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

 
 
 
Reply to this topicStart new topic
> AVRStudio vs IAR vs me, кого глючит?
Balaganov
сообщение Oct 10 2005, 20:54
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 41
Регистрация: 16-02-05
Пользователь №: 2 688



Здравствуйте господа, такой вопрос:
имеется 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 продолжаетвыполнять код.
Короче как оно должно быть на самом деле?
Где истина?
ЗЫ Сейчас в отпуске на даче, даташита под рукой нет, да даже еслибы и был все равно момент интересный. Кто объяснит?
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Oct 10 2005, 23:28
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата
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, можно пообщаться.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
vet
сообщение Oct 11 2005, 05:50
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Цитата(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();


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Balaganov
сообщение Oct 11 2005, 09:43
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 41
Регистрация: 16-02-05
Пользователь №: 2 688



Цитата(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();
Go to the top of the page
 
+Quote Post

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

 


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


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