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: BASIC-Programm zum interaktiven Einstellen der Echtzeituhr? Kategorie: Programmierung Basic (von das |_ Team - 9.01.2024 20:15)
 Als Antwort auf Re: BASIC-Programm zum interaktiven Einstellen der Echtzeituhr? von Laika - 8.01.2024 21:38
das |_ Team nutzt:  CC1-Unit V1.1, CC1-M-Unit V1.1, CC1-Station V1.1, Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station, C-Control 2
Hallo Laika!

Den C-Control/BASIC Quelltext konnte ich jetzt kompilieren lassen. Wie ich bereits vermutet hatte, fehlte lediglich die Deklaration der verwendeten Variablen.

Ich habe diese jetzt wie folgt deklariert:


define datum_vom_pc byte
define i1           byte
define b1_i1        byte
define i2           byte
define b2_i1        byte
define SUB_RETURN   byte


Und ein paar Kleinigkeiten im Quelltext angepasst.

Das erzeugte Kompilat umfasst 485 Bytes und leistet im Prinzip das Gew├╝nschte. Die Benutzerf├╝hrung ist klar ersichtlich, und sogar ein Timeout ist realisiert. Im Falle von Nichteingabe terminiert das Programm zur├╝ck in den Hostmodus.  


Allerdingss ist es mir nicht gelungen, die Uhrzeit Sekundensynchron einzustellen. Das ist ein Feature das ich mir noch w├╝nschen w├╝rde.



Das Visual Basic Programm habe ich hingegen noch nicht ausprobiert. Denn zwischenzeitlich hatte ich im Kapitel 10.3 im PDF zum Buch C-Control Hardwareerweiterungen den folgenden VBA-Quelltext (wieder)-gefunden:


Sub Form_Load ()
Comm1.CommPort = 2
Comm1.Settings = "9600,N,8,1"
Comm1.InputLen = 1
Comm1.PortOpen = True
If Comm1.PortOpen = False Then
Comm1.CommPort = 1
Comm1.PortOpen = True
End If
MsgBox "C-Control Uhr stellen", 0
Sende 14 'Kommando Uhr stellen
Sende Second(Now) Mod 256
Sende Minute(Now) Mod 256
Sende Hour(Now) Mod 256
Sende Weekday(Now) Mod 256
Sende Day(Now) Mod 256
Sende Month(Now) Mod 256
Sende (Year(Now) Mod 100) Mod 256
End
End Sub



Viele Gr├╝sse

Dirk


PS: Hier der angepasste Quelltext des C-Control/BASIC Programms.


'--------------------------------------------------------------------------------
'Datum + Uhrzeit setzen.
'
'Gelegentlich geraten Datum und Zeit falsch, z.B. wenn an der Elektronik des Hausleitsystems
'gebastelt wird und RN abgeklemmt wird oder dieser aus Versehen auf HI geht. Dann setzt der MC
'die Uhrzeit auf RN-kommen-Zeit. Das z.B. soll korrigiert werden k├Ânnen.

'Ein: -
'Aus: datum_vom_PC = LO, wenn nichts eingegeben wurde

'Table wochentag_tabelle            'Hinter das Programmende verschoben
'   19823  17513  19817  17519  18034  21345  21359
'   'Mo     Di     Mi     Do     Fr     Sa     So
'TabEnd
'define WOCHENTAG_TABELLE_LAENGE 6  'eins weniger als Anzahl Eintr├Ąge
define datum_vom_pc byte
define i1           byte
define b1_i1        byte
define i2           byte
define b2_i1        byte
define SUB_RETURN   byte
print
#datum_zeit_setzen

  ' datum_vom_PC = LO   'Wenn 'datum_vom_PC = LO' bleibt, wurde nichts eingegeben

   'Datum und Uhrzeit vom PC anfordern.
   'Beginnen mit dem Tag ("day")
   print "Alles zweistellig eingeben !"
   print "Tag 00 - 31: ";
   for i1 = 0 to 50    '50 * 300 msec = 15 sec auf eine Eingabe warten
      if RXD then goto datum_zeit_eingeben
      pause 15         '15 * 20 = 300 msec
   next
   goto datum_zeit_eingeben_ende  
     'Wenn nichts eingegeben wird, kommt das Programm ├╝ber "next" aus der
     'Warteschleife heraus, darf dann nat├╝rlich NICHT in die folgende Eingabe laufen!
   END
   #datum_zeit_eingeben

      'Die weiteren Daten: Monat, Jahr, Stunde, Minute, Sekunde und Wochentag
      'Vom PC werden alle Daten - day, month, ... zweistellig (!) gesendet,
      'd.h. in zwei Byte
      'Vom MC werden sie zu einer Zahl day = 1 - 31, month = 1 - 12 usw.
      'zusammen gesetzt.
      'Damit kann man auch mit Hyperterminal arbeiten.
      'Nach "get" immer ein Zeilenvorschub, sonst ├╝berschreibt das folgende
      'print die Eingabe

      get b1_i1  'print "Tag ... " war oben schon
      get b2_i1
      i2 = (b1_i1 - 48)*10 + b2_i1 - 48  '48 ^= ASCII-Basiswert der Ziffer "0"
      if i2 = 0 then  goto datum_zeit_eingeben_ende
      day = i2
      print

      print "Monat 01 - 12: ";
      get b1_i1
      get b2_i1
      month = (b1_i1 - 48)*10 + b2_i1 - 48
      print

      print "Jahr 20, 21, ...: ";
      get b1_i1
      get b2_i1
      year = 23 '(b1_i1 - 48)*10 + b2_i1 - 48
      print

      print "Stunde 00 - 23: ";
      get b1_i1
      get b2_i1
      hour = (b1_i1 - 48)*10 + b2_i1 - 48
      print

      print "Minute 00 - 59: ";
      get b1_i1
      get b2_i1
      minute = (b1_i1 - 48)*10 + b2_i1 - 48
      print

      print "Wochentag: Mo = 01, Di = 02, Mi = 03, Do = 04, Fr = 05, Sa = 06, So = 07: ";
      get b1_i1
      get b2_i1
      dow = (b1_i1 - 48)*10 + b2_i1 - 48
      print   'noch ein Zeilenvorschub zum Abschluss

    '  datum_vom_PC = HI

   #datum_zeit_eingeben_ende

   'Ausgabe, damit es auch in Hyperterminal lesbar ist
 '''  gosub print_version
   print day; "."; month; "."; year; ", ";
 '''  gosub print_zeit
   print ", dow = "; dow;' " ^= ";

   looktab wochentag_tabelle, dow - 1, i1
   put b1_i1     'Der als Zahlen├Ąquivalent des 2-stelligen ASCII-Strings nach ┬┤i1┬┤
   put b2_i1     'geladene Wochentag kann als Buchstabe nur mit ┬┤put┬┤ ausgegeben werden.
   print         'Noch einen print = Zeilenvorschub ausgeben, da ┬┤put┬┤ nichts macht

i1 = SUB_RETURN    'i1 als Returnwert "alles ok"
return

    Table wochentag_tabelle
   19823  17513  19817  17519  18034  21345  21359
   'Mo     Di     Mi     Do     Fr     Sa     So
TabEnd


 Antwort schreiben

Bisherige Antworten:

Forschung: Echtzeituhr (RTC) interaktiv feinjustieren - ca. auf 1/10 Sekunde genau (von das |_ Team - 11.01.2024 21:41)