Forum: Mikrocontroller und Digitale Elektronik Input Capture bei ATmega162


von exphystronic (Gast)


Lesenswert?

Hallo Leute,

ich habe ein kleines Problem mit der Input Captue Funktion des Timer 1
des ATmega162. Ich starte zuerst über einen externen Interrupt den
Timer und möchte dann die Zeit bis zum nächsten Peak messen. Ich mache
das mit Hilfe des Input Capture Interupts. Das Programm funktioniert
soweit, außer dass der At mir den Zeitstempel nicht vom TCNth registers
in das ICRl und ICRh register schreibt.

Vielleicht kann mir jemand sagen wo das Problem liegt?

Danke

von Hannes L. (hannes)


Lesenswert?

Du brauchst keinen externen Interrupt.
Der ICP-Pin kan beide Flanken erkennen, die Auswahl muss aber in der
ISR eingestellt werden.

Hier http://www.hanneslux.de/avr/zuenduhr/index.html findest du im
Quelltext des "Zündverteilers" ein Beispiel mit AT90S8515, wie
mittels ICP ein Signal gescannt wird.

...

von Hannes L. (hannes)


Lesenswert?

Hier der Relevante Teil der ISR:

impuls:         ;ISR Input-Capture Timer 1 (Datenempfang von Zünduhr)
                ;Achtung, das Signal ist wegen Optokoppler Low-aktiv!
 in srsk,sreg               ;SREG sichern
 in xl,tccr1b               ;aktuelle Flanke ermitteln
 cpi xl,icpf                ;fallende Flanke? (Impulsbeginn)
 brne impuls_steigend       ;nein, steigende
impuls_fallend:     ;Impulsbeginn (L-aktiv)
 ldi xl,icps                ;ja, ICP auf steigende
 out tccr1b,xl              ;Flanke umschalten
 in altzeit,icr1l           ;Zeitstempel Impulsbeginn holen
 rjmp impuls_e              ;fertig...
impuls_steigend:    ;Impulsende (L-aktiv)
 ldi xl,icpf                ;ICP auf fallende Flanke
 out tccr1b,xl              ;umschalten
 in xl,icr1l                ;Zeitstempel holen
 sub xl,altzeit             ;Zeitstempeldifferenz ermitteln


...

von exphystronic (Gast)


Lesenswert?

Danke für die Antworten, vieleicht muss ich die Werte in die x, y oder z
register einlesen und nicht in ein tempräres. Kann sein, dass da der
Hund begraben liegt.

von Hannes L. (hannes)


Lesenswert?

Nööö, eigentlich nicht...
Ich benutze nur deshalb xl, weil ich (für mich persönlich vereinbart)
die X-Register exklusiv für die ISRs als Tempregister nutze.

...

von exphystronic (Gast)


Angehängte Dateien:

Lesenswert?

Nein, das ist auch nicht der Grund.
Ich gehe jetzt schon das xte mal das Datenblatt durch aber ich verstehe
nicht wieso er die Werte nicht in die ICRl und h Register schreibt.
Wenn ich es simuliere dann macht er alles Brav außer den Zeitstempel in
das Register schreiben.

Im Anhang habe ich einmal mein Programm.

von Hannes L. (hannes)


Lesenswert?

Überdenke mal dein Konzept.

Ich würde es so nicht angehen. Du verschwendest unnötig Ressourcen. Du
brauchst keinen externen Int, du brauchst auch den Timer nicht zu
löschen, du musst dir nur den Zeitstempel des Impulsbeginns merken und
dann vom Zeitstempel des Impulsendes subtrahieren. Der Timer läuft
dabei frei durch. Damit hast du auch die Möglichkeit, parallel die
Compare-Interrupts zu nutzen, falls du Verzögerungen oder weitere
interne Takte zum Synchronisieren des Programmablaufs brauchst.

Versuche mal das Beispielprogramm zu verstehen, dann weißt du was ich
meine.

Dann gefällt mir das rcall in der ISR nicht, rcall/ret braucht 7 Takte,
ISRs sollen aber so kurz wie möglich sein. Das cli in der ISR ist
besonders gefährlich, sowas macht man nur im Ausnahmefall und auch nur,
wenn man genau weiß, was man tut.
Wenn man nur 2 Werte ins SRAM schreiben will, dann muss man auch keinen
Pointer benutzen, dann geht das auch mit sts. Pointer lohnt sich erst,
wenn es mehr Werte werden.

Und stell mal dein AVR-Studio so ein, dass es die Tabs durch Spaces
ersetzt, dann passt der Quelltext auch in anderen Programmen auf den
Bildschirm und man muss nicht immer hinundher scrollen (das ist ätzend)
wenn man die Zeile bis zum Ende lesen will. War bei mir anfangs auch so,
lässt sich aber einstellen.

So, erstmal genug kritisiert... - Sorry...

...

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.