Hey Folks
What’s the fault in my code? i just want to run the Timer1 and it should turn on a LED on Pin 0 after a seconde or two. The clk is set to 8MHz. Documentation is here (Page 108 Timer1)
void setup(){
pinMode(0, OUTPUT);
cli();
TCCR1A = 0; // TCCR1A to 0 (no OCR1 shoul not change)
TCCR1B = 0; // reset TCCR1B
TCNT1 = 0; // start value 0
OCR1A = 4000;
GTCCR |= (1 << PSR10); // reset prescalar
TCCR1B |= (1 << WGM12); // enable Clear Timer on Compare Match with OCR1
TCCR1B |= (1 << CS12) | (1 << CS10); // 1024 prescaler
TIMSK1 |= (1 << OCIE1A); // Interrupt Mask Register 1: OCIE1A = 1 for Output Compare A Match Interrupt Enable
TIFR1 |= (1 << OCF1A); // set OCF1A flag for interrupt vector ? TIM1_COMPA or TIMER1_COMPA_vect
sei(); // set I-Flag or : SREG |= (1 << 7);
}
ISR(TIMER1_COMPA_vect){
digitalWrite(0,HIGH);
}
void loop(){
}
in the comments are some hints
fOCnA=fclk_I/O/[2* N*(1 + OCRnA)]
Got it.
Here the code with some comments:
// Timer/Counter 1 ATTiny24/44/84 using Arduino as ISP using repo of david a. mellis
// Toggle LED with Timer1 using CTC (Clear Timer on Compare Match)
// by bongo1234 11.11.2017
// Arduino IDE 1.8.5
// ATMEL DOCUMENTATION ATTiny24/44/84: PAGE 108 (Timer 1)
// for prescaler: doc page 97 (formula) and 111 (cs10-cs12 selection)
//
#define PIN 0 // SELECT YOUT OUTPUT PIN
#define I_FLAG 7 // Status register Flag I enables intrrupt globally
void setup(){
pinMode(PIN, OUTPUT);
TCCR1A = 0; // TCCR1A to 0 (no MODIFICATION ON OCR1 with CTC Mode) (DEFAULT)
TCCR1B = 0; // reset TCCR1B (DEFAULT)
OCR1A = 2000; // Output Compare Register 16-Bit recalculte for other timing
GTCCR |= (1 << PSR10); // reset prescalar (DEFAULT)
TCCR1B |= (1 << WGM12); // clear Timer when Counter (TCNT1) equals OCR1A --> CTC (Clear Timer on Compare Match)
TCCR1B |= (1 << CS12) | (1 << CS10); // 1024 prescaler
TIMSK1 |= (1 << OCIE1A); // Interrupt Mask Register 1: enable interrupt for TCNT is equal OCR1A
TIFR1 |= (1 << OCF1A); // set OCF1A flag for interrupt vector TIM1_COMPA_vect (DEFAULT)
TCNT1 = 0; // start value 0
SREG |= (1 << I_FLAG); // enable global interrupt in status register. It'ss equal to sei(); function
}
// Interrupt Service Routine for Timer1 (Vector select in TIFR1)
ISR(TIM1_COMPA_vect){
digitalWrite(PIN, digitalRead(PIN) ^ 1); // toggle PIN
}
void loop(){
}
cheers b