LAB599.RU — интернет-магазин средств связи
EN FR DE CN JP

Полезные схемы / 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

Партнеры