Передача группы байт микроконтроллером ATMEGA168 через USART

Продолжая разговор, начатый в статье “Подключение устройства с интерфейсом RS-485 к персональному компьютеру” http://radio-technica.ru/kompyuternaya-texnika/podklyuchenie-ustrojstva-s-interfejsom-rs-485-k-personalnomu-kompyuteru.html хочу рассказать о программном решении передачи микроконтроллером нескольких байт через интерфейс USART принимающему устройству, которым может быть персональный компьютер, промышленный логический контроллер или модуль на основе микроконтроллера оснащенный соответствующим интерфейсом.

Передавать информацию центральному устройству приходится при обработке данных, поступающих от нескольких датчиков или в случае проверки состояния множества контактов тумблеров и кнопок пульта управления или в случае обработки состояния клавиатуры. Один из вариантов реализации такого модуля может содержать контроллер фирмы Atmel семейства AVR, имеющий тип ATMEGA168.

Работой микроконтроллера управляет программа, в состав которой входит подпрограмма передачи. Текст подпрограммы приведен далее. Она предназначена для передачи данных через интерфейс USART, полученных в результате работы других программных процедур. Программа написана на языке ассемблера в пакете AVR STUDIO 4.12. Приведенный текст программы предназначен для копирования с экрана и внедрения в текст программ, создаваемых в текстовом редакторе AVR STUDIO.

ИНИЦИАЛИЗАЦИЯ  USART

В начале работы микроконтроллера для определения формата передаваемой информации происходит инициализация порта USART. Это заключается в записи в специальные регистры порта  данных о режиме его работы. Группа команд описывающих эти действия и комментарии записываются в начале основной программы.

В приведенном примере проводится установка режима передачи и приема. В программе выполняется установка скорости передачи для частоты тактового генератора 14,7456 мегагерц, частота входит в набор частот генератора микроконтроллера, рекомендованных для работы с USART.

Кварцевый резонатор на эту частоту распространен и встречается почти на всех модулях, входящих в состав персонального компьютера. Скорость передачи данных можно изменить, заменив константу в команде:

LDI TEMP, 47

записываемую в регистр настройки USART с помощью команды:

STS UBRR0L, TEMP

Для выбора константы имеется подсказка в комментариях к программе. Эту информацию в виде комментариев удобно хранить в тексте программы для настройки,  отладки и проведения различных экспериментов.

Текст участка программы, выполняющего инициализацию порта USART ATMEGA168.

;— ИНИЦИАЛИЗАЦИЯ ПОРТА USART ATMEGA168 —

;УСТАНОВКА ДЛИНЫ ПЕРЕДАВАЕМОГО БАЙТА 8 БИТ

;БЕЗ БИТА ЧЕТНОСТИ ПРОИСХОДИТ ПО УМОЛЧАНИЮ

LDI TEMP,   47                    ; СКОРОСТЬ ПЕРЕДАЧИ 19200 БОД

STS UBRR0L, TEMP          ;ПРИ ЧАСТОТЕ ГЕНЕРАТОРА 14,7456 МГц

 

;ПЕРЕДАЧА И ПРИЕМ ВОЗМОЖНЫ ПРИ ЗАПИСИ В БИТЫ TXEN0 И RXEN0 ЗНАЧЕНИЯ 1

;ПРЕРЫВАНИЯ UART RXC И UART TXC РАЗРЕШЕНЫ

LDI TEMP, (1<<TXEN0)+(1<<TXCIE0)+(1<<RXEN0)+(1<<RXCIE0)

STS UCSR0B, TEMP          ;ВЫХОД МИКРОКОНТРОЛЛЕРА ПОДКЛЮЧАЕТСЯ К ПОРТУ

 

; — ФУНКЦИИ РАЗРЯДОВ РЕГИСТРА UCSR0B ПОРТА USART —

;RXCIE0 ЕСЛИ УСТАНОВЛЕНА 1 РАЗРЕШЕНО ПРЕРЫВАНИЕ UART RXC БАЙТ ПРИНЯТ

;TXCIE0 ЕСЛИ УСТАНОВЛЕНА 1 РАЗРЕШЕНО ПРЕРЫВАНИЕ UART TXC

;ПРИ ЗАВЕРШЕНИИ ПЕРЕДАЧИ БАЙТА И ОТСУТСТВИИ ВТОРОГО БАЙТА

;ПРОИСХОДИТ ПРЕРЫВАНИЕ UART TXC

;RXEN0 ПРИ ЗАПИСИ 1 ПРИЕМНИК ГОТОВ К РАБОТЕ,

;ВХОД ПОДКЛЮЧАЕТСЯ К ПОРТУ USART

;TXEN0 ПРИ ЗАПИСИ 1 ПЕРЕДАТЧИК ГОТОВ К РАБОТЕ.

;ВЫХОД ПОДКЛЮЧАЕТСЯ К ПОРТУ USART

 

;УСТАНОВКА СКОРОСТИ ПЕРЕДАЧИ USART

;   СКОРОСТЬ     КОНСТАНТА В UBRR ДЛЯ ЧАСТОТЫ ГЕНЕРАТОРА 14,7456 MГц

;           4800                           191

;           9600                           95

;           14400                         63

;           19200                         47

;           28800                         31

;—————————————

ПОДПРОГРАММА  СООБЩЕНИЯ  ИЗ  СЕМИ  БАЙТ

В подпрограмме, текст которой приведен далее, реализована передача группы из семи байт. Количество передаваемых байт можно легко изменить добавляя или убирая однотипные группы команд. Началом подпрограммы служит метка TRANSMIT. Вызов подпрограммы с использованием метки должен находится в основной программе. По окончанию выполнения подпрограммы передачи благодаря команде, расположенной в конце

RET

происходит возвращение микроконтроллера к выполнению основной программы. В начале подпрограммы передачи производится запрет работы приемника USART. Передача одного байта происходит по короткому алгоритму:

На передачу байта требуется время, так как производится последовательная передача данных. Пока байт не передан, нельзя переходить к передаче следующего байта. Нужно постоянно проверять окончена передача текущего байта или нет. Для организации проверки используется прерывание UTXCaddr. При окончании передачи байта прерывание вызывает выполнение программы из одной команды, по которой в регистр с условным названием TXCTXC записывается нуль. Перед отправкой байта в регистр TXCTXC записывается 1 с помощью команды:

SER  TXCTXC

Выполнение программы происходит по замкнутому циклу пока прерывание, вызванное окончанием передачи байта не приведет к записи нуля в регистр с условным именем TXCTXC. Для работы подпрограммы в разделе описания используемых регистров вводится запись присвоения условного имени регистру:

.DEF TXCTXC=R18

В разделе описания прерываний записывается:

;ВЫПОЛНЯЕТСЯ ПО ОКОНЧАНИЮ ПЕРЕДАЧИ БАЙТА И ОТСУТСТВИИ

;НОВОГО БАЙТА В РЕГИСТРЕ UDR0 УСТАНАВЛИВАЕТСЯ В

;ЕДИНИЦУ РАЗРЯД ТХС РЕГИСТРА USR И ПРИ ЕДИНИЧНОМ СОСТОЯНИИ

;РАЗРЯДА TXCIE РЕГИСТРА UCR ПРОИСХОДИТ ЗАПРОС ПРЕРЫВАНИЯ UTXC

.ORG UTXCaddr LDI TXCTXC,0 RETI

Данные для передачи вводятся в регистр UDR0 порта USART. Данными могут быть константы как при передачи байт с первого по третий или содержимое регистров как при передачи  байт с четвертого по седьмой.

TRANSMIT:              ;МЕТКА НАЧАЛА ПОДПРОГРАММЫ

PUSH TEMP

IN TEMP, SREG

PUSH TEMP            ;СOXPAHEHИЕ В СТЕКЕ РЕГИСТРА TEMP

PUSH TXCTXC       ;СOXPAHEHИЕ В СТЕКЕ РЕГИСТРА СОСТОЯНИЯ

PUSH R30

PUSH R31

 

LDS  TEMP, UCSR0B

ANDI TEMP, 0B01101111 ;ЗАПРЕЩЕНИЕ ПРЕРЫВАНИЙ ПРИЁМНИКА RXEN0 И RXCIE0

STS  UCSR0B, TEMP

 

;ПЕРЕДАЧА 7 БАЙТ

 

;НАЧАЛО ПЕРЕДАЧИ

 

;_1_##### ПЕРЕДАЧА БАЙТА 1 #####

SER  TXCTXC          ;РЕГИСТР ПРИЗНАКА ПЕРЕДАЧИ СТАВИТСЯ В ЕДИНИЦУ

LDS TEMP, $153

STS UDR0, TEMP    ;ВЫВОД В USART

METKA1:

; —- ПРОВЕРКА: ОКОНЧЕНА ПЕРЕДАЧА БАЙТА? —-

SBRC TXCTXC, 0   ;ПРОПУСКАЕТСЯ СЛЕДУЮЩАЯ КОМАНДА ЕСЛИ БИТ N0 = 0

RJMP METKA1

CALL MEJBAIT CALL MEJBAIT CALL MEJBAIT

CALL MEJBAIT CALL MEJBAIT CALL MEJBAIT

 

;_2_##### ПЕРЕДАЧА БАЙТА 2 #####

SER TXCTXC           ;РЕГИСТР ПРИЗНАКА ПЕРЕДАЧИ СТАВИТСЯ В ЕДИНИЦУ

LDI TEMP, 3

STS UDR0, TEMP    ;ВЫВОД В USART

M2:

; —- ПРОВЕРКА: ОКОНЧЕНА ПЕРЕДАЧА БАЙТА? —-

SBRC TXCTXC, 0   ;ПРОПУСКАЕТСЯ СЛЕДУЮЩАЯ КОМАНДА ЕСЛИ БИТ N0 = 0

RJMP M2

CALL MEJBAIT CALL MEJBAIT CALL MEJBAIT

CALL MEJBAIT CALL MEJBAIT CALL MEJBAIT

 

;_3_##### ПЕРЕДАЧА БАЙТА 3 #####

SER TXCTXC         ;РЕГИСТР ПРИЗНАКА ПЕРЕДАЧИ СТАВИТСЯ В ЕДИНИЦУ

LDI TEMP, 2

STS UDR0, TEMP   ;ВЫВОД В USART

L5A:

; —- ПРОВЕРКА: ОКОНЧЕНА ПЕРЕДАЧА БАЙТА? —-

SBRC TXCTXC, 0  ;ПРОПУСКАЕТСЯ СЛЕДУЮЩАЯ КОМАНДА ЕСЛИ БИТ N0 = 0

RJMP L5A

CALL MEJBAIT CALL MEJBAIT CALL MEJBAIT

CALL MEJBAIT CALL MEJBAIT CALL MEJBAIT

 

;_4_##### ПЕРЕДАЧА БАЙТА 4 #####

SER TXCTXC          ;РЕГИСТР ПРИЗНАКА ПЕРЕДАЧИ СТАВИТСЯ В ЕДИНИЦУ

STS UDR0, REG4    ;ВЫВОД В USART

L86A:

; —- ПРОВЕРКА: ОКОНЧЕНА ПЕРЕДАЧА БАЙТА? —-

SBRC TXCTXC, 0   ;ПРОПУСКАЕТСЯ СЛЕДУЮЩАЯ КОМАНДА ЕСЛИ БИТ N0 = 0

RJMP L86A

CALL MEJBAIT CALL MEJBAIT  CALL MEJBAIT

CALL MEJBAIT CALL MEJBAIT CALL MEJBAIT

 

;_5_##### ПЕРЕДАЧА БАЙТА 5 #####

SER TXCTXC                      ;РЕГИСТР ПРИЗНАКА ПЕРЕДАЧИ СТАВИТСЯ В ЕДИНИЦУ

STS UDR0, REG5    ;ВЫВОД В USART

; —- ПРОВЕРКА: ОКОНЧЕНА ПЕРЕДАЧА БАЙТА? —-

M1007:

SBRC TXCTXC, 0   ;ПРОПУСКАЕТСЯ СЛЕДУЮЩАЯ КОМАНДА ЕСЛИ БИТ N0 = 0

RJMP M1007

CALL MEJBAIT CALL MEJBAIT CALL MEJBAIT

CALL MEJBAIT CALL MEJBAIT CALL MEJBAIT

 

;_6_##### ПЕРЕДАЧА БАЙТА 6 #####

SER TXCTXC          ;РЕГИСТР ПРИЗНАКА ПЕРЕДАЧИ СТАВИТСЯ В ЕДИНИЦУ

STS UDR0, REG6    ;ВЫВОД В USART

; —- ПРОВЕРКА: ОКОНЧЕНА ПЕРЕДАЧА БАЙТА? —-

M210:

SBRC  TXCTXC, 0  ;ПРОПУСКАЕТСЯ СЛЕДУЮЩАЯ КОМАНДА ЕСЛИ БИТ N0 = 0

RJMP  M210

CALL MEJBAIT CALL MEJBAIT CALL MEJBAIT

CALL MEJBAIT CALL MEJBAIT CALL MEJBAIT

;_7_##### ПЕРЕДАЧА БАЙТА 7 #####

SER TXCTXC          ;РЕГИСТР ПРИЗНАКА ПЕРЕДАЧИ СТАВИТСЯ В ЕДИНИЦУ

STS UDR0, REG7    ;ВЫВОД В USART

; —- ПРОВЕРКА: ОКОНЧЕНА ПЕРЕДАЧА БАЙТА? —-

M7X:

SBRC TXCTXC, 0   ;ПРОПУСКАЕТСЯ СЛЕДУЮЩАЯ КОМАНДА ЕСЛИ БИТ N0 = 0

RJMP M7X

 

LDS TEMP, UCSR0B

ORI TEMP, 0B10010000     ;РАЗРЕШЕНИЕ ПРЕРЫВАНИЙ ОТ ПРИЕМНИКА RXEN0 И RXCIE0

STS UCSR0B, TEMP

 

POP R31

POP R30

POP TXCTXC          ;ВОССТАНОВЛЕНИЕ РЕГИСТРА TXCTXC

POP TEMP

OUT SREG, TEMP

POP TEMP               ;ВОССТАНОВЛЕНИЕ РЕГИСТРА TEMP

RET                            ;ВОЗВРАТ ИЗ ПОДПРОГРАММЫ

ПАУЗЫ  МЕЖДУ БАЙТАМИ

Передавать байты один за одним без паузы между ними нельзя. Принимающее устройство не успеет принять такой быстро поступающий поток информации. Аппаратная часть принимающего порта не сможет работать, а программа должна отличать одну группу байт от другой, определять начало и конец группы по длине паузы и другим признакам. Короткие паузы в передачи позволят отнести несколько байт к одной группе, а длинные паузы позволят отличить группы друг от друга.

Для формирования короткой паузы между байтами используется подпрограмма CALL MEJBAIT. Подпрограмма может вызываться несколько раз для формирования паузы требуемой длины. Подпрограмма MEJBAIT включает 1200 команд пустой операции NOP. Во время выполнения подпрограммы формирования паузы процессор микроконтроллера простаивает.

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

Весь текст подпрограммы MEJBAIT здесь не приводится, а лишь небольшая часть.

 

Подпрограмма формирования паузы между передачей байт. В подпрограмму входит 1200 команд NOP.

 

MEJBAIT:

NOP NOP NOP NOP NOP NOP NOP NOP NOP

NOP NOP NOP NOP NOP NOP NOP NOP NOP

NOP NOP NOP NOP NOP NOP NOP NOP NOP

NOP NOP NOP NOP NOP NOP NOP NOP NOP

NOP NOP NOP NOP NOP NOP NOP NOP NOP

.

.

.

NOP NOP NOP NOP NOP NOP NOP NOP NOP

NOP NOP NOP NOP NOP NOP NOP NOP NOP

NOP NOP NOP NOP NOP NOP NOP NOP NOP

NOP NOP NOP NOP NOP NOP NOP NOP NOP

NOP NOP NOP NOP NOP NOP NOP NOP NOP

RET

Паузы в передаче между байтами, заложенные в подпрограмме при использовании скорости передачи 19200 бод,  соответствуют требованиям протокола MODBUS RTU при использовании частоты генератора микроконтроллера, указанного выше. В сформированной информационной посылке может содержаться адрес источника передачи, номера функций MODBUS.

Посылку может завершать контрольная сумма всей группы байт. Модуль микроконтроллера с программой приведенной в статье может содержать интерфейс RS-232, RS-422, RS-485 или другие интерфейсы, на основе которых создан канал связи.

 

Денисов П. К.

Симферополь

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Проверочный код *

Разработка сайта: cryptonic