Что-то не так?
Пожалуйста, отключите 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