Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Микроконтроллеры PIC фирмы Microchip для начинающих выпуск №22


РАССЫЛКА Микроконтроллеры PIC фирмы Microchip для начинающих
Ведущий: Алексей (pont_a@mail.ru)


Доброго времени суток, дамы и господа!!

Сегодня продолжаем рассматривать периферийный модуль USART!  Как я и обещал в предыдущем выпуске, привожу примеры работы с этим модулем!   

Я решил написать Вам готовый код программы, который работает с USART. Программа выполняет следующие действия: после приема без ошибок байта инвертирует состояние светодиода и  передает принятый байт обратно в линию! Микроконтроллер тактируется от внешнего кварца частотой 20МГц. Также, на нулевой пин порта D заведен светодиод.

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

;===================================================================================
; подключаем стандартный заголовочный файл
#include <P18F452.INC>
; директивой LIST задаем тип микроконтроллера, формат HEX-файла
; и формат констант по-умолчанию - десятичный.
LIST        P=18F452, f=INHX32, R=DEC
; задаем биты конфигурации (как задавать, смотрите шестой выпуск)
CONFIG      OSC=HS                       ; тактирование от кварца частотой 20МГц
CONFIG      OSCS=OFF                ; запретить переключать частоту тактирования микроконтроллера
CONFIG      PWRT=ON                      ; включать задержку на 72мс после включения питания      
CONFIG      BOR=ON, BORV=45   ; схему сброса по провалу питания включить. Порог = 4,5В
; старайтесь использовать сторожевой таймер всегда!
CONFIG      WDT=ON, WDTPS=128 ; сторожевой таймер включить, период 2,3 сек
CONFIG      STVR=ON                      ; по переполнению стека давать сброс микроконтроллера
; объявляем константы
ab equ 0    ; признак, что переменная находиться в access bank        
bb equ 1    ; признак, что адрес необходимо считать с использованием регистра BSR
rw equ ab   ; rw=0. Результат размещается в регистр-аккумулятор WREG
rf equ bb   ; rf=1.  Результат размещается в регистр FREG
; объявляем переменные (в данном примере пользовательская память ОЗУ не используется совсем)
CBLOCK      0x000 ; блок начинается с нулевого адреса банка 0
ENDC
; основная программа
; прерывания использовать не будем      
ORG         0
; изначально, при инициализации, всегда запрещают все прерывания
CLRF        INTCON, ab        ; сбросили глобальные флаги прерываний
CLRF        PIE1, ab
; если пины не используются на схеме, то они должны быть настроены все на вход
; при включении питания все порты ввода/вывода по умолчанию настроены на вход
; поэтому мы должны настроить на выход только пин 0 порта D для работы светодиода
; также надо отключить аналоговые входа.
MOVLW       0x07
MOVWF       ADCON1, ab        ; отключаем аналоговые входа, все пины цифровые
CLRF        LATD, ab          ; на выход светодиода пойдет сразу 0 (будет выключен)
; светодиод будет инвертировать свое состояние после каждого успешно принятого байта
BCF         TRISD, RD0, ab    ; пин 0 порта D настроили, как выход, и на  светодиод пошел 0
; инициализируем периферийный модуль USART
BCF         TRISC, RC6, ab    ; пин 6 порта С настроили, как выход (пин TX передатчика USART)
CLRF        RCSTA, ab         ; отключаем USART
; настраиваем скорость работы интерфейса, равной 19200
; Бит BRGH регистра TXSTA  равен 0 - низкая скорость работы
; вычисляем SPBRG по формуле, которая получена из той, что я приводил в предыдущем выпуске
; Генератор настроен на частоту 20МГц (см. схему в предыдущих выпусках)
; SPBRG = 20000000/19200/64 - 1 = 15
MOVLW       0x0F
MOVWF       SPBRG, ab   ; задаем скорость 19200
MOVLW       0x20         
MOVWF       TXSTA, ab   ;TXEN=1; BRGH=0; асинхронный режим(SYNC=0); 8-ми битные данные(TX9=0)
MOVLW       0x90
MOVWF       RCSTA, ab   ;SPEN=1; CREN=1; ADDEN=0; RX9=0
Main_Loop:
; теперь начинается основной цикл микроконтроллера              
CLRWDT                             ; сброс сторожевого таймера, обязательно, как минимум, раз в 2,3сек
BTFSS       PIR1, RCIF        ; байт принят?
BRA         Main_Loop         ; нет, ждем флага прерывания по приему байта
; если байт принят проверяем сразу наличие ошибок
BTFSC       RCSTA, OERR, ab   ; было переполнение USART?  
BRA         Err_code_OR       ; да
BTFSC       RCSTA, FERR, ab   ; была ошибка фрейма?  
BRA         Err_code_FR       ; да
; сюда программа попадет, если прием прошел без ошибок
MOVF        RCREG, rw, ab     ; читаем в WREG принятый байт из буфера приемника
BTG         LATD, RD0, ab     ; проинвертировали состояние светодиода
; начинаем передачу
; сначала, проверяем когда освободиться буфер. При свободном буфере флаг прерывания TXIF всегда равен 1
; (устанавливается аппаратно), если включен передатчик    
Test_TX:
CLRWDT     
BTFSS       PIR1, TXIF, ab          ; буфер на передачу освободился?  
BRA         Test_TX                      ; нет, ждем, когда освободиться
MOVWF       TXREG, ab               ; загружаем принятый байт из WREG в буфер на передачу. Передача началась
BRA         Main_Loop               ; ждем следующего байта на приеме
; -----------------------------------------------------------------------------------
; обработчики ошибок USART
; флаг ошибки OERR сбрасывается аппаратно после отключения приемника модуля USART
; таким же способом можно очищать и FERR - бит, но есть опасность потерять следующий принимаемый байт,
; если он сразу идет, за только что принятым
Err_code_OR:
BCF         RCSTA, CREN, ab         ; отключаем приемник
BSF         RCSTA, CREN, ab         ; включаем приемник     - все ошибки сбросились
BRA         Main_Loop               ; ждем следующий байт  
; флаг ошибки FERR сбрасывается аппаратно
; после чтения принятого ошибочного байта
Err_code_FR:
MOVF        RCREG, rw, ab           ; читаем ошибочный принятый байт
BRA         Main_Loop               ; ждем следующий байт
END
;====================================================================================

 В следующем выпуске, посвященному аппаратной части,  будем рассматривать дополненную схему, по сравнению со схемой из 10-го выпуска, а также, аппаратный драйвер, который  обеспечивает согласование уровней USART и уровней RS-232.

Полный архив рассылки Вы можете прочитать на нашем сайте!  При любом опубликовании текстов данной рассылки ссылка на сайт http://www.2aplusa.ru обязательна!

Желаю Вам удачи! До скорой встречи!


С уважением, Алексей pont_a@mail.ru
Cайт разработчиков 2AplusA http://2aplusa.ru


В избранное