Jump to content

    

Recommended Posts

Ниже приведен код, который работает на 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

 

Может кто чего подскажет?

Share this post


Link to post
Share on other sites

Таймер обычно ставят в режим с автоматической перезагрузкой.

Это делается один раз в начале программы. Тогда и прерывания от него обрабатвать не нужно и переинициализировать тоже.

А так как у вас сделано лично я никогда не пробовал.

Возможно не работает из-за того, что обработчик прерывания автоматически сбрасывает флаг переполнения таймера, которым собственно UART тактируется, но как это реализовано у Atmel - можно только догадываться.

Share this post


Link to post
Share on other sites
Таймер обычно ставят в режим с автоматической перезагрузкой.

Это делается один раз в начале программы. Тогда и прерывания от него обрабатвать не нужно и переинициализировать тоже.

А так как у вас сделано лично я никогда не пробовал.

Возможно не работает из-за того, что обработчик прерывания автоматически сбрасывает флаг переполнения таймера, которым собственно 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 бит/сек. Но он не работает. :(

Share this post


Link to post
Share on other sites

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

 

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

Если прерывания не возникают, то можно попробовать явно инициализировать все управляющие регистры, не надеясь на то, что они инициализируются по сбросу.

Проверить генерируются ли прерывания по отдельности, то есть отключить прерывание сначала от уарта, а потом от таймера.

Попробовать на другом экземпляре.

Share this post


Link to post
Share on other sites
прошу прощения за невнимательность - смутила нереальная (очень низкая) скорость передачи.

 

Можно попробовать проверить по косвенным признакам(инвертируя например свободную ногу контроллера) возникают ли прерывания от таймера и при передаче. Если возникают, то возможно в порт записан 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.

Программа проверена на двух микроконтроллерах (больше нет).

Share this post


Link to post
Share on other sites

попробуйте закомментировать строки CLR TR1; SETB TR1; они принципиально не нужны. Хотя в еррате и не указно, что RMW операции относительно TCON могут приводить к потере прерываний, но кто знает.

 

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

А потом привел бы его к желаемому виду.

Share this post


Link to post
Share on other sites
попробуйте закомментировать строки CLR TR1; SETB TR1; они принципиально не нужны. Хотя в еррате и не указно, что RMW операции относительно TCON могут приводить к потере прерываний, но кто знает.

 

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

А потом привел бы его к желаемому виду.

 

Вообще, я должен был сразу сказать, что в остальных режимах UART работает нормально. Timer1 в режиме автоперегрузки в качестве baud rate - работает и Timer2 в режиме автоперегрузки в качестве baud rate тоже работает.

Закомментировать строки CLR TR1; SETB TR1; тоже пробовал - не помогает.

Ятак думаю что это просто глюк, и прийдется делать работу UARTа вручную.

Share this post


Link to post
Share on other sites
По моему в вышенаписанной программе нет установки стека, поэтому она и не работает. :biggrin:

Для данной программы достаточно стека установленного "по умолчанию"

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this