roboforum.ru

Технический форум по робототехнике.

 

Проблема с таймером - не заходит в прерывание

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Проблема с таймером - не заходит в прерывание

Сообщение =DeaD= » 07 окт 2006, 16:49

В чем может быть засада, никто не подскажет???
Вроде всё перерыл и документацию и прочее.

Мега16 на 1МГц.

В эмуляторе (AVR Studio) флаг TOIE1 в TIMSK выставлен оказывается в 1;
Флаг TOV1 в TIFR тоже в 1, но в обработку прерывания всё равно не заходит :(

Код: Выделить всёРазвернуть
SIGNAL(SIG_OVERFLOW1){
 //сюда не попадаем :(
};

int main(void)
{
 TCCR1A=0x00;
 TCCR1B=0x01;

 TCNT1H=0xFF;
 TCNT1L=0x69;
 TIMSK=0x04;
 outb(DDRD,inb(DDRD) | 0x20);
 ICR1H=0x00;
 ICR1L=0x00;
 OCR1AH=0x00;
 OCR1AL=0x00;
 OCR1BH=0x00;
 OCR1BL=0x00;

 while(1);
};
Аватара пользователя
=DeaD=
 
Сообщения: 24053
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: Pascal / C++ / PHP / 1C
ФИО: Антон Ботов

Сообщение -= Александр =- » 07 окт 2006, 16:57

Просто включить прерывание таймера - не достаточно. Надо еще разрешить прерывания вообще. asm("sei"); - это обычно ставится в конце инициализации. В некоторх компилерах пишется так: SEI(); или _SEI();
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3664
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C++, VB, asm
ФИО: Курмис Александр Андреевич

Сообщение =DeaD= » 07 окт 2006, 17:03

-= Александр =- писал(а):Просто включить прерывание таймера - не достаточно. Надо еще разрешить прерывания вообще. asm("sei"); - это обычно ставится в конце инициализации. В некоторх компилерах пишется так: SEI(); или _SEI();


О! Спасибо! :)

Еще сидел думал что такое должно быть, но в даташите про это почему-то не сказано в разделе "Прерывания", или не нашел при беглом просмотре :(((
Аватара пользователя
=DeaD=
 
Сообщения: 24053
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: Pascal / C++ / PHP / 1C
ФИО: Антон Ботов

Сообщение =DeaD= » 07 окт 2006, 18:59

Да что же это такое...

5 секунд всё работало, потом решил вернуть весь функционал кроме вызова таймера и всё нафиг сломалось, и теперь не хочет работать даже в минимальном варианте опять.

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

(потихоньку начинаю подозревать в глюках AVR Studio - как будто в таблицу прерываний не записывается адрес обработчика - его хоть не надо как-то явно туда прописывать???)

Код: Выделить всёРазвернуть
#include <avr/io.h>
#include <avr/pgmspace.h>

INTERRUPT(SIG_OVERFLOW1){
 TCNT1H=0xFF;
 TCNT1L=0x69;
};

int main(void)
{
 TCCR1A=0x00;
 TCCR1B=0x01;

 TCNT1H=0xFF;
 TCNT1L=0x69;

 TIMSK=0x04;

 __asm__ __volatile__ ("sei" ::);

 while(1);  
}
Аватара пользователя
=DeaD=
 
Сообщения: 24053
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: Pascal / C++ / PHP / 1C
ФИО: Антон Ботов

Сообщение -= Александр =- » 07 окт 2006, 19:25

Юзай CodeVision или ICC - там все работает без всяких шаманских бубнов!
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3664
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C++, VB, asm
ФИО: Курмис Александр Андреевич

Сообщение =DeaD= » 07 окт 2006, 19:43

В общем проблему вылечил вроде.

Но это бред короче какой-то, я чуть мозг себе не сломал:

Вот так не работает:
Код: Выделить всёРазвернуть
#include <avr/io.h>
//#include <avr/pgmspace.h>
//#include <avr/interrupt.h>

ISR(TIMER1_OVF_vect){
 TCNT1H=0xFF;
 TCNT1L=0x69;
};

int main(void)
{
 TCCR1A=0x00;
 TCCR1B=0x01;

 TCNT1H=0xFF;
 TCNT1L=0x69;

 TIMSK=0x04;

 __asm__ __volatile__ ("sei" ::);

 while(1);  
}


А вот так:
Код: Выделить всёРазвернуть
//#include <avr/io.h>
//#include <avr/pgmspace.h>
#include <avr/interrupt.h>

ISR(TIMER1_OVF_vect){
 TCNT1H=0xFF;
 TCNT1L=0x69;
};

int main(void)
{
 TCCR1A=0x00;
 TCCR1B=0x01;

 TCNT1H=0xFF;
 TCNT1L=0x69;

 TIMSK=0x04;

 __asm__ __volatile__ ("sei" ::);

 while(1);  
}

Работает.

Че к чему... Серьезные вроде люди...
Аватара пользователя
=DeaD=
 
Сообщения: 24053
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: Pascal / C++ / PHP / 1C
ФИО: Антон Ботов

Сообщение avr123.nm.ru » 07 окт 2006, 20:43

=DeaD= писал(а): в даташите про это почему-то не сказано в разделе "Прерывания", или не нашел при беглом просмотре :(((


Сказано в самом начале - про регистр SREG  бит I.

Подробно о механизме работы прерываний в AVR рассказано на странице 3 курса и приложены 2 примера.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14200
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение =DeaD= » 07 окт 2006, 20:53

avr123.nm.ru писал(а):
=DeaD= писал(а): в даташите про это почему-то не сказано в разделе "Прерывания", или не нашел при беглом просмотре :(((

Сказано в самом начале - про регистр SREG  бит I.

Я говорю в разделе "Прерывания". Зачем-то про это сказано в разделе "CPU Core. Status Register". Типа не пишите программу, пока не прочитали и не выучили весь 300-страничный даташит :)

Шутники однако в Атмел работают :)

2Avr123: Однако, спасибо за помощь - теперь знаю откуда засада :)
Правда всё равно на догоняю, почему при подключении разных заголовочных файлов такой эффект.
Аватара пользователя
=DeaD=
 
Сообщения: 24053
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: Pascal / C++ / PHP / 1C
ФИО: Антон Ботов

Сообщение avr123.nm.ru » 07 окт 2006, 21:58

=DeaD= писал(а):Типа не пишите программу, пока не прочитали и не выучили весь 300-страничный даташит :)

Шутники однако в Атмел работают :)


в Атмел просто надеются, что читать будут внимательно !  про SREG I  говорится в нескольких местах ДШ где говорится об управлении прерываниями от разной переферии.

в описании тех регистров которые ВЫ использовали в программе ТОЧНО ЕСТЬ !

==================

Можно сделать ВСЁ правильно почти без ДШ
с помошью мастера встроенного в компилятор.  

==================

=DeaD= писал(а): не догоняю, почему при
подключении разных заголовочных файлов
такой эффект.


дак в первом случае вы закомментировали библу прерываний - наверно поэтому.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14200
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Mail.ru counter