Свежие обсуждения
Микроконтроллеры

Ликбез по программированию PIC

1 18 99

Это точно, спорить тут не о чем, каждый программирует по-своему.
Splav56, я Вам по e-mail о выявленных замечаниях сообщил.

 

picmaniac: Splav56, я Вам по e-mail о выявленных замечаниях сообщил.

Спасибо, получил.

 

SAK: Я бы предложил создавать для каждого проекта новую ветку, это облегчит поиск информации.

Согласен.
Раздувание ветки больше чем на 20 страниц сильно затрудняет поиск информации. Поэтому здесь стоит прилепить файл с готовым проектом, который включает все от ТЗ до исходника и hex - файла (исходников и hex - файлов можно включить и более одного, если они различны в написании, но 100% работоспособны, проверены на макете, а не только в симуляторе) и на этом закончить, оставив пару страниц для возникающих вопросов.

Новую ветку предлагаю назвать "Ликбез по программированию PIC, часть №2"

В ней есть предложение рассмотреть следующее изменение: кнопки заменить на матрицу из кнопок, пока 2х2. Соответствие между номером нажатой кнопки и зажиганием с/д оставить прежним.

Просьба не торопиться, пока окончательно не освоим материал первой части.

 

Итоги тестирования программ picmaniac'a и SAK'a:

1. программа picmaniac'a на макете ведет себя идеально, четко исполняется заданный алгоритм.
2. программа SAK'a глючит: имеется паразитная засветка с/д порта RB0 даже при ненажатых кнопках. При нажатиях на кнопки алгоритм выполняется не всегда, бывают непредсказуемые комбинации зажигания с/д. Влияет на паразитную засветку также прикосновение к входным портам RB3:RB0. Возможно из-за отсутствия задержек? Фото будут вечером.

 

Splav56: программа SAK'a глючит
Splav56: программа picmaniac'a на макете ведет себя идеально
Обе программы абсолютно идентичны. Разница только в
xorwf TEMP,W
subwf TEMP,W -но это непринципиально. По отношению к флагу Z обе команды ведут себя одинаково.
А что за команда banksel PORTB ? Если выбор банка, то почему PORTB?
Может дело в шапке, которую SAK не дал. Я тоже думаю, задержка нипричём. Но ввести 2 NOPа у SAKа и проверить не помешает.
А кстати, Splav56, Вы видите , что программа, состоит из 4-х очень похожих кусков? А не хотите ли всё это завернуть в цикл? Познакомитесь с очень полезной командой DECFSZ, а также командой сдвига (с использованием бита переноса). И в дальнейшем при динамическом опросе кнопок это очень поможет.

 

gan: А что за команда banksel PORTB

Это директива выбора банка для прямой адресации: banksel <label>, где <label> наименования регистра. Описана на стр.21 русифицированного руководства MPASM. Написание banksel PORTB равнозначна переходу в банк 0, где этот регистр находится. Вместо PORTB можно было бы указать любой регистр нулевого банка. Соответственно banksel TRISB равнозначен выбору банка памяти 1.

gan: Обе программы абсолютно идентичны

Я не знаю почему, но на макете получилось так. Чуть позже повторю эксперимент. Нашел принципиальные вещи в своей программе, почему она не могла работать: 1) забывал после каждого блока возвращаться к началу цикла, 2) использовал операцию лог. И, которая в принципе для этого сравнения не годится.

В программе используется регистр TEMP, как посмотреть его изменения в MPLAB? Я что-то не нашел. В окне RAM ячейка с адресом 073h не меняется.

gan: А не хотите ли всё это завернуть в цикл?

Надо спросить у народа, куда пойдем дальше.

 

View->Watch
Слева список с регистрами спец. назначения, справа с теми, что описаны в шапке, там и ищите, затем AddSymbol, заодно обязательно вызывайте W (WREG) (слева).
Splav56: 1) забывал после каждого блока возвращаться к началу цикла, 2) использовал операцию
Да к я о том же говорил, но это даже лучше, что сами дошли.

 

У меня версия 5.70.40 там такого нет

 

У вас в окне регистры спец. назначения, там его конечно нет. Был где-то, это я точно помню, либо в дебуге, либо в тулзах.. Сейчас народ подтянется, подскажет.

 

Проверил еще раз на макетке обе программы, результат подтвердился. В программе SAK'a какая-то проблема с входными портами. Если пальцем замыкаешь ыходные порты на общий (вносишь ёмкость), то программа начинает более-менее выполняться нормально, но тоже иногда сбоит. Если входы не трогать, то загорается с/д на RB0 и программа сильно глючит. Такое ощущение что подтягивающие резисторы не включены на входах. Возможно из-за того, что у меня 628А и bcf OPTION_REG,NOT_RBPU тут не катит?