Перейти к содержанию
    

AT89S8253

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По моему в вышенаписанной программе нет установки стека, поэтому она и не работает. :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По моему в вышенаписанной программе нет установки стека, поэтому она и не работает. :biggrin:

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...