www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Capture Interrupt Mega 88


Autor: Martin S. (martinsc)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fred S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin S. (martinsc)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fred S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin S. (martinsc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Fred!
Habs jetzt begriffen...
Hab mit Hilfe deiner Antworten jetzt einen Weg gefunden!
Danke nochmal!
Gruss
martin

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.