Easyelectronics.ru

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

Часовой пояс: 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
Сообщения: 3739
Откуда: г. Липецк
По такому куцему куску не понять, какая частота кварца, это полная программа?
Лучше б выложили проект 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
Сообщения: 3739
Откуда: г. Липецк
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
Сообщения: 3739
Откуда: г. Липецк
Я пользуюсь 7.10, в ней есть модель AT89C51RB2. 8 версию ставить не планирую, пока там все глюки не подчистят, так что извини.


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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