Beispiel für myAVR Board mit LCD Display und Echtzeituhr (RTC) DS1307
Der BASCOM Compiler unterstützt verschiedene Datum und Zeit-Funktionen, über Benutzer eigene Funktionen, wie hier beim DS1307, oder auch softwaremäßig über einen zweiten Quarz bei den ATmega-Prozessoren, mit RTC Unterstützung über einen speziellen Timer.
Der DS1307 wird über die I2C Schnittstelle angesprochen, bei einigen Herstellern auch als TWI bezeichnet. Die I2C (TWI) Funktion wird von den meisten Atmel-Prozessoren bereits hardwaremäßig unterstützt und ist in BASCOM bereits inplementiert.
Man muß lediglich noch die Adressen der Hardware und die entsprechenden Kommados kennen, hier das Beispiel für den DS1307:
'------------------------------------------------------------------------------
' LCD: Db4-Db7 = Portd.4-Portd.7 E = Portd.3 Rs = Portd.2 Backlight = Portb.1
' I2C: Sda = Portc.4 Scl = Portc.5
' UART: RxD = Portd.0 TxD = Portd.1
' Frei: Portb.0,Portb.2-Portb.5 Portc.0-Portc.3
'------------------------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 3686411
$baud = 9600
Ddrd = &HFE
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Config Sda = Portc.4 ' I2C Bus konfigurieren
Config Scl = Portc.5
Const Ds1307w = &HD0 ' Addresse der Ds1307 Uhr
Const Ds1307r = &HD1
Config Clock = User ' Interne Time/Date Routinen für Bascom konfigurieren
Config Date = Dmy , Separator = .
' Init
Ddrb.1 = 1
Cls
Cursor Noblink
Cursor Off
Portb.1 = 1 ' 0=Licht aus / 1=Licht an (LCD)
' Stellen der Uhr, muss nur einmal ausgeführt werden
'Time$ = "11:55:00"
'Date$ = "08.01.07"
' Main Loop
Do
Locate 1 , 1 : Lcd Date$
Locate 2 , 1 : Lcd Time$
Waitms 500
Loop
' Unterprogramme für die Bascom Date/Time-Funktionen
Dim Weekday As Byte
Getdatetime:
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cstart
I2cwbyte Ds1307r
I2crbyte _sec , Ack
I2crbyte _min , Ack
I2crbyte _hour , Ack
I2crbyte Weekday , Ack
I2crbyte _day , Ack
I2crbyte _month , Ack
I2crbyte _year , Nack
I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return
Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 4
I2cwbyte _day
I2cwbyte _month
I2cwbyte _year
I2cstop
Return
Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cwbyte _sec
I2cwbyte _min
I2cwbyte _hour
I2cstop
Return
End
|