Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Отладка в IAR прерывания Т0 в mega8535
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Sergey83
Подскажите убогому 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++;
}
}
GDI
Так просмотрите по шагам, что у вас в регистры таймера записывается. TIMSK0, наверное лучше внутри timer0_init() модифицировать, до старта таймера.
Sergey83
Цитата(GDI @ Jul 23 2008, 12:17) *
Так просмотрите по шагам, что у вас в регистры таймера записывается. TIMSK0, наверное лучше внутри timer0_init() модифицировать, до старта таймера.


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

ВОПРОС - В других отладчиках прерывания работают?
=GM=
Цитата(Sergey83 @ Jul 23 2008, 07:48) *
Может с настройками где наплужил?

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

TIMSK
Bit 7 6 5 4 3 2 1 0
OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0

Может уважаемый =GM= с 8515 попутал там так как вы написали
GDI
Цитата
ВОПРОС - В других отладчиках прерывания работают?

Странно было бы, если в отладчике не работали бы прерывания. Если входа в прерывания нету, то скорее всего это прерывание просто не наступает, или вектор неправильно указан, или еще тысяча причин, но отладчик тут не при чем, это все ошибки программиста.
Sergey83
Поставил
TIMSK = 0x03;
Эфекта никакого.

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

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

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


так помогите мне эту ошибку найти пожалста программка ведь не сложная help.gif
GDI
Можно отлаживаться в AVR Studio, там какой бит у каждого регистра за что отвечает, только для отладке в студии надо в опциях проекта в ИАРе заказать делать COFF файл.
=GM=
Цитата(Sergey83 @ Jul 23 2008, 09:03) *
Может уважаемый =GM= с 8515 попутал там так как вы написали

Вот чёрт, действительно, прошу пардону. Смотрел по дейташиту на 8515, под рукой оказался, никогда бы не подумал, что в этих битах есть разница между 8515 и 8535 с точностью до наоборот.
GDI
Код
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() и все работало.
=GM=
Цитата(Sergey83 @ Jul 23 2008, 09:06) *
в каком регистре эта фигня взводит бит
__disable_interrupt(); //disable all interrupts
__enable_interrupt(); //re-enable interrupts

В SREG, бит 7

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

Ещё вот подумал, может разрешить прерывание по переполнению и все прерывания внутри пп прерывания? Посмотрите листинг, что там компилятор натворил?
Sergey83
Цитата(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() и все работало.


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

А всё потому, что кое-кому надо программы по-человечески писать, а не заставлять людей рыЦЦа по справочникам в поисках "что же там обозначает 0х02 в TIMSK"
Sergey83
Цитата(=GM= @ Jul 23 2008, 13:17) *
А точно тот вектор прерывания?

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


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

ЗЫ SREG, бит 7=1
GDI
Еще раз говорю, проверьте по шагам как там все работает, не только инициализацию проверьте, но и саму работу таймера. Чтобы долго не ждать инкремента счетного регистра временно запустите таймер без прескаллера.
Почему в 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() и все работало.


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

Если честно, не помню, но наверняка работала, иначе как бы я ее отлаживал, но пользоваться я любил все же студией, а не ИАРовским отладчиком, но это дело привычки.
Sergey83
Цитата(GDI @ Jul 23 2008, 13:23) *
Чтобы долго не ждать инкремента счетного регистра временно запустите таймер без прескаллера.

Почему в TCNT у вас разные значения при ините и в прерывании заносятся?

для того чтобы знать наверняка прошло прерывание или нет.
Как проверить работу самого таймера?
Что такое прескаллер?
GDI
Цитата
Как проверить работу самого таймера?

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

теперь поняв что такое прескаллер делитель по нашему smile.gif

После инизиализации таймера TCNT0 = 0x17 и стоит как вкопанный.
Полная фигня которой я понять не могу 07.gif этоже регистр таймера может че с инициализацией или настройкой дебагера?
Stanislav_S
Цитата(Sergey83 @ Jul 23 2008, 15:47) *
теперь поняв что такое прескаллер делитель по нашему smile.gif

После инизиализации таймера TCNT0 = 0x17 и стоит как вкопанный.
Полная фигня которой я понять не могу 07.gif этоже регистр таймера может че с инициализацией или настройкой дебагера?

Для начала в дебагере вам необходимо включить эмуляцию прерываний. Для этого зайдите в опцию Simulator - Interrupt и включите нужное прерывание, незабывая выставить там нужные параметры.
Sergey83
полная лажа этим отладчиком
Stanislav_S
Цитата(Sergey83 @ Jul 23 2008, 16:06) *
полная лажа этим отладчиком

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

нахел но там непонятные мне параметры как их настрайвать?
Из списка выбрал TIMER0_OVF а дальше? help.gif
Stanislav_S
Цитата(Sergey83 @ Jul 23 2008, 16:13) *
что-то не могу найти в настройках опцию Simulator - Interrupt 07.gif

В самом верху между Debug и Tools.

Цитата(Sergey83 @ Jul 23 2008, 16:13) *
нахел но там непонятные мне параметры как их настрайвать?
Из списка выбрал TIMER0_OVF а дальше? help.gif

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


ааааааааааа получилось тока как пока не понял 08.gif 08.gif 08.gif
shamray
На сколько я знаю, ИАР не симулирует переферию и соответсятенно таймер у вас тикать не будет. Можно только выставить прерывания которые будут срабатывать с заданным интервалом. Переферию самое лучшее отлаживать в AVR Studio. Просто открываете в нем созданый файл d90 формата ubrof 8(forsed) и отлаживайте на здоровье.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.