Hallo zusammen! Für ein Projekt verwende ich den Analogkomparator mit dem Input Capture Inerrupt von Counter 1. Damit möchte ich erreichen, dass bei jeder steigenden Flanke der Interrupt ausgelöst wird und ich den jeweiligen Wert, im entsprechenden Register, abspeichern kann. Diese Werte möchte ich in den SRAM speichern, wo ich bereits die notwendigen Bytes reserviert habe. Dies möchte ich 16 mal machen und aus diesen Werten dann jeweils den Betrag ermitteln. Nun zu meiner Frage. Wie lege ich das codemäßig so an, dass der Interrupt genau 16mal ausgelöst wird und danach nicht mehr aktiv ist, damit ich mit meinen Berechnungen fortfahren kann. Bis jetzt habe ich das Problem, dass ich eine Interruptroutine dafür geschrieben habe in der ich die benötigten Register pushe dann das X-Register für das speicherindirekte Abspeichern vorbereite. Danach soll die Interruptroutine verlassen werden und auf die nächste Auslösung warten. Jetzt würde ich bei jeder Auslösung das X-Register neu definieren und somit immer an die gleiche Stelle im SRAM schreiben. Wo lege ich eine Zählvariable an um den Interrupt zu unterbrechen und wo lege ich das X-Register an, damit ich nicht immer an die gleiche Stelle speichere? Irgendwie stehe ich auf dem Schlauch... Vielen Dank für eurere Hilfe! Viele Grüsse Martin
Hallo Martin, nach Deiner Beschreibung geht es um Assembler. So ganz kapier' ich Deine Frage mit der X-Register-Initialisierung nicht. Trotzdem ein Vorschlag: Innerhalb Deiner ISR zählst Du bei jedem Interrupt eine Variable runter, die mit 16 initialisiert ist (nenne ich im Folgenden "Zähler"). Im Hauptprogramm wird X mit dem Beginn Deines RAM-Bereichs für die Werte initialisiert (vor dem ersten "sei"!). In der ISR wird der Wert (was für ein Wert eigentlich? - geht nicht aus Deiner Beschreibung hervor!) in ein Register übernommen und mit "st X+, r_wert" abgespeichert. Dann dekrementierst Du den Zähler. Wenn er Null ist, schaltest Du den Komparator-Interrupt innerhalb der ISR ab. Gruß Fred
Hallo Fred! Danke für deine Antwort! Ja, es geht um Assembler und mit X-Register Initialisierung meine ich, dass ich das Register mit dem Beginn, der im SRAM angelegten Variable, initialisiere. Ah, jetzt bin ich schon wieder einen Schritt weiter. So ähnlich habe ich das vorher auch schon gehabt. Ich möchte diese Routine öfters und zu unterschiedlichen Zeiten aufrufen. Wie mache ich das dann mit dem X-Register? Soll wie ein Art Unterprogramm werden, wo ich diese Messroutine nur Aufrufe und mir dann die Werte von ICR1L und ICR1H in den SRAM geschrieben werden. Ich hoffe es verständlich was ich schreibe... Vielen Dank nochmal! gruss Martin
Hi Martin, > Ich möchte diese Routine öfters und zu unterschiedlichen Zeiten > aufrufen. Wie mache ich das dann mit dem X-Register? ... Das ist zu ungenau für eine spezifische Antwort. Prinzipiell kannst Du es in Assembler doch so gestalten, dass jede Routine Einsicht in den Zähler der ISR hat, also erfahren kann, ob bereits 16 Messwerte abgespeichert wurden. Dann kann jede "übergeordnete Routine", wenn sie noch einmal 16 Messwerte abgespeichert haben will, den Zähler wieder auf 16 setzen, X korrekt (re-)initialisieren und den Komparator-Interrupt erneut aktivieren. Um festzustellen, ob bereits 16 Messwerte abgespeichert wurden, könnte die "übergeordnete Routine" auch nachsehen, ob der Komparator-Interrupt abgeschaltet ist (denn das macht ja die ISR nach dem Abspeichern von 16 Messwerten). Es führen viele Wege zum Ziel! Wenn Du 16-bit Werte speicherst, muss es (siehe mein Vorschlag oben) natürlich "st X+, r_wert_L st X+, r-wert_H" heißen. Viele Grüße Fred
Hallo Fred! Habs jetzt begriffen... Hab mit Hilfe deiner Antworten jetzt einen Weg gefunden! Danke nochmal! Gruss martin
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.