Forum: Compiler & IDEs timer interrupt problem


von Markus R. (Firma: tu wien) (specht)


Angehängte Dateien:

Lesenswert?

hallo,
ich habe gerade in der uni angefangen atmega16 zu programmieren und hab 
da eine frage. ich wollte einfach nur eine stoppuhr programmieren, 
schaffe es jedoch nicht die zeit anzuhalten.
zum stoppen lese ich einfach einen button ein:

help = PINA;
if((help & 0x40)==0x40){ /*wenn PINA.7  auf 1 ist, --> uhr stoppen */
  flag = 0;
}
else{
  flag = 1;
}

soweit funktioniert das ja auch.
jetzt will ich aber im timer interrupt das flag auslesen und entweder 
einen counter dort weiterlaufen lassen oder eben stoppen, damit die zeit 
stehen bleibt:

SIGNAL(SIG_OVERFLOW1){/*timer interrupt*/
if(flag == 1){
  temp++;
}

das funktioniert aber einfach nicht. temp wird einfach immer 
weitergezählt.  ich hab auch schon probiert, dass ich einfach mal gleich 
nach dem abfragen des buttons leds ein und ausschalte. das geht auch. 
nur die abfrage im interrupt macht ein problem.
kann es sein, dass das überhaupt nicht funktioniert oder hats da ein 
anderes problem?
mfg specht

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Pin A7 hat die Maske (1 << 7), also 0x80 und nicht 0x40.

von Markus R. (Firma: tu wien) (specht)


Lesenswert?

danke für den tipp, aber da ist einfach nur der kommentar alt. sollt ich 
mal ausbessern.
also das einlesen des buttons funktioniert (am pin a6)
nur das abfragen des flags im interrupt geht einfach nicht.
mfg

von Stefan E. (sternst)


Lesenswert?

volatile

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Dir ist schon klar daß das bestenfalls nur dann geht, wenn der Taster 
(dauerhaft) gedrückt ist?

Ausserdem tust du dir und anderen einen Gefallen, wenn du "magische" 
Zahlen wie in TIMSK=4 vermeidest. Ich hab jetzt keine Lust das Handbuch 
runterzulagen und zu schauen was in Bit 2 codiert ist; es sollte aber 
gleichbedeutend sein zu sowas wie
1
TIMSK |= (1 << TOV1);

Johann

von Markus R. (Firma: tu wien) (specht)


Lesenswert?

ok danke für die tipps. werds gleich mal umschreiben. bin wie gesagt neu 
im programmiergeschäft. drum schaut der code vielleicht ein bisschen 
anders aus.
das es nur solange stoppt, wie der button gedrückt ist ist mir schon 
klar. ich werds noch umändern, so dass der button start - stopp toggelt

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Und nachdem du den Hinweis von Ernst umgesetzt hast, lies mal
AVR-GCC-Tutorial/Die Timer und Zähler des AVR durch. DU kannst den 
Timer besser betreiben im CTC-Mode (clear Timer on compare match) und 
musst nicht von Hand die Timerwerte (momentan zudem zu einem ungünstigen 
Zeitpunkt) in Timer1 neu setzen.

Johann

von Markus R. (Firma: tu wien) (specht)


Lesenswert?

ok werd ich machen. wird sicher noch ein langer sonntag ;)
übrigens danke für die vielen schnellen tipps. echt cool das forum hier.
das tutorial ist echt gut. im datenblatt nachlesen ist da wirklich viel 
anstrengender.

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.