Передача данных в сторону компьютераВ предыдущем разделе мы узнали протокол передачи интерфейса RS232 и длительность битовой посылки.
Сейчас мы составим несколько элементарных программ для МК:
– передача от МК в сторону ПК набора символов;
– прием на стороне МК от ПК символов;
– двухсторонний обмен: ПК<=>МК.
Программа непрерывной передачи в сторону ПК фразы "Ура! ".
Периодичность посылки 1 сек.
LIST P=PIC16F84A
__CONFIG H3FF1
W EQU 0
F EQU 1
STATUS EQU H0003
PORTA EQU H0005
PORTB EQU H0006
TRISA EQU H0005
TRISB EQU H0006
C EQU 0
Reg_1 EQU H000C ; для счетчика паузы 100 мкс
Reg_2 EQU H000D ; для счетчика битов в байте
Reg_3 EQU H000E ; для передаваемого символа
Reg_4 EQU H000F
Reg_5 EQU H0010
Reg_6 EQU H0011
org 0 ; начало программы
; подготовительные моменты
Start bsf STATUS,5 ; переход в Банк 1
movlw b00011101 ; RA0 на выход, остальные на вход
movwf TRISA
clrf TRISB
bcf STATUS,5 ; переход назад в Банк 0
bsf PORTA,0 ; установка 1 - "режим ожидания"
clrf PORTB ; очистка порта
; вставка символа "У" для передачи
m3 movlw "У" ; копируем букву У (рус) как символ, который
movwf Reg_3 ; пропишется в кодировке ANSI в Reg_4 (hС4)
call Tx
; о кодировке ANSI мы поговорим чуть позже
movlw "р"
movwf Reg_3
call Tx
movlw "а"
movwf Reg_3
call Tx
movlw "!"
movwf Reg_3
call Tx
movlw " "
movwf Reg_3
call Tx ; т.о. отправлено "Ура! ",
call Pause2
goto m3 ; 5 символов, в т.ч. пробел
; сегмент передачи от МК в сторону ПК (9600, 8-N-1, 104 мкс)
Tx movlw .9 ; 8+1, т.е + бит C из STATUS
movwf Reg_2
bcf STATUS,C ; подготовка стартового бита
m1 btfsc STATUS,C
goto bit1
goto bit0
bit1 bsf PORTA,1 ; передача единицы
call Pause
goto m2
bit0 bcf PORTA,1 ; передача нуля
call Pause
goto m2
m2 rrf Reg_3,F ; сдвиг вправо для передачи с младшего бита
decfsz Reg_2,F
goto m1
bsf PORTA,1 ; установка 1 - "режим ожидания"
call Pause
return
;delay = 95 machine cycles
Pause movlw .31
movwf Reg_1
wr decfsz Reg_1, F
goto wr
nop
return
;delay = 1000000 machine cycles
Pause2 movlw .173
movwf Reg_4
movlw .19
movwf Reg_5
movlw .6
movwf Reg_6
wr2 decfsz Reg_4, F
goto wr2
decfsz Reg_5, F
goto wr2
decfsz Reg_6, F
goto wr2
return
end ; конец программы
Далее текст прошивки:
:020000040000FA
:1000000083161D3085008601831205148601D330C6
:100010008E001820F0308E001820E0308E0018205E
:1000200021308E00182020308E0018203020072824
:1000300009308D00031003181E28212885142A205A
:10004000242885102A2024288E0C8D0B1B2885142B
:100050002A2008001F308C008C0B2C280000080080
:10006000AD308F0013309000063091008F0B362892
:0A007000900B3628910B362808008B
:02400E00F13F80
:00000001FF
В случае передачи более длинных фраз (или набора слов), программу можно упростить, создав таблицу в которой символы из фразы будут следовать друг за другом, а обращение к таблице будет организовано из счетчика.
Start
; организация счетчика передаваемых символов
movlw .6 ; всего 5 символов +1
movwf Reg_4 ; 6 => Reg_4
; организация передачи из таблицы
m4 movf Reg_4,W ; Reg_4 => W
call TABLE ; уход в таблицу
movwf Reg_3 ; символ из таблицы W => Reg_3
call Tx ; уход в передачу
decfsz Reg_4,F ; уменьшаем (Reg_4)-1
goto m4 ; зацикливание
goto Start
TABLE addwf PC,F ; Содержимое счетчика команд PC = PC + W
nop ; для корректировки
retlw " "
retlw "!"
retlw "А"
retlw "Р"
retlw "У"
Размер таблицы накладывает некоторые ограничения, которые ранее мы не рассматривали для облегчения восприятия принципа работы. Выход на командные строчки таблицы производится путем принудительного увеличения счетчика команд PC. Этот счетчик команд организован с помощью обычного регистра, который может принять максимальное значение в 255. А теперь представим ситуацию, что перед таблицей находится некоторое количество других командных строк, например 32. Исходя из этого, таблица может содержать не более (255 – 32) = 223 строк, иначе будет переполнение регистра PC, что приведет к неправильному ходу выполнения программы. Это и есть ограничение размера таблицы для вышеуказанного примера.
Самостоятельно предлагаем сделать следующие модификации программы:
– посылка более длинных фраз (или набора слов) с использованием таблицы;
– посылка символов (фраз) по факту нажатия кнопки (кнопок);
– использование временных задержек между словами.
|