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

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

1 15 99

Вот последний вариант асма.

35751.asm

 

movlw b'11110000' ;
Main
movwf PORTB ;
movf PORTB,W ;
andlw Mask1 ;
movwf TEMP ;
------------------------------------------------------------------------------------
movf PORTB,W ; Зачем? Мы уже получили TEMP
andlw Mask2 ;
movwf TEMP ;
btfss TEMP,4 ;Нам же не только 4-й бит проверять надо, но и еденички перед ним
goto Light1 ;

До подчёркивания правильно, после подчёркивания я бы сделал так:
XORLW E0h ; если W=E0, то результатом будет 0-->W, но при этом флаг регистра статуса Z должен стать =1
BTFSC STATUS,Z ;
goto Light1 ;если бит Z=1
Всё, появлюсь завтра утром или после обеда.

 

Если использовать константы, то надо давать им осмысленные имена, например
MaskKey1 EQU B'11100000'
MaskKey2 EQU B'11010000'
....................
Теперь понятно, что первая констанда служит для выделения клавиши 1, а вторая - клавиши 2. Наименования Mask1, Mask2, не говорят об их назначении, и больше запутывают, чем помогают.

 

Мы всё же пишем учебную программу с расчётом на тех, кто только начал осваивать ассемблер. Поэтому самый первый вариант программы я предлагаю сделать максимально простым и приближенным к алгоритму. Без подпрограмм, использования констант и т.п. Безусловно, все эти "хитрости" будут очень полезны в дальнейшем. Но пока, для понимания работы программы по алгоритму, я сделал всё максимально упрощенно. Кроме того, максимум комментариев и разбиение кода на участки. Предлагаемый исходник - в приложении.

35784.asm

 

picmaniac: Мы всё же пишем учебную программу с расчётом на тех, кто только начал осваивать ассемблер.

Согласен. Но я тоже из тех, кто только начал осваивать ассемблер. Наваял вот! Но где-то про***. Конечно я разберусь, для этого нужно лишь время, но прошу товарищей, имеющих опыт в программировании ткнуть меня мордой в *****, чтобы мне немножко облегчить жизнь.

gan, вам отдельное спасибо, учту все ваши замечания.

picmaniac: Предлагаемый исходник - в приложении

ОК! Работаем сначала по Вашему исходнику. Потом предлагаю перейти к моему. Затем отметить остальные возможные варианты решения этой задачи. Это весьма интересно и поучительно. Главное, давайте не торопиться, масса вопросов возникает.

 

Так и быть, выкладываю свой вариант (без шапки). Сразу уточняю, процедуры прерывания нет, зачем описывать прерывание если его нет и не предвидится в данном проекте.
PS Предполалось, что биты конфигурирования будут установлены при программировани, потому конфигурация не задана в тексте.

35787.asm

 

To picmaniac: Вопрос №1: в чем "сермяжная" правда этих строк:


movf PORTA,F ; Приводим в соответствие с состоянием выводов
movf PORTB,F ; выходные защелки портов

 

В комментариях следует дополнить то, что раз в программе не используется таймер TMR0 и в слове конфигурации отключен WDT и не надо конфигурировать предделитель, то вместо установки в ноль только бита 7 (-RBPU) мы можем использовать байт-ориентированную команду загрузки 8-битной константы:

		movlw	B'00000000'
movwf OPTION_REG ; Подтягивающие резисторы вкл (бит7 := 0)

 

Splav56, тыкать Вас в ***** никто не будет, я искренне надеюсь. Ибо совершенно не за что. Скорее наоборот, респект Вам за настойчивое стремление получше разобраться. Я лишь пытаюсь с самого начала показать наработанные мной за два года хорошие (ИМХО) привычки в программировании. Если они понравятся уважаемым участникам, то возьмём их на вооружение.

Так, я уже погонял написанную программу в симуляторе. Всё работает ОК. А вот и проект для PROTEUS:
http://www.pic16.nm.ru/likbez01proteus.zip

Отвечаю на вопрос о приведении в соответствие защелок. Команда
movf PORTA,F
предписывает контроллеру считать реальные логические уровни на выводах порта и записать соответствующие значения в выходные защелки порта. Так сделано на всякий случай.
Теперь более подробно. При включении питания или сбросе по _MCLR все выводы портов автоматически настраиваются как входы, в TRISA и TRISB записываются единицы. Выходные буферы находятся в третьем состоянии (оба транзистора закрыты). Какие при этом будут напряжения на выводах порта - заранее сказать сложно, это зависит от схемы. После выполнения команды
movf PORTA,F
состояния защелок данных порта будут соответствовать реально существующим логическим уровням на выводах, т.к. при чтении порта мы получаем именно те значения, которые РЕАЛЬНО имеются на выводах микросхемы, независимо от состояния защелок. Эти же значения и записываем в защелки. Выходные буферы пока останутся в третьем состоянии.
После этого можно спокойно переключать на выход те разряды порта, которые и должны по нашему замыслу работать как выходы. Если на выводе было напряжение, соответствующее лог.0 - то при переключении на выходе порта и установится лог.0. Аналогично для лог.1.
В принципе, так делать и не обязательно, но я для себя решил, что это будет полезно.
А потом уже записываем в PORTA те значения, которые нам необходимы.
Всё написанное выше относится и к PORTB.
Подробности можете прочитать в даташите, в разделе "порты ввода/вывода".

 

ОК! Принято к сведению.