Простейшая программа для подключения контроллера к компьютеру по 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 и, наконец, проверить (и, если надо, то сбросить) ошибку переполнения.

Ну всё, хватит теории, переходим к программе.

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

Алгоритм:

Алгоритм обмена данными контроллера с ПК по UART

Программа:

;---------------------------------------------------------
 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, которую можно скачать здесь.