Вопрос по прерываниям
- Войдите на сайт для отправки комментариев
Вс, 02/04/2017 - 19:30
Не могу разобраться в чем проблема. Необходимо обрабатывать прерывания по сравнеию с регистром OCR
Почему то когда я начинаю настраивать регистры по 5 таймеру (к примеру) на меге то происходит полная фигня, к примеру delay() аозращает всегда 0, а вот пример кода должен светодиод по нажатию кнопки загортся, если делать код без прерывания все четко работате, если делаю так как в коде светодиод живет своей непонятно жизнью... вообще не понимаю что происходит, помогите разобраться, голову сломал.
#include <ButtonMode.h> #define B_OPEN_PIN 3 //кнопка открыть #define B_MODE true //есть инвертация кнопки (т.е. нажатат это сигнал переходит в LOW #define B_STOP_PIN 5 //кнопка стоп #define B_STOP_MODE true int mode=0; //режим работы по кнопкам: 0стоп, 1открыть, 2закрыть, 3 ButtonMode butOpen(B_OPEN_PIN, 2, B_MODE); // создание объекта для кнопки открыть, 15 время усреднения (счетчик) ButtonMode butStop(B_STOP_PIN, 2, B_STOP_MODE); // создание объекта для кнопки стоп /*---------------------------------------------------------------------------------------------------------------*/ void setup() { pinMode(33, OUTPUT); pinMode(29, OUTPUT); Serial.begin(9600); TCCR5A =0; TCCR5B |= (1<<WGM31); // Режим работы таймера CTC со сбросом счетчика + предделитель TIMSK5 |= ((1<<OCIE5A)|(1<<OCIE5B)); // Разрешение прерывания по сравнению с OCR3A и OCR3B без В почему то не работает OCR5A = 25500; // Частота прерываний будет = Fclk/(N*(1+OCR1A)) где N - коэф. предделителя (1, 8, 64, 256 или 1024) } /*---------------------------------------------------------------------------------------------------------------*/ void loop() { if (butOpen.flagClick == true) { mode = 1; butOpen.flagClick = false; } //нажатия кнопок управления открыть if (butStop.flagClick == true) { mode = 0; butStop.flagClick = false; } //нажатия кнопок управления стоп switch (mode) { case 0: digitalWrite(33, LOW); break; case 1: digitalWrite(33, HIGH); break; } } ISR (TIMER5_COMPA_vect) { digitalWrite(29, !digitalRead(29)); butOpen.filterAvarage(); // вызов метода фильтрации по среднему butStop.filterAvarage(); // вызов метода фильтрации по среднему Serial.println(butOpen.flagClick); }
cdriver, проблема в том, что вы не понимаете как работают таймеры и не умеете их настраивать. У вас ошибки в каждой строчке конфигурации.
19 -ну ладно, тут ок.
20 строчка -3 ошибки сразу. (1) Нельзя давать команду |= если вы до этого не обнуляли регистр. Ибо нам неизвестно, что там было. В этом случае просто = (2) Вы вставляете бит от 3-го таймера. Режим СТС это бит WGM52 (3) вы не запустили таймер битами CS5x Итого правильно будет: TCCR5B = (1<<WGM52) | (1<<CS50) ;
21 строчка 2 ошибки. Опять нельзя делать |=, и нельзя указывать прерывание, которые в не обрабатываете. Итого правильно будет TIMSK5=1<<OCIE5A;
Ок спасибо... про 3 таймер все праильно. Как таймеры работают я понимаю, изначально написал код под 3 таймер 16 битный... но у меня не получилось... далее уже были эксперементы с дургими таймерами... вот и получилась ошибка что от 3 таймера..... я так пологаю, что моя ошибка в |= я не понимаю как это работает, я думал что это выставляет определнный бит в регистре в 1... покажите тогда как правильно выставить несколько битов в 1 и в 0... и что все таки делает операция в моем примере? можетет разжевать или ссылку указать где почитать.
Спасибо.