; UART1-автор Богомолов Д.А. dima_bo@chat.ru ; Версия 1.0, от 03,03,01 :-) ; Подпрограмма асинхронного приёмопередатчитка. ; 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 ;выход ;---------------------------------------------