Forum: Mikrocontroller und Digitale Elektronik Capture Interrupt Mega 88


von Martin S. (martinsc)


Lesenswert?

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

von Fred S. (Gast)


Lesenswert?

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

von Martin S. (martinsc)


Lesenswert?

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

von Fred S. (Gast)


Lesenswert?

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

von Martin S. (martinsc)


Lesenswert?

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
Noch kein Account? Hier anmelden.