PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATmega8 Timer1 Overflowinterrupt



Geimel
23.09.2007, 14:03
Hallo,
ich habe mal eine Frage zum Timer1 des Atmega 8. Und zwar habe ich ein Programm geschrieben, das bei Overflow des Timers Ports kurzzeitung anschaltet. Nun möchte ich aber nicht einen Überlauf des Timers bei 65536, sondern einem Variablen Wert. Kann man solch einen Wert einstellen, wenn ja wie? Bin aus dem Datenblatt nicht so richtig schlau geworden.
Hier mein Testcode der soweit funktioniert:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <util/delay.h>


ISR(TIMER1_OVF_vect){PORTD|=(1<<PD6)|(1<<PD5)|(1<<PD7);_delay_ms(100);PORTD&=~((1<<PD6)|(1<<PD5)|(1<<PD7));}


int main(void)
{ DDRD|=(1<<PD6)|(1<<PD5)|(1<<PD7);
TCCR1B|= (1<<CS10) | (1<<CS11); //Prescaling für 16 bit timer
TIMSK |= (1<<TOIE1); /*Overflowinterrupt aktivieren*/


PORTD|=(1<<PD6)|(1<<PD5)|(1<<PD7);
sei();
while(1){
}



return 0;}

Vielen Dank
Geimel

p_mork
23.09.2007, 14:54
Hallo Geimel,

um den Output Compare Match Intrrupt zu aktivieren, muss man die Bits OCIE1A für Output Compare A Match bzw. OCIE1B für Output Compare B Match im TIMSK setzten. Nun wird beim erreichen der Werte, die in den Registern OCR1A bzw OCR1B stehen, der TIMER1_COMPA-/TIMER1_COMPB-Interrupt ausgelöst. Wenn der Timer zusätzlich automatisch zurückgesetzt werden soll, sobalt der COMPA-Int eintrifft, muss man die das Bit WGM12 im TCCR1B setzten. Kleines Beispielprogramm, welches eine LED an PORTD.7 mit 0.5 Herz blinken lässt:



#include <avr/io.h>
#include <avr/interrupt.h>

ISR(TIMER1_COMPA_vect)
{
PORTD^=(1<<7);
}

int main()
{
DDRD|=(1<<7); //PD7 als Ausgang
TCCR1B=(1<<CS10)|(1<<CS12)|(1<<WGM12); //Prescale = 1024, CTC
OCR1A=F_CPU/1024; //Jede Sekunde ein IRQ

TIMSK|=(1<<OCIE1A); //Compare A Match Interrupt aktivieren

sei(); //Interrupts aktivieren

while(1); //Endlosschleife
}


MfG Mark