![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' ============================================================================ ' DCF77-Simulator auf den Open-Control-Mikrocontrollern ' In OCBASIC 1.12a_e1 von Dietmar Harlos am 18. August 2018 ' ============================================================================ ' Ein Programm zum Simulieren des DCF77-Signals. Ein OM-Mikrocontroller wird ' eingesetzt, um das invertierte Signal eines DCF77-Empfängers nachzubilden. ' Im Vergleich zu anderen Simulatoren ist der Code sehr schlank, denn ich habe ' die Programmlogik größtenteils in einer Tabelle untergebracht. ' Auf den drei kleinsten OM-Mikrocontrollern muß LOOKTABBYTE durch LOOKTAB ' ersetzt werden. ' Sinnvollerweise sollte eine Open-Maxi zum Simulieren benutzt werden. Denn ' sie unterstützt auch die Datumsfunktionen DAY, DOW, MONTH und YEAR. ' Der DCF77-Eingang der Open-Maxi liegt an FREQ1. ' --- Definitionen für das System -------------------------------------------- 'INCLUDE "om.def" 'Definitionen für die Open-Micro und Open-Mini 'INCLUDE "omid.def" 'Definitionen für die Open-Midi INCLUDE "omac.def" 'Definitionen für die Open-Macro 'INCLUDE "omax.def" 'Definitionen für die Open-Maxi ' --- Definitionen des Anwenders --------------------------------------------- DEFINE dcfport PORT[6] 'Ausgabeport, invertiert DIM bitarray BYTE 'Ein Bitarray DIM parity BIT[1] OF bitarray DIM zustand BIT[2] OF bitarray DIM a,b,c,i,y,z BYTE 'Einige Variablen DIM databyte,offset BYTE DIM bitnr BYTE DIM ^pb BYTE 'Ein Pointer auf BYTE-Variablen DIM a0,a1,a2,a3,a4,a5,a6,a7,a8,a9 BYTE 'Ein Feld mit 10 Elementen DEFINE array a0 ' --- Hauptprogramm ---------------------------------------------------------- ?"DCF77SIM.BAS" MINUTE=7 : HOUR=23 : DAY=18 : DOW=6 : MONTH=8 : YEAR=18 PrintSpc=ON End2Host=ON bitnr=255 parity=OFF dcfport=ON 'ist invertiert WHILE TRUE WAIT bitnr<>SECOND bitnr=SECOND a0=0 'interne Daten a1=1 'MESZ/MEZ a2=0 'Schaltsekunde a3=1 'Startbit a4=MINUTE a5=HOUR a6=DAY a7=DOW a8=MONTH a9=YEAR ?"---" ?"bitnr:"bitnr IF bitnr=59 THEN ?"Lücke" ELSE i=0 a=LOOKTABBYTE(index,i+1) offset=0 WHILE LOOKTABBYTE(index,i+1)<>0 AND bitnr>=a ADD i,2 offset=a ADD a,LOOKTABBYTE(index,i+1) WEND IF LOOKTABBYTE(index,i)=255 THEN ?"Parity:"parity sendpulse parity parity=OFF ELSE pb=^array+LOOKTABBYTE(index,i) c=dec2bcd(@pb) ?"Sende Daten (dez):"@pb ?"Sende Daten (BCD):"c ?"Bitnummer:"bitnr-offset sendpulse(btst(c,bitnr-offset)) END IF END IF IF bitnr=20 THEN parity=OFF END IF WEND END ' --- Tabellen --------------------------------------------------------------- TABLE index BYTE 0 17 'interne Daten 1 2 'MESZ/MEZ 2 1 'Schaltsekunde 3 1 'Startbit 4 7 'Minute 255 1 'Minutenparität (gerade Parität Bits 21..27) 5 6 'Stunde 255 1 'Stundenparität (gerade Parität Bits 29..34) 6 6 'Tag 7 3 'Wochentag 8 5 'Monat 9 8 'Jahr 255 1 'Datumsparität (gerade Parität Bits 36..57) 0 0 'Ende der Tabelle END TABLE ' --- Subroutinen ------------------------------------------------------------ ' Einen Sekundenpuls senden PROCEDURE sendpulse(zustand) dcfport=OFF IF zustand THEN ?"HIGH" PAUSE 10 parity=NOT(parity) ELSE ?"LOW" PAUSE 5 END IF dcfport=ON RETURN END PROCEDURE ' Dezimal nach BCD umwandeln ' Input darf 0 bis 99 sein FUNCTION dec2bcd(databyte) RETURN 16*(databyte/10)+(databyte mod 10) END FUNCTION ' Testen eines BITs (aus BSETBCLR.BAS) FUNCTION btst(y,z) RETURN ((1 SHL z) AND y)<>0 END FUNCTION ' --- Ende des Programms ---------------------------------------------------- Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |