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

 
 
> AT89S8253, не работает Timer1 в качестве baud rate
Artog
сообщение Aug 18 2005, 13:57
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 8-08-05
Пользователь №: 7 448



Ниже приведен код, который работает на AT89S8252, но не работает на AT89S8253. Выдержка из даташита:
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.

Код:
ORG 0000H
JMP BEGIN
ORG 001BH
JMP TM1INT
ORG 0023H
JMP SRLINT

ORG 0100H

BEGIN:
MOV SCON,#50H
MOV TMOD,#10H
MOV TH1,#0CFH ;baud rate is equal to 5 baud
MOV TL1,#2CH
ORL PCON,#10000000B ;SMOD1=1

SETB ES ;Enable serial interrupt
SETB ET1
SETB EA ;Enable global interrupt
SETB TR1 ;Timer 1 run

MOV SBUF,#55H

JMP $

TM1INT:
CLR TR1
MOV TH1,#0CFH
MOV TL1,#2CH
SETB TR1
RETI

SRLINT:
;JNB TI,TI_NINT
CLR TI
MOV SBUF,#55H
TI_NINT:
RETI

end

Может кто чего подскажет?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
psL
сообщение Aug 18 2005, 17:04
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



Таймер обычно ставят в режим с автоматической перезагрузкой.
Это делается один раз в начале программы. Тогда и прерывания от него обрабатвать не нужно и переинициализировать тоже.
А так как у вас сделано лично я никогда не пробовал.
Возможно не работает из-за того, что обработчик прерывания автоматически сбрасывает флаг переполнения таймера, которым собственно UART тактируется, но как это реализовано у Atmel - можно только догадываться.
Go to the top of the page
 
+Quote Post
Artog
сообщение Aug 19 2005, 07:37
Сообщение #3





Группа: Новичок
Сообщений: 5
Регистрация: 8-08-05
Пользователь №: 7 448



Цитата(psL @ Aug 18 2005, 20:04)
Таймер обычно ставят в режим с автоматической перезагрузкой.
Это делается один раз в начале программы. Тогда и прерывания от него обрабатвать не нужно и переинициализировать тоже.
А так как у вас сделано лично я никогда не пробовал.
Возможно не работает из-за того, что обработчик прерывания автоматически сбрасывает флаг переполнения таймера, которым собственно UART тактируется, но как это реализовано у Atmel - можно только догадываться.
*


Еще раз процитирую даташит:
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.

Это единственный режим в котором можжно получить 5 бит/сек. Но он не работает. sad.gif
Go to the top of the page
 
+Quote Post
psL
сообщение Aug 19 2005, 16:52
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



прошу прощения за невнимательность - смутила нереальная (очень низкая) скорость передачи.

Можно попробовать проверить по косвенным признакам(инвертируя например свободную ногу контроллера) возникают ли прерывания от таймера и при передаче. Если возникают, то возможно в порт записан 0 или аппаратные проблемы.
Если прерывания не возникают, то можно попробовать явно инициализировать все управляющие регистры, не надеясь на то, что они инициализируются по сбросу.
Проверить генерируются ли прерывания по отдельности, то есть отключить прерывание сначала от уарта, а потом от таймера.
Попробовать на другом экземпляре.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 20th June 2025 - 15:54
Рейтинг@Mail.ru


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