Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 DCF77-Simulator Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 18.08.2018 23:07)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station
' ============================================================================
' 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

Bisherige Antworten: