Answer the question
In order to leave comments, you need to log in
Arduino MEGA timer interrupts?
Good afternoon. The head swells with a bunch of other questions and does not want to master the work with timers ((((
What you need:
- call two interrupts on different timers
- be able to quickly change the frequency of the
timers mixed porridge)
volatile unsigned int tcnt2;
volatile unsigned int flag;
void setup()
{
flag=true;
TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2
TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика
TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика
ASSR &= ~(1<<AS2); //Выбор источника синхронизации таймера если AS2=0 от системного генератора
tcnt2 = 1; // 16000000/64/f=tcnt2
TIMSK2 |= (1<<TOIE2);//Разрешение прерывания по переполнению Т2.
}
void loop()
{
}
void MyInterupt()
{
if (flag) {
flag=false;
}
else{
flag=true;
}
//обработчик вашего прерывания
}
//****************обработчик прерывания********************
ISR(TIMER2_OVF_vect)
{
TCNT2 = tcnt2;
MyInterupt();
}
TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2
//****************обработчик прерывания********************
29
ISR(TIMER2_OVF_vect)
30
{
31
TCNT2 = tcnt2;
32
MyInterupt();
33
}
Answer the question
In order to leave comments, you need to log in
void setup()
{
//------ Timer0 ----------
TCCR0A = (1<<WGM01); // Режим CTC (сброс по совпадению)
TCCR0B = (1<<CS00); // Тактирование от CLK.
// Если нужен предделитель :
// TCCR0B = (1<<CS01); // CLK/8
// TCCR0B = (1<<CS00)|(1<<CS01); // CLK/64
// TCCR0B = (1<<CS02); // CLK/256
// TCCR0B = (1<<CS00)|(1<<CS02); // CLK/1024
OCR0A = 123; // Верхняя граница счета. Диапазон от 0 до 255.
// Частота прерываний будет = Fclk/(N*(1+OCR0A))
// где N - коэф. предделителя (1, 8, 64, 256 или 1024)
TIMSK0 = (1<<OCIE0A); // Разрешить прерывание по совпадению
//------ Timer1 ----------
TCCR1B = (1<<WGM12); // Режим CTC (сброс по совпадению)
TCCR1B |= (1<<CS10); // Тактирование от CLK.
// Если нужен предделитель :
// TCCR1B |= (1<<CS11); // CLK/8
// TCCR1B |= (1<<CS10)|(1<<CS11); // CLK/64
// TCCR1B |= (1<<CS12); // CLK/256
// TCCR1B |= (1<<CS10)|(1<<CS12); // CLK/1024
OCR1A = 2678; // Верхняя граница счета. Диапазон от 0 до 65535.
// Частота прерываний будет = Fclk/(N*(1+OCR1A))
// где N - коэф. предделителя (1, 8, 64, 256 или 1024)
TIMSK1 = (1<<OCIE1A); // Разрешить прерывание по совпадению
//------ Timer2 ----------
TCCR2A = (1<<WGM21); // Режим CTC (сброс по совпадению)
TCCR2B = (1<<CS20); // Тактирование от CLK.
// Если нужен предделитель :
// TCCR2B = (1<<CS21); // CLK/8
// TCCR2B = (1<<CS20)|(1<<CS21); // CLK/32
// TCCR2B = (1<<CS22); // CLK/64
// TCCR2B = (1<<CS20)|(1<<CS22); // CLK/128
// TCCR2B = (1<<CS21)|(1<<CS22); // CLK/256
// TCCR2B = (1<<CS20)|(1<<CS21)|(1<<CS22); // CLK/1024
OCR2A = 234; // Верхняя граница счета. Диапазон от 0 до 255.
// Частота прерываний будет = Fclk/(N*(1+OCR2A))
// где N - коэф. предделителя (1, 8, 32, 64, 128, 256 или 1024)
TIMSK2 = (1<<OCIE2A); // Разрешить прерывание по совпадению
sei (); // Глобально разрешить прерывания
}
ISR (TIMER0_COMPA_vect)
{
// Обработчик прерывания таймера 0
}
ISR (TIMER1_COMPA_vect)
{
// Обработчик прерывания таймера 1
}
ISR (TIMER2_COMPA_vect)
{
// Обработчик прерывания таймера 2
}
You could choose a timer. Those. what values should be written for what timers? If I understand correctly, then in this line the timer and its mode of operation are selected
ISR (TIMER<b>0</b>_COMPA_vect)
OCR0A = 123; // Верхняя граница счета. Диапазон от 0 до 255
OCR1A = 2678; // Верхняя граница счета. Диапазон от 0 до 65535
: here, by the way, there is a noticeable difference between using 8 and 16 bit values). And it's not entirely clear how the interrupt handler is attached to a specific counter.
Thank you all very much! But everything turned out to be easier - I found an excellent
arduino timer library that does everything it needs!
#include <ve_avr.h> // Используется библиотека VEduino
#include "myheader.h"
/*
* Эта функция должна быть определена в заголовке myheader.h
* чтобы её код не вызывался, а был включен в тело функции-обработчика прерывания.
*/
inline void MyInterupt()
{
if (flag) {
flag=false;
}
else{
flag=true;
} //обработчик вашего прерывания
}
volatile unsigned char tcnt2;
volatile bool flag;
void setup()
{
flag = true;
DEV_TICTRL2.overflowIntDisable();
DEV_TIMER2.setWaveGenMode(Timer2::Normal);
DEV_TIMER2.setPrescaler(Prescaler2::Prescaler64);
DEV_ASYNCST.setTimer2ClkSrc(AsyncStatus::CLKIO);
tcnt2 = 1;
DEV_TICTRL2.overflowIntEnable();
enableInterrupts();
}
void loop() { }
//****************обработчик прерывания********************
ISR(TIMER2_OVF_vect)
{
DEV_TIMER2.setCounter(tcnt2);
MyInterupt();
}
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question