Прерывания...с чего начать?

vasia
Offline
Зарегистрирован: 07.11.2013

Не могу никак подружиться с прерываниями. Вроде какие то куски кода нарыл, корифеев и мануалы покурил...

Но в итоге IDE упорно ругается то функция прерывания не так обьявлена, то TCCR0 was not declared, где я его должен декларировать??? По ходу с дефайнсами и инклюидами у меня  полное непонимание......

Вощем люди добрые, если кому нетрудно напишите кусок кода:

Прерывание по переполнению таймера, желательно Т2 (он вроде  в arduine ни в delly ни в millis не задействован),хотя если будет для Т0 или Т1 не страшно.

Чтоб прерывание вызывало функцию, например увеличивающюю с каждым циклом(прерванием) некую переменную ,  ну что то типа:

"ISR (TIMER0_OVF_vect)    {    Svet0++ ; }// При каждом переполнении счётного регистра увеличиваем  счётчик на единицу.

   

Ну и если сразу допишите Blink 13 будет очень поучительно.

Все  #include и #define  по возможности в один файл с основным скетчем, чтоб было видно, что и откуда берется и где обьявляется.

Чтоб было понятно что писать в  void setup(), а что в void loop()

Чтоб скетч был именно для IDE Arduino , а не Visualstudio там всякие или кодевижны, чтоб загрузил, хрясь и вот оно щастье - мигает диод.

Кажется код буквально из нескольких строчек должен состоять, но мне вот не дается...

Думаю, что человек произведший скетч, по данному техзаданию прославит себя в веках, по крайней мере в глазах чайников. 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Начние с простого- например уход в обработчик прерывания по нажатию кнопки, заведенной на ( 2 для уны) вход ( прерывания) и свершение в этом обработчике уникального для программы события. Попробуйте разные режимы отлова прерывания. Поймите, как сопоставляются время оновного цикла и обработчика. 

Таймеры несколько посложнее...попробуйте поиграться с библиотекой http://playground.arduino.cc/code/timer1

там есть attachInterrupt(function, period) , мне кажется это то, что Вы ищете

vasia
Offline
Зарегистрирован: 07.11.2013

Спасибо,  попробую поковырять библиотЭку. Ну а варианты типа настроить таймер-счетчики через регистры управления таймерами, задать время цикла.... Подобные варианты вроде бы более наглядны:

#include <iom8.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 2048000
ISR(TIMER1_COMPA_vect)//обработчик прерывания по совпадению А
{
TCNT1H=0;//обнуляем регистр TCNT1
TCNT1L=0;
}
int main()
{
DDRB=0x02;//настраиваем OC1A как выход
PORTB=0x00;
TCCR1A=0x40;//при совпадении уровень OC1A меняется на противоположный
TCCR1B=0x05;//CLK/1024
OCR1AH=0x03;//записываем в регистр OCR1A 1000
OCR1AL=0xE8;
TIMSK = 0x10;//разрешаем прерывание по совпадению
sei();//разрешаем прерывания глобально
while(1);
}

или

#include <mega8.h>

int Svet0, Svet1, Svet2, Svet3;

interrupt [10] void timer0_overflow(void) 
  {
    Svet0++ ;
    Svet1++ ;
    Svet2++ ;
    Svet3++ ;
  }

void main(void)
{
  DDRD = 0b11111111;  
 
  TCCR0 |= 0b00000101;  // 00000101 - 1/1024 ;  00000100 - 1/256 ;  00000011 - 1/64 ;  00000010 - 1/8 ;
                                             // 00000001 - 1/1 (чистые импульсы) ;  00000000 - выключить таймер.

  SREG |= 0b10000000;
  TIMSK |= 0b00000001;  // Записываем единичку в нулевой бит регистра маскирования прерываний от таймеров (TIMSK - Timer Interrupt Mask Register), и разрешаем прерывания по переполнению таймера T0.
  SFIOR = 0b00000001;
 
  TCNT0 = 0; 

  while (1) 
    {
      if (Svet0 >= 1)  
        {
          PORTD ^= 0b00000001;
          Svet0=0;
        }

      if (Svet1 >= 2)  
        {
          PORTD ^= 0b00000010;
          Svet1=0; 
        }

      if (Svet2 >= 4)  
        {
          PORTD ^= 0b00000100;
          Svet2=0;  
        }

      if (Svet3 >= 8)  
        {
          PORTD ^= 0b00001000;
          Svet3=0;
        }
    }
}

Но вот как заставить все это работать в IDE. Меня сбивают в первую очередь инклюиды , непонятно какие файлы надо присоединять в случае с IDE Arduino  и где эти файлы находятся.