|
Отладка в IAR прерывания Т0 в mega8535 |
|
|
|
Jul 23 2008, 08:48
|
Группа: Новичок
Сообщений: 14
Регистрация: 2-08-07
Пользователь №: 29 517

|
Подскажите убогому Как отдебагить простенькую программку? Задача проста - по прерыванию от переполнения таймера0 проинкрементировать переменную "i". Проблема - не выходит в прерывание в режиме дебагер. Компилирую и дебагю в IAR Embedded Workbench for Atmel AVR 4.12A Может с настройками где наплужил? Благодарен за любую помощь. #include <iom8535.h> #include <inavr.h> int i=1; int ii=0; int iii=0; void timer0_init(void) // { TCCR0 = 0x00; //stop timer TCNT0 = 0x17; //set count value TCCR0 = 0x05; //start timer } #pragma vector = TIMER0_OVF_vect __interrupt void timer0_ovf_isr(void) { TCNT0 = 0x30; //reload counter value i++; } ///----------------------------------------- ///////////////////////////////////////////////////////////////////////// int main() { __disable_interrupt(); //disable all interrupts timer0_init(); TIMSK = 0x01; __enable_interrupt(); //re-enable interrupts while(1) { ii++; } }
Сообщение отредактировал Sergey83 - Jul 23 2008, 08:49
|
|
|
|
|
Jul 23 2008, 09:52
|
Группа: Новичок
Сообщений: 14
Регистрация: 2-08-07
Пользователь №: 29 517

|
Цитата(GDI @ Jul 23 2008, 12:17)  Так просмотрите по шагам, что у вас в регистры таймера записывается. TIMSK0, наверное лучше внутри timer0_init() модифицировать, до старта таймера. Посмотрел по шагам в регистры таймера записуеться то что и в исходнике написано. TIMSK = 0x01 перенес до старта таймера не помогло. В регистр TIMSK записалось 0х01 ВОПРОС - В других отладчиках прерывания работают?
|
|
|
|
|
Jul 23 2008, 10:03
|
Группа: Новичок
Сообщений: 14
Регистрация: 2-08-07
Пользователь №: 29 517

|
Из даташита взал 0 бит-переполнение 1 бит-сравнение
TIMSK Bit 7 6 5 4 3 2 1 0 OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0
Может уважаемый =GM= с 8515 попутал там так как вы написали
|
|
|
|
|
Jul 23 2008, 10:06
|
Группа: Новичок
Сообщений: 14
Регистрация: 2-08-07
Пользователь №: 29 517

|
Поставил TIMSK = 0x03; Эфекта никакого. в каком регистре эта фигня взводит бит __disable_interrupt(); //disable all interrupts __enable_interrupt(); //re-enable interrupts Цитата(GDI @ Jul 23 2008, 13:03)  Странно было бы, если в отладчике не работали бы прерывания. Если входа в прерывания нету, то скорее всего это прерывание просто не наступает, или вектор неправильно указан, или еще тысяча причин, но отладчик тут не при чем, это все ошибки программиста. так помогите мне эту ошибку найти пожалста программка ведь не сложная
|
|
|
|
|
Jul 23 2008, 10:17
|
Профессионал
    
Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008

|
Код void timer_init(void) { TCCR1A = 0; TCCR1B = 5; //prescaler = 1024 TCNT1 = TIMER_VALUE; TIMSK |= 0x04; } Вот такой у меня был код для таймера1 в мега128 В общем то тоже самое что и у вас Вот вектор прерывания Код #pragma vector = TIMER1_OVF_vect __interrupt void timer_isr(void) { TCNT1 = TIMER_VALUE; led_act_fsm(); } В майне собственно запускается timer_init() и все работало.
--------------------
|
|
|
|
|
Jul 23 2008, 10:17
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Sergey83 @ Jul 23 2008, 09:06)  в каком регистре эта фигня взводит бит __disable_interrupt(); //disable all interrupts __enable_interrupt(); //re-enable interrupts В SREG, бит 7 А точно тот вектор прерывания? Ещё вот подумал, может разрешить прерывание по переполнению и все прерывания внутри пп прерывания? Посмотрите листинг, что там компилятор натворил?
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 23 2008, 10:21
|
Группа: Новичок
Сообщений: 14
Регистрация: 2-08-07
Пользователь №: 29 517

|
Цитата(GDI @ Jul 23 2008, 13:17)  Код void timer_init(void) { TCCR1A = 0; TCCR1B = 5; //prescaler = 1024 TCNT1 = TIMER_VALUE; TIMSK |= 0x04; } Вот такой у меня был код для таймера1 в мега128 В общем то тоже самое что и у вас Вот вектор прерывания Код #pragma vector = TIMER1_OVF_vect __interrupt void timer_isr(void) { TCNT1 = TIMER_VALUE; led_act_fsm(); } В майне собственно запускается timer_init() и все работало. эта фигня работала в железе или в отладчике?
|
|
|
|
|
Jul 23 2008, 10:22
|
Группа: Новичок
Сообщений: 14
Регистрация: 2-08-07
Пользователь №: 29 517

|
Цитата(=GM= @ Jul 23 2008, 13:17)  А точно тот вектор прерывания?
Ещё вот подумал, может разрешить прерывание по переполнению и все прерывания внутри пп прерывания? Посмотрите листинг, что там компилятор натворил? так а как посмотреть? ЗЫ SREG, бит 7=1
Сообщение отредактировал Sergey83 - Jul 23 2008, 10:24
|
|
|
|
|
Jul 23 2008, 10:26
|
Профессионал
    
Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008

|
Еще раз говорю, проверьте по шагам как там все работает, не только инициализацию проверьте, но и саму работу таймера. Чтобы долго не ждать инкремента счетного регистра временно запустите таймер без прескаллера. Почему в TCNT у вас разные значения при ините и в прерывании заносятся? Цитата (GDI @ Jul 23 2008, 13:17) *
void timer_init(void) { TCCR1A = 0; TCCR1B = 5; //prescaler = 1024 TCNT1 = TIMER_VALUE; TIMSK |= 0x04; }
Вот такой у меня был код для таймера1 в мега128 В общем то тоже самое что и у вас
Вот вектор прерывания #pragma vector = TIMER1_OVF_vect __interrupt void timer_isr(void) { TCNT1 = TIMER_VALUE; led_act_fsm(); }
В майне собственно запускается timer_init() и все работало.
эта фигня работала в железе или в отладчике? Если честно, не помню, но наверняка работала, иначе как бы я ее отлаживал, но пользоваться я любил все же студией, а не ИАРовским отладчиком, но это дело привычки.
--------------------
|
|
|
|
|
Jul 23 2008, 10:27
|
Группа: Новичок
Сообщений: 14
Регистрация: 2-08-07
Пользователь №: 29 517

|
Цитата(GDI @ Jul 23 2008, 13:23)  Чтобы долго не ждать инкремента счетного регистра временно запустите таймер без прескаллера.
Почему в TCNT у вас разные значения при ините и в прерывании заносятся? для того чтобы знать наверняка прошло прерывание или нет. Как проверить работу самого таймера? Что такое прескаллер?
|
|
|
|
|
Jul 23 2008, 10:37
|
Профессионал
    
Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008

|
Цитата Как проверить работу самого таймера? Так и проверить, посмотреть как будет он считать, как будет меняться регистр TCNT0. Цитата Что такое прескаллер? Ээээ...кхм... а зачем вы в TCCR0 пятерку заносите? Этим вы ставите прескаллер, т.е. делитель на 1024, напишите для отладки TCCR0 = 0x01, тогда изменение TCNT0 будет происходить на каждом клоке. Вот и следите как он меняется, доходит ли до 0xFF и что происходит дальше, как минимум флаг прерывания таймера должен установиться.
--------------------
|
|
|
|
|
Jul 23 2008, 10:47
|
Группа: Новичок
Сообщений: 14
Регистрация: 2-08-07
Пользователь №: 29 517

|
Цитата(GDI @ Jul 23 2008, 13:37)  Так и проверить, посмотреть как будет он считать, как будет меняться регистр TCNT0. Ээээ...кхм... а зачем вы в TCCR0 пятерку заносите? Этим вы ставите прескаллер, т.е. делитель на 1024, напишите для отладки TCCR0 = 0x01, тогда изменение TCNT0 будет происходить на каждом клоке. Вот и следите как он меняется, доходит ли до 0xFF и что происходит дальше, как минимум флаг прерывания таймера должен установиться. теперь поняв что такое прескаллер делитель по нашему  После инизиализации таймера TCNT0 = 0x17 и стоит как вкопанный. Полная фигня которой я понять не могу  этоже регистр таймера может че с инициализацией или настройкой дебагера?
|
|
|
|
|
Jul 23 2008, 11:05
|

извечный пессимист
    
Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125

|
Цитата(Sergey83 @ Jul 23 2008, 15:47)  теперь поняв что такое прескаллер делитель по нашему  После инизиализации таймера TCNT0 = 0x17 и стоит как вкопанный. Полная фигня которой я понять не могу  этоже регистр таймера может че с инициализацией или настройкой дебагера? Для начала в дебагере вам необходимо включить эмуляцию прерываний. Для этого зайдите в опцию Simulator - Interrupt и включите нужное прерывание, незабывая выставить там нужные параметры.
--------------------
Slaves are those of this world Given freedom to lay chains upon The Master The wolf is no longer free Release the chains and come for me
|
|
|
|
|
Jul 23 2008, 11:06
|
Группа: Новичок
Сообщений: 14
Регистрация: 2-08-07
Пользователь №: 29 517

|
полная лажа этим отладчиком
|
|
|
|
|
Jul 23 2008, 11:13
|
Группа: Новичок
Сообщений: 14
Регистрация: 2-08-07
Пользователь №: 29 517

|
Цитата(Stanislav_S @ Jul 23 2008, 14:05)  Для начала в дебагере вам необходимо включить эмуляцию прерываний. Для этого зайдите в опцию Simulator - Interrupt и включите нужное прерывание, незабывая выставить там нужные параметры. нахел но там непонятные мне параметры как их настрайвать? Из списка выбрал TIMER0_OVF а дальше?
Сообщение отредактировал Sergey83 - Jul 23 2008, 11:18
|
|
|
|
|
Jul 23 2008, 11:21
|

извечный пессимист
    
Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125

|
Цитата(Sergey83 @ Jul 23 2008, 16:13)  что-то не могу найти в настройках опцию Simulator - Interrupt  В самом верху между Debug и Tools. Цитата(Sergey83 @ Jul 23 2008, 16:13)  нахел но там непонятные мне параметры как их настрайвать? Из списка выбрал TIMER0_OVF а дальше?  Выставляете Repeat interval сколько нужно, жмете Install, в обработчик Breakpoint и вперед, ну и руководство пользователя для дебагера неплохо почитать.
--------------------
Slaves are those of this world Given freedom to lay chains upon The Master The wolf is no longer free Release the chains and come for me
|
|
|
|
|
Jul 23 2008, 11:26
|
Группа: Новичок
Сообщений: 14
Регистрация: 2-08-07
Пользователь №: 29 517

|
Цитата(Stanislav_S @ Jul 23 2008, 14:21)  В самом верху между Debug и Tools. Выставляете Repeat interval сколько нужно, жмете Install, в обработчик Breakpoint и вперед, ну и руководство пользователя для дебагера неплохо почитать. ааааааааааа получилось тока как пока не понял
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|