www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Input Capture bei ATmega162


Autor: exphystronic (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: Hannes Lux (hannes)
Datum:

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


...

Autor: exphystronic (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: exphystronic (Gast)
Datum:
Angehängte Dateien:

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

Autor: Hannes Lux (hannes)
Datum:

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

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.