Artog 0 18 августа, 2005 Опубликовано 18 августа, 2005 · Жалоба Ниже приведен код, который работает на 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 0 18 августа, 2005 Опубликовано 18 августа, 2005 · Жалоба Таймер обычно ставят в режим с автоматической перезагрузкой. Это делается один раз в начале программы. Тогда и прерывания от него обрабатвать не нужно и переинициализировать тоже. А так как у вас сделано лично я никогда не пробовал. Возможно не работает из-за того, что обработчик прерывания автоматически сбрасывает флаг переполнения таймера, которым собственно UART тактируется, но как это реализовано у Atmel - можно только догадываться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artog 0 19 августа, 2005 Опубликовано 19 августа, 2005 · Жалоба Таймер обычно ставят в режим с автоматической перезагрузкой. Это делается один раз в начале программы. Тогда и прерывания от него обрабатвать не нужно и переинициализировать тоже. А так как у вас сделано лично я никогда не пробовал. Возможно не работает из-за того, что обработчик прерывания автоматически сбрасывает флаг переполнения таймера, которым собственно UART тактируется, но как это реализовано у Atmel - можно только догадываться. <{POST_SNAPBACK}> Еще раз процитирую даташит: 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 бит/сек. Но он не работает. :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
psL 0 19 августа, 2005 Опубликовано 19 августа, 2005 · Жалоба прошу прощения за невнимательность - смутила нереальная (очень низкая) скорость передачи. Можно попробовать проверить по косвенным признакам(инвертируя например свободную ногу контроллера) возникают ли прерывания от таймера и при передаче. Если возникают, то возможно в порт записан 0 или аппаратные проблемы. Если прерывания не возникают, то можно попробовать явно инициализировать все управляющие регистры, не надеясь на то, что они инициализируются по сбросу. Проверить генерируются ли прерывания по отдельности, то есть отключить прерывание сначала от уарта, а потом от таймера. Попробовать на другом экземпляре. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artog 0 20 августа, 2005 Опубликовано 20 августа, 2005 · Жалоба прошу прощения за невнимательность - смутила нереальная (очень низкая) скорость передачи. Можно попробовать проверить по косвенным признакам(инвертируя например свободную ногу контроллера) возникают ли прерывания от таймера и при передаче. Если возникают, то возможно в порт записан 0 или аппаратные проблемы. Если прерывания не возникают, то можно попробовать явно инициализировать все управляющие регистры, не надеясь на то, что они инициализируются по сбросу. Проверить генерируются ли прерывания по отдельности, то есть отключить прерывание сначала от уарта, а потом от таймера. Попробовать на другом экземпляре. <{POST_SNAPBACK}> Код: 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 0 20 августа, 2005 Опубликовано 20 августа, 2005 · Жалоба попробуйте закомментировать строки CLR TR1; SETB TR1; они принципиально не нужны. Хотя в еррате и не указно, что RMW операции относительно TCON могут приводить к потере прерываний, но кто знает. Вообще, я бы взял стандартный код с atmel.com и проверил, UART то вообще принципиально работает? А потом привел бы его к желаемому виду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artog 0 22 августа, 2005 Опубликовано 22 августа, 2005 · Жалоба попробуйте закомментировать строки CLR TR1; SETB TR1; они принципиально не нужны. Хотя в еррате и не указно, что RMW операции относительно TCON могут приводить к потере прерываний, но кто знает. Вообще, я бы взял стандартный код с atmel.com и проверил, UART то вообще принципиально работает? А потом привел бы его к желаемому виду. <{POST_SNAPBACK}> Вообще, я должен был сразу сказать, что в остальных режимах UART работает нормально. Timer1 в режиме автоперегрузки в качестве baud rate - работает и Timer2 в режиме автоперегрузки в качестве baud rate тоже работает. Закомментировать строки CLR TR1; SETB TR1; тоже пробовал - не помогает. Ятак думаю что это просто глюк, и прийдется делать работу UARTа вручную. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeyip 0 26 октября, 2010 Опубликовано 26 октября, 2010 · Жалоба По моему в вышенаписанной программе нет установки стека, поэтому она и не работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 26 октября, 2010 Опубликовано 26 октября, 2010 · Жалоба По моему в вышенаписанной программе нет установки стека, поэтому она и не работает. Для данной программы достаточно стека установленного "по умолчанию" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться