Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT89S8253
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
Artog
Ниже приведен код, который работает на 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

Может кто чего подскажет?
psL
Таймер обычно ставят в режим с автоматической перезагрузкой.
Это делается один раз в начале программы. Тогда и прерывания от него обрабатвать не нужно и переинициализировать тоже.
А так как у вас сделано лично я никогда не пробовал.
Возможно не работает из-за того, что обработчик прерывания автоматически сбрасывает флаг переполнения таймера, которым собственно UART тактируется, но как это реализовано у Atmel - можно только догадываться.
Artog
Цитата(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
psL
прошу прощения за невнимательность - смутила нереальная (очень низкая) скорость передачи.

Можно попробовать проверить по косвенным признакам(инвертируя например свободную ногу контроллера) возникают ли прерывания от таймера и при передаче. Если возникают, то возможно в порт записан 0 или аппаратные проблемы.
Если прерывания не возникают, то можно попробовать явно инициализировать все управляющие регистры, не надеясь на то, что они инициализируются по сбросу.
Проверить генерируются ли прерывания по отдельности, то есть отключить прерывание сначала от уарта, а потом от таймера.
Попробовать на другом экземпляре.
Artog
Цитата(psL @ Aug 19 2005, 19:52)
прошу прощения за невнимательность - смутила нереальная (очень низкая) скорость передачи.

Можно попробовать проверить по косвенным признакам(инвертируя например свободную ногу контроллера) возникают ли прерывания от таймера и при передаче. Если возникают, то возможно в порт записан 0 или аппаратные проблемы.
Если прерывания не возникают, то можно попробовать явно инициализировать все управляющие регистры, не надеясь на то, что они инициализируются по сбросу.
Проверить генерируются ли прерывания по отдельности, то есть отключить прерывание сначала от уарта, а потом от таймера.
Попробовать на другом экземпляре.
*


Код:

PCON EQU 87H
T2CON EQU 0C8H
RCLK EQU 0CDH ;T2CON.5
AV1 EQU P2.0
AV2 EQU P2.1

ORG 0000H
JMP BEGIN
ORG 001BH
JMP TM1INT
ORG 0023H
JMP SRLINT

ORG 0100H
BEGIN:
MOV A,#0
MOV R0,#0FFH
CLR_RAM:
MOV @R0,A ;все SFR в 0
DJNZ R0,CLR_RAM
CLR AV1
CLR AV2
MOV SCON,#50H
MOV PCON,#80H ;SMOD1=1
MOV TMOD,#10H ;T1- синхронизатор приемника UART
MOV TH1,#0CFH ;baud rate is equal to 5 baud
MOV TL1,#2CH
SETB ES ;Enable serial interrupt
SETB ET1 ;Enable Timer1 interrupt
SETB EA ;Enable global interrupt
SETB TR1 ;Timer 1 run
MOV SBUF,#55H
JMP $

; обработчик Timer 1
TM1INT:
CPL AV1 ;для проверки входа в прерывание
CLR TR1
MOV TH1,#0CFH
MOV TL1,#2CH
SETB TR1
TM1INT_1:
RETI

;обработчик UART
SRLINT:
CLR TI
CPL AV2 ;для проверки входа в прерывание
MOV SBUF,#55H
RETI

end

Результаты:
В прерывание по Timer1 входит - на AV1(P2.0) меандр с периодом 25 мс.
В прерывание по UART не входит - AV2(P2.1) в нуле.
TxD - в единице.
include файла от AT89S8253 не нашел, но все используемые регистры есть в AT89S8252 и имеют теже адреса.
Использую Phyton PICE-51 v.3.02.56.
Программа проверена на двух микроконтроллерах (больше нет).
psL
попробуйте закомментировать строки CLR TR1; SETB TR1; они принципиально не нужны. Хотя в еррате и не указно, что RMW операции относительно TCON могут приводить к потере прерываний, но кто знает.

Вообще, я бы взял стандартный код с atmel.com и проверил, UART то вообще принципиально работает?
А потом привел бы его к желаемому виду.
Artog
Цитата(psL @ Aug 20 2005, 16:54)
попробуйте закомментировать строки CLR TR1; SETB TR1; они принципиально не нужны. Хотя в еррате и не указно, что RMW операции относительно TCON могут приводить к потере прерываний, но кто знает.

Вообще, я бы взял стандартный код с atmel.com и проверил, UART то вообще принципиально работает?
А потом привел бы его к желаемому виду.
*


Вообще, я должен был сразу сказать, что в остальных режимах UART работает нормально. Timer1 в режиме автоперегрузки в качестве baud rate - работает и Timer2 в режиме автоперегрузки в качестве baud rate тоже работает.
Закомментировать строки CLR TR1; SETB TR1; тоже пробовал - не помогает.
Ятак думаю что это просто глюк, и прийдется делать работу UARTа вручную.
sergeyip
По моему в вышенаписанной программе нет установки стека, поэтому она и не работает. biggrin.gif
Палыч
Цитата(sergeyip @ Oct 26 2010, 12:16) *
По моему в вышенаписанной программе нет установки стека, поэтому она и не работает. biggrin.gif

Для данной программы достаточно стека установленного "по умолчанию"
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.