|
Отладка в 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() и все работало.
эта фигня работала в железе или в отладчике? Если честно, не помню, но наверняка работала, иначе как бы я ее отлаживал, но пользоваться я любил все же студией, а не ИАРовским отладчиком, но это дело привычки.
--------------------
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|