Что-то не так?
Пожалуйста, отключите Adblock.
Портал QRZ.RU существует только за счет рекламы, поэтому мы были бы Вам благодарны если Вы внесете сайт в список исключений. Мы стараемся размещать только релевантную рекламу, которая будет интересна не только рекламодателям, но и нашим читателям. Отключив Adblock, вы поможете не только нам, но и себе. Спасибо.
Как добавить наш сайт в исключения AdBlockРеклама
Полезные схемы / Cхема для RS232 (КР1878ВЕ1)
Cхема для RS232 (КР1878ВЕ1).
Данная программа работает с компьютером по интерфейсу RS232, в полудуплексе на скорости 9600 бод при кварцевом резонаторе 1.843.200 питание 5 Вольт, потребление в режиме ожидания 3.7 ма. Входная часть взята из программатора Атмела avr910.pdf, питание от ком порта через линии RTS и DTR через диоды шотки и стабилизатор 78L05. Алгоритм работы взят Микрочиповский из AN555C, кому интересно читайте в оригинале, коротко смысл такой. Для детектирования старт бита таймер счётчик подключается к входной ножке, счёт идёт по спаду, в регист интервала пишится 1. При появлении старт бита, перепад от 1 к 0, происходит переполнение счётчика и вырабатывается прерывание на процессор. Затем таймер переконфигурируется на счёт от кварца, без предделителя, и в регистр интервала пишется такое значение, чтоб прерывание пришлось на середину старт бита (длинна бита на данной скорости делённая пополам). По прерыванию читается приёмная нога и её значение задвигается в буфер данных. Затем в регистр интервала пишется значение равное длинне принимаемого бита (1843200 / 9600 = 192, 0c0h) и по следующим прерываниям считывается весь байт, бит чётности и стоп бит. Преимущество данного способа в том, что для работы необходимо только одно прерывание таймера. При передаче в таймер загружается длинна бита и по прерываниям от таймера, циклически сдвигая регистр с данными, последовательно передатся весь байт, со старт и стоп битами. При приёме возможна работа любой другой программы, при передаче нужно ждать пока не уйдёт весь байт. При инициализации ножек RX и TX, функции остальных ног не меняются. В данном примере программа принимает байт с компьютера, добавляет к нему 1, и передаёт обратно. Для теста устройства лучше использовать программу Term95, она идёт в комлекте к нортон-командеру, хотя можно использовать и другие, работающие с ком портами (датаскоп, дос-навигатор). При этом необходимо, чтоб на линиях RTS и DTR были установлены логические 1 (+12 Врльт), для питания микроконтроллера. Выставив номер порта и скорость передачи можно наблюдать как в ответ на посланый байт приходит увеличеный на 1, особенно прикольно когда посылаешь цифры :-)
UART1.MIC (3Kb)
Автор: Богомолов Дмитрий г. Москва
; UART1-автор Богомолов Д.А. dima_bo (at) chat.ru
; Подпрограмма асинхронного приёмопередатчитка.
; Cкорость работы 9600, полудуплекс.
; используются:
; Прерывание от таймера счётчика uart
; Вход RX - PA4, выход TX - PA3
; подпрограммы:
; uart_init: - инициализация портов
; uart_resiv: - таймер на приём старт бита
; uart_trans: - передача байта из data1
; буфер передачи data1, data2
; флаг передачи tx_c 1-идёт передача
; флаг приёма rx_c 1-идёт приём
; Внимание!!! в данной тестовой программе
; нет сохранения контекста (регистры #a,#c)
#define tx_c a0,01h ;
#define rx_c a0,02h ;
baud=0c0h ;скорость передачи 9600 при 1.843.200 мгц
#define TX c1,1000b ;
#define RX c1,0001b ;
#define flags a0 ;два флага, приём и передача
#define count a1 ;временный буфер счётчика байтов
#define data1 a2 ;передаваемый байт
#define data2 a3 ;биты стоп и чётность
;--- область векторов прерываний процессора-----------------------------
jmp start ;<0> Начальный пуск программы
nop ;<1> Сторожевой таймер
nop ;<2> выход за границу стека
jmp uart ;<3> Таймер A не используется
nop ;<8> не используется
nop ;<5> не используется
nop ;<6> Порт A
nop ;<7> Порт B (прерывания не используются)
nop ;<8>
nop ;<9>
nop ;<10>
nop ;<11>
nop ;<12>
nop ;<13>
nop ;<14>
nop ;<15>Завершение записи в флэш
;-----------Начало работы подпрограммы----------------------
start:
jsr uart_init ;инициализация ног
jsr uart_resiv ;перевод на приём
loop: nop ;
$1: wait ;спим!
nop ;
bttl rx_c ;пришёл ли весь байт?
jeq $1 ;если нет, ждём дальше
rlc data2 ;подвигаем чтоб
rlc data1 ;принятый байт
rlc data2 ;оказался в data1
rlc data1 ;
inc data1 ;+1
jsr uart_trans ;ответ :-)
jmp loop ;бесконечный цикл!
;-----------инициализация портов и таймера------------------
uart_init:
;формирование конфигурации порта А: RX-ввод TX-вывод
ldr #c,18h ; адреса регистра управления
;установки для RX (PA4)
movl c1,00011011b ; регистр управления порта +1
bich RX ;3-ножки на выход -1 вход -0
bich RX ;4-активный выход -1 открытый сток -0
bish RX ;5-подключение резисторов -1
bich RX ;6-разрешение прерывания от / -1
bich RX ;7-разрешение прерывания от \ -1
;установки для TX (PA3)
movl c1,00011011b ; регистр управления порта +1
bisl TX ;3-ножки на выход -1 вход -0
bisl TX ;4-активный выход -1 открытый сток -0
bicl TX ;5-подключение резисторов -1
bicl TX ;6-разрешение прерывания от / -1
bicl TX ;7-разрешение прерывания от \ -1
ldr #c,00h ; адрес порта А
bisl TX ;на выход -1 (нет передачи)
rts
;-----------обработка переполнения таймера----
uart:
; bich c4,0eh ;а этой командой не сбрасывается :-(
cmp c4,c5 ;сброс прерывания
bttl tx_c ;проверка передачи
jne transmit ;переход на передачу
cmpl count,0 ;вначале инициализация таймера на 1/2
jne $4 ;переход на приём байтов
movl c4,00010000b ;Работа с Регистром Конфигурации
movl c5,00100000b ;Х + 8 бит + \ + cpu clock + без пред. + ххх
movl c4,00000000b ;Работа с Мл.Байтом Регистра Интервала
movl c5,(baud/2)-18 ;значение скорости передачи
bisl c4,3 ;старт таймера
stie ;разрешение прерывания
inc count ;+1
rti ;выход из прерывания
$4: cmpl count,1 ;если старт бит то инициализация таймера
jne $5 ;переход на приём байтов
movl c4,00000000b ;Работа с Мл.Байтом Регистра Интервала
movl c5,baud ;значение скорости передачи
bisl c4,3 ;старт таймера
$5: btth RX ;смотрим входную ногу
jeq $6 ;если 1 то
stc ;устанавливаем перенос
$6: rrc data1 ;задвигаем перенос в приёмник
rrc data2 ;
inc count ;счётчик битов +1
cmpl count,12 ;проверка всё ли принято
jne $7 ;если нет то дальше
bisl rx_c ;иначе выставляем флаг
clr count ;очищаем счётчик
bisl c4,0 ;стоп таймера
clie ;запрет прерывания
$7: rti ;
transmit: ;передача
inc count ;следующий бит
rrc data2 ;сдвиг посылки
rrc data1 ;для передачи
jc $1 ;
bicl TX ;ТХ - 0
jmp $2 ;
$1: bisl TX ;ТХ - 1
$2: cmpl count,11 ;проверка все ли байты
jne $3 ;когда все
bicl tx_c ;сброс флага
$3: rti ;
;-----------приём байта-----------------------
uart_resiv:
;формирование конфигурации таймера на приём
ldr #c,00h ; адрес таймера
ldr #a,40h ;
clr count ;очистка счётчика
bicl rx_c ;очистка флага приёма
bicl tx_c ;
movl c4,00010000b ;Работа с Регистром Конфигурации
movl c5,00110000b ;Х + 8 бит + \ + PA4 clock + без пред. + ххх
movl c4,00000000b ;Работа с Мл.Байтом Регистра Интервала
movl c5,1 ;значение младшего байта интервала
bisl c4,3 ;старт таймера
stie ;разрешение прерывания
rts ;выход
;-----------передача байта--------------------
uart_trans:
;формирование конфигурации таймера на передачу
ldr #a,40h ;указатель на данные
clr count ;сброс счётчика байт
movl data2,0ffh ;стоп бит
clc ;старт бит
rlc data1 ;начальное
rlc data2 ;положение
bisl tx_c ;передача пошла
ldr #c,00h ; адрес таймера
movl c4,00010000b ;Работа с Регистром Конфигурации
movl c5,00100000b ;Х + 8 бит + \ + cpu clock + без пред. + ххх
movl c4,00000000b ;Работа с Мл.Байтом Регистра Интервала
movl c5,baud ;значение скорости передачи
bisl c4,3 ;старт таймера
stie ;разрешение прерывания
$1: wait ;ожидание прерывания
bttl tx_c ;проверка конца передачи
jnz $1 ;ожидание конца передачи
bicl c4,1 ;стоп таймера
clie ;запрет прерываний
jsr uart_resiv ;переход на приём
rts ;выход
;---------------------------------------------
Разработка и оформление Андрея Александровича Борисенко aka ICE.
По всем вопросам просьба писать мне на icenet (at) narod.ru