|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Thomas
Anmeldungsdatum: 24.03.2005 Beiträge: 3
|
Verfasst am: 24.03.2005, 15:19 Titel: Funkuhr realisieren |
|
|
Hallo!
Für meine Facharbeit in Physik muss ich einen Empfänger bauen, der das Zeitsignal empfängt (was mir auch schon gelungen ist) und ein Programm schreiben, welches das Zeitsignal dann auswertet.
Ich hab nicht viel Ahnung vom Programmieren. Ich hab in der Schule mit Java angefangen (aber für Java hab ich noch nicht mal im Netz die Möglichkeit gesehen, Schnittstellen auszulesen) und mit Basic hab ich auch ein bisschen Erfahrung und da fiel es mir schon mal leichter, etwas über das Auslesen von Schnittstellen zu finden.
Das Zeitsignal setzt sich zusammen aus einem unmoduliertem Trägersignal und dazwischen 100 oder 200 ms lange Pausen. Die Information über Datum etc liegt also in den Pausen. Zu jedem Minutenanfang wird die Pause einmal weggelassen was zu einem langen "Beep" führt. Also mein Empfänger kann "hohe" Spannung und "niedrige" Spannung für die Schnittstelle liefern. Ich möchte daraus dann einen Digitalcode extrahiert haben, nur wie? Muss die Spannung klar 0 / 5V haben oder reicht 1/2V (was den Aufwand ziemlich verringern würde..).
Ich hab jetzt gelesen, dass QB eigentlich nur 56ms-"Einheiten"kennt. Wie bekomme ich das hin, dass mein Programm mir die 100/200ms richtig auszählt? Ich hoffe ihr könnt mir helfen... |
|
Nach oben |
|
|
Paul aka ICC, HV-Freak
Anmeldungsdatum: 11.09.2004 Beiträge: 588 Wohnort: Uelzen
|
Verfasst am: 24.03.2005, 15:54 Titel: |
|
|
Moin, das DCF-Signal ist Pulsweitenmoduliert. Ein 200ms-Puls bedeutet 1, ein 100ms-Puls bedeutet 0.
Auf jeden fall schickst du diese Einsen und Nullen dann an den LPT-Port.
Dann musst du sie nur noch auswerten.
Low ist alles unter 0,2V und High ist alles ab 3 V.. oder so ähnlich
Achja das hier hab ich auch noch gefunden. Damit sollte sich was machen lassen. Muss man dann nur noch auf n BASIC-Programm übertragen: http://www.elektronik-kompendium.de/public/arnerossius/bastel/dcf2pc.htm _________________
|
|
Nach oben |
|
|
Thomas
Anmeldungsdatum: 24.03.2005 Beiträge: 3
|
Verfasst am: 24.03.2005, 19:10 Titel: |
|
|
jo, danke! Aber könntest du vielleicht noch genauer darauf eingehen, WIE das Programm aus dem Pulsweiten-modulierten BCD-Code (..alles bekannt..) mir die Einsen und Nullen rausfiltert?! Mir fällt da zur Zeit ein Ansatz schwer..
Thx Thomas |
|
Nach oben |
|
|
MisterD
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 25.03.2005, 20:02 Titel: |
|
|
Also bei Java würd ich spontan auf einen InputStream über System.in raten.. schau die in der API mal die java.lang.System.in-Klasse an. Vllt findeste da was. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2510 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 25.03.2005, 20:52 Titel: |
|
|
Für die Interessierten gibt es unter
http://www.heret.de/funkuhr/ptb.htm#K1
einen Link, wie die Zeit codiert wird. Die dortige Spezifikation beschreibt sinnvollerweise lediglich, wie das Signal als Funkwellen in der Luft aussieht. Ein DCF77-Empfänger kann jedoch ganz unterschiedlich implementiert werden, ich rede jetzt von den Hardware-Schaltkreisen.
Ein ultraprimitiver Empfänger wertet lediglich die Amplitude aus und lässt eine Leitung von High auf Low während diesen 0.1 bzw. 0.2 Sekunden fallen, so dass der PC praktisch die gesamte Auswertarbeit verrichten muss, was womöglich direkte INP() und OUT-Abfragen notwendig macht.
Eine intelligente DCF77-Hardware dagegen hat die Stoppuhr für diese 0.1 s bzw. 0.2 s hardwaremässig integriert und sammelt die Bits in einem Schieberegister, bis die Minutenmarke kommt. Dann könnten die Daten als Bytes normal über RS-232 gesendet werden + ein Synchronisationsbyte, wann diese Minute gilt.
Ich weiss halt nicht, wie die Hardware gängiger DCF77-Empfänger aufgebaut ist. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
Skilltronic
Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 27.03.2005, 14:46 Titel: |
|
|
Hallo
Ich denke, ich habe genau das richtige für dich. In der Tat ist die zeitliche Auflösung des Basicbefehls TIMER auf ca. +/- 55ms begrenzt, Die Toleranz liegt also genau im Bereich der Länge der DCF77-Impulse und macht diese Methode dafür ungeeignet. Es gibt aber eine Möglichkeit, diese Genauigkeit theoretisch auf bis zu 1µs zu verbessern. Fragen zur genauen Zeitmessung kommen immer wieder, deshalb erkläre ich es nochmal etwas ausführlicher für alle, die es interessiert.
Der Rechner besitzt spezielle, unabhängige Timerbausteine, die von einem Quarz mit einem eigenen Zeitzigal versorgt werden und mehr oder weniger unabhängig vom restlichen System laufen. Dadurch ist gewährleistet, dass sie immer gleichmässig laufen.
Der Quarzoszillator liefert eine Frequenz von 1193182 Hz. Der eigentliche Timer besteht nun aus zwei 8-Bit Abwärtszählern. Die laufen also immer von 255 bis 0 und dann von wieder vorn. Bei jedem Überlauf, also wenn der Zähler von 0 auf 255 umschlägt, wird ein Signal am Ausgang des Timers ausgegeben. Die Frequenz dieses Signals ist also um den Faktor 256 niedriger als die am Eingang. Der zweite Zähler teilt den Takt nochmal durch 256. Insgesamt ergibt sich also ein Faktor von 256*256 = 65536.
Der TIMER-Befehl arbeitet nun mit genau dem Takt, der am Ausgang des zweiten Teilers ausgegeben wird. Dessen Frequenz beträgt 1193182Hz / 65536 = 18,207Hz bzw. die Periode ist 55ms. Man kann aber auch den aktuellen Stand der beiden vorgeschalteten 8-Bit Zähler mit INP(64) einlesen. Beide Bytes werden mit der gleichen Adresse (64) abgefragt. Dabei liegt automatisch nach jedem Lesevorgang mit INP() immer abwechselnd zuerst das untere und dann das obere Zählerbyte unter dieser Adresse an. Deswegen müssen immer beide paarweise ausgelesen werden und man sollte Programme, die diese Funktion benutzen, nicht mit Strg+Untbr beenden. Wenn man Pech hat, erwischt man gerade einen Punkt zwischen beiden Abfragen. Bei einem Neustart kann es dann sein, dass bei der ersten Abrage gerade noch das ober Byte anliegt, bei der nächsten das untere usw. Dann ergibt die Auswertung kein sinnvolles Ergebnis mehr.
Um im ms-Bereich zu arbeiten reicht es, nur den oberen Zähler auszuwerten. Der bekommt vom Ausgang des unteren eine frequenz von 1193182Hz / 256 = 4660,867Hz. Wenn der obere Zähler also um eins weitergezählt hat, isind 0,2145523 ms vergangen. Eine Aüflöung, mit der sich schon was anfangen lässt. Auf die selbe Art kann man auch mit dem unteren Timer arbeiten und so eben unter 1µs kommen. Das macht dann aber auch nur unter echtem DOS Sinn und ist für das DCF77-Signal nicht nötig.
Ich habe ein kleines Programm geschrieben, mit dem man vielleicht über den COM1 ein DCF77-Signal einlesen kann. Leider habe ich kein solches Empfansmodul und musste mir mit einem Mikrocontroller behelfen, der ein entsprechendes Signal simuliert. Eingelesen wird über den CTS-Pin, natürlich muss auch die Masse des Empfängers mit der des COM1-Ports verbunden werden. Spannungen unter 1V werden als logische 0 erkannt, solche über 1,25V als 1.
Das Programm liest lediglich die 59 Bit des Zeitsignals ein und legt sie in einem Array ab. Mich würde sehr interessieren, ob das funktioniert, dann könnte man noch eine Auswertung bzw. Umformung in Datum und Uhrzeit einbauen. Wenn ich nebenher nicht gerade irgendwelche Dateien verschiebe etc. läuft die Erkennung auch unter WinXP so gut wie fehlerfrei. Im DCF77-Signal sind ja noch drei Prüfbit enthalten, mit denen eine zusätzliche Kontrolle der empfangenen Daten möglich ist.
Code: | CLS
DIM bit(58)
OUT 1020, 0
OUT 1020, 1
zf = .2145524
warten:
PRINT "Warte auf neuen Minutenanfang";
zeile = CSRLIN
DO
LOCATE zeile, 30: PRINT " "
FOR p = 1 TO punkt
LOCATE zeile, 29 + p
PRINT "."
NEXT
punkt = punkt + 1
IF punkt = 4 THEN punkt = 0
DO
LOOP WHILE (INP(1022) AND 16) = 16
GOSUB zeitmessung
IF INKEY$ = CHR$(27) THEN END
LOOP WHILE pause < 1750 OR pause > 1950
neueminute:
PRINT "Neue Minute:";
sekunde = 0
DO
DO: LOOP WHILE (INP(1022) AND 16) = 16
GOSUB zeitmessung
IF pause < 750 OR pause >= 1950 THEN f = 1: EXIT DO
IF pause >= 950 AND pause < 1850 THEN f = 1: EXIT DO
IF pause >= 750 AND pause < 850 THEN bit(sekunde) = 1
IF pause >= 850 AND pause < 950 THEN bit(sekunde) = 0
IF pause > 1750 AND pause < 1850 THEN bit(sekunde) = 1: EXIT DO
IF pause >= 1850 AND pause < 1950 THEN bit(sekunde) = 0: EXIT DO
PRINT USING "#"; bit(sekunde);
sekunde = sekunde + 1
IF sekunde > 59 THEN f = 1: EXIT DO
IF INKEY$ = CHR$(27) THEN END
LOOP
IF f = 1 THEN PRINT "Fehler!": f = 0: GOTO warten
PRINT USING "#"; bit(sekunde)
GOTO neueminute
END
zeitmessung:
l = INP(64)
halt = INP(64)
pause = 0
DO
l = INP(64)
h = INP(64)
d = halt - h
halt = h
IF d < 0 THEN d = d + 256
pause = pause + d
LOOP WHILE (INP(1022) AND 16) = 0
pause = pause * zf
RETURN |
Ist zwar nicht sehr schön, funktioniert bei mir in Verbindung mit dem Mikrocontroller aber einwandfrei.
Genaue Infos zum Timer gibt es hier: http://ivs.cs.uni-magdeburg.de/bs/lehre/sose99/bs1/aufgaben/aufgabe3/timer.shtml
und ausführlicher aber in Englisch hier: http://www.sharpmz.org/mz-700/8253ovview.htm
Wie gesagt wäre ich sehr daran interessiert zu erfahren, ob das so geht. Was braucht die Empfängerschaltung denn an Spannung und Strom? Der COM-Port kann ungefähr 10mA liefern. So wird eine externe Stromversorgung vielleicht unnötig.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
|
MisterD
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 27.03.2005, 14:52 Titel: |
|
|
INP(64) war doch der, der unter XP / NT nur mist baut, oder?
btw: mein 300. Beitrag _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
|
Skilltronic
Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 27.03.2005, 15:06 Titel: |
|
|
Hallo
Wie gesagt läuft es entgegen anderslautenden Gerüchten bei mir unter XP astrein. Probieren geht über studieren. Das einzige was mir in diesem Zusammenhang aufgefallen ist, ist dass die mit TIMER ausgelesene Zeit unter XP nicht unbedingt was mit den Timerregistern zu tun haben scheint. Aber das stört nicht weiter.
Was ich noch vergass zu erwähnen: Man kann die Funktionen des Timers - z.B. die Teilerrate oder ob immer nur eines der beiden Byte ausgegeben wird anstatt beide im Wechsel - über Steuerregister ändern. Wenn man dabei aber einen Fehler macht, kann man leicht mal den Refresh für den Arbeitsspeicher ausschalten oder so und einen sauberen Absturz provozieren. Da es auch ohne geht, ist es besser man arbeitet mit dem Standardmodus.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
|
Thomas
Anmeldungsdatum: 24.03.2005 Beiträge: 3
|
Verfasst am: 09.04.2005, 19:07 Titel: |
|
|
Hi Skilltronic,
warum steuerst du die Ausgänge an? OUT 1020, 0; OUT 1020, 1?
Ich gebe das Signal nun mit 1,5V bzw. 0V auf den CTS-Pin und Masse (auf deiner Seite steht, Masse ist Pin 5. Ist die "Steckeraußenseite" nicht Masse oder sind die beiden verbunden?) Ich kann den OUT-Befehl noch nicht einordnen, denn ich hab keine Möglichkeit, Signale seitens der Schnittstelle entgegenzunehmen. Bei mir tut sich jetzt leider nicht. Am Signal kanns nicht liegen. Ich hab einen Lastwandler verbaut und auf dem Oszilloskop sieht die Flanke wunderschön aus. Bin etwas ratlos... Kannst du / könnt ihr mir nochmal helfen? |
|
Nach oben |
|
|
Skilltronic
Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 09.04.2005, 19:30 Titel: |
|
|
Hallo
Das mit den Ausgängen mache ich nur, weil ich irgendwann bemerkt habe, dass man einen Eingang erst Auslesen kann, wenn man vorher mindestens einmal auf einen Ausgang zugegriffen hat. Windows eben... Eingentlich sollte es aber zuerst 1 und dann 0 heissen, also nur kurz an und wieder aus. Kleiner Fehler meinerseits.
Hast du mal geprüft, ob du überhaupt auf den COM zugreifen kannst? Einen Ausgang einschalten und den mit einem Eingang verbinden. Dabei den Status dieses Eingangs anzeigen lassen. Wenn nichts passiert, liegt es - du ahnst es vielleicht schon - an Windows. Bender hatte neulich die Idee, dass man vielleicht nur wenn man mit Administratorrechten angemeldet ist Zugriff auf den COM hat. Ansonsten enfach mal unter DOS versuchen.
Am COM-Stecker sind Masse und Steckergehäuse verbunden, weil das ganze Gehäuse des PC auf Masse liegt. Das gilt aber nicht für jedes Verlängerungskabel.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|