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

vitallativ

Новичок
  • Постов

    2
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные vitallativ


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

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

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

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