
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
Hallo, ich lese erst seit einem Monat hier im Forum mit. Habe mir die verschiedenen Basicversionen angesehen und war von Ocbasic begeistert. Es kommt wahrscheinlich daher,daß ich in den 80/90 Jahren sehr viel Power Basic programmiert habe. An Hardware besitze ich einige M1 Units von Conrad und arbeite mich z.Z in das OpenMicro Projekt ein. Es ist eine Alternative zu zu Conrads C-Control und bestimmt für viele Anwendungen zu gebrauchen. Ich stelle hier mal ein Programm, das in OCbasic, für die OpenMicro geschrieben wurde ein. Kann auch mit kleinen Änderungen für die C-Control verwendet werden. Kommentare und Verbesserungsvorschläge sind erwünscht. Also nach vorne schauen und nicht verzagen, vielleicht mal etwas Hardware für das OpenMicro Programm entwickeln. Gruß Eckhard 'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 'IIIIIII Programm decodieren DCF Empfänger 'IIIIIII 14.10.2005 10:43:02 (by Eckhard) 'IIIIIII Basic = ocbas.exe 'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 'Das Programm wurde in ähnlicher Form im Juni 1986 für einen Schneider-Computer geschrieben. 'Aus Spaß am programmieren und zum Testen habe ich es, in reinem Basic, für eine Open Micro umgesetzt. 'Ausgabe auf 7 Segmentanzeige ist wegen Schnelligkeit eine Maschinenroutine. 'Ich möchte ausdrücklich betonen, daß das Programm nur zum Verständnis der Funkuhr beitragen soll. 'Um den Prozessor mit der FunkUhr abzugleichen, ist es besser ein Maschinenprogramm zu verwenden. 'An Hardware wird ein StarterBoard und ein Prozessor MC68HC908QT4CP DIP8, sowie von Conrad, der DCF Empfänger benötigt, 'an Software dieses Programm und das Teminalprogramm von Dietmar Harlos (Bildschirmansicht) . 'link zum Anschlußplan der DCF Empfängerplatine 'http://www2.produktinfo.conrad.com/datenblaetter/625000-649999/641138-an-01-de-Anschlussplan_DCF-Empfaengerplatine.pdf 'Die Leitung zum Port[3] muß an Pin 4 der DCF Empfänerplatine(Invertierter Ausgang) angeschlossen werden. 'Das Zeitprotokoll des DCF Senders der Physikalisch-Technische Bundesanstalt (PTB) in Braunschweig : 'Sekunde: Bedeutung: '0. Minutenbeginn (immer LOW) '1. - 14. Reserviert, keine Bedeutung '15. Reserveantenne aktiv '16. Umstellung von Sommer- auf Winterzeit, oder umgekehrt '17. Sommerzeit aktiv '18. Winterzeit aktiv '19. Ankündigung Schaltsekunde '20. Zeitbeginn '21. - 27. Minute plus 1, 2, 4, 8, 10, 20, 40 '28. Prüfbit Minute, Parität gerade 0 oder ungerade 1 '29. - 34. Stunde plus 1, 2, 4, 8, 10, 20 '35. Prüfbit Stunde '36. - 41. Tag plus 1, 2, 4, 8, 10, 20 '42. - 44. Wochentag plus1, 2, 4 '45. - 49. Monat plus 1, 2, 4, 8, 10 '50. - 57. Jahr plus 1, 2, 4, 8, 10, 20, 40, 80 '58. Prüfbit Datum, Parität 36 bis 57 Sekunde '59. fehlt zur Erkennung des Minutenanfangs option openmicro define DCF port[3] define SCL port[5] define SDA port[6] define mi byte[1] 'Minute (7 Stellen) define bmi bit[8] 'Bit Minute define st byte[2] 'Stunde 6 define bst bit[15] define tg byte[3] 'Tag 6 define btg bit[23] define wotg byte[4] 'Wochentag 3 define bwotg bit[28] define mo byte[5] 'Monat 5 define bmo bit[38] define ja byte[6] 'Jahr 8 define bja bit[48] define pf byte[7] 'Prüfflag define pf1 bit[49] 'Prüfflag Minute define pf2 bit[50] 'Prüfflag Stunde define pf3 bit[51] 'Prüfflag Datum define pfmi bit[53] 'Prüfflag 1 Minute define pfst bit[54] 'Prüfflag 2 Stunde define pfda bit[55] 'Prüfflag 3 Datum define Zeit1 byte[8] 'Funksignal low define Zeit byte[9] 'Funksignal high define f byte[10] 'flag, merker define zae byte[11] 'Zaehler für Sekunden define ii byte[12] 'Variable define i byte[13] 'Variable define Digit1 byte[14] define Digit2 byte[15] define Digit3 byte[16] define Digit4 byte[17] define BRIGHT2 &B00100111 ' Helligkeit 6 mA define LEDWRITE &B01110110 ' Adresse #init 'Am Anfang einer Minute alles auf null mi = 0 st = 0 tg = 0 wotg = 0 mo = 0 ja = 0 zae = 0 pf = 0 wait not DCF 'Warten bis 59 Sekunde vorbei Gosub SEC_ausgabe wait DCF 'Sekunde 0 nicht auswerten #anfang ' anfang einer Sekunde add zae,1 ' zae = zae +1 zeit1 = 0 i = 0 f = 0 #signal_low while DCF 'Schleife solange durchlaufen DCF on (messen wielang kein Signal anliegt)(invertiert) for ii = 1 to 100 'Man könnte bei diesem Programm das direkte Signal verwenden (while not DFC) next add zeit1,1 ' in zeit1 wird gezählt wie oft die While/wend Schleife durchlaufen wird if zeit1 > 75 then goto Minutenanfang 'die 59. Sekunde wurde gefunden wend pause 1 'entprellen des Signals if f =0 then f = 1 'sorgt dafür, daß die if Bedingung nur einmal durchlaufen wird goto signal_low 'es wird nachgesehen ob DCF tatsächlich on (1) ist end if i = 0 f =0 #signal_high 'messen wie lange ein Signal anliegt 0,1 oder 0,2 Sekunden while not DCF 'ansonsten gleich wie oben. for ii = 1 to 100 next i = i +1 wend pause 1 if f =0 then f = 1 goto signal_high end if zeit = i if i > 9 then i = 1 else i = 0 'Signal auswerten 1 oder 0 ' Die ersten 19 Sekunden werden nicht auswertet if (zae = 20) and (i = 0) then goto init ' die 20. Sek. muß 1 sein. sonst abbrechen if (zae => 21) and (zae<= 27) then ' Minuten merken bmi = i ' In das minutenbyte laden mi = mi shr 1 ' und eine Stelle nach rechts schieben pfmi = pfmi + i ' Für Prüfbit merken,Wie oft eine 1 gesendet wurde, wenn i = 0 verändert sich nichts end if if (zae => 29) and (zae<= 34) then ' Stunden merken bst = i st = st shr 1 pfst = pfst + i end if if (zae => 36) and (zae<= 41) then ' Tag merken btg = i pfda = pfda + i tg = tg shr 1 end if if (zae => 42) and (zae<= 44) then ' Wochentag merken bwotg = i pfda = pfda + i wotg = wotg shr 1 end if if (zae => 45) and (zae<= 49) then ' Monat merken bmo = i pfda = pfda + i mo = mo shr 1 end if if (zae => 50) and (zae<= 57) then ' jahr merken bja = i pfda = pfda + i if zae < 57 then ja = ja shr 1 'Letztes Bit darf nicht geschoben werden, da Jahr 8 bit lang end if if zae = 28 then pf1 = i ' Prüfbit merken if zae = 35 then pf2 = i if zae = 58 then pf3 = i print zae " * " i " * " zeit1" * " zeit " min " mi ", Std " st ", Tag " tg ", Wtag " wotg ", Mon. " mo ", Jahr " ja gosub sec_ausgabe if zae > 61 then goto init ' Fehler abfangen goto Anfang end 'wird zwar nie erreicht, markiert aber das Ende des Hautprogramms #Minutenanfang F = 0 if pf1 = pfmi then f = f + 1 'alle drei if pf2 = pfst then f = f + 1 'Prüfbits if pf3 = pfda then f = f + 1 'müssen o.K sein. If f = 3 then print "Alles o.K." else print "Nix gut" print pf1":"pfmi " " pf2":" pfst " "pf3":" pfda 'zur Kontrolle auf den Bildschirm gosub sec_ausgabe print "Zeitsignal Anfang " if f = 3 then ' Die Daten werden in folgender Wertigkeit gesendet 1, 2, 4, 8, 10, 20, 40, 80 = BCD Code ' Abgespeichert sind sie in mi, st ... 80,40,20,10 8,4,2,1 also das höherwertige bit zuerst ' BIT 7 6 5 4 3 2 1 0 ' Nun kann man rechnen z.B 0 1 1 0 1 0 1 0 ' Nach BCD Code 40 + 20 +8 +2 = 70 ' Im Binärcode ergibt 0110 = 6 1010 =10 ' Das obere Halbbyte (oberes Nibbel) * 10 = 6 *10 + 10 = 70 ' Binär 01101010 = dezimal 116 '116 / 16 * 10 ergibt 60 + Rest 10 = 70 'mod ergibt den Rest einer Division st = (st/16 *10) + (st mod 16) mi = (mi/16 *10) + (mi mod 16) tg = (tg/16 *10) + (tg mod 16) mo = (mo/16 *10) + (mo mod 16) ja = (ja/16 *10) + (ja mod 16) second = 0 minute = mi 'Syncronisation der Unit hour = st day = tg dow = wotg month = mo year = ja end if print st":"; if mi < 10 then print"0"; print mi" " tg"."mo". 20"; if ja < 10 then print"0"; print ja goto init #sec_ausgabe 'Ausgabe von Minuten und Sekunden auf einer vierstelligen 7 Segment Anzeige mit SAA 1064 'return 'wenn Anzeige nicht verwendet wird. gosub I2C_init ii = second /10 : DIGIT2 = looktab (decoder, ii) ii = second mod 10 : DIGIT1 = looktab (decoder, ii) ii = minute /10 : DIGIT4 = looktab (decoder, ii) ii = minute mod 10 : DIGIT3 = looktab (decoder, ii) #SENDBUF gosub I2C_START 'Start i2c_write(LEDWRITE) 'Adresse i2c_write(0) 'INSTRUCTION i2c_write(BRIGHT2) 'CONTROL i2c_write(DIGIT4) i2c_write(DIGIT3) i2c_write(DIGIT2) i2c_write(DIGIT1) gosub I2C_stop 'Stop return include "c:\osbasic\asm\OM_I2C.bas" 'Pfad muß angepasst werden Table Decoder byte &H3F,&H06,&H5B,&H4F,&H66,&H6D,&H7D,&H07,&H7F,&H6F tabend |
| Antwort schreiben |