- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 5 von 5

Thema: Kein Overflow Interrupt für Timer0

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    04.02.2006
    Ort
    Aachen
    Beiträge
    14

    Kein Overflow Interrupt für Timer0

    Hi!

    Ich arbeite gerade an meinem ersten Timer/Interrupt Programm. Ich bin ja eigentlich der Meinung, dass es läuft, nur der AVR eben nicht!


    Es soll einfach eine LED an PB0 blinken...

    LED1 und LED2 sind nur zum Test drin, wobei LED1 leuchtet, LED2 aber nicht. Scheinbar wird nicht ein einziger Interrupt ausgelöst...

    Ich wäre mal dankbar, wenn jemand mal drüber schauen könnte.


    Hier mal der Code:
    Code:
    /*Programm zur Ausgabe von PWM Signalen   v070605
     *fuer Atmega8 @ 3.6864 MHz
     */
    
    
    #define F_CPU 3686400
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <stdint.h>
    
    volatile uint8_t NumberOverflow0; /*Zaehlt die Ueberlaeufe des Timer0*/
    
    
    
    
    ISR(TIMER0_OVF_vect) /*Interrupt Timer0 Overflow*/
    
    {
      /*
       *Check
       */
      PORTB |= (1<<PB2); /*LED2 fuer Test*/
      /*
       *Check
       */
    
      NumberOverflow0++; /*NumberOverflow0 hochzaehlen*/
      
      if(NumberOverflow0==15) /*beim 15. Overflow PB0 auf high, 3686400/1024 = 3600,3600/256 = 14.0625, 15 Ueberlaefe ~1 sek*/
        {
          PORTB |= (1<<PB0);
        }
    
      if(NumberOverflow0==30) /*beim 30. Overflow PB0 auf low*/
        {
          PORTB &= ~(1<<PB0);
    
          NumberOverflow0 = 0; /*NumberOverflow0 zurÃŒcksetzen*/
        }
    }
    
    
    
    int main(void)
    
    {
      TCCR0 |= (1<<CS00) | (1<<CS02); /*Prescaling /1024*/
      TIMSK |= (1<<TOIE0); /*Overflowinterrupt aktivieren*/
    
      sei(); /*globale Interrupts aktivieren*/
    
      DDRB = 0xff; /*PortB als Ausgang*/
    
      NumberOverflow0 = 0;
      
      /*
       *Check
       */
      if((SREG & (1<<7)) && (TCCR0 & (1<<CS00)) && (TCCR0 & (1<<CS02)) && (TIMSK & (1<<TOIE0))) /*Einstellungen testen*/
        {
          PORTB |= (1<<PB1); /*LED1 fuer Test*/ 
        }
      /*
       *Check
       */
    
      while(1)
        {
          ;
        }
    }

    Gruß Elias

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hm,
    soltte funktionieren
    Zwei Anmerkungen:
    1.Numberoverflow0 brauch nicht volatile und global den kannst Du lieber als static in der ISR deklarieren
    2. TCCR0 und TIMSK kannst Du auch direkt zuweisen, brauchst nicht verodern

    Aber wie gesagt, es müßte funktionieren...
    Was ist das für ein Controller nochmal ?

    Gruß Sebastian

    EDIT: Habe gerade Deim Programm 1:1 auf einem Mega 16 aufgespielt, blinkt was das Zeug hält
    Software is like s e x: its better when its free.
    Linus Torvald

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    04.02.2006
    Ort
    Aachen
    Beiträge
    14
    Hi!

    Das Programm ist für einen Atmega8.

    Ich meine im Forum gibt es schon viele Beispiele zum Thema Timer und Interrupt, aber ich habe das nicht hin bekommen...

    Wenn ich NumberOverflow in der ISR deklariere, kann ich dann den Wert in main() setzen? Mir ist die Handhabung der ISR noch nicht soo vertraut... ne Funktion ist es ja in dem Sinne nicht...

    Elias

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hallo, ich habe meinen Beitrag oben Editiert, nochmal:
    Ich habe Dein Programm 1:1 übernommen und in eine M16 gebrannt, es klappt PB0 blinkt...
    Vielleicht stimmt was mit der Hardware bei Dir nicht ?

    Was Deine Frage mit NumberOverflow angeht, klar, wenn Du den von außerhalb verändern willst mußt Du den schon global deklarieren, meine Anmerkung bezog sich auf dieses Beispiel hier

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    04.02.2006
    Ort
    Aachen
    Beiträge
    14
    Hi!

    Ja danke... dann werde ich mir mal die hardware vorknöpfen. Ich habe auch irgendwo noch einen Atmega32 auf dem ich das mal ausprobiere.

    Elias


    EDIT: Mmh... Das Programm läuft nach wie vor nicht... Dann muss ich doch noch mal unter Windows mit Basic da dran (da habe ich ein paar Beispielprogramme). Ich hoffte das hätte ich hinter mir :-/

    Ok...Die hex Datei aus den Basiccode geht...Hardwarefehler ist somit ausgeschlossen. Dann liegt der Fehler im Compiler

    EDIT2: Tippfehler in meinem Compiler Script...
    Jetzt gehts!

Berechtigungen

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

12V Akku bauen