как запускать Timer1 по int0 и совпадению
- Войдите на сайт для отправки комментариев
Вс, 01/12/2019 - 10:40
Здравствуйте! Прошу программистов помочь с кодом. Собираю регулятор мощности с плавным пуском.
Требуется от внешнего прерывания int0 запускать Таймер1 на заданное время, но IDE 1.8.10 выдаёт в строке ISR (INT0_vect) ошибку "expected unqualified-id before string constant". Может кто подскажет как написать код и в чём причина ошибки? Таймер2 работал.
Moderator : пожалуйста, вставьте код правильно (возможно, новым сообщением в тему), как описано в http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
Еще одного от гугла отключили.
http://www.cyberforum.ru/arduino/thread2386030.html
Еще одного от гугла отключили.
http://www.cyberforum.ru/arduino/thread2386030.html
В этой ссылке нет ни слова о таймерах и прерываниях.....
А поиск не помог найти решение.
Сейчас код выглядит так (часть setup):
void setup() { Serial.begin(115200); pinMode (ENABLEWORK, INPUT); //работает как вход pinMode (SIM, OUTPUT); //работает как выход на симистор pinMode (LED, OUTPUT); //работает как выход на светодиод pinMode (2, INPUT); //Pin2 вход прерывания int0 //attachInterrupt (0, Uprsim, FALLING); //внешнее прерывание на D2 по спаду cli(); // отключить глобальные прерывания val1old = 500; // инициализация Timer2 для отсчётов каждые 0,5с 7812 TCCR2A = 0; // установить регистры в 0 TCCR2B = 0; TCCR2A |= (1 << WGM01); //сброс при совпадении OCR2A = 7812; // установка регистра совпадения TIMSK2 |= (1 << OCIE2A); // разрешить прерывание при совпадении с регистром А TCCR2B |= (1 << CS02) | (1<< CS00); //установить делитель частоты на 1024 ISR(TIMER2_COMPA_vect) //прерывание по переполнению { Flag1 = 1; //флаг разрешить опрос потенциометров P и t разрешение и диод } // инициализация Timer1 для запуска по int0 на заданный интервал TCCR1B=0; //настройка таймера1 TCCR1A=0; //настройка таймера1 EICRA |=(1<<ISC00)|(0<<ISC01); //настройка внешнего прерывания int0 (falling ) EIMSK |=1<<INT0; //разрешаем внешнее прерывание int0 ISR (INT0_vect) //по внешнему прерыванию запустить таймер1 { TCCR1A = B00000010; //режим счёта импуьльсов OCR1A сброс в 0 при совпадении TCCR1B = B00001011; //запуск таймера1 делитель частоты на 64 т.е.каждые 4мкс OCR1A = delit; // установка регистра совпадения для времени задержки подачи импульса TIMSK1 |= (1 << OCIE1A); // разрешить прерывание при совпадении с регистром А FlagSIM = 1; //Разрешить запуск симистора } }Благодарю. Попробую
Можете ещё уточнить по Таймер1? ISR по прерыванию int0 будет запускать Таймер1 по имеющемуся коду и настройке таймера? И Флаг FlagSIM для подачи импульса на симистор по прерыванию будет срабатывать в таком случае? Требуется, чтобы флаг сработал по срабатыванию таймера после отсчёта заданного интервала.
С 34 по 41 строки вынесите и поставьте перед сетапом
Можете ещё уточнить по Таймер1? ISR по прерыванию int0 будет запускать Таймер1 по имеющемуся коду и настройке таймера?
ISR - это функция обработчик. Зачем Вы засунули её в setup известно одному Вам. Ваш код не компилируется, а потому Ваш вопрос будет ли он что-то запускать выглядит странно. Не будет уже потому, что не скомпилируется и не зальётся.
С 34 по 41 строки вынесите и поставьте перед сетапом
Но строки 23-26 аналогичны, там также ISR и ошибок не давал компилятор
Можете ещё уточнить по Таймер1? ISR по прерыванию int0 будет запускать Таймер1 по имеющемуся коду и настройке таймера?
ISR - это функция обработчик. Зачем Вы засунули её в setup известно одному Вам. Ваш код не компилируется, а потому Ваш вопрос будет ли он что-то запускать выглядит странно. Не будет уже потому, что не скомпилируется и не зальётся.
Евгений, благодарю!
Убрал ISR из setup - компилятор скушал без ошибки.
Осталось разобраться формированием импульса по совпадению с заданным интервалом.
Вот так сейчас выглядит код
void setup () { Serial.begin(115200); pinMode (ENABLEWORK, INPUT); //работает как вход pinMode (SIM, OUTPUT); //работает как выход на симистор pinMode (LED, OUTPUT); //работает как выход на светодиод pinMode (2, INPUT); //Pin2 вход прерывания int0 //attachInterrupt (0, Uprsim, FALLING); //внешнее прерывание на D2 по спаду cli(); // отключить глобальные прерывания val1old = 500; // инициализация Timer2 для отсчётов каждые 0,5с 7812 TCCR2A = 0; // установить регистры в 0 TCCR2B = 0; TCCR2A |= (1 << WGM01); //сброс при совпадении OCR2A = 7812; // установка регистра совпадения TIMSK2 |= (1 << OCIE2A); // разрешить прерывание при совпадении с регистром А TCCR2B |= (1 << CS02) | (1<< CS00); //установить делитель частоты на 1024 // инициализация Timer1 для запуска по int0 на заданный интервал TCCR1B=0; //настройка таймера1 TCCR1A=0; //настройка таймера1 EICRA |=(1<<ISC00)|(0<<ISC01); //настройка внешнего прерывания int0 (falling ) EIMSK |=1<<INT0; //разрешаем внешнее прерывание int0 nom = 3; sei(); // включить глобальные прерывания } ISR(TIMER2_COMPA_vect) //прерывание по переполнению { Flag1 = 1; //флаг разрешить опрос потенциометров P и t разрешение и диод } ISR (INT0_vect) //по внешнему прерыванию запустить таймер1 { TCCR1A = B00000010; //режим счёта импуьльсов OCR1A сброс в 0 при совпадении TCCR1B = B00001011; //запуск таймера1 делитель частоты на 64 т.е.каждые 4мкс OCR1A = delit; // установка регистра совпадения для времени задержки подачи импульса TIMSK1 |= (1 << OCIE1A); // разрешить прерывание при совпадении с регистром А FlagintZC = 1; //установить флаг "прерывание int0 произошло" FlagSIM = 1; //Разрешить запуск симистора } void loop() {Вы сами себя в комментариях обманываете
COMPA- это прерывание по совпадению.
Код уже переделал. Прерывание int0 и таймер1и2 работают,однако заметил странность в работе таймера1. Сейчас импульсы на вход подаю от внешнего генератора (имитация сигнала датчика нуля). Если включать импульс управления симистором по срабатыванию внешнего прерывания функция attachInterrupt, то фаза этого импулса точно совпадает с импульсом генератора. А теперь о таймере1. Когда же я запускаю тамер1 по совпадению на заданный интервал, то фаза импульса управления симистором скачет в пределах 20мкс! Это странно особенно если учесть то, что loop почти не загружен. Код размещу позже, сейчас пишус телефона.
Всё разобрался сам. Нашёл косяк. Не устанавливал регистр GTCCR поэтому фаза импульса плавала.
Всё разобрался сам. Нашёл косяк. Не устанавливал регистр GTCCR поэтому фаза импульса плавала.
обычно рабочий код скетча выкладывают )))
обычно рабочий код скетча выкладывают )))
По моим наблюдениям, обычно выкладывают как раз нерабочие в #0 ))