Перейти к содержанию
    

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 работает исправно.

Ломаю голову... Возможно я что-то делаю не так.

Буду признателен за любую помощь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...