|
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 17 2008, 12:09
|
Группа: Новичок
Сообщений: 9
Регистрация: 17-04-08
Пользователь №: 36 821

|
Вот это скорость ответов на форуме! Супер! К теме Код 239: USART0_Enable_Int_Status = 1; +000002D1: E081 LDI R24,0x01 Load immediate +000002D2: 93800167 STS 0x0167,R24 Store direct to data space +000002D4: 91FF POP R31 Pop register from stack +000002D5: 91EF POP R30 Pop register from stack +000002D6: 919F POP R25 Pop register from stack +000002D7: 918F POP R24 Pop register from stack +000002D8: 900F POP R0 Pop register from stack +000002D9: BE0F OUT 0x3F,R0 Out to I/O location +000002DA: 900F POP R0 Pop register from stack +000002DB: 901F POP R1 Pop register from stack +000002DC: 9518 RETI Interrupt return Занятость: Data: 383 bytes (37.4% Full) Чем может переполниться стек, если программа только получает и отсылает по 5-7 Байт?
|
|
|
|
|
Apr 17 2008, 12:35
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Палыч @ Apr 17 2008, 16:22)  Так Вы в Студии и проконтролируйте стек: состояние стека и содержимое его когда вошли в прерывание, и когда выходите (перед RTI). Должно быть одним и тем же. +1 И регистры должны то-же значение иметь, и адрес возврата в стеке д.б. Вы в прерывание как входите? М.б. вы просто адрес возврата в стек не кладёте? Надо при отладке call/rcall команду на таблицу прерываний делать.
|
|
|
|
|
Apr 17 2008, 12:45
|
Группа: Новичок
Сообщений: 9
Регистрация: 17-04-08
Пользователь №: 36 821

|
Цитата(galjoen @ Apr 17 2008, 16:35)  +1 И регистры должны то-же значение иметь, и адрес возврата в стеке д.б. Вы в прерывание как входите? М.б. вы просто адрес возврата в стек не кладёте? Надо при отладке call/rcall команду на таблицу прерываний делать. Опа?! А вот с этого места по подробнее. Я всю жизнь думал, что при вызове прерывания адрес возврата сохраняется автоматически в стек. Если это не так, то как это делается и в каком месте. Я же не знаю в какой момент прерывание произойдет. Где этот код распологать?
|
|
|
|
|
Apr 17 2008, 13:11
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(ProfessorBraz @ Apr 17 2008, 16:45)  Опа?! А вот с этого места по подробнее. Я всю жизнь думал, что при вызове прерывания адрес возврата сохраняется автоматически в стек. Правильно думали. Цитата(ProfessorBraz @ Apr 17 2008, 16:45)  Если это не так, то как это делается и в каком месте. Я же не знаю в какой момент прерывание произойдет. Где этот код распологать?  Это только для отладки. А как у вас прерывание от USART при отладке вызывается? А чтоб стек проконтролировать - надо ОЗУ начиная с адреса указателя стека посмотреть.
|
|
|
|
Сообщений в этой теме
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, 16:22) Так Вы... Apr 17 2008, 12:32 Палыч Цитата(ProfessorBraz @ Apr 17 2008, 15:09... Apr 17 2008, 14:51 ProfessorBraz Переход осуществляется на адресс указанный в стеке... Apr 18 2008, 06:58 Палыч Цитата(ProfessorBraz @ Apr 18 2008, 09:58... Apr 18 2008, 08:03  ProfessorBraz Цитата(Палыч @ Apr 18 2008, 12:03) Отчего... Apr 18 2008, 08:20   Палыч Цитата(ProfessorBraz @ Apr 18 2008, 11:20... Apr 18 2008, 08:36    ProfessorBraz Цитата(Палыч @ Apr 18 2008, 12:36) Это не... Apr 18 2008, 08:51     Палыч Тот rjmp по адресу E7 - это скорее всего while(1){... Apr 18 2008, 08:58      ProfessorBraz Цитата(Палыч @ Apr 18 2008, 12:58) Тот rj... Apr 18 2008, 09:21       Палыч Ну, Вы, блин, даёте! Это не RJMP PC-0x0000 пер... Apr 18 2008, 09:30 ProfessorBraz у меня только два прерывания и оба оброботчика пр... Apr 18 2008, 10:13 Палыч Если бы Вы в своём вопросе привели бы всю информац... Apr 18 2008, 12:43
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|