// AVR Timer CTC Interrupts Calculator
// v. 8
// http://www.arduinoslovakia.eu/application/timer-calculator
// Microcontroller: ATmega2560
// Created: 2024-04-21T11:45:45.170Z
#define PWM_X 11
#define PWM_Y 5
#define DIR_PIN_X 2
#define DIR_PIN_Y 3
#define LED_X 13
#define LED_Y 12
volatile bool DIR_X = 0;
volatile bool DIR_Y = 0;
volatile int counter_X = 0;
volatile int counter_Y = 0;
void setupTimer1() {
noInterrupts();
// Clear registers
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// 10 Hz (16000000/((6249+1)*256))
OCR1A = 6249;
TCCR1A |= (1 << COM1A0);
// CTC
TCCR1B |= (1 << WGM12);
// Prescaler 256
TCCR1B |= (1 << CS12);
// Output Compare Match A Interrupt Enable
TIMSK1 |= (1 << OCIE1A);
interrupts();
}
void setupTimer3() {
noInterrupts();
// Clear registers
TCCR3A = 0;
TCCR3B = 0;
TCNT3 = 0;
// 10 Hz (16000000/((6249+1)*256))
OCR3A = 6249;
//TCCR3A |= (1 << COM3A0);
// CTC
TCCR3B |= (1 << WGM32);
// Prescaler 256
TCCR3B |= (1 << CS32);
// Output Compare Match A Interrupt Enable
TIMSK3 |= (1 << OCIE3A);
interrupts();
}
void setup() {
pinMode(4, INPUT_PULLUP);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(PWM_Y, OUTPUT);
pinMode(PWM_X, OUTPUT);
pinMode(LED_X, OUTPUT);
pinMode(LED_Y, OUTPUT);
setupTimer1();
setupTimer3();
}
void loop() {
if(digitalRead(4)==0)
{
TCCR3A |= (1 << COM3A0);
}
}
ISR(TIMER1_COMPA_vect) {
digitalWrite(LED_X, digitalRead(LED_X) ^ 1);
if(DIR_X== 0)
{
counter_X++;
}
if(DIR_X== 1)
{
counter_X--;
}
if (counter_X == 30)
{
DIR_X=1;
digitalWrite(DIR_PIN_X, DIR_X);
}
if (counter_X == 00)
{
DIR_X=0;
digitalWrite(DIR_PIN_X, DIR_X);
}
}
ISR(TIMER3_COMPA_vect) {
if(DIR_Y== 0)
{
counter_Y++;
}
if(DIR_Y== 1)
{
counter_Y--;
}
digitalWrite(LED_Y, digitalRead(LED_Y) ^ 1);
if (counter_Y == 30)
{DIR_Y=1;
digitalWrite(DIR_PIN_Y, DIR_X);
}
if (counter_Y == 00)
{DIR_Y=0;
digitalWrite(DIR_PIN_Y, DIR_X);
}
}