Forum: Compiler & IDEs WIN-AVR; springt nach TIMER1_OVF_vect ISR nach main()


von Toni (Gast)


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.

: Verschoben durch Moderator
von Stefan E. (sternst)


Lesenswert?

Weil du nicht den Overflow-Interrupt aktivierst, sondern den 
Output-Compare-Interrupt.

von I. L. (Gast)


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.

von Toni (Gast)


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
  }

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.