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
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. ...
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 ...
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.
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. ...
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.
Ü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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.