Прерывания...с чего начать?
- Войдите на сайт для отправки комментариев
Не могу никак подружиться с прерываниями. Вроде какие то куски кода нарыл, корифеев и мануалы покурил...
Но в итоге 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 там всякие или кодевижны, чтоб загрузил, хрясь и вот оно щастье - мигает диод.
Кажется код буквально из нескольких строчек должен состоять, но мне вот не дается...
Думаю, что человек произведший скетч, по данному техзаданию прославит себя в веках, по крайней мере в глазах чайников.
Начние с простого- например уход в обработчик прерывания по нажатию кнопки, заведенной на ( 2 для уны) вход ( прерывания) и свершение в этом обработчике уникального для программы события. Попробуйте разные режимы отлова прерывания. Поймите, как сопоставляются время оновного цикла и обработчика.
Таймеры несколько посложнее...попробуйте поиграться с библиотекой http://playground.arduino.cc/code/timer1
там есть attachInterrupt(function, period) , мне кажется это то, что Вы ищете
Спасибо, попробую поковырять библиотЭку. Ну а варианты типа настроить таймер-счетчики через регистры управления таймерами, задать время цикла.... Подобные варианты вроде бы более наглядны:
#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 и где эти файлы находятся.