как запускать Timer1 по int0 и совпадению

romc9
Offline
Зарегистрирован: 01.12.2019

Здравствуйте! Прошу программистов помочь с кодом.  Собираю регулятор мощности с плавным пуском.

Требуется от внешнего прерывания 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

 

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Еще одного от гугла отключили.

http://www.cyberforum.ru/arduino/thread2386030.html

romc9
Offline
Зарегистрирован: 01.12.2019

mykaida пишет:

Еще одного от гугла отключили.

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; //Разрешить запуск симистора
    }
    
}

 

romc9
Offline
Зарегистрирован: 01.12.2019

Благодарю. Попробую

Можете ещё уточнить по Таймер1? ISR по прерыванию int0 будет запускать Таймер1 по имеющемуся коду и настройке таймера? И Флаг FlagSIM для подачи импульса на симистор по прерыванию будет срабатывать в таком случае? Требуется, чтобы флаг сработал по срабатыванию таймера после отсчёта заданного интервала.

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

С 34 по 41 строки вынесите и поставьте перед сетапом

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

romc9 пишет:

Можете ещё уточнить по Таймер1? ISR по прерыванию int0 будет запускать Таймер1 по имеющемуся коду и настройке таймера? 

ISR - это функция обработчик. Зачем Вы засунули её в setup известно одному Вам. Ваш код не компилируется, а потому Ваш вопрос будет ли он что-то запускать выглядит странно. Не будет уже потому, что не скомпилируется и не зальётся.

romc9
Offline
Зарегистрирован: 01.12.2019

mykaida пишет:

С 34 по 41 строки вынесите и поставьте перед сетапом

 

Но строки 23-26 аналогичны, там также ISR и ошибок не давал компилятор

romc9
Offline
Зарегистрирован: 01.12.2019

ЕвгенийП пишет:

romc9 пишет:

Можете ещё уточнить по Таймер1? ISR по прерыванию int0 будет запускать Таймер1 по имеющемуся коду и настройке таймера? 

ISR - это функция обработчик. Зачем Вы засунули её в setup известно одному Вам. Ваш код не компилируется, а потому Ваш вопрос будет ли он что-то запускать выглядит странно. Не будет уже потому, что не скомпилируется и не зальётся.

Евгений, благодарю!

Убрал ISR из setup - компилятор скушал без ошибки.

Осталось разобраться формированием импульса по совпадению с заданным интервалом.

romc9
Offline
Зарегистрирован: 01.12.2019

Вот так сейчас выглядит код

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()
{

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Вы сами себя в комментариях обманываете
COMPA- это прерывание по совпадению.

romc9
Offline
Зарегистрирован: 01.12.2019

Код уже переделал. Прерывание int0 и таймер1и2 работают,однако заметил странность в работе таймера1. Сейчас импульсы на вход подаю от внешнего генератора (имитация сигнала датчика нуля). Если включать импульс управления симистором по срабатыванию внешнего прерывания функция attachInterrupt, то фаза этого импулса точно совпадает с импульсом генератора. А теперь о таймере1. Когда же я запускаю тамер1 по совпадению на заданный интервал, то фаза импульса управления симистором скачет в пределах 20мкс! Это странно особенно если учесть то, что loop почти не загружен. Код размещу позже, сейчас пишус телефона.

romc9
Offline
Зарегистрирован: 01.12.2019

Всё разобрался сам. Нашёл косяк. Не устанавливал регистр GTCCR поэтому фаза импульса плавала.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

romc9 пишет:

Всё разобрался сам. Нашёл косяк. Не устанавливал регистр GTCCR поэтому фаза импульса плавала.

обычно рабочий код скетча выкладывают )))

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

ua6em пишет:

обычно рабочий код скетча выкладывают )))

По моим наблюдениям, обычно выкладывают как раз нерабочие в #0 ))