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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Отладка в IAR прерывания Т0 в mega8535
Sergey83
сообщение Jul 23 2008, 08:48
Сообщение #1





Группа: Новичок
Сообщений: 14
Регистрация: 2-08-07
Пользователь №: 29 517



Подскажите убогому help.gif
Как отдебагить простенькую программку?
Задача проста - по прерыванию от переполнения таймера0 проинкрементировать переменную "i".
Проблема - не выходит в прерывание в режиме дебагер.
Компилирую и дебагю в IAR Embedded Workbench for Atmel AVR 4.12A

Может с настройками где наплужил?
Благодарен за любую помощь. beer.gif

#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
Go to the top of the page
 
+Quote Post
GDI
сообщение Jul 23 2008, 09:17
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Так просмотрите по шагам, что у вас в регистры таймера записывается. TIMSK0, наверное лучше внутри timer0_init() модифицировать, до старта таймера.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Sergey83
сообщение Jul 23 2008, 09:52
Сообщение #3





Группа: Новичок
Сообщений: 14
Регистрация: 2-08-07
Пользователь №: 29 517



Цитата(GDI @ Jul 23 2008, 12:17) *
Так просмотрите по шагам, что у вас в регистры таймера записывается. TIMSK0, наверное лучше внутри timer0_init() модифицировать, до старта таймера.


Посмотрел по шагам в регистры таймера записуеться то что и в исходнике написано.
TIMSK = 0x01 перенес до старта таймера не помогло.
В регистр TIMSK записалось 0х01

ВОПРОС - В других отладчиках прерывания работают?
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 23 2008, 09:56
Сообщение #4


Ambidexter
*****

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



Цитата(Sergey83 @ Jul 23 2008, 07:48) *
Может с настройками где наплужил?

Надо разрешить таймеру0 прерывания от переполнения TIMSK=0x02, а вы почему-то разрешаете прерывания по сравнению TIMSK=0x01


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Sergey83
сообщение Jul 23 2008, 10:03
Сообщение #5





Группа: Новичок
Сообщений: 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 попутал там так как вы написали
Go to the top of the page
 
+Quote Post
GDI
сообщение Jul 23 2008, 10:03
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата
ВОПРОС - В других отладчиках прерывания работают?

Странно было бы, если в отладчике не работали бы прерывания. Если входа в прерывания нету, то скорее всего это прерывание просто не наступает, или вектор неправильно указан, или еще тысяча причин, но отладчик тут не при чем, это все ошибки программиста.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Sergey83
сообщение Jul 23 2008, 10:06
Сообщение #7





Группа: Новичок
Сообщений: 14
Регистрация: 2-08-07
Пользователь №: 29 517



Поставил
TIMSK = 0x03;
Эфекта никакого.

в каком регистре эта фигня взводит бит

__disable_interrupt(); //disable all interrupts
__enable_interrupt(); //re-enable interrupts

Цитата(GDI @ Jul 23 2008, 13:03) *
Странно было бы, если в отладчике не работали бы прерывания. Если входа в прерывания нету, то скорее всего это прерывание просто не наступает, или вектор неправильно указан, или еще тысяча причин, но отладчик тут не при чем, это все ошибки программиста.


так помогите мне эту ошибку найти пожалста программка ведь не сложная help.gif
Go to the top of the page
 
+Quote Post
GDI
сообщение Jul 23 2008, 10:08
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Можно отлаживаться в AVR Studio, там какой бит у каждого регистра за что отвечает, только для отладке в студии надо в опциях проекта в ИАРе заказать делать COFF файл.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 23 2008, 10:08
Сообщение #9


Ambidexter
*****

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



Цитата(Sergey83 @ Jul 23 2008, 09:03) *
Может уважаемый =GM= с 8515 попутал там так как вы написали

Вот чёрт, действительно, прошу пардону. Смотрел по дейташиту на 8515, под рукой оказался, никогда бы не подумал, что в этих битах есть разница между 8515 и 8535 с точностью до наоборот.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
GDI
сообщение Jul 23 2008, 10:17
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 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() и все работало.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 23 2008, 10:17
Сообщение #11


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

А точно тот вектор прерывания?

Ещё вот подумал, может разрешить прерывание по переполнению и все прерывания внутри пп прерывания? Посмотрите листинг, что там компилятор натворил?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Sergey83
сообщение Jul 23 2008, 10:21
Сообщение #12





Группа: Новичок
Сообщений: 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() и все работало.


эта фигня работала в железе или в отладчике?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jul 23 2008, 10:22
Сообщение #13


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(=GM= @ Jul 23 2008, 14:08) *
Вот чёрт, действительно, прошу пардону. Смотрел по дейташиту на 8515, под рукой оказался, никогда бы не подумал, что в этих битах есть разница между 8515 и 8535 с точностью до наоборот.

А всё потому, что кое-кому надо программы по-человечески писать, а не заставлять людей рыЦЦа по справочникам в поисках "что же там обозначает 0х02 в TIMSK"


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Sergey83
сообщение Jul 23 2008, 10:22
Сообщение #14





Группа: Новичок
Сообщений: 14
Регистрация: 2-08-07
Пользователь №: 29 517



Цитата(=GM= @ Jul 23 2008, 13:17) *
А точно тот вектор прерывания?

Ещё вот подумал, может разрешить прерывание по переполнению и все прерывания внутри пп прерывания? Посмотрите листинг, что там компилятор натворил?


так а как посмотреть?

ЗЫ SREG, бит 7=1

Сообщение отредактировал Sergey83 - Jul 23 2008, 10:24
Go to the top of the page
 
+Quote Post
GDI
сообщение Jul 23 2008, 10:26
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 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() и все работало.


эта фигня работала в железе или в отладчике?

Если честно, не помню, но наверняка работала, иначе как бы я ее отлаживал, но пользоваться я любил все же студией, а не ИАРовским отладчиком, но это дело привычки.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 07:31
Рейтинг@Mail.ru


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