HRP-N3 - серия источников питания с максимальной пиковой мощностью в 350% от MEAN WELL
Новичок
 
Регистрация: 31.05.2012
Сообщений: 4
Репутация: 10
 
04.07.2018 09:02 #1
Привет, ребята. Буду признателен за любую помощь.
Ситуация в следующем:
Мне требуется выполнить миграцию для одного проекта с МК 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 работает исправно.
Ломаю голову... Возможно я что-то делаю не так.
Буду признателен за любую помощь.
Оценка
Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель.
Новичок
 
Регистрация: 31.05.2012
Сообщений: 4
Репутация: 10
 
04.07.2018 13:41 #2
Частота кварца 12Мгц
Оценка
Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW. Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного.
Новичок
 
Регистрация: 13.02.2011
Сообщений: 5
Репутация: 12
2 0
0 0
 
05.07.2018 17:48 #3
Напишите программный UART, для чего сначала отключите аппаратный от выводов, а после - включите. У меня так работает преобразователь для чтения "мозга" автомобиля ROVER 400.
Если нужно - скину участок кода на асме для Atmel.
Оценка
Новичок
 
Регистрация: 31.05.2012
Сообщений: 4
Репутация: 10
 
06.07.2018 09:44 #4
Цитата:
Сообщение от dr.doc
Напишите программный UART, для чего сначала отключите аппаратный от выводов, а после - включите. У меня так работает преобразователь для чтения "мозга" автомобиля ROVER 400.
Если нужно - скину участок кода на асме для Atmel.
Да, уже реализовал программный UART на том же Т1, которым формирую 100 мс (это 2 цикла счета) для сдвига в центр бита и 200 мс (4 цикла счета) для побитового перехода. Детектирую стоп-бит прерыванием по INT0 соединенной с RxD. 5 бод у меня исп-ся только для инциализации связи, поэтому не хочется этот процесс разделять во времени с остальными на весь цикл работы программы. Собственно поэтому и INT0. Код куском работает, а вот внедрить в мой большой проект пока не удалось, сплошные наслойки ресурсов. Код тяжелый для восприятия, плавится мозг...
Если возможно сбросьте и свой участок, возможно он будет в помощь.
Оценка
Новичок
 
Регистрация: 13.02.2011
Сообщений: 5
Репутация: 12
2 0
0 0
 
07.07.2018 06:16 #5
Мои участки кода с комментариями. Если что не понятно - спрашивайте.
Цитата:
; Разрешим работу таймера 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
Оценка
Новичок
 
Регистрация: 31.05.2012
Сообщений: 4
Репутация: 10
 
10.07.2018 13:09 #6
Цитата:
Сообщение от dr.doc
Мои участки кода с комментариями. Если что не понятно - спрашивайте.
Благодарю
Оценка
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

Быстрый переход
Электронные компоненты. Бесплатная доставка по России
Часовой пояс GMT +3, время: 02:06.
Обратная связь РадиоЛоцман Вверх