реклама на сайте
подробности

 
 
> ATmega 16L проблема с UART
ProfessorBraz
сообщение Apr 17 2008, 11:31
Сообщение #1





Группа: Новичок
Сообщений: 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, но почемуто в старт? help.gif

Може кто с таким эффектом сталкивался?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ProfessorBraz
сообщение Apr 18 2008, 06:58
Сообщение #2





Группа: Новичок
Сообщений: 9
Регистрация: 17-04-08
Пользователь №: 36 821



Переход осуществляется на адресс указанный в стеке. Странно только,что команда RTI ситает из стека 2 байта (0х20 0хЕ8) а переходит на 0хЕ8. Но такого адресса 0х20Е8 или 0хЕ820 все равно нет. В стеке все нормально, до переполнения ему еще очень долеко, там всего 38 байт. wacko.gif
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 18 2008, 08:03
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(ProfessorBraz @ Apr 18 2008, 09:58) *
Странно только,что команда RTI ситает из стека 2 байта (0х20 0хЕ8) а переходит на 0хЕ8.
Возможно, Вы не учитываете то, что Stack Pointer указывает на свободную ячейку: содержимое стека - выше. Т.е., если возврат на 0х00Е8, то в ячейке +1 должен быть 00, в ячейке +2 должно быть Е8.
Отчего всё же Вы решили, что на адрес 0 попадаете по reti из этого обработчика?
Go to the top of the page
 
+Quote Post
ProfessorBraz
сообщение Apr 18 2008, 08:20
Сообщение #4





Группа: Новичок
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 18 2008, 08:36
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(ProfessorBraz @ Apr 18 2008, 11:20) *
потому-что после reti программа переходит вот сюда
Это не переход на адрес 0. Очень похоже на бесконечный цикл, в конце программы, в который попадают при выходе из main. Сама main у Вас как выглядит?
Go to the top of the page
 
+Quote Post
ProfessorBraz
сообщение Apr 18 2008, 08:51
Сообщение #6





Группа: Новичок
Сообщений: 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){;}        
}
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 18 2008, 08:58
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Тот rjmp по адресу E7 - это скорее всего while(1){;}
Вас, наверное, смутили нули при jmp'е? Так обратите внимание, что они входят в выражение "РС-0х000", что означает "этот адрес", т.е. команда перехода на самою себя.
Go to the top of the page
 
+Quote Post
ProfessorBraz
сообщение Apr 18 2008, 09:21
Сообщение #8





Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 12:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01452 секунд с 7
ELECTRONIX ©2004-2016