PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einschaltdauer einer LED oder Pulsbreite messen.



Michaele48
21.06.2005, 17:19
Hallo Leute, ich versuch seit tagen das dcf 77 Singnal für meine Nixi Uhr zu decodieren.
Jedoch leider ohne Erfolg.
Ich verwende den At 90S8515.
Das dcf Singnal habe ich auf Port.b1 (T1) gelegt. (ohne vorwiederstand).
Also, meine Led angeschlossen am dcf77 singnal blinkt im sekundentakt. Verwende ich diesen Tackt für meine Programierte Uhr, so leuft sie genau. Man mus sie halt noch von Hand stellen.
So weit ich das jetzt verstanden habe Blinkt die Led jede Sekunde entweder 100ms(0) oder 200ms(1). Zum decodieren muß man also die lange Low pause(felende Sekundenmarke) abwarten und nach weiteren 20 sekunden begint mit einem high die BCD Codierte Minute(1erStelle).
Jetzt verwendet man den Timer 1 zum Messen der Impule.
Und das bekomme ich nicht hin.
Könnte mir jemand erklären wie das funktioniert.
Ich lade meinen Programentwuf hoch. Ich weis er ist recht umständlich.
Aber für mehr reichen leider meine Kenntnisse noch nicht.
Ich hoffe sehr jemand kann mir helfen.

Danke im vorraus , Gruß Michael,

Michaele48
21.06.2005, 17:27
Hier sind noch ein paar Bilder von der Hardware.

sebastian.heyn
22.06.2005, 09:02
Hallo, wenn du eine bestimmte signaldauer messen willst (in diesem fall 100/200ms) dann brauchst du einen takt der mindestens zwei mal so schnell ist (also 50ms) damit die ganze geschichte genauer wird würde ich sogar bis auf 25ms runter gehen. dann nimmst du dir ein byte, welches du zu jedem intervall erhöhst. im hauptprogramm vergleichst du nun den eingang mit 0/1 und wenn du wieder 0 hast weisst du das dein byte ca.4 oder 8 ist. (bit0/1). Damit hast du die impulslänge gemessen.


Ich empfehle dir erstmal die nixies as debug zu nutzen, damit du siehst ob es wirklich geht...

Michaele48
22.06.2005, 16:19
Das habe ich schon im Programm ausprobiert:
Im Simulator fuktionirt das eigentlich so:

Dim a as Byte
Dim b as Byte
Dim i as Byte
Config Pinb.1 = Input
Portb.1 = 1

Pause:
If Pinb.1 = 1 Then Incr I |'erhöhen um 1
If I = 100 Then Goto L |' 100 ms Warten habe es auch mit höeren weren Probiert
Waitms 1
Gosub 21 | Debag ausgabe auf NIxi
Goto Pause

L:
I = 0
If Pinb.1 = 1 Then Goto H | Pausen länger als = 100 ms sprung zu Variable a = 1
A = 0
Goto Pause1

H:
I = 0
A = 1
Goto Pause1

Den wert für I habe ich auch schon verändert gröser b.z.w. kleiner.
jedoch kommt als Ergebnis immer nur 1 herraus.
Ich habe mir Überlegt das selbst wenn ich die Minutenmakierung nicht treffe und durch Zufall an irgendeiner stelle des DCF Cods Pausen messe, so müsten doch mindestens 1 oder 2 Nullen Impulse unter 200ms dabei sein.

Nomalerweise müste man doch den Timer1 verwenden können.
Habe auch schon mal rumexperimentiert.
Wo kann ich aber den Wert des Timers auslesen.
Im Simmulator erhot sich weder der Wert des Timers noch einer zugeordneten
Variablen.
Start Timer
Stop Timer
Timer = a

:(

sebastian.heyn
23.06.2005, 07:32
Den timer selber würde ich nicht auslesen. Aber mit dem Programm rnavr lässt sich ein timer prima berechnen, und es erzeugt beispielcode. der timer ruft dann ne routine auf in der du eine variable erhöhen kannst (incr x)

Michaele48
23.06.2005, 18:42
Wo gibt ws denn dieses Programm ?
Mavr ?