UART Low-Speed AT89C51RB2
04.07.2018, 09:02
|
#1
|
Новичок
Регистрация: 31.05.2012
Сообщений: 4
Репутация: 10
|
UART Low-Speed AT89C51RB2
Привет, ребята. Буду признателен за любую помощь.
Ситуация в следующем:
Мне требуется выполнить миграцию для одного проекта с МК 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.
|
Т2 у меня занят, Internal_BaudRate_Generator на 5 бод настроить не выйдет. Юзаем Т1 на таймере 1 в режиме 16бит с софтварной перезагрузкой в прерывании (как ДШ завещал). Код (только UART) асемблирую и прошиваю следующий:
Код:
$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
В результате стартовую посылку "55H" МК не отправляет, нога TxD прижимается к лог. 1 и висит, на прием МК также не реагирует. Понимаю, что не показатель, но в протеусе данный код работает прекрасно.
Ко всему вышесказанному добавлю, что запустить UART на Т1 (16bit software reload in interrupt) ни на одной из скоростей у меня не вышло. На Т2 и Internal_BaudRate_Generator, да даже на Т1 в режиме 8бит автоперезагрузки (только высокие скорости) UART работает исправно.
Ломаю голову... Возможно я что-то делаю не так.
Буду признателен за любую помощь.
|
|
Оценка
0
|
|
04.07.2018, 13:41
|
#2
|
Новичок
Регистрация: 31.05.2012
Сообщений: 4
Репутация: 10
|
Частота кварца 12Мгц
|
|
Оценка
0
|
|
|
Производитель – Maxim Integrated Products – позиционирует серию интегральных DC/DC с предельно низким током покоя NanoPower как решение, позволяющее серьезно повысить КПД изделий с автономным электропитанием. Так ли это?
В статье описано практическое решение на базе представителя семейства MAX17225, экспериментальная установка для его испытания и результат этого испытания.
|
05.07.2018, 17:48
|
#3
|
Новичок
Регистрация: 13.02.2011
Сообщений: 5
Репутация: 12
|
Напишите программный UART, для чего сначала отключите аппаратный от выводов, а после - включите. У меня так работает преобразователь для чтения "мозга" автомобиля ROVER 400.
Если нужно - скину участок кода на асме для Atmel.
|
|
Оценка
+1
|
|
|
Решения на галлий-нитриде (GaN) обладают фундаментальными преимуществами перед кремнием. В частности, имея более высокую критическую напряжённость электрического поля, в сравнении с традиционными кремниевыми транзисторами, транзисторы на основе галлий-нитрида обладают выдающимися динамическими характеристиками, что позволяет коммутировать их на высоких частотах.
А специально разработанные для них микросхемы драйверов семейства GaN EiceDriver™ помогут быстро и просто реализовать это на практике.
|
06.07.2018, 09:44
|
#4
|
Новичок
Регистрация: 31.05.2012
Сообщений: 4
Репутация: 10
|
Цитата:
Сообщение от dr.doc
Напишите программный UART, для чего сначала отключите аппаратный от выводов, а после - включите. У меня так работает преобразователь для чтения "мозга" автомобиля ROVER 400.
Если нужно - скину участок кода на асме для Atmel.
|
Да, уже реализовал программный UART на том же Т1, которым формирую 100 мс (это 2 цикла счета) для сдвига в центр бита и 200 мс (4 цикла счета) для побитового перехода. Детектирую стоп-бит прерыванием по INT0 соединенной с RxD. 5 бод у меня исп-ся только для инциализации связи, поэтому не хочется этот процесс разделять во времени с остальными на весь цикл работы программы. Собственно поэтому и INT0. Код куском работает, а вот внедрить в мой большой проект пока не удалось, сплошные наслойки ресурсов. Код тяжелый для восприятия, плавится мозг...
Если возможно сбросьте и свой участок, возможно он будет в помощь.
|
|
Оценка
0
|
|
07.07.2018, 06:16
|
#5
|
Новичок
Регистрация: 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
|
|
|
Оценка
0
|
|
10.07.2018, 13:09
|
#6
|
Новичок
Регистрация: 31.05.2012
Сообщений: 4
Репутация: 10
|
Цитата:
Сообщение от dr.doc
Мои участки кода с комментариями. Если что не понятно - спрашивайте.
|
Благодарю
|
|
Оценка
0
|
|
Опции темы |
Поиск в этой теме |
|
|
Оценка этой теме |
|
Похожие темы
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
|
|