Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVRStudio vs IAR vs me
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Balaganov
Здравствуйте господа, такой вопрос:
имеется IAR 4.10B, имеется AVRStudio 4.11.401, имеется MEGA32 (частота 4 МГц), имеется тупая задержка от timer0 де-то 200 мкс
теперь вопрос: почему перечисленныые проги ,при работе в режиме симулятора, ведут себя по разному при одинаковом коде, который, кстати тоже имеется:

#pragma vector=TIMER0_OVF_vect
__interrupt void irqHandler(void)
{
TIMSK=0; //здесь тормозим таймер пока не выполнится функция задержки
...
void del();
}

void del(void) //сюда приходим после прерывания
{
TIMSK=1; //здесь запускаем таймер (разрешаем прерывание)
... //здесь успеваем сделать нечто не связанное с прерыванием
}

void main(void)
{
init_peref();
...
}

void init_peref(void)
{
...
TCCR0=0x02; //делитель clk/8
TCNT0=0x06; //начальное значение = 6
OCR0=0x00; //сравнить с 0 (итого де-то 200 мс)
asm ("sei");
}

Так вот студия после TIMSK=1 сразу переходит на #pragma...
А IAR после TIMSK=1 продолжаетвыполнять код.
Короче как оно должно быть на самом деле?
Где истина?
ЗЫ Сейчас в отпуске на даче, даташита под рукой нет, да даже еслибы и был все равно момент интересный. Кто объяснит?
haker_fox
Цитата
void del(void) //сюда приходим после прерывания
{
TIMSK=1; //здесь запускаем таймер (разрешаем прерывание)
... //здесь успеваем сделать нечто не связанное с прерыванием
}


Первое: я бы посоветовал так устанавливать бит в регистре
TIMSK|=(1<<TOIE0); //разрешаем прерывания от таймера 0
а так сбрасывать:
TIMSK&=~(1<<TOIE0); //запрещаем прерывания от таймера0
а то не очень понятно, да и при переносе программы с одного АВРа на другой могут быть проблемы, т.к. положение битов может изениться.

Потом запускать и останавливать таймер лучше на мой взгляд с помощью регистра управления таймером TCCR0.
Например так:
TCCR0|=(1<<CS01); //запускаем таймер с частотой Fclk/8, причем остальные биты остаются не тронутыми

TCCR0&=~(1<<CS01); //останавливаем таймер, причем остальные биты остаются не тронутыми

Цитата
void init_peref(void)
{
...
TCCR0=0x02; //делитель clk/8
TCNT0=0x06; //начальное значение = 6
OCR0=0x00; //сравнить с 0 (итого де-то 200 мс)
asm ("sei");
}


Не понятно, как возникают прерывания, регистр TIMSK не инициализирован, а при старте МК этот регистр "нулевой"?

Последнее
Цитата
Здравствуйте господа, такой вопрос:
имеется IAR 4.10B, имеется AVRStudio 4.11.401, имеется MEGA32 (частота 4 МГц), имеется тупая задержка от timer0 де-то 200 мкс


200 МКС??? Микросекунд??? Да это делать на таймере изврат!!! Извините за слова smile.gifsmile.gifsmile.gif
ИМХО: на таймере задержки делать от 5-10 мс (миллесекунд), иначе таймер будет срабатывать слишком часто и тормозить систему.
Задержку в 200 мкс можно сделать так:

__delay_cycles(0.0002*F_CLK);
где 0.0002 это 200 мкс, а F_CLK частота вашего кварца (4 МГц)
Только нужно подключить #include <intrinsics.h>

Удачи!!!!!

В общем я с утра сегодня не много не в себе, если что-то напутал, то sorry.
Вот если что ICQ 339085018, можно пообщаться.
vet
Цитата(Balaganov @ Oct 11 2005, 00:54)
почему перечисленныые проги ,при работе в режиме симулятора, ведут себя по разному при одинаковом коде
*


Насколько я знаю, симулятор IAR не симулирует периферию. Используйте AVR Studio.

Цитата(Balaganov @ Oct 11 2005, 00:54)
#pragma vector=TIMER0_OVF_vect
__interrupt void irqHandler(void)
{
  TIMSK=0;  //здесь тормозим таймер пока не выполнится функция задержки
...
void del(); 
}

*


Хочу обратить внимание, что функция del() не вызывается, т.к. в прерывании нарисован не вызов, а прототип. Надо так: del();
Balaganov
Цитата(haker_fox @ Oct 11 2005, 02:28)
Не понятно, как возникают прерывания, регистр TIMSK не инициализирован, а при старте МК этот регистр "нулевой"?


Это я забыл вставить строчку
TIMSK=0x40;
в инициализации
Цитата(haker_fox @ Oct 11 2005, 02:28)
200 МКС??? Микросекунд??? Да это делать на таймере изврат!!! Извините за слова smile.gifsmile.gifsmile.gif
ИМХО: на таймере задержки делать от 5-10 мс (миллесекунд), иначе таймер будет срабатывать слишком часто и тормозить систему.

Может быть, но это какбы тестовый вариант, хотя за 200 мкс выполнится 800 тактов (на 4 МГц) а это по большому счету 800 инструкций что есть не мало.
Цитата(haker_fox @ Oct 11 2005, 02:28)
В общем я с утра сегодня не много не в себе, если что-то напутал, то sorry.
Вот если что ICQ 339085018, можно пообщаться.
*

Вот за это спасибо есть пара вопросов вечерком попробую выйти на связь...

Цитата(vet)
Хочу обратить внимание, что функция del() не вызывается, т.к. в прерывании нарисован не вызов, а прототип. Надо так: del();


Да это я неправильно написал здесь (ночью дело было) а так конечно del();
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.