реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Проблема с передачей по RS-232
MichaelTLT
сообщение Jan 27 2012, 07:40
Сообщение #1





Группа: Новичок
Сообщений: 8
Регистрация: 27-01-12
Пользователь №: 69 910



Здравствуйте!

Есть контроллер 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 - нехитрое устройство, данные на него отправляются по одному биту. И если бы он был глючный, то наверно портились все бы биты или большая их часть. Но у меня стабильно отличие только в двух старших битах. Может с программой что-нибудь не так?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 27 2012, 09:04
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(MichaelTLT @ Jan 27 2012, 11:40) *
Скажите, где засада?

Вероятно, несовпадение скоростей - неправильно расчитано значение TH1
Go to the top of the page
 
+Quote Post
ChipKiller
сообщение Jan 27 2012, 10:43
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 26-12-11
Пользователь №: 69 097



Цитата
.. где засада?
... попробуйте так
Код
    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
Go to the top of the page
 
+Quote Post
MichaelTLT
сообщение Jan 27 2012, 15:03
Сообщение #4





Группа: Новичок
Сообщений: 8
Регистрация: 27-01-12
Пользователь №: 69 910



Цитата(Палыч @ Jan 27 2012, 13:04) *
Вероятно, несовпадение скоростей - неправильно расчитано значение TH1


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

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


Да! Все получилось )
Только интересно, почему (ушел искать про удвоение скорости...). Спасибо за помощь sm.gif
Go to the top of the page
 
+Quote Post
SSerge
сообщение Jan 27 2012, 15:19
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(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%, многовато.
Ближе к концу посылки накапливается ошибка более половины бита и старшие биты принимаются неправильно.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 27 2012, 15:33
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(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% - незначительная ошибка).
Go to the top of the page
 
+Quote Post
MichaelTLT
сообщение Jan 28 2012, 09:27
Сообщение #7





Группа: Новичок
Сообщений: 8
Регистрация: 27-01-12
Пользователь №: 69 910



Большое спасибо! Ваши советы мне по-настоящему помогли.
Go to the top of the page
 
+Quote Post
Denis24
сообщение Apr 17 2012, 10:28
Сообщение #8





Группа: Участник
Сообщений: 11
Регистрация: 6-03-12
Пользователь №: 70 636



Я всегда пользовался так:
;настройка последовательного порта 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 - Apr 17 2012, 10:29
Go to the top of the page
 
+Quote Post
Denis24
сообщение Apr 18 2012, 04:07
Сообщение #9





Группа: Участник
Сообщений: 11
Регистрация: 6-03-12
Пользователь №: 70 636



Для кварца 12 или 24 Мгц без RCAP2 получить правильную скорость не получиться , только 10418 бот, железные СОМ порты на ББ поддерживают.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 14:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01429 секунд с 7
ELECTRONIX ©2004-2016