Forum: Mikrocontroller und Digitale Elektronik 2 min Zähler parallel zum Hauptprogramm


von Matze (Gast)


Lesenswert?

Hossa!!!

Nachdem ich nun schon einen Tag lang keine Lösung für mein Problem
gefunden habe wende ich mich an dieses Forum.

Ich habe hier ein Board mit einem PIC-Controller und einem Display!
Ich lese über den AD Wandler einen Spannungswert ein und gebe ihn auf
dem Display aus!

Problem:

Es wird auch noch ein anderer Wert auf dem Display ausgegeben, den ich
alle 2 Minuten auf den letzten gemessenen Wert draufaddieren will! Es
hadelt sich hier um eine Art Strahlungsdosis, die alle 2 Min. erhöt
wird!
Ein Timer wäre hier doch sinnvoll, weil er parallel zum Hauptprogramm
läuft. Nur müsste ich ihn in einer Schleife mehrmals durchlaufen. Und
wenn ich diese Schleife in der Interupt Routine einbaue, bleibt ja mein
Hauptprogramm stehen!
Hat jemand eine Idee, wie ich das sinnvill lösen könnte?

Ich wäre um jeden Rat dankbar!!!

Matze

von Chris (Gast)


Lesenswert?

Hallo,

Du läßt den Timer einfach durch laufen und löst bei jedem Überlauf
einen Interrupt aus. Dann zählst Du in der Interruptroutine die
Überläufe so lange zusammen, bis die Zeit für einen Überlauf
multipliziert mit der Anzahl der Überläufe die 2 Minuten ergibt. Wenn
die nötige Anzahl erreicht ist, kannst Du die Interruptroutine
irgendein Bit in einem Register setzen/löschen lassen, um damit dem
Hauptprogramm anzuzeigen, daß die 2 Minuten um sind. Das Bit vom
Hauptprogramm aus jedesmal abfragen. Wenn die Ausgabe gemacht wurde,
das Flag wieder löschen/setzen und den Zähler in der Interruptroutine
wieder auf Null setzen.
Der Wert für den Vorteiler ergibt sich aus der verwendeten Taktfrequenz
und einer kleinen Rechnung.

Interruptroutinen sollen grundsätzlich so kurz wie möglich sein.

Gruß

von Matze (Gast)


Lesenswert?

Hui, das ging schnell! Danke!

Also sehe ich das richtig:

Der Timer läuft parallel zum Hauptgrogramm!
Der Interrupt jedoch nicht! Hier blaibt das Hauptprogramm stehen und
der der Interrupt wird bearbeitet! Darum sollte die Routine auch sehr
kurz gehalten werden!
Es ist halt nur dumm, dss ich den Timer ein paar 100 mal durchlaufe und
damit ein paar 100 Interrupts habe, also wird mein Hauptprg. auch ein
paar 100 mal unterbrochen.
Eine andere Möglichkeit, mein Hauptprg. ohne Unterbrechungen laufen zu
lassen, gibt es also nicht?

Matze

von Alex (Gast)


Lesenswert?

An Atmels kann man auch externe Uhrenquarze anschließen. Wenn man die
über entsprechende Prescaler auswählt, werden es weniger Interrupts.
Allerdings kannst du die Unterbrechungen meiner Meinung nach zeitlich
gesehen in den Skat drücken, um die du dir grad Sorgen machst.
Es kostet effektiv nur wenige Zyklen, da der MC ja nur einen Sprung in
deine ISR machen muss, dort eine Variable inkrementiert und dann schon
wieder zurück ins Hauptprogramm springt.

Gruss, Alex

von Chris (Gast)


Lesenswert?

Hallo,

das hast Du vollständig richtig kapiert!

Wenn Du überhaupt keine Zeit übrig hast, was ich für unwahrscheinlich
halte, mußt Du eben extern einen 2 Minuten-Zähler aufbauen und dann
über einen externen Interrupt über den passenden Pin dieses Ereignis
verarbeiten.

Ist dein Programm wirklich nie am Warten auf irgendwas? Die Werte vom
AD-Wandler abzuholen und auf's LCD zu senden kann doch nicht sooo
rechenintensiv sein. Das reicht doch, das höchstens 10 mal in der
Sekunde zu tun, Timergesteuert. Dann könntest Du alle 1200 Mal Deine
momantane Strahlenbelastung anzeigen. Nur 'n Vorschlag.

Oder du führst dem Timer von Außen einen Takt niedriger Frequenz zu, so
daß er nur einmal in 2 Minuten überläuft. Benötigt externen Oszillator,
etc.

Gruß

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.