Easyelectronics.ru

Электроника для всех
Текущее время: 19 ноя 2018, 10:24

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: UART Low-Speed AT89C51RB2
СообщениеДобавлено: 04 июл 2018, 11:37 
Здравствуйте!

Зарегистрирован: 04 июл 2018, 11:35
Сообщения: 4
Привет, ребята. Буду признателен за любую помощь.
Ситуация в следующем:
Мне требуется выполнить миграцию для одного проекта с МК 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 работает исправно.
Ломаю голову... Возможно я что-то делаю не так.
Буду признателен за любую помощь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART Low-Speed AT89C51RB2
СообщениеДобавлено: 04 июл 2018, 14:40 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 3772
Откуда: г. Липецк
По такому куцему куску не понять, какая частота кварца, это полная программа?
Лучше б выложили проект Proteus.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART Low-Speed AT89C51RB2
СообщениеДобавлено: 04 июл 2018, 15:20 
Здравствуйте!

Зарегистрирован: 04 июл 2018, 11:35
Сообщения: 4
anakost писал(а):
По такому куцему куску не понять, какая частота кварца, это полная программа?
Лучше б выложили проект Proteus.

Эта часть программы отвечающая за uart на 5 бодах.
Частота кварца 12Mhz. Скорость рассчитана правильно:
f=(2^smod)*Fovf/32,
где Fov = (Fosc/12)/(FFFFH-TH1|TL1)
Кодярник (дописал комменты):
Код:
        org     00H
        ljmp    BEGIN

        org     23H
        ljmp    serial_IT

        ORG     001BH   
        JMP     TM1INT

        org 100h

BEGIN:
        clr     A
        mov     TCON, A ;очищаем TCON
        mov     SCON,#50H  ;uart 8bit, speed variable
        MOV     PCON,#80H  ;smod up: speed x2
        MOV     TMOD,#10H   ;T1 16bit mode
        MOV     TH1,#0CFH ;start value load
        MOV     TL1,#02CH     

        setb    ES ;serial interrupt ON
        setb    EA ;all interrupt ON
        setb    ET1 ;T1 interrupt ON
        setb    TR1 ;T1 ON
       
        mov     A,#55h
        mov     sbuf,A ;отправим 55H

        jmp     $ ;крутимся

TM1INT: ;обработчик прерывания по переполнению Т1
        clr     TR1 ;T1 OFF
        MOV     TL1,#02CH ;reload value T1
        MOV     TH1,#0CFH
        SETB    TR1 ;T1 ON

        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


Апнот Атмела по юарту 8051 - http://ww1.microchip.com/downloads/en/AppNotes/doc4346.pdf. Сверялся с ним.
Но там нет примера по режиму с Т1 16бит


Последний раз редактировалось vitallativ 04 июл 2018, 16:05, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART Low-Speed AT89C51RB2
СообщениеДобавлено: 04 июл 2018, 15:38 
Здравствуйте!

Зарегистрирован: 04 июл 2018, 11:35
Сообщения: 4
Выложил именно проблемный кусок кода.
Остальными 4К строками не буду вам глаза мозолить.
Прикладываю проект протеуса и хекс по юарту 5 бод.
https://yadi.sk/d/ur8z6JiQ3YkhGW


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART Low-Speed AT89C51RB2
СообщениеДобавлено: 04 июл 2018, 18:28 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 3772
Откуда: г. Липецк
UART.pdsprj для какой версии Протеус? Если для 8, мне его и открыть нечем.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART Low-Speed AT89C51RB2
СообщениеДобавлено: 06 июл 2018, 11:33 
Здравствуйте!

Зарегистрирован: 04 июл 2018, 11:35
Сообщения: 4
anakost писал(а):
UART.pdsprj для какой версии Протеус? Если для 8, мне его и открыть нечем.

К сожалению именно восьмерка


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART Low-Speed AT89C51RB2
СообщениеДобавлено: 06 июл 2018, 13:22 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 3772
Откуда: г. Липецк
Я пользуюсь 7.10, в ней есть модель AT89C51RB2. 8 версию ставить не планирую, пока там все глюки не подчистят, так что извини.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: sdv_cyborg


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB