www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Input Capture


Autor: Sascha Dürkes (plutoonline)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich lese ein Signal per Input Capture ein.

Bei einem Interrupt steht ja dann in ICR1H und ICR1L die Aktuelle Zeit
zum Zeitpunkt des Interrupts.
Der Wert wird gespeichert und vom nächsten Wert abgezogen, so erhalte
ich die Signallänge.
So weit so gut, wenn aber der neue Wert kleiner ist als der
gespeicherte (Überlauf) kommt ja ein negativer Wert herraus.

Bsp.: 1. 1Wert=1000 2.Wert=2000
      2. 2Wert-1.Wert=1000
      So ist aller O.K

      1. 1Wert=2000 2.Wert=1000
      2. 2Wert-1.Wert=-1000

Ich habe das jetzt so gelöst:

  cp Wert1H,Wert2H
  brge comp2
comp1:
  cp Wert1L,Wert2L
  brge comp2
  rjmp norm
comp2:
  com Wert1H
  com Wert1L
  com Wert2H
  com Wert2L
norm:
  sub Wert2L, Wert1L
  sbc Wert2H, Wert1H

Jetzt zu meiner Frage:
Kann man das einfacher lösen?
Ich hoffe ich habe mich einigermaßen Verständlich ausgedrückt.
Vielen Dank für eure Hilfe!

Autor: Andreas Kassner (andi_k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BRGE würde ich nicht nehmen, da es das MSB als Vorzeichen (+/-) hernimmt
aber der Timer1 zählt ja von 0 bis 65535 und nicht von -32768 bis
+32767.
Benutze lieber BRSH (Same or higher unsigned) oder BRLO mit umgekehrtem
Vergleich (Lower unsigned).
Das hohe Byte einer 16 Bit-Zahl kann man mit CPC (Compare with Carry)
vergleichen.
Bei dem ersten Vergleich der Low-Bytes wird unter Umständen das
Carry-Bit gesetzt welches bei dem Vergleich der High-Bytes mit CPC
einbezogen wird.
Ansonsten würde ich nur den alten Wert negieren und nicht beide, sonst
kommt es ja wieder auf das selbe (falsche) hinaus.
Eine Negation ist übrigens nicht einfach nur ein Invertieren der Bits
sondern auch noch mit einem Abgleich von +1 verbunden.
So wird aus +1 (00000001) nach dem COM ein -2 (11111110), ein +1 macht
daraus dann -1 (11111111).

Für die Einfachheit:

 cp   Wert2L,Wert1L    ;Ist Wert2 (wahrscheinlich der neue)
 cpc  Wert2H,Wert1H    ;>= Wert1?
 brsh norm             ;Dann nicht negieren.
 com  Wert2H           ;Ansonsten Wert2
 neg  Wert2L           ;negieren.
 sbci Wert2H,-1        ;High-Byte korigieren +(1-Carry).
norm:
 sub  Wert2L,Wert1L
 sbc  Wert2H,Wert1H

MfG
Andi

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum so umständlich?
Gesucht ist die Differenz (Impulsdauer) seit dem letzten Int.
Da Timer und (2) Register positive Zahlen enthalten
(Interpretationsfrage), genügt eine einfache Subtraktion. Weitere
Vergleiche erübrigen sich, da die Differenz nicht negativ ist.

...

Autor: Andreas Kassner (andi_k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Hannes!

Stimmt, hast recht.
Wenn man es sich genau überlegt, erfolgt nach einem Überlauf des Timers
bei der Subtraktion des zuvor höheren Wertes vom neuen niedrigeren auch
ein Überlauf oder besser Unterlauf (Borrow) was das dann von selbst
korrigiert.

Beispiel:
Wert1 = 50000 (alt)
Wert2 = 1000  (neu)

Ergebnis muß dann 16536 sein (15536 bis zum Überlauf + 1000).

1000 - 50000 = -49000 (17 Bit), betrachtet ohne Vorzeichen als 16 Bit
ist es dann 16536.

MfG
Andi

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
'Nabend Andi...

Nunja, sehen wir den Timer soch einfach als eine "fortlaufende Zahl"
(Zeit kann man bekanntlich nicht zurückdrehen), von der wir nur die
letzten beiden Stellen (Bytes) berücksichtigen, die höheren Stellen
aber ignorieren. Somit ist der später eingelesene Wert immer höher als
ein zuvor eingelesener.

Bei der Subtraktion des vorherigen Wertes vom "neuesten" Wert kann
daher nur ein positiver Wert herauskommen. Also werfen wir das Carry
weg und interpretieren den 16-Bit-Wert als unsigned-Integer.

Gute N8...

...

Autor: Sascha Dürkes (plutoonline)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, vielen Dank für eure Erklärungen!
Ich bin jetzt aber ein wenig verwirrt, wie verhält sich das jetzt?
Soll ich jetzt einfach die Werte Subtrahieren und alles ist O.K.?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau...

 sub neu_low,alt_low     ;Lowbytes subtrahieren
 sbc neu_high,alt_high   ;Highbytes und Übertrag (Carry) subtrahieren

Vorher aber noch den Wert von neu_xxx sichern, damit er nach alt_xxx
kopiert werden kann und für die nächste Subtraktion bereit steht.

Wenn man die Werte im SRAM hält, dann benötigt man 4 temporäre
Register:

- SREG sichern
- benuzte Register freimachen (push)
- alten Wert aus SRAM holen (H und L)
- neuen Wert vom ICP-Register einlesen (H und L)
- neuen Wert als alten Wert ins SRAM (H und L)
- Subtraktion (erst L, dann H mit Carry)
- Ergebnis ins SRAM als Impulsdauer (H und L)
- benutzte Register wiederherstellen (pop)
- SREG wiederherstellen

...

Autor: Sascha Dürkes (plutoonline)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hatte leider keine Zeit in den letzten Tagen.

Ich werde das mal so austesten wie es Hannes beschrieben hat.
Vielen Dank nochmal an alle!!!!!!

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.