Forum: Mikrocontroller und Digitale Elektronik timer interuppt avr atmega8


von micha (Gast)


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;
}

von Johannes M. (johnny-m)


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?

von micha (Gast)


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
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.