Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Funkuhr realisieren

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Thomas



Anmeldungsdatum: 24.03.2005
Beiträge: 3

BeitragVerfasst am: 24.03.2005, 14:19    Titel: Funkuhr realisieren Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Paul
aka ICC, HV-Freak


Anmeldungsdatum: 11.09.2004
Beiträge: 588
Wohnort: Uelzen

BeitragVerfasst am: 24.03.2005, 14:54    Titel: Antworten mit Zitat

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 durchgeknallt


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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Thomas



Anmeldungsdatum: 24.03.2005
Beiträge: 3

BeitragVerfasst am: 24.03.2005, 18:10    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 25.03.2005, 19:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 25.03.2005, 19:52    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 27.03.2005, 13:46    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 27.03.2005, 13:52    Titel: Antworten mit Zitat

INP(64) war doch der, der unter XP / NT nur mist baut, oder?


btw: mein 300. Beitrag cool
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 27.03.2005, 14:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Thomas



Anmeldungsdatum: 24.03.2005
Beiträge: 3

BeitragVerfasst am: 09.04.2005, 18:07    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 09.04.2005, 18:30    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz