Новичок
Регистрация: 31.05.2012
Сообщений: 4
Репутация: 10
|
Привет, ребята. Буду признателен за любую помощь.
Ситуация в следующем: Мне требуется выполнить миграцию для одного проекта с МК P87C51FB (снятого с производства) на МК AT89C51RB2 (в производстве). Код переехал отлично, за исключением одной вещи. В проекте реализована связь диагностического стенда с моим блоком, инициализирующаяся кодовой посылкой на 5 бодах (ISO 9141), исходя из которой настраивается передача на 4800/9600. Проблема в том, что UART данного МК отказывается работать на этой скорости. P87C51FB это делал легко. ДШ гласит: Цитата:
One can achieve very low baud rates with Timer 1 by leaving the Timer 1 interrupt
enabled, and configuring the Timer to run as a 16-bit timer (high nibble of TMOD = 0001B), and using the Timer 1 interrupt to do a 16-bit software reload. Код:
$DATE ( 30.06.2018 ) $TITLE ( Project3 ) $NOPAGING $NOMOD51 $INCLUDE (AT89C51RB2.inc) org 00H ljmp BEGIN org 23H ljmp serial_IT ORG 001BH JMP TM1INT org 100h BEGIN: clr A mov TCON, A mov T2CON, A mov SCON,#50H MOV PCON,#80H MOV TMOD,#10H MOV TH1,#0CFH MOV TL1,#02CH setb ES setb EA setb ET1 setb TR1 mov A,#55h mov sbuf,A jmp $ TM1INT: clr TR1 MOV TL1,#02CH MOV TH1,#0CFH SETB TR1 RETI serial_IT: jnb RI, _TI clr RI mov A,sbuf mov sbuf,A cpl P3.5 ljmp end_IT _TI: clr TI end_IT: reti END Ко всему вышесказанному добавлю, что запустить UART на Т1 (16bit software reload in interrupt) ни на одной из скоростей у меня не вышло. На Т2 и Internal_BaudRate_Generator, да даже на Т1 в режиме 8бит автоперезагрузки (только высокие скорости) UART работает исправно. Ломаю голову... Возможно я что-то делаю не так. Буду признателен за любую помощь. |
||
Оценка
|
Новичок
Регистрация: 31.05.2012
Сообщений: 4
Репутация: 10
|
Частота кварца 12Мгц
|
||
Оценка
|
Новичок
Регистрация: 13.02.2011
Сообщений: 5
Репутация: 12
|
Напишите программный UART, для чего сначала отключите аппаратный от выводов, а после - включите. У меня так работает преобразователь для чтения "мозга" автомобиля ROVER 400.
Если нужно - скину участок кода на асме для Atmel. |
||
Оценка
|
Новичок
Регистрация: 31.05.2012
Сообщений: 4
Репутация: 10
|
Цитата:
Если возможно сбросьте и свой участок, возможно он будет в помощь. |
||
Оценка
|
Новичок
Регистрация: 13.02.2011
Сообщений: 5
Репутация: 12
|
Мои участки кода с комментариями. Если что не понятно - спрашивайте.
Цитата:
; Разрешим работу таймера 0
in r16,TIMSK sbr r16,(0<<TOIE1|0<<OCIE1A|0<<OCIE1B|0<<ICIE1|0<<OCIE 0B|1<<TOIE0|0<<OCIE0A) out TIMSK,r16 ; Отправляем байт связи (0x16) на частоте 5 бит/сек. ldi r16,0x16 sts TX_byte,r16 rcall Tx_prg ; Разрешим работу программного UART на прием (делал и так, на частоте ; PD3 - input UART programmable (9600 бод - работает без проблем) receiver: ; Ожидаем прерывания по спаду импульса на INT1 in r16,GIFR ori r16,EXP2(INTF1) ; Сбросим возможный флаг прерывания по INT1 out GIFR,r16 in r16,GIMSK sbr r16,(1<<INT1|0<<INT0); Разрешим прерывания от INT1 out GIMSK,r16 ; Обнулим счетчики таймера 1 секунды и сбросим его флаг rcall res_tim ; В ответ должно прийти 0x55:0x76:0x83 ldi r20,3 ; число байт в сообщении clr r16 sts count_rb,r16 Cikl_1: lds r16,Stat sbrc r16,sinhr rjmp AL_arm ; В случае долгого ожидания (около 1 сек) перезапуск программы соединения ..... Tx_prg: ; Засинхронизируемся с таймером и запустим его на 200 мС lds r16,Stat cbr r16,EXP2(_200mS) (это флаг запуска таймера на 200 мС) sts Stat,r16 ; При синхронизации бит регистра будет сброшен и начнется отсчет времени Tim_sinchr: lds r16,Stat sbrs r16,_200mS rjmp Tim_sinchr ; Бит установлен, начался новый отсчет времени в 200 мС cbr r16,EXP2(_200mS) sts Stat,r16 lds r18,TX_byte ; Выставим старт-бит (передача ведется от младшего бита к старшему) cbi tx_port,tx ; K-line ldi r17,9 ; число передаваемых бит + старт бит rjmp Tx_prg3 Tx_prg1: lsr r18 ; сдвинем вправо передаваемые данные, и по биту Carry будем ориентироваться brcc Tx_prg2 ; Carry равен 1, выставим уровень sbi tx_port,tx ; K-line rjmp Tx_prg3 Tx_prg2: cbi tx_port,tx ; K-line Tx_prg3: lds r16,Stat sbrs r16,_200mS rjmp Tx_prg3 cbr r16,EXP2(_200mS) ; Синхроимпульс пришел, обнулим его sts Stat,r16 dec r17 brne Tx_prg1 ; передача байта завершена. Передадим стоп-бит sbi tx_port,tx ; K-line Tx_prg4: lds r16,Stat sbrs r16,_200mS rjmp Tx_prg4 ; Настроим линию на вход ; sbi DDRtx,tx ; K-line ret |
||
Оценка
|
Ответ |
Опции темы | Поиск в этой теме |
Оценка этой теме | |
Похожие темы |
|
|
Обратная связь РадиоЛоцман Вверх |