Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум Picbasic.ru » Скорая помощь начинающим » Помощь в вопросах программирования » Неадекватный порт PORT.B (подскажите где туплю)
Неадекватный порт PORT.B
555serg Дата: Вт, 01.12.2015, 12:06  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 55
Репутация: 0   ±
Замечания:   ±
На сайте с 12.12.2011

Статус: Offline

Доброго времени суток всем участникам форума. Не могу решить одну проблемку.
Может кто подскажет, буду очень признателен. Собрал макетную плату на PIC16F876
камне. Начал писать прогу, и сразу же отлаживать все в работе. Половину постав-
ленной задачи сделал, но как только приступил к определению поступающего логи-
ческого нуля или еденицы на выводе PORTB.5 - столкнулся со стеной. Весь порт 
PORTB настроен на вход. В свободном, никуда не подключенном выводе PORTB.5
на нем мультиметром обнаруживается 0 вольт. Подключай к этому порту резистор
33К второй вывод которого подтягиваю к плюсу источника питания. Так же подклю-
чаю к этому порту резистор номиналом 2К второй вывод которого подключаю к об-
щему , минус источника питания. Проблема в том, что на входе PORTB.5  - не 
0,2 - 0,3 вольта как это и должно быть, а четко 0 вольт. Ткните носом пожалуйста,
где туплю.
Прогу прилагаю, все что в данный момент закомментировано, к делу не относится,
подскажите что не так с настройками порта PORTB
Нужна ваша помощь, спасибо.
Прикрепления: Maket_driver_1.bas(36Kb)
ЯНДЕКС Дата: 01.12.2015
DAlexV Дата: Вт, 01.12.2015, 12:47  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Цитата
'------------------ настройка порт В ----------------------------
'Declare PortB_Pullups = On   'подключим подтягивающие резисторы к порт В
TRISB = 1                    ' порт В на вход
Цитата 555serg ()
Весь порт PORTB настроен на вход
Ну если верить коду то TRISB = 1 это только PORTB.0 будет входом, а остальные выходы. Правильней будет писать TRISB=$FF или TRISB=%11111111. Поэтому и не работает подтяжка
То же касаемо и остальных портов (PORTA)

Успехов  wink


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
Matrix252005 Дата: Вт, 01.12.2015, 13:13  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 675
Репутация: 20   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Приятного времени суток!!!

Добавлю следующее, сразу скажу, не примите за критику, но стиль написания у Вас....

И так...

Вы заремили основную прогу!!!! "On_Interrupt GoTo prer" поставьте его перед " 'GoTo main"

Сейчас проверил в протеусе, вроде бы работает...


THE TRUTH IS OUT THERE.

С уважением, Николай.
555serg Дата: Вт, 01.12.2015, 13:33  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 55
Репутация: 0   ±
Замечания:   ±
На сайте с 12.12.2011

Статус: Offline

Спасибо ребята что быстро откликнулись, сейчас буду читать и переваривать.
Matrix252005 Дата: Вт, 01.12.2015, 13:41  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 675
Репутация: 20   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Всегда ПЛЗ!!!!  wink

На будущее!!! 

Пишите настройки, да и в других переменных либо в НЕХ-ах, либо в бинарнике
TRISх=$FF или TRISх=%11111111

Потому что, TRISх = 1 это тоже самое что TRISх = $01 или TRISх = %00000001

Вот и получается, что порт PortB.0 = 1 (тобишь на вход), а остальные на выход...


THE TRUTH IS OUT THERE.

С уважением, Николай.
555serg Дата: Вт, 01.12.2015, 14:10  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 55
Репутация: 0   ±
Замечания:   ±
На сайте с 12.12.2011

Статус: Offline

DALexV и Matrix252005 спасибо. Изменил форму написания на TRISB = %11111111
как вы и посоветовали, напряжение на делителе из резисторов достигло разумных пре-
делов 0.31в. Это говорит о том что - буфер в высокоимпедансном (Z) состоянии, и наг-
рузочный резистор ничем не шунтируется - порт работает правильно. Да кстати изна-
чально у меня была команда PULLUPS = on , но она работала как то неадекватно, и 
я от нее отказался. Просто подкинул внешние резисторы подтяжки. Теперь я понял почему.
В дальнейшем собирался разобраться в этом вопросе, но теперь я вижу решился и он.
Еще раз спасибо всем , тем более за такую оперативность.
Да и кстати Matrix 252005 а что не так у меня со стилем?
Matrix252005 Дата: Вт, 01.12.2015, 14:50  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 675
Репутация: 20   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Цитата 555serg ()
Да и кстати Matrix 252005 а что не так у меня со стилем?

Вы все пишете столбиком, что очень сильно затрудняет читабельность программы.
Например:

'---------------------------- ОСНОВНОЙ ЦИКЛ ---------------------                   
'main:

'If fact_tmr1 = 1 Then        ' если имеется факт прерывания от таймера TMR1, то
'fact_tmr1 = 0                ' сбросим факт прерывания, и        
'GoSub meandr                 ' отправляемся в подпрограмму формирования меандра - meandr
'EndIf 

И это только кусочек кода, а теперь представьте, когда у Вас код под сотню строчек и еще это не Ваша программа... И как сможете прочесть многоуровневое условие....

Комменты это хорошо, но не когда они занимают много места в коде:

'If s2 = 0 And s2_on = 0 Then ' если кнопка s2 нажата, И как дальше будет понятно отпущена уже более двух пе-
'                              риодов переполнения таймера TMR0, то
'Inc per_0v_s2                ' увеличиваем на единицу переменную ожидания низкого уровня напряжения (per_0v_s2)
'ElseIf s2 = 1 And s2_on = 1 Then       ' или если кнопка s2 отпущена, И с момента последнего нажатия прошло
'                              менее двух периодов переполнения таймера TMR0, то есть в процессе сканирования
'                              факт нажатия кнопки s2 s2_on еще не опущен, то
'Inc per_5v_s2                ' увеличиваем на единицу переменную ожидания высокого уровня напряжения (per_5v_s2)
'EndIf

Везде в условиях Вы используете ElseIf, для чего???

'If s3_on = 1 And vkl_s3 = 0 Then
....
'ElseIf s3_on = 1 And vkl_s3 = 1 Then
...
'EndIf

 Не проще сделать 2 условия???

Так что, без обид!!!  wine


THE TRUTH IS OUT THERE.

С уважением, Николай.
555serg Дата: Ср, 02.12.2015, 12:19  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 55
Репутация: 0   ±
Замечания:   ±
На сайте с 12.12.2011

Статус: Offline

Понял, спасибо. Приму к сведению. :)

Добавлено (02.12.2015, 12:14)
---------------------------------------------

Добавлено (02.12.2015, 12:18)
---------------------------------------------
Matrix252005 еще проконсультируйте если не трудно.
По поводу ElseIF , такой вариант сравнения лучше не использовать
при написании программы?

Сообщение отредактировал 555serg - Ср, 02.12.2015, 12:19
Matrix252005 Дата: Ср, 02.12.2015, 12:33  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 675
Репутация: 20   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Приятного времени суток!!!

Не могу говорить за всех, но я делаю так (кусок кода написанный на mikroBasic-е!!!):

         if (But = 0) and (But1 = false) then
            But1 = true
            UART1_Write_text("OK!!!")
         end if

         if (But = 1) and (But1 = true) then
            But1 = false
         end if

Я делаю так... Если нужно условие с "если", то просто:

          if (P < 0 ) then
             P = (P + 3) + (2 * A_)
             inc(A_)
          else
             P = (P + 5) + (2 * (A_ - B_))
             inc(A_)
             dec(B_)
          end if

А там... Кому как нравится...


THE TRUTH IS OUT THERE.

С уважением, Николай.
555serg Дата: Ср, 02.12.2015, 17:20  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 55
Репутация: 0   ±
Замечания:   ±
На сайте с 12.12.2011

Статус: Offline

А я всего лишь думал что вложения ElseIf, Else, делают окончательный код
более габаритным, и иногда могут глючить.  Еще мне думается, что одноуров-
невая схема сравнения в исключительных случаях работает стабильнее.
Все равно спасибо за разъяснения. smile
MiXaS Дата: Пт, 04.12.2015, 09:07  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 618
Репутация: 26   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Цитата 555serg ()
per_0v_s1 = 0                ' îáíóëèì ïåðåìåííóþ çàäåðæêè ðåãèñòðàöèè íèçêîãî óðîâíÿ ñ êíîïêè s1
per_0v_s2 = 0                ' îáíóëèì ïåðåìåííóþ çàäåðæêè ðåãèñòðàöèè íèçêîãî óðîâíÿ ñ êíîïêè s2
per_0v_s3 = 0                ' îáíóëèì ïåðåìåííóþ çàäåðæêè ðåãèñòðàöèè íèçêîãî óðîâíÿ ñ êíîïêè s3
per_0v_s4 = 0                ' îáíóëèì ïåðåìåííóþ çàäåðæêè ðåãèñòðàöèè íèçêîãî óðîâíÿ ñ êíîïêè s4
per_0v_s5 = 0                ' îáíóëèì ïåðåìåííóþ çàäåðæêè ðåãèñòðàöèè íèçêîãî óðîâíÿ ñ êíîïêè s5
per_0v_s6 = 0                ' îáíóëèì ïåðåìåííóþ çàäåðæêè ðåãèñòðàöèè íèçêîãî óðîâíÿ ñ êíîïêè s6

s1_on = 0                    ' îáíóëèì ïåðåìåííóþ ôàêòà íàæàòèÿ íà êíîïêó s1
s2_on = 0                    ' îáíóëèì ïåðåìåííóþ ôàêòà íàæàòèÿ íà êíîïêó s2
s3_on = 0                    ' îáíóëèì ïåðåìåííóþ ôàêòà íàæàòèÿ íà êíîïêó s3
s4_on = 0                    ' îáíóëèì ïåðåìåííóþ ôàêòà íàæàòèÿ íà êíîïêó s4
s5_on = 0                    ' îáíóëèì ïåðåìåííóþ ôàêòà íàæàòèÿ íà êíîïêó s5
s6_on = 0                    ' îáíóëèì ïåðåìåííóþ ôàêòà íàëè÷èÿ íèçêîãî óðîâíÿ íà âõîäå PORTB.5

timer_buz = 0                ' îáíóëèì ïåðåìåííóþ âðåìåíè âêëþ÷åíèÿ áóçåðà
buz_on = 0                   ' îáíóëèì ôëàã âêëþ÷åíèÿ áóçåðà

vkl_s1 = 0                      ' âíà÷àëå - âûêëþ÷åíî
vkl_s2 = 0                      ' âíà÷àëå - âûêëþ÷åíî
vkl_s3 = 0                      ' âíà÷àëå - âûêëþ÷åíî
vkl_s4 = 0                      ' âíà÷àëå - âûêëþ÷åíî
vkl_s5 = 0                      ' âíà÷àëå - âûêëþ÷åíî
vkl_s6 = 0                      ' âíà÷àëå - âûêëþ÷åíî

per_5v_s1 = 0                ' îáíóëèì ïåðåìåííóþ çàäåðæêè ðåãèñòðàöèè âûñîêîãî óðîâíÿ ñ êíîïêè s1
per_5v_s2 = 0                ' îáíóëèì ïåðåìåííóþ çàäåðæêè ðåãèñòðàöèè âûñîêîãî óðîâíÿ ñ êíîïêè s2
per_5v_s3 = 0                ' îáíóëèì ïåðåìåííóþ çàäåðæêè ðåãèñòðàöèè âûñîêîãî óðîâíÿ ñ êíîïêè s3
per_5v_s4 = 0                ' îáíóëèì ïåðåìåííóþ çàäåðæêè ðåãèñòðàöèè âûñîêîãî óðîâíÿ ñ êíîïêè s4
per_5v_s5 = 0                ' îáíóëèì ïåðåìåííóþ çàäåðæêè ðåãèñòðàöèè âûñîêîãî óðîâíÿ ñ êíîïêè s5
per_5v_s6 = 0                ' îáíóëèì ïåðåìåííóþ çàäåðæêè ðåãèñòðàöèè âûñîêîãî óðîâíÿ ñ êíîïêè s6

s1_on_prin_resh = 0          ' îáíóëèì ïåðåìåííóþ ôàêòà íàæàòèÿ íà êíîïêó s1, äëÿ åäèíîðàçîâîãî ïîñåùåíèÿ 
'                              ïîäïðîãðàììû ïðèíÿòèÿ ðåøåíèé ( prin_resh )
s2_on_prin_resh = 0          '
s3_on_prin_resh = 0          '
s4_on_prin_resh = 0          '
s5_on_prin_resh = 0          '
s6_on_prin_resh = 0          ' îáíóëèì ïåðåìåííóþ ôàêòà íàæàòèÿ íà êíîïêó s6, äëÿ åäèíîðàçîâîãî ïîñåùåíèÿ 
'                              ïîäïðîãðàììû ïðèíÿòèÿ ðåøåíèé ( prin_resh )


Чтобы не городить огород, есть команда clear, которая очищает оперативную память, т.е в начале кода пишите ее и не надо в ручную каждую переменную обнулять, что в свою очередь сокращает время выполнения кода, время написания кода, а также размер кода. 

Цитата 555serg ()
Да кстати изна-чально у меня была команда PULLUPS = on , но она работала как то неадекватно, и 
я от нее отказался.

За подтяжки отвечает OPTION_REG. Рекомендую почитать ШИТ на камень и прописывать все регистры в ручную? чтобы не использовать протоновские декларации (Pullups; digital_all), у меня они не всегда работали. Из личного опыта работы с протоном, рекомендую сразу настраивать все модули, которые мультиплицированы с портами (ADC, CPP, Comparator, MSSP, .........) В противном случае настройки по умолчанию Вам будут портить жизнь, причем Вы потратите много времени чтобы понять в чем дело. Также рекомендую в начале кода прописывать регистр конфигурации MCU, чтобы быть на 100% уверенным, что Watch Dog выключен, если это не нужно.... выбран необходимый тактовый генератор.
Форум Picbasic.ru » Скорая помощь начинающим » Помощь в вопросах программирования » Неадекватный порт PORT.B (подскажите где туплю)
Страница 1 из 11
Поиск: