Forum: Mikrocontroller und Digitale Elektronik Timer0 bleibt im ISR


von Steffen (Gast)


Lesenswert?

nabend :-)
ich bin eben am verzweifelten versuch den Timer0 eines ATMega8 im OVF zu 
nutzen. Dabei habe ich eine funktionierenden Code aus einem älteren 
Projekt genutzt, neu compeliert und ausgeführt. Geht aber nicht. Wenn 
ich dann mit F11 den neuen Code ausführe, dann zählt der Timer bis 0x03h 
oder 0x20h. Je nach dem was für einen Prescaler eingestellt habe. 
komisch. In der Codeansicht sieht man wie nur der ISR Code ausgeführt 
wird und nicht zurück in den unterbrochenen Code springt.

Hier der Code den ich um den Timer zu testen geschrieben habe:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
const uint8_t T_COUNT = 100;
5
uint8_t timeCounter = 0;
6
7
uint8_t checkISR = 0;
8
9
ISR (TIMER0_OVF_vect)
10
{
11
  timeCounter++;
12
  if(timeCounter>=T_COUNT){  
13
    timeCounter = 0;
14
    checkISR = 1;
15
        }
16
}
17
18
int main(void){
19
  
20
  DDRD |= (1 << DDD5); //LED1
21
  PORTD &= ~(1<<PD5); // Port aus
22
23
  TCCR0 = (1 << CS02)|(1<< CS00); // Prescaler
24
  TIMSK |= (1 << TOIE0);  //Bei Overflow Interrupt auslösen
25
26
  sei(); // Interrupts global freigeben
27
28
  while(1)
29
  {
30
  if (checkISR == 1) {
31
    PORTD |= (1<<PD5);
32
    checkISR = 0;
33
    }
34
  }
35
  
36
  return 0;
37
}

von ●● pit ●. (Gast)


Lesenswert?

die wiki page schon gelesen? da sind die basics recht gut erklärt:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR

von Steffen (Gast)


Lesenswert?

ja das habe ich. Ich hab den Code auf das nötigste verkleinert unm nur 
den Timer zu testen. und genau das macht er nicht:

>Der Zähler zählt nun aufwärts bis 255, um dann wieder bei 0 zu beginnen.
>Der aktuelle Zählerstand steht in TCNT0. Bei jedem Überlauf von 255 auf 0
>wird das Timer Overflow Flag TOV0 im Timer Interrupt Flag TIFR-Register gesetzt
>und, falls so konfiguriert, ein entsprechender Timer-Overflow-Interrupt ausgelöst
>und die daran gebundene Interrupt-Service-Routine (ISR) abgearbeitet.
>Das TOV Flag lässt sich durch das Hineinschreiben einer 1 und nicht wie erwartet
>einer 0 wieder zurücksetzen.

er zählt entweder bis 0x03 oder 0x20. Wo liegt da der fehler? Hat der 
Compiler ne Fehler?

von Stefan E. (sternst)


Lesenswert?

Das Problem dürfte sein, dass der Debugger nicht mit der leeren 
while(1)-Schleife zu Recht kommt. Warum die leer ist? Weil du vergessen 
hast, checkISR volatile zu machen.

von Steffen (Gast)


Lesenswert?

gut hab ich so gemacht, geht aber auch nicht, das selbe Fehlerbild :-(
1
volatile uint8_t checkISR = 0;

von Karl H. (kbuchegg)


Lesenswert?

Fehler bei der Projekterstellung (falschen Controller eingestellt)?
Falscher Prozessor im Simulator eingestellt?

von Steffen (Gast)


Lesenswert?

Ich hab das gefühl als ob mich mein AVR Studio "verarscht" Das ist nicht 
das erste Projekt oder Programm. Ich hab jetzt eine ganz neues Projekt 
erstellt, mit dem Assistenten, Namen und Speicherort eingegeben, als 
Simulator den AVR Simulator gewählt und dann den ATMega8 so wie ich das 
immer mache. Ich glaub ich werd das AVR Studio neu installieren und 
schau dann mal.

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.