|
Новичок
Регистрация: 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 |
||
|
Оценка
|
| Обратная связь РадиоЛоцман Вверх |