WIN-AVR; springt nach TIMER1_OVF_vect ISR nach main()

Gast #1938066
Lesenswert?
• ▲
▼
Guten Abend,

bin nun schon seit ungefähr 2 Stunden auf der Suche nach oben gennantem 
Problem.
Ich programmiere einen ATMEGA 8 in C und habe das Problem, dass nach dem 
Timer1 - overflow in die entsprechende ISR gesprungen wird, dennoch nach 
dem beenden der ISR wird an den Anfang von main(); gesprungen. Warum?
Hier noch die wichtigen ausschnitte aus dem Code:
1
void main (void)
2

3
  {......
4
          // Timer start
5
    zeitmessung_start();
6
    sei();
7

8
          while(1)
9
    {.....
10
    _delay_ms(2000);
11
    lcd_befehl(1);
12
    }      
13
  }
14

15
// Interrupt routine 
16

17
ISR (TIMER1_OVF_vect)
18
  {
19
    sek++;
20
    if(sek >= 60)
21
      {
22
      min++;
23
      sek = 0;
24
        if(min >= 60)
25
          {
26
          std++;
27
          min = 0;
28
          }
29
      }
30
  }

zeitmessung_start():
1
void timer1_start()
2
  {
3
    TCCR1B |= ((1<<WGM12) | (1<<CS11) | (1<<CS10));    // CTC-Mode 5; CLK/64   
4
  }
5

6
void zeitmessung_start()
7
  {
8
    OCR1A = 31250;      // OCR1a vorladen = 31250
9
    TIMSK |= (1<<OCIE1A);  // Interrupt Overflow start
10
    timer1_start();      // Timer1 starten
11
  }

Vielen Dank im voraus.
Gast #1938121
Lesenswert?
• ▲
▼
Mach es dir nicht unnötig schwer indem du für die kleinsten Sachen ne 
Funktion aufziehst, dass lohnt sich erst wenn man Sachen machen will die 
sich oft wiederholen müssen. Deine Timer starten Funktion is also nicht 
so elegant.
Gast #1938220
Lesenswert?
• ▲
▼
Ohje, vielen Dank.
Da hab ich mich wohl tierisch verschaut :).
Vollständigkeitshalber - So funktionierts:
1
void main (void)
2

3
  {......
4
          // Timer start
5
    zeitmessung_start();
6
    sei();
7

8
          while(1)
9
    {.....
10
    _delay_ms(2000);
11
    lcd_befehl(1);
12
    }      
13
  }
14

15
// Interrupt routine 
16

17
ISR (TIMER1_COMPA_vect)
18
  {
19
    sek++;
20
    if(sek >= 60)
21
      {
22
      min++;
23
      sek = 0;
24
        if(min >= 60)
25
          {
26
          std++;
27
          min = 0;
28
          }
29
      }
30
  }

Antwort schreiben

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.

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.