Input Capture bei ATmega162

Gast #281393
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
#281395
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


...
Gast #281398
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.
Angehängte Dateien:
#281399
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...

...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren