Простейшая программа для подключения контроллера к компьютеру по RS-232 с помощью встроенного модуля USART
В этой статье рассмотрена простейшая программа для подключения контроллера (PIC16F628A) к компьютеру с помощью встроенного модуля USART. Для экспериментов воспользуемся тестовой платкой, рассмотренной в статье "Подключение контроллера к компьютеру по RS-232 с помощью встроенного модуля USART". Встроенный USART модуль котроллера позволяет реализовать как синхронный режим, так и асинхронный, но ввиду того, что синхронный режим практически не используется, мы будем рассматривать только асинхронный режим. В асинхронном режиме может быть использован восьмибитный или девятибитный формат данных, с одним стартовым и одним стоповым битами. Обычно, девятый бит - проверка четности, соответственно, если проверки нет, то используется восьмибитный формат данных.
Так как мы рассматриваем простейший пример, то будем использовать восьмибитный формат данных (без проверки четности) с одним стоповым битом. Аппаратный контроль использовать не будем, поэтому выводы нашей тестовой платы CTS и RTS просто закоротите между собой.
Итак, для начала немножко теории, поскольку дока от микрочипа, к сожалению, с ошибками (места, которые в родной доке описаны неверно, выделены красным шрифтом):
Регистры, которые нам понадобятся для работы с USART:
1) TXSTA (98h) - регистр управления и статуса передатчика.
бит 1 (TRMT) - флаг очистки сдвигового регистра передатчика (0 - в регистре есть данные, 1 - регистр пуст)
бит 2 (BRGH) - выбор высокоскоростного или низкоскоростного режима. (0 - низкоскоростной режим, 1 - высокоскоростной режим). Во-первых режим влияет на вычисление скорости передачи. Во-вторых, у разных режимов разные алгоритмы определения уровня сигнала на входе приемника.
бит 4 (SYNC) - выбор синхронного (1) или асинхронного (0) режима USART
бит 5 (TXEN) - включение (1) или выключение (0) передатчика. Здесь есть одни очень веселые грабли. При выключении передатчика его вывод переводится в z-состояние. То есть, если вы не используете контроль передачи, то включенный приемник компьютера (соединенный с передатчиком контроллера) окажется подвешен в воздухе, причем с довольно некислой антенной (провод от передатчика контроллера к приемнику компьютера) и естественно наловит всяких наводок, которые вы увидите в виде многочисленных ошибок передачи, в то время как вы ничего не передаете. В связи с вышеописанным, передатчик рекомендуется включить один раз при инициализации и больше не выключать.
бит 6 (TX9) - выбор девятибитной (1) или восьмибитной (0) передачи.
2) RCSTA (18h) - регистр управления и статуса приемника.
бит 1 (OERR) - ошибка переполнения внутреннего буфера (0 - нет переполнения, 1 - есть переполнение). Чтобы сбросить эту ошибку - нужно выключить и снова включить приемник. (сбросить и заново установить бит CREN).
бит 2 (FERR) - бит ошибки кадра (выставляется в 1, если не обнаружен стоповый бит). Сбрасывается при чтении регистра RCREG.
бит 4 (CREN) - включение (1) или выключение (0) приемника.
бит 6 (RX9) - выбор девятибитного (1) или восьмибитного (0) приема
3) SPBRG (99h) - регистр генератора скорости обмена (BRG). Скорость вычисляется по следующим формулам: для высокоскоростного режима (BRGH=1) V=Fosc/(16(X+1)), для низкоскоростного (BRGH=0) V=Fosc/(64(X+1)), где V - корость обмена в бодах, Fosc - частота, на которой работает контроллер в герцах, X - значение в регистре SPBRG.
4) TXREG (19h) - регистр данных передатчика USART.
5) RCREG (1Ah) - регистр данных приемника USART.
Работа передатчика USART в асинхронном режиме (восьмибитная передача)
Главным элементом передатчика является регистр TSR. Это сдвиговый регистр, который, собственно, и передает данные, со скоростью, установленной генератором обмена. Программно этот регистр не доступен, а данные в него загружаются автоматически из регистра TXREG.
Если регистр TSR пуст, а в регистре TXREG есть данные, то в последнем машинном машинном такте цикла генератора обмена TSR загружается данными из TXREG, после чего выставляется флаг прерывания TXIF (4-й бит регистра PIR1 (0Ch)). Само прерывание можно запретить сбросом бита TXIE (4-й бит регистра PIE1 (8Ch)), но флаг все равно будет выставляться. То есть, этот флаг сигнализирует - занят регистр TXREG (TXIF=0) или освободился (TXIF=1). Очистка флага происходит после загрузки новых данных в регистр TXREG.
Аналогично, флаг TRMT (первый бит регистра TXSTA) сигнализирует о состоянии регистра TSR (0 - в регистре есть данные, 1 - регистр пуст).
Таким образом, последовательность действий при передаче следующая:
1) Инициализация: установить скорость, режим генератора скорости обмена, выбрать восьмибитный режим, разрешить/запретить прерывания, включить передатчик.
2) Работа: записать байт в регистр TXREG, при появлении флага TXIF можно писать в TXREG новый байт, он будет послан сразу после окончания передачи предыдущего, после записи в TSR последнего байта, дождаться появления флага TRMT. Всё, передача завершена.
Работа приемника USART в асинхронном режиме (восьмибитный прием)
Главным элементом приемника является регистр RSR. Это сдвиговый регистр, который, собственно, и принимает данные, со скоростью, установленной генератором обмена. Программно этот регистр не доступен, а данные из него автоматически загружаются в регистр RCREG после цикла получения стопового бита, если этот регистр не заполнен. После этого выставляется флаг прерывания RCIF (пятый бит регистра PIR1 (0Ch)). Само прерывание можно запретить сбросом бита RCIE (5-й бит регистра PIE1 (8Ch)), но флаг все равно будет выставляться.
Регистр RGREG представляет сбой двухуровневый FIFO, т.е. в него можно принять два байта. Чтобы считать из него два байта, нужно просто считать его два раза.
Если в регистр RSR принят байт (пришел стоповый бит), а в регистре RCREG уже есть два байта, то выставляется флаг переполнения приемника OERR (первый бит регистра RCSTA (18h)), а принятый байт теряется. Сбросить флаг OERR можно только выключив и заново включив приемник.
Таким образом, последовательность действий при приеме следующая:
1) Инициализация: установить скорость, режим генератора скорости обмена, выбрать восьмибитный режим, разрешить/запретить прерывания, включить приемник.
2) Работа: ожидать появления флага RCIF, после этого проверить, нет ли ошибки FERR, затем считать данные из RCREG и, наконец, проверить (и, если надо, то сбросить) ошибку переполнения.
Ну всё, хватит теории, переходим к программе.
Наша программа будет принимать один байт от компьютера, увеличивать его значение на единицу и отсылать обратно на компьютер, без проверки ошибок приема.
Алгоритм:
Программа:
;--------------------------------------------------------- list p = 16f628a __config 03F30h ;*** Переменные ****************************************** CBLOCK 0x20 ; Начальный адрес блока Rbyte ;Принятый байт ENDC ;*** Константы / Адреса регистров ************************ Baudrate equ .12 ; скорость 19200 ;--------------------------------------------------------- STATUS equ 03h ; Регистр выбора банка PORTA equ 05h ; Порт А PORTB equ 06h ; Порт В TRISA equ 05h ; Конфигурация порта А (банк 1) TRISB equ 06h ; Конфигурация порта В (банк 1) CMCON equ 1Fh ; Управление компараторами ;--- Регистры передатчика и приемника--------------------- TXREG equ 19h ; буфер передатчика RCREG equ 1Ah ; буфер приемника PIR1 equ 0Ch ; регистр флагов передатчика PIE1 equ 0Ch ; разреш/запрет прерыв-й передатч.(1-й банк) TXSTA equ 18h ; конфигурация передатчика (1-й банк) RCSTA equ 18h ; конфигурация приемника SPBRG equ 19h ; настройка скорости ;********************************************************* org 0 ;*** Настройка портов (чтобы работал UART надo TRISB[2,1]=1) start movlw .7 movwf CMCON ; выкл. компараторы clrf PORTA ; инициализация защелок порта А clrf PORTB ; инициализация защелок порта В bsf STATUS,5 ; Перейти в 1-й банк movlw .4 ; Записать конфиг. порта A в аккум-р (W) ; .4=00000100 (RA2 - всегда вход) movwf TRISA ; Скопировать конфиг-ю порта А из W в TrisA movlw .7 ; Записать конфиг. порта В в аккум-р (W) ; .255=00000111 (RB0(CTS) - вход) movwf TRISB ; Скопировать конфиг-ю порта B из W в TrisB bcf STATUS,5 ; Перейти в 0-й банк ;*** Настройка приемо-передатчика ************************ bsf STATUS,5 ; перейти в первый банк movlw Baudrate ; загрузить устанавливаемую скорость в W movwf SPBRG ; установить скорость movlw b'00100100' ; 8-разрядные данные, включить передачу, movwf TXSTA ; высокоскоростной асинхронный режим bcf PIE1, 4 ; запретить прерыв-я от передатчика (TXIE=0) bcf PIE1, 5 ; запретить прерыв-я от приемника (RCIE=0) bcf STATUS,5 ; перейти в нулевой банк movlw b'10000000' ; 8-разрядные данные, выключить прием, movwf RCSTA ; включить модуль USART ;---------- Прием ------------------------- bsf RCSTA,4 ; включаем приемник prog btfss PIR1,5 ; если 5-й бит PIR1 = 1, - в буфер пришли данные goto prog movf RCREG,0 ; читаем буфер приемника в аккумулятор movwf Rbyte ; помещаем это значение в принятый байт bcf RCSTA,4 ; выкл-ем приемник (можно его и не выключать, ; если комп свой передатчик не выключает) incf Rbyte,1 ; прибавляем к принятому байту 1 ;---------- Передача ----------------------- movf Rbyte,0 ; помещаем это значение на передачу movwf TXREG bsf STATUS,5 ; в первый банк per btfss TXSTA,1 ; если 1-й бит регистра TXSTA = 1, ; то передача завершена (TSR пуст) goto per bcf STATUS,5 ; нулевой банк bsf RCSTA,4 ; включаем приемник goto prog end ;---------------------------------------------------------Скачать готовую прошивку и asm-файл
Для проверки работы и отладки удобно пользоваться программой для работы с com-портом RH_Com, которую можно скачать здесь.