|
ATmega 16L проблема с UART |
|
|
|
Apr 17 2008, 11:31
|
Группа: Новичок
Сообщений: 9
Регистрация: 17-04-08
Пользователь №: 36 821

|
Выручай всезнающий Олл! ATmega 16L проблема с UART, а именно после посылки всего, когда буфер уже пустой возвращается из интерапта на начало программы (фактически рестарт). Код прерывания Код ISR(USART0_UDRE_INTERRUPT) { uint8_t temp_tail; if ( USART0_TX_Head != USART0_TX_Tail) { temp_tail = (USART0_TX_Tail + 1) & USART_TX_BUFFER_MASK; USART0_TX_Tail = temp_tail; USART0_UDR = USART0_TX_Buffer[temp_tail]; } else { USART0_UCSRB &= ~(1<<USART0_UDRIE); USART0_Enable_Int_Status = 1; } } Что я делаю не так. При просмотре в Студии в режиме ассемблега, видно что в переходе на прерывание все пакуется в стек, потом также аккуратно распаковывается, и возвращается по команде RTI, но почемуто в старт? Може кто с таким эффектом сталкивался?
|
|
|
|
|
 |
Ответов
|
Apr 18 2008, 06:58
|
Группа: Новичок
Сообщений: 9
Регистрация: 17-04-08
Пользователь №: 36 821

|
Переход осуществляется на адресс указанный в стеке. Странно только,что команда RTI ситает из стека 2 байта (0х20 0хЕ8) а переходит на 0хЕ8. Но такого адресса 0х20Е8 или 0хЕ820 все равно нет. В стеке все нормально, до переполнения ему еще очень долеко, там всего 38 байт.
|
|
|
|
|
Apr 18 2008, 08:20
|
Группа: Новичок
Сообщений: 9
Регистрация: 17-04-08
Пользователь №: 36 821

|
Цитата(Палыч @ Apr 18 2008, 12:03)  Отчего всё же Вы решили, что на адрес 0 попадаете по reti из этого обработчика? потому-что после reti программа переходит вот сюда Код +000000E4: E081 LDI R24,0x01 Load immediate +000000E5: 93800184 STS 0x0184,R24 Store direct to data space +000000E7: CFFF RJMP PC-0x0000 Relative jump теперь это Е7.
|
|
|
|
|
Apr 18 2008, 08:51
|
Группа: Новичок
Сообщений: 9
Регистрация: 17-04-08
Пользователь №: 36 821

|
Цитата(Палыч @ Apr 18 2008, 12:36)  Это не переход на адрес 0. Очень похоже на бесконечный цикл, в конце программы, в который попадают при выходе из main. Сама main у Вас как выглядит? вот так Код int main(void) { //Init UART InitUSART0_Int(); USART_Init_Function(&i16RcvByte, &vOnEvent, &vOnError); InitFD(); InitSM(); // Interrupt erlauben sei(); Global.bShortTaskEnable = true;
while(1){;} }
|
|
|
|
|
Apr 18 2008, 09:21
|
Группа: Новичок
Сообщений: 9
Регистрация: 17-04-08
Пользователь №: 36 821

|
Цитата(Палыч @ Apr 18 2008, 12:58)  Тот rjmp по адресу E7 - это скорее всего while(1){;} Вас, наверное, смутили нули при jmp'е? Так обратите внимание, что они входят в выражение "РС-0х000", что означает "этот адрес", т.е. команда перехода на самою себя. а после этого он переходит вот сюда Код +0000001A: 940C0047 JMP 0x00000047 Jump +0000001C: 940C0047 JMP 0x00000047 Jump а от туда уже Код +00000047: 940C0000 JMP 0x00000000 Jump
|
|
|
|
Сообщений в этой теме
ProfessorBraz ATmega 16L проблема с UART Apr 17 2008, 11:31 galjoen Цитата(ProfessorBraz @ Apr 17 2008, 15:31... Apr 17 2008, 11:51 Палыч ИМХО, стек переполнился. Apr 17 2008, 11:52 galjoen Цитата(Палыч @ Apr 17 2008, 15:52) ИМХО, ... Apr 17 2008, 11:54 defunct Все-таки переполнился.
Возможность зануления адрес... Apr 17 2008, 12:01 ProfessorBraz Вот это скорость ответов на форуме! Супер... Apr 17 2008, 12:09 Палыч Цитата(ProfessorBraz @ Apr 17 2008, 15:09... Apr 17 2008, 12:22  ProfessorBraz Цитата(Палыч @ Apr 17 2008, 16:22) Так Вы... Apr 17 2008, 12:32  galjoen Цитата(Палыч @ Apr 17 2008, 16:22) Так Вы... Apr 17 2008, 12:35   ProfessorBraz Цитата(galjoen @ Apr 17 2008, 16:35) +1
И... Apr 17 2008, 12:45    galjoen Цитата(ProfessorBraz @ Apr 17 2008, 16:45... Apr 17 2008, 13:11 Палыч Цитата(ProfessorBraz @ Apr 17 2008, 15:09... Apr 17 2008, 14:51       Палыч Ну, Вы, блин, даёте! Это не RJMP PC-0x0000 пер... Apr 18 2008, 09:30 ProfessorBraz у меня только два прерывания и оба оброботчика пр... Apr 18 2008, 10:13 Палыч Если бы Вы в своём вопросе привели бы всю информац... Apr 18 2008, 12:43
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|