mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Falsche Werte bei Pulsweite messen


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

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forumgemeinde,

ich möchte die Pulsweite eines DCF77 Signals messen, die Werte die
der Controller ermittelt pendeln zwischen 60 und 68, macht bei
Prescale 1024/1000000Mhz = 0,001024s * 68 ca. 69ms.
Das Oszilloscope zeigt jedoch Weiten von weit über 100ms an.

Wo hat sich der Wurm versteckt ?

Danke.

Gruß
Reinhard

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht musst Du den Wert verdoppeln, was ist die Grundfrequenz des
Timers (Quarzfrequenz / 2? )?

Ist das ein 8 oder 16-bit-Zähler? Lege mal ein 1-10 Sekunden langes
Signal an und lese den Zähler ab.

Autor: Reinhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es ist timer0 = 8 bit, die werte liegen innerhalb einer minute immer bei
ca. 60 bis 68.

die grundfrequenz des timers :
prescale 1024/1000000mhz = 0,001024s * 68  = ca. 69ms.

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zwei Effekte könnten es sein:
Zählt der Zähler rauf oder runter?

Misst Du die high-Zeit oder die Low-Zeit? Bzw. was ist high? Pause oder
Impuls?
Wenn Du die Pause-Zeit mit einem 8-bit zählst, gibt es Überlaufe:

1000ms -163 ms = 837ms  ; 837 modulo 256 = 69


Beide Effekte können auch kombiniert sein, ich tippe eher mal Fall 2.

Möglichkeiten: Erzeuge mit einem andern Controller / Generator ein
Signal mit verschiedenen High- und Low-Zeiten und beobachte das
Display.

Autor: Reinhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich messe den Low Pegel, der kann bis max 230 ms dauern. Mit der
Einstellung von Timer0 1024/1000000*255 = max 261ms.
Außerdem gibt es noch eine Timer Overflow Routine.

Do  'Hauptfunktion,Werte von Fuktion Lopulse an Value übergeben
Cls
   Value = Lopulse()
   Locate 1 , 1 : Lcd "Pulsweite = " ; Value
Loop

End

Function Lopulse() As Word     'Funktion Pulsweite messen
   While Pind.6 <> 1 : Wend    'Wenn Pegel an Pind.6 Low
   Tcnt0 = 0                   'dann Timerwert auf 0 setzen
   Start Timer0                'Timer0 starten
   While Pind.6 = 1 : Wend     'wenn Pegel pind.6 High
   Stop Timer0                 'dann Timer0 stoppen
   Lopulse = Tcnt0          'Timerwerte an Variable Lopulse übergeben
End Function Lopulse()

Overflow_isr:
   !push R24
   Stop Timer0
   Tcnt0 = 0
   !pop R24
   Return

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.