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
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ß
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.