Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с передачей по RS-232
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
MichaelTLT
Здравствуйте!

Есть контроллер AT89S52. К нему напрямую, без всяких извращений подключен MAX232 со стандартной обвязкой из 5 конденсаторов. Я пытаюсь вывести в последовательный порт данные, но на компьютере принимаю какой-то мусор. Причем этот мусор отличается от данных всего-лишь двумя старшими битами. Например, отправляю в порт число 41h, а получаю попеременно 81h и C1h. Вот пример программы:

Код
cseg
                                
org    00h
jmp        init

init:
    mov    p3, #0FFh
    mov    SCON, #50h
    mov    TH1, #0F9h
    orl    TMOD, #20h
    setb    TR1

main:
    clr    TI
    mov    SBUF, #41h
    jnb    TI, $
    sjmp    main


Скажите, где засада?
MAX232 - нехитрое устройство, данные на него отправляются по одному биту. И если бы он был глючный, то наверно портились все бы биты или большая их часть. Но у меня стабильно отличие только в двух старших битах. Может с программой что-нибудь не так?
Палыч
Цитата(MichaelTLT @ Jan 27 2012, 11:40) *
Скажите, где засада?

Вероятно, несовпадение скоростей - неправильно расчитано значение TH1
ChipKiller
Цитата
.. где засада?
... попробуйте так
Код
    orl    PCON,#80h       ; установим бит удвоения скорости передачи
    mov    A,SerialSpeed
    mov    TH1,A           ; скорость передачи
    mov    TL1,A
    mov    SCON,SerialMode    ; запишем режим работы UASP
    anl    TMOD,#0Fh       ; маскируем T/C0
    orl    TMOD,#20h       ; T/C1 в режим 2
    setb    TR1                ; запустим таймер
.........
.........
    jnb    TI,$   ; ждем окончания передачи
    clr    TI     ; сбрасываем флаг передачи
    mov    SBUF,A ; передача байта в буфер UART
MichaelTLT
Цитата(Палыч @ Jan 27 2012, 13:04) *
Вероятно, несовпадение скоростей - неправильно расчитано значение TH1


Возможно. Я считал по такой формуле: 256 - (Fosc / 384 / 9600). При Fosc = 24МГц получил 249.5 и округлил до 249 (0xF9h).
Пробовал менять это значение на единицу в обе стороны. Тогда получаю на выходе вообще хаос )

Цитата(ChipKiller @ Jan 27 2012, 14:43) *
... попробуйте так


Да! Все получилось )
Только интересно, почему (ушел искать про удвоение скорости...). Спасибо за помощь sm.gif
SSerge
Цитата(MichaelTLT @ Jan 27 2012, 22:03) *
Возможно. Я считал по такой формуле: 256 - (Fosc / 384 / 9600). При Fosc = 24МГц получил 249.5 и округлил до 249 (0xF9h).

Ну вот вам и разгадка: делить частоту нужно на (Fosc / 384 / 9600)=6.5
При делении на 6 или 7 ошибка составляет ~0.5/6.5 = 7.7%, многовато.
Ближе к концу посылки накапливается ошибка более половины бита и старшие биты принимаются неправильно.
Палыч
Цитата(MichaelTLT @ Jan 27 2012, 19:03) *
Только интересно, почему

Элементарно! При F=24МГц и BR=9600 у Вас каждый импульс на UART должен быть длительностью 6.51 "тиков" таймера (24 000 000 / (32*12*9600) ). Вы приняли - 7, т.е. с ошибкой около 7%, что неприемлемо. При удвоении частоты получаем 6.51 х 2 = 13.02 (берем 13 с ошибкой 0.1% - незначительная ошибка).
MichaelTLT
Большое спасибо! Ваши советы мне по-настоящему помогли.
Denis24
Я всегда пользовался так:
;настройка последовательного порта 115200 8n1,кварц 11059
;формула FOSC/(32*(65536-RCAP2H,RCAP2L)
MOV SCON,#050H
MOV RCAP2L,#0FDH
MOV RCAP2H,#0FFH
MOV T2CON,#034H
CLR RI
setb REN ; enable serial reception
jmp start

либо без RCAP2

BAUD_9600 EQU 0fdh ; 9600 baud
initialize:
; mov PCON, #80h ; initialize power control register
mov IE, #0 ; deactivate all interrupts
mov SCON, #01000000b ; serial port mode one
mov TMOD, #00100000b ; timer one 8-bit auto-reload,
mov TH1, #BAUD_9600 ; timer one reload value
mov TCON, #01000000b ; start timer one
setb REN ; enable serial reception
setb EA ; global interrupt enable
setb ES ; UART interrupt enable
Denis24
Для кварца 12 или 24 Мгц без RCAP2 получить правильную скорость не получиться , только 10418 бот, железные СОМ порты на ББ поддерживают.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.