roboforum.ru

Технический форум по робототехнике.
Текущее время: 26 ноя 2024, 23:49

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Проблема с таймером - не заходит в прерывание
СообщениеДобавлено: 07 окт 2006, 16:49 
Не в сети
Аватара пользователя

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

Мега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);
};


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 07 окт 2006, 16:57 
Не в сети
Мастер Самоделкин
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 07 окт 2006, 17:03 
Не в сети
Аватара пользователя

Зарегистрирован: 06 окт 2004, 18:01
Сообщения: 24218
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов
-= Александр =- писал(а):
Просто включить прерывание таймера - не достаточно. Надо еще разрешить прерывания вообще. asm("sei"); - это обычно ставится в конце инициализации. В некоторх компилерах пишется так: SEI(); или _SEI();


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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 07 окт 2006, 18:59 
Не в сети
Аватара пользователя

Зарегистрирован: 06 окт 2004, 18:01
Сообщения: 24218
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов
Да что же это такое...

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);  
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 07 окт 2006, 19:25 
Не в сети
Мастер Самоделкин
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 07 окт 2006, 19:43 
Не в сети
Аватара пользователя

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

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

Вот так не работает:
Код:
#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);  
}

Работает.

Че к чему... Серьезные вроде люди...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 07 окт 2006, 20:43 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
=DeaD= писал(а):
в даташите про это почему-то не сказано в разделе "Прерывания", или не нашел при беглом просмотре :(((


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

Подробно о механизме работы прерываний в AVR рассказано на странице 3 курса и приложены 2 примера.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 07 окт 2006, 20:53 
Не в сети
Аватара пользователя

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

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

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

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

2Avr123: Однако, спасибо за помощь - теперь знаю откуда засада :)
Правда всё равно на догоняю, почему при подключении разных заголовочных файлов такой эффект.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 07 окт 2006, 21:58 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
=DeaD= писал(а):
Типа не пишите программу, пока не прочитали и не выучили весь 300-страничный даташит :)

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


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

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

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

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

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

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


дак в первом случае вы закомментировали библу прерываний - наверно поэтому.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 4 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO