PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zwei Timer = Problem



Moritz f.
29.05.2006, 15:32
Hallo,
ich habe gestern ein LCD Display mit einem AtMega 32 verbunden und eine Kleine Drehzahlmessung programmiert.
Soweit kein Problem. Das ganze ist mit Timer0 gemacht worden und basiert auf interrupts.
Timer1 verwende ich dazu um alle 16 sec die Anzeige des Displays zu verändern.

Ergebnis: Drehzahl funzt, wechsel nicht.

Im Simulator bin ich draufgekommen das sich die Timer " überschneiden" d.h es werd der Drehzahlinterupt ausgelöst und während dieser lauf wird der wechselinterrupt ausgelößt. Ich habe schon probiert den timer1 mit einem anderen wer zu loaden, er fäng jedoch immer bei 0 an.

Codeschnippsel kann ich leider im Mom nicht bieten aber vielleicht hatte jemand ein ähnliches Problem.

MfG Moritz

PicNick
29.05.2006, 17:03
Codeschnippsel kann ich leider ...
Is schade, denn offenbar ist da irgendetwas sub-optimales drin.

Moritz f.
29.05.2006, 21:57
Hallo,
bitte erkläre mir mal suboptimal :)

MfG Moritz

PicNick
30.05.2006, 07:26
optimal ~= das Beste
sub = darunter, unterhalb
unterhalb des Besten ==> nicht gar so gut, eher mäßig (eigentlich schrottig)

sebastian.heyn
30.05.2006, 09:23
Ich antworte dir jetzt mal weil hier ja sonst lieber gesülzt wird.

Also ein interrupt kann einen anderen nicht unterbrechen. Hatte dieses Problem schonmal. Du kannst das umgehen indem du interrupts wieder mit 'sei' aktivierst. Nachteil: dein Stack kann überlaufen, wenn du schlecht programmiert hast.
Mein vorschlag wäre einen zähler einzusetzen, der im hauptprogramm ausgewertet wird.

angenommen Drehzahlinterrupt 1x pro sekunde

do

if zähler=16 then
displayausgabe
zähler=0
end if

loop

end

timerinterrupt:
incr zähler
(drehzahlauswertung)
.
.
.
return

PicNick
30.05.2006, 09:25
.. weil hier ja sonst lieber gesülzt wird..
geht das deutlicher ?

sebastian.heyn
30.05.2006, 09:31
Is schade, denn offenbar ist da irgendetwas sub-optimales drin.
Hallo,
bitte erkläre mir mal suboptimal

MfG Moritz
optimal ~= das Beste
sub = darunter, unterhalb
unterhalb des Besten ==> nicht gar so gut, eher mäßig (eigentlich schrottig)


drei antworten, weder fachlich noch zum thema passend.

PicNick
30.05.2006, 09:34
präpotent = überheblich, klugsch...r

sebastian.heyn
30.05.2006, 09:49
Merkst du eigentlich das du ein kleines bisschen unsachlich wirst?

Leider ist nicht nur dein Ton ein Problem, sondern auch Inhalte, bei denen nix fachliches dabei ist.

@moritz: wenn noch fragen sind PM mich
hier ist anscheinend niemand an einer problemlösung interessiert sondern eher am lustig machen und eigene schlechte laune abreagieren. [/quote]

-tomas-
30.05.2006, 09:52
Vielleicht sollte man das Posten von Codeschnipseln in den Forumsregeln verankern um solche ausufernden nichtssagenden threads zu vermeiden.
Dann genügt ein einfacher Hinweis auf die Forumsregeln.

Im Simulator bin ich draufgekommen das sich die Timer " überschneiden" d.h es werd der Drehzahlinterupt ausgelöst und während dieser lauf wird der wechselinterrupt ausgelößt.
Überschneidungen lassen sich nur mit Enable/Disable Interrupt und TimerX erzeugen. Ansonsten wartet der µC mit der ISR des ausgelösten Interrupts bis er wieder auf ein RETI stößt.
Prüfe bei zwei ISR mal den $hwstack!

sebastian.heyn
30.05.2006, 09:55
@thomas: Ich denke das problem ist auch ohne code sehr gut zu verstehe, wenn man das datenblatt kennt. Ich fände es dagegen sinnvoller in den regeln zu verankern, dass unsachliche und nicht zum thema passende antworten zu unterlassen sind.

-tomas-
30.05.2006, 10:07
@sebastian.heyn
habe Posting ergänzt, bin somit wieder regelkonform :-)

Es ist sinnvoller einen Codeschnipsel zu lesen als darüber zu grübeln er bei Drehzahlinterupt und Wechselinterrupt berücksichtigt hat, dass jede nicht-NoSave-ISR 32 Byte auf dem HWStack belegt.