www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik timer interuppt avr atmega8


Autor: micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <avr/io.h>   //Bibliotheken(Headerfiles einbinden) 
#include <avr/interrupt.h>

#define F_CPU 16000000UL

volatile int a=0;

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

int main (void) 
{           

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

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

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

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

        sei();  // globale Interrupts zulassen

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.