Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit übrigbehalten!


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: Open-Mega Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Norbert - 8.10.2020 1:43)
 Als Antwort auf Re: Open-Mega von das |_ Team - 7.10.2020 9:23
Norbert nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi
> Hallo Dietmar!
>
>
> > Auf der Open-Maxi gibt es die Möglichkeit eine eigene Routine in das System einzubinden.
> > DAnn könnte man natürlich auch gleich das "Software-Filter" für DCF77 implementieren.
>
> Stimmt, das mit der eigenen Routine wäre eine Möglichkeit.
> Ich muß mir das noch mal genauer anschauen, vielleicht habe ich zu kompliziert gedacht.
>
> @Norbert: Ich habe auch ein DS3231 Uhrenmodul, welches ich noch nicht angesteuert bekomme. Könntest du ein Beispiel posten?
>
>
> Viele Grüße
> Dirk, von das |_ Team

Hallo, ich habe eben auf die Schnelle ein Programm bis auf einige RTC-Details gekürzt. Etliche Define-Einstellungen sind überflüssig.

Freundliche Grüße
Norbert


'---------------------------------------------------------------------------
'Aus einem Programm Details für das Modul DS3231,
'weggelassen sind die Timer- und Interrupt-Möglichkeiten des Moduls

include "omax.def"

'---------------------------------------------------------------------------

dim a,b,c,d,k,l,i    byte

'---------------------------------------------------------------------------

define ADDRESS       word
define ADDRHI        byte
define ADDRLO        byte
define DATA          byte
define xWM           byte
define xYD           byte
define xHour         byte
define xMin          byte
define xSec          byte

'---------------------------------------------------------------------------

define Impuls        byte
define ImpulsMax     byte
define Zeit          byte
define MySecond      byte
define MyMinute      byte
define MYHour        byte
define Sekunde       byte
define Intensitaet   byte

'---------------------------------------------------------------------------

define AktuelleSec   byte
define LetzteSec     byte
define VergleichsSec byte

'---------------------------------------------------------------------------
'Init
'---------------------------------------------------------------------------
  End2Host=ON
  'PrintSpc=ON
  RunOnErr=ON

  IF ERR THEN
    ?"Fehler Nr."ERR
    END
  END IF

  POKE i2cdelay,20 'ca. 100 kHz I²C-Bustakt

  DS3231=&hD0        'ADRESSE EEPROM in DS3231

  LCDINIT            'setzt LcdErr auf OFF bei ACK vom PCF8574, sonst auf ON

  IF LcdErr THEN PRINT "NoAck vom I2C-LCD" : END
 
  LCDLight=on
  LCDCLS

'---------------------------------------------------------------------------
#Loop
'---------------------------------------------------------------------------

' mit Drehmelder (Impuls) werden die einzelnen Unterroutinen ausgewählt

'--------------------------------------------------------------------------

  If Impuls=15 then     'Uhrzeit setzen
     SetRTCZeit
     Pause 50
  end if

'--------------------------------------------------------------------------

  If Impuls=16 then    'Uhrzeit auslesen und anzeigen
     While TasteR=on
     GetRTCZeit
     wend
  end if

'--------------------------------------------------------------------------

#EndLoop
  Impuls=0

goto Loop

'--------------------------------------------------------------------------

#SetRTCZeit

  LCDLocate 0,0
  LCDPrint "Uhr stellen    "
  Pause 15   'Pause zum Abklingen Drehtaste 0
 
  LCDLocate 1,0
  LCDPrint "Stunde          "
  ImpulsMax=23
  Drehwahl2
  hour=impuls
  Pause 15     'Pause zum Abklingen Drehtaste 0
 
  LCDLocate 1,0
  LCDPrint "Minute          "
  ImpulsMax=59
  Drehwahl2
  minute=impuls
  Pause 15     'Pause zum Abklingen Drehtaste 0
 
  LCDLocate 0,0
  LCDPrint "Datum           "

  LCDLocate 1,0
  LCDPrint "Jahr            "
  ImpulsMax=16
  Drehwahl2
  year=impuls
  Pause 15     'Pause zum Abklingen Drehtaste 0
 
  LCDLocate 1,0
  LCDPrint "Monat           "
  ImpulsMax=12
  Drehwahl2
  month=impuls
  Pause 15     'Pause zum Abklingen Drehtaste 0

  LCDLocate 1,0
  LCDPrint "Tag             "
  ImpulsMax=31
  Drehwahl2
  Day=impuls
  Pause 15     'Pause zum Abklingen Drehtaste 0

  Impuls=0
  LCDCLS
  LCDLocate 1,0
  LCDPrint "Start TasteR    "

  While TasteR=on
  wend

  xHour=Dez_to_BCD(hour)
  'xSec=Dez_to_BCD(second)
  xSec=Dez_to_BCD(0)
  xMin=Dez_to_BCD(minute)

  I2C_Init
  I2C_stop
  I2C_Start                           'start
  i2c_write(DS3231)
  i2c_write(0)                  'select second register
  i2c_write(xSec)
  i2c_write(xMin)
  i2c_write(xHour)
  I2C_stop

Return

'---------------------------------------------------------------------------

#GetRTCZeit

    I2C_Init
    I2C_Start                           'start
    i2c_write(DS3231)
    i2c_write(0)
    I2C_stop                            'stop
    I2C_Start                           'start
    i2c_write(DS3231+1)
    xsec=i2c_read                       'seconds
    pause 5
    xmin=i2c_read                        'minutes
    pause 5
    xHour=i2c_read                       'hours
    I2C_stop

    Hour=BCD_to_Dez(xHour)               'Stundenregister
    Second=BCD_to_Dez(xSec)
    Minute=BCD_to_Dez(xMin)

    'print "Uhrzeit "; hour; ":"; minute; ":"; second; ":"; "   '   "; day; "."; month; "." ;year; "      "

    LCDCLS
    LCDLocate 0,0
    LCDPrint "Zeit"

    repeat
      mySecond=Second
      myMinute=Minute
      myHour=Hour
    until mySecond<>59 or Second<>0
   
    LCDLocate 0,7
    If myHour>9 then
    LCDPrint myHour
    else
    LCDPrint "0";myHour
    end if
    LCDPrint ":"
    If myMinute>9 then
    LCDPrint myMinute
    else
    LCDPrint "0";myMinute
    end if
    LCDPrint ":"
    If mySecond>9 then
    LCDPrint mySecond
    else
    LCDPrint "0";mySecond
    end if
   
    LCDLocate 1,0
    LCDPrint "Datum  " day; "."; month; "." ;year

Return

'---------------------------------------------------------------------------

Function BCD_to_Dez(Wert)                 ' Wandele BCD in Dezimalzahl
  'Wert=i2c_read             ' Hole BCD-Zahl (Minute/Stunde usw. aus UhrMemory
  x= Wert and &hF           ' BCD-Zahl (ohne obere 4 BITs in x)=EINER     SHR
  y= x+10*(WERT SHR 4)
  RETURN y
end function

FUNCTION Dez_to_BCD (Wert)        ' Wandele Dezimal in BCDzahl (Zahl in Wert)
   Y=Wert/10                      ' Zehner                                  '                             '
  x= Wert -(Y*10)+ (Y SHL 4)      ' Zehner(Y SHL 4) Einer (Wert-Y*10)
   'i2c_write(x)                   ' MINUTEn oder Stunden gesetzt
  'PAUSE 20
  RETURN x
end function

'-----------------------------------------------------------------------------------
'OMAX_I2C.PRO:
'-----------------------------------------------------------------------------------

PROCEDURE i2c_init INLASM
! jmp FwI2Cinit
END PROCEDURE

PROCEDURE i2c_start INLASM
! jmp FwI2Cstart
END PROCEDURE

FUNCTION i2c_write INLASM
! jsr FwPop          'Eintrag vom Rechenstack in den Akkumulator holen
! jsr FwI2Cwrite
! sta OSTEMP
! jmp FwPushW        'ACK auf Stack
END FUNCTION

FUNCTION i2c_read INLASM
! jsr FwPop          'ACK vom Rechenstack in den Akkumulator holen
! jsr FwI2Cread
! jmp FwPush         'Gelesenes Byte auf den Rechenstack
END FUNCTION

PROCEDURE i2c_stop INLASM
! jmp FwI2Cstop
END PROCEDURE

'---------------------------------------------------------------------
' Die Firmware-Routinen einbinden
' ---------------------------------------------------------------------
INCLUDE "om_fw.pro"

 Antwort schreiben

Bisherige Antworten:

Re: Open-Mega (von das |_ Team - 8.10.2020 17:41)
    Re: Open-Mega (von Norbert - 9.10.2020 0:34)
        RTC DS3231 - Ladeschaltung deaktivieren (von das |_ Team - 10.10.2020 19:33)
            Re: RTC DS3231 - Ladeschaltung deaktivieren (von Norbert - 11.10.2020 2:10)