timer interuppt avr atmega8

Gast #748617
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
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
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.