Forum: Mikrocontroller und Digitale Elektronik Falsche Werte bei Pulsweite messen


von Reinhard (Gast)


Angehängte Dateien:

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

von Profi (Gast)


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.

von Reinhard (Gast)


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.

von Profi (Gast)


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.

von Reinhard (Gast)


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

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
Noch kein Account? Hier anmelden.