timer interuppt avr atmega8

Gast #748617
Lesenswert?

bin gerade die timer und die interuppt funktion am testen und will das 
nach 3 sekunden die led angeht aber es tut sich nix kann mir jemand 
sagen was ich falsch mache???

#include <avr/io.h>   //Bibliotheken(Headerfiles einbinden)   io=input 
output bibliiothek
#include <avr/interrupt.h>


#define F_CPU 16000000UL





volatile int a=0;

ISR ( TIMER0_OVF_vect )
{
    a++;  //das gleiche wie a=a+1
    if (a == 300)
    {PORTD |= (1<<PD5);} //led1setzen
}
int main (void)
{

   DDRD = 0x00;                      //Datenrichtungsregister D alles 0 
(Eingänge)
   //DDRD = (1 << DDD5);             //eine 1 für ausgang an Stelle 5
  // DDRD = (1 << DDD7);
         DDRD = (1 << DDD5) | (1<<DDD7) | (1<<DDD6);




//Quarztakt wird durch 1024 geteilt 16MHz/1024=15625Hz
// 15625Hz/100Hz(10ms)=156,25

      TCCR0 |= (1<<CS00)|(0<<CS01)|(1<<CS02);

      TCNT0  = 156;  // Vorladen

      TIMSK |= (1<<TOIE0);

// Interrupts freigeben

    sei();




   while(1) {
   }


   return 0;
}
#748707
Lesenswert?

Erstens musst Du den Pin, an dem die LED hängt, als Ausgang 
konfigurieren, und nicht als Eingang!

Du musst den Timer auch in der ISR wieder nachladen, sonst dauert das 
ganze mehr als doppelt so lang.

Sind die anderen Timer alle belegt? Wenn nicht, dann nimm einen von 
denen (Timer 2 z.B.) und betreibe ihn im CTC-Modus. Dann kannste Dir das 
lästige und ungenaue Vorladen komplett sparen.

BTW:
Bist Du sicher, dass die LED Low-Side angeschlossen ist und bei einer 1 
am Pin angeht? In vielen Fällen ist es andersrum.

EDIT:
Sehe grad, dass das sowieso fürchterlich chaotisch ist. Der Pin wird ja 
tatsächlich drei Zeilen weiter auf Ausgang geschaltet. Daran liegts also 
nicht. Allerdings ist das "DDRD = 0x00;" irritierend und überflüssig.

Und: Bitte formatiere den Code vernünftig! Unten unter den "Wichtigen 
Regeln" steht, wie es geht...

Noch ein EDIT:
Ist im Makefile bzw. AVRStudio der richtige Controller angegeben?
Gast #748942
Lesenswert?

hallo hab das Problem gelößt habe die fusebits nicht auf den externen 
Quarz   gestellt und deswegen vorher mit 1MHz gearbeitet jetzt läuft es 
danke
1
#include <avr/io.h>   //Bibliotheken(Headerfiles einbinden) 
2
#include <avr/interrupt.h>
3

4
#define F_CPU 16000000UL
5

6
volatile int a=0;
7

8
  ISR ( TIMER0_OVF_vect ) //auslößen des Timerinteruppts
9
  {
10
     
11
   TCNT0  = 100;  // Vorladen  
12
      
13
     a++;  //das gleiche wie a=a+1
14
    if (a >= 500) //500*9,984ms=4,992s
15
    {PORTD |= (1<<PD5);} //led1 setzen
16
  }
17

18
int main (void) 
19
{           
20

21
         DDRD = (1 << DDD5) | (1<<DDD7) | (1<<DDD6); //DDRD 5(Led1) 6(LED2) 7(Summer) als Ausgänge
22
    
23
    // Initialisierung des Timers:
24

25
      TCCR0 |= (1<<CS00)|(0<<CS01)|(1<<CS02); //Quarztakt wird durch 1024 geteilt 16MHz/1024=15625Hz
26

27
      TCNT0  = 100;  // Vorladen  15625Hz/101,16Hz(9,984ms)=156  256-156=100
28

29
      TIMSK |= (1<<TOIE0);  // Interrupts aktivieren und damit Timer starten  
30

31
        sei();  // globale Interrupts zulassen
32

33
 
34
   while(1) { }     //endlosschleife um programm nicht zu beenden                   
35
 
36
   
37
   return 0;       //Rückgabewert an das Betriebssystem (wird nie erreicht wegen while Schleife)          
38
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren