|
Проблема с передачей по RS-232 |
|
|
|
Jan 27 2012, 07:40
|
Группа: Новичок
Сообщений: 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 - нехитрое устройство, данные на него отправляются по одному биту. И если бы он был глючный, то наверно портились все бы биты или большая их часть. Но у меня стабильно отличие только в двух старших битах. Может с программой что-нибудь не так?
|
|
|
|
|
 |
Ответов
(1 - 8)
|
Jan 27 2012, 10:43
|

Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Jan 27 2012, 15:03
|
Группа: Новичок
Сообщений: 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)  ... попробуйте так Да! Все получилось ) Только интересно, почему (ушел искать про удвоение скорости...). Спасибо за помощь
|
|
|
|
|
Jan 27 2012, 15:19
|
Профессионал
    
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Jan 28 2012, 09:27
|
Группа: Новичок
Сообщений: 8
Регистрация: 27-01-12
Пользователь №: 69 910

|
Большое спасибо! Ваши советы мне по-настоящему помогли.
|
|
|
|
|
Apr 17 2012, 10:28
|
Группа: Участник
Сообщений: 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
|
|
|
|
|
Apr 18 2012, 04:07
|
Группа: Участник
Сообщений: 11
Регистрация: 6-03-12
Пользователь №: 70 636

|
Для кварца 12 или 24 Мгц без RCAP2 получить правильную скорость не получиться , только 10418 бот, железные СОМ порты на ББ поддерживают.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|