Радиолоцман Электроника en
расширенный поиск +
  
Ответ
 
Опции темы Поиск в этой теме Оценить тему
Старый 04.07.2018, 09:02 #1
vitallativ
Новичок
 
Регистрация: 31.05.2012
Сообщений: 4
Репутация: 10
vitallativ Новичок
Exclamation 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 работает исправно.
Ломаю голову... Возможно я что-то делаю не так.
Буду признателен за любую помощь.
vitallativ вне форума  
Оценка 0
Старый 04.07.2018, 13:41 #2
vitallativ
Новичок
 
Регистрация: 31.05.2012
Сообщений: 4
Репутация: 10
vitallativ Новичок
По умолчанию

Частота кварца 12Мгц
vitallativ вне форума  
Оценка 0
Компания FANSO расширила линейку своей продукции. Дополнительно к имеющимся батарейкам в цилиндрическом и призматическом форм-факторах запущено производство Li-MnO2 батареек в корпусе «таблетка» с напряжением 3,0 В.
Старый 05.07.2018, 17:48 #3
dr.doc
Новичок
 
Регистрация: 13.02.2011
Сообщений: 5
Репутация: 12
dr.doc Новичок
2 0
0 0
По умолчанию

Напишите программный UART, для чего сначала отключите аппаратный от выводов, а после - включите. У меня так работает преобразователь для чтения "мозга" автомобиля ROVER 400.
Если нужно - скину участок кода на асме для Atmel.
dr.doc вне форума  
Оценка +1
Отладочная плата на основе одного из самых популярных WiFi-модулей Espressif ESP32-WROVER-B позволяет в самые короткие сроки запустить приложение с поддержкой беспроводных стандартов WiFi 802.11b/g/n и Bluetooth Classic/BLE. Ресурсов встроенного в модуль чипа ESP32-D0WD хватит для решения даже очень сложных задач.
Старый 06.07.2018, 09:44 #4
vitallativ
Новичок
 
Регистрация: 31.05.2012
Сообщений: 4
Репутация: 10
vitallativ Новичок
По умолчанию

Цитата:
Сообщение от dr.doc Посмотреть сообщение
Напишите программный UART, для чего сначала отключите аппаратный от выводов, а после - включите. У меня так работает преобразователь для чтения "мозга" автомобиля ROVER 400.
Если нужно - скину участок кода на асме для Atmel.
Да, уже реализовал программный UART на том же Т1, которым формирую 100 мс (это 2 цикла счета) для сдвига в центр бита и 200 мс (4 цикла счета) для побитового перехода. Детектирую стоп-бит прерыванием по INT0 соединенной с RxD. 5 бод у меня исп-ся только для инциализации связи, поэтому не хочется этот процесс разделять во времени с остальными на весь цикл работы программы. Собственно поэтому и INT0. Код куском работает, а вот внедрить в мой большой проект пока не удалось, сплошные наслойки ресурсов. Код тяжелый для восприятия, плавится мозг...
Если возможно сбросьте и свой участок, возможно он будет в помощь.
vitallativ вне форума  
Оценка 0
Старый 07.07.2018, 06:16 #5
dr.doc
Новичок
 
Регистрация: 13.02.2011
Сообщений: 5
Репутация: 12
dr.doc Новичок
2 0
0 0
По умолчанию

Мои участки кода с комментариями. Если что не понятно - спрашивайте.
Цитата:
; Разрешим работу таймера 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
dr.doc вне форума  
Оценка 0
Старый 10.07.2018, 13:09 #6
vitallativ
Новичок
 
Регистрация: 31.05.2012
Сообщений: 4
Репутация: 10
vitallativ Новичок
По умолчанию

Цитата:
Сообщение от dr.doc Посмотреть сообщение
Мои участки кода с комментариями. Если что не понятно - спрашивайте.
Благодарю
vitallativ вне форума  
Оценка 0
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Оценка этой теме
Оценка этой теме:
Похожие темы
Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход
Часовой пояс GMT +3, время: 17:45.
Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Снизить потери энергии: гетероструктурные полевые транзисторы CoolGaN от Infineon
Пассивные компоненты для передовых разработок
Срезы портала ↓
Рейтинг@Mail.ru