-         

Ergebnis 1 bis 2 von 2

Thema: ATmega8 Timer1 Overflowinterrupt

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    01.06.2006
    Ort
    Gernrode-Ilmenau
    Beiträge
    48

    ATmega8 Timer1 Overflowinterrupt

    Anzeige

    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:
    Code:
    #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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    26
    Beiträge
    522
    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:

    Code:
    #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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •