#define Channel_A 9
#define Channel_B 10
uint32_t number = 0;
volatile byte tmrCount = 0;
bool Enc_Run = false;
bool DIR;
void setup()
{
pinMode(Channel_A, OUTPUT);
pinMode(Channel_B, OUTPUT);
Serial.begin(9600);//enable serial monitor
Serial.println("Interrupt timer1 calculator");
Serial.println("--------------------");
}
ISR(TIMER1_COMPA_vect){
//interrupt commands for TIMER 1 here
switch (tmrCount & 3) {
case 0:
digitalWrite(Channel_A,HIGH);
break;
case 1:
digitalWrite(Channel_B,HIGH);
break;
case 2:
digitalWrite(Channel_A,LOW);
break;
case 3:
digitalWrite(Channel_B,LOW);
}
number++;
if (!DIR) {
tmrCount++;
}
else {
tmrCount--;
}
}
void loop() {
while (Serial.available() == 0) {}
int value = Serial.parseInt();
float Freq;
int Puls10Mtr=6522;
float CompareReg;
if(value > 0)
{
cli(); // stop interrupts
TCCR1A = 0; // set entire TCCR1A register to 0
TCCR1B = 0; // same for TCCR1B
TCNT1 = 0; // initialize counter value to 0
Freq=value;
Serial.print("Fequency: ");
Serial.print(Freq,5);
Serial.println(" Hz");
CompareReg=(16000000/(1*Freq))-1;
if (CompareReg<65536){
Serial.println("CS12 - CS10 = 001 : divide by 1");
// Set CS12, CS11 and CS10 bits for 1 prescaler
TCCR1B |= (0 << CS12) | (0 << CS11) | (1 << CS10);
goto Found;
}
CompareReg=(16000000/(8*Freq))-1;
if (CompareReg<65536){
Serial.println("CS12 - CS10 = 010 : divide by 8");
// Set CS12, CS11 and CS10 bits for 8 prescaler
TCCR1B |= (0 << CS12) | (1 << CS11) | (0 << CS10);
goto Found;
}
CompareReg=(16000000/(64*Freq))-1;
if (CompareReg<65536){
Serial.println("CS12 - CS10 = 011 : divide by 64");
// Set CS12, CS11 and CS10 bits for 8 prescaler
TCCR1B |= (0 << CS12) | (1 << CS11) | (1 << CS10);
goto Found;
}
CompareReg=(16000000/(256*Freq))-1;
if (CompareReg<65536){
Serial.println("CS12 - CS10 = 100 : divide by 256");
// Set CS12, CS11 and CS10 bits for 256 prescaler
TCCR1B |= (1 << CS12) | (0 << CS11) | (0 << CS10);
goto Found;
} CompareReg=(16000000/(1024*Freq))-1;
if (CompareReg<65536){
Serial.println("CS12 - CS10 = 101 : divide by 1024");
// Set CS12, CS11 and CS10 bits for 1024 prescaler
TCCR1B |= (1 << CS12) | (0 << CS11) | (1 << CS10);
goto Found;
}
Found:
Serial.print("compare match register: ");
Serial.println(word(CompareReg));
DIR = false;
// set compare match register
OCR1A = word(CompareReg);
// turn on CTC mode
TCCR1B |= (1 << WGM12);
// enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);
sei(); // allow interrupts
}
}