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 

 Re: Ich weiss nicht was Ihr habt! Kategorie: Verschiedenes (von Eckhard - 26.10.2005 15:47)
 Als Antwort auf Re: Ich weiss nicht was Ihr habt! von Heino - 25.10.2005 21:47
Eckhard nutzt:  CC1-M-Unit V1.1, Open-Micro, Open-Mini
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

Bisherige Antworten: