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

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

1 14 99

Откорректировано.

 

Что именно?

 

picmaniac: Что именно?

Мой предыдущий пост.

 

Написал кусок программы (проверка первого условия), может быть коряво и неправильно, в симуляторе еще не проверял:


bsf STATUS,RP0 ;выбор банка 1
movlw 00h ;
movwf TRISA ;конфигурируем выводы прота А как выходы: "00000000", где (1-вход, 0-выход)
movlw Mask1 ;
movwf TRISB ;конфигурируем выводы прота В: "11110000", где (1-вход, 0-выход)
bcf STATUS,RP0 ;возвращаемся в банк 0

Main movlw b'00001111' ;загружаем константу в W
movwf PORTB ;и заносим в порт В: гасим светодиоды на RB3:RB0
andlw Mask1 ;поразрядное "И" с константой F0h
movwf TEMP ;забиваем ненужные биты
movf PORTB ;читаем порт В и заносим значение в W
andlw Mask2 ;поразрядное "И" с константой E0h
movwf TEMP ;сохраняем в TEMP
btfss TEMP,4 ;проверяем 4-й бит на 0, и если он не равен 0, то
call Light1 ;включаем с/д1
movf PORTB ;продолжаем процедуру опроса

Подпрограмма Light1:

Light1 movlw b'00001110' ;
movwf PORTB ;
return

И описание констант:

Mask1 EQU H'F0'
Mask2 EQU H'E0'


 

А вот с шапкой.
Кстати, чем отличаются PIC16F628 от PIC16F628A? Почему у них разные вложенные файлы в MPASM?

35665.asm

 

Дописал до конца, в MPLAB'е пока не пробовал. Буду пробовать вечером. Исходник прилагаю. Полагаю что это не лучший и далеко не единственный вариант.

35696.asm

 

Смотрю я на нашу блок-схему http://pro-radio.ru/user/uploads/35460.gif и вижу кое-какие несоответствия:
Main movlw b'00001111' ;загружаем константу в W
movwf PORTB ;и заносим в порт В: гасим светодиоды на RB3:RB0 -----это только первый раз мы их гасим

Здесь должно быть считывание с PORTB. Ячейка TEMP=PORTB & F0 состоит из двух команд, сначала считать PORTB а затем поразрядное "И" с константой F0h, что и сделано строкой ниже

andlw Mask1 ;поразрядное "И" с константой F0h
Потом, что-то с операцией сравнения TEMP c E0 что-то непонятное, сначала поразрядное "И" с Е0, затем опрос 4-го бита, независимо от результата предыдущей операции. Думаю, правильнее бы было применить команду XORLW, а затем проверить результат на ноль.

и в конце:
Wait goto Main ; Зациклиться
а вот идти надо не на Main, а на строку ниже, для которой явно напрашивается метка, которую надо и на блок-схеме поставить (где сходятся стрелки). Вообще метки на блок-схеме и в программе должны обзываться одинаково (для читаемости программы).

И ещё, для команды movf PORTB, надо ставить указатель адреса результата (проверено), то есть movf PORTB,0
И ещё после возврата из Call, мы остаёмся в основной прграмме, а надо бы прыгать в начало на ту самую метку, о которой я говорил. И смысл использования Call? Обычно к подпрограммам прибегают, если какой-то набор команд повторяется неоднократно. У нас только один раз, ведь все call Light i разные .

 

gan, спасибо за замечания, буду разбираться. Если еще что-нибудь найдете, сообщите. Вывод оформил подпрограммами на случай усовешенствования программы, да и просто для тренировки. Кстати я там забыл подключить подтягивающие резисторы на входы.

 

Splav56: да и просто для тренировки
Дело хорошее . Только после каждого CALL надо будет ставить GO TO--> (метка после Main). Но тогда учтите, придётся переделывать команды BTFSS, которые стоят перед CALL, так как пропустить можно только 1-у команду, а у нас их будет уже две, и обе надо будет пропустить.
А если тренироваться, то по-крупному. Сделать одну подпрограмму для всех, но перед обращением к ней записывать в регистр число зажжённых с/д, а в подпрграмме через цикл сделать сдвиг влево 0F на это число (предварительно обнулив бит переноса), а затем обрезать левую тетраду нулями. Вот тогда это будет 100%-я подпрограмма.
Но это меня уже куда-то вбок понесло

 

Что-то я совсем запутался с этим Портом В. Куда проще было бы входы сунуть на Порт А. Но чтобы понять, где я напортачил, давайте разберем мой асм не только с указанием ошибок, но и правильных решений этих ошибочных мест. Иначе количество вопросов не уменьшается, а только увеличивается.

gan: А если тренироваться, то по-крупному.

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