Ich habe noch was gefunden, aber die Taktzahlabfrage immer noch nicht. Aber das sollte auch gehen da ich schon gelesen habe das damit auch Frequenzzähler gebaut werden
Code:
'------------------- AN 4 -----------------------------
' Copyright 1998-2002 MCS Electronics
' CLOCK.BAS
'This AN shows how to use the PCF8583 I2C clock device
'The PCF8583 is a PHILIPS device. Look at the datasheet for more details
'I have used the STK200 to test the program with a 8515
'------------------------------------------------------
$crystal = 3686400
$baud = 19200
On Int0 Onls 'Interrupt 0 verweist auf die Sub Onls
Config Int0 = Falling 'Interrupt 0 reagiert auf fallende Flanke
Enable Int0 'Interrupt 0 aktivieren
Enable Interrupts 'generell alle Interrupts aktivieren
Config Portb = Output
Portb = 63
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portb.0 , Db7 = Portd.7 , E = Portd.5 , Rs = Portd.4
Config Lcd = 40 * 2
Declare Sub Settime(byval S1 As Byte , Byval M1 As Byte , Byval H1 As Byte , Byval D1 As Byte , Byval Month1 As Byte)
Declare Sub Gettime()
Declare Sub Setalert(byval S1 As Byte , Byval M1 As Byte , Byval H1 As Byte , Byval D1 As Byte , Byval Month1 As Byte)
'Declare variables
Dim Tm(5) As Byte At &H60
Dim I As Byte , Temp As Byte , Cnt As Byte
Cnt = 31
'These are pointers to tm() for simple handling.
Dim S As Byte At &H60 Overlay
Dim M As Byte At &H61 Overlay
Dim H As Byte At &H62 Overlay
Dim D As Byte At &H63 Overlay
Dim Month As Byte At &H64 Overlay
'configure the used port pin for I2C
Config I2cdelay = 5 ' default slow mode
Config Sda = Portc.4
Config Scl = Portc.5
Cls
Lcd "PCF8583 Clock Sample"
Call Settime(0 , 30 , 12 , 1 , 8) 'set time
Call Setalert(0 , Cnt , 12 , 1 , 8)
Wait 2
Do
Call Gettime
Cls
Lcd Hex(d) ; "." ; Hex(month) ; ". - " ; Hex(h) ; ":" ; Hex(m) ; ":" ; Hex(s) ; " Err:" ; Err
Lowerline
Lcd "alarmminute: " ; Str(cnt)
Wait 1
Loop
End
Sub Gettime()
'there are 2 ways to get the time. With low level I2C calls or with a high level call
'first the high level call
Tm(1) = 2 ' point to second register
I2creceive &HA0 , Tm(1) , 1 , 5 ' write the second address and get 5 bytes back
'i2creceive will first write 1 byte from tm(1) which is 2, and then will read 5 bytes and store it onto tm(1)-tm(5)
'and optional with low level calls
' For I = 1 To 5
' Temp = I + 1
' I2cstart
' I2cwbyte &HA0 'write addres of PCF8583
' I2cwbyte Temp 'select register
' I2cstart 'repeated start
' I2cwbyte &HA1 'write address for reading info
' I2crbyte Tm(i) , Nack 'read data
' Next
' I2cstop
End Sub
Sub Settime(s1 As Byte , M1 As Byte , H1 As Byte , D1 As Byte , Month1 As Byte)
'values are stored as BCD values so convert the values first
Tm(1) = Makebcd(s1) 'seconds
Tm(2) = Makebcd(m1) 'minutes
Tm(3) = Makebcd(h1) 'hours
Tm(4) = Makebcd(d1) 'days
Tm(5) = Makebcd(month1) 'months
I2cstart 'generate start
I2cwbyte &HA0 'write address
I2cwbyte 0 'jmp to control/status register
I2cwbyte &B00000100 'control/status register
I2cwbyte &B00000000 'setting 100th seconds
I2cwbyte Tm(1) 'setting seconds
I2cwbyte Tm(2) 'setting minutes to 45
I2cwbyte Tm(3) 'setting hours to 14
I2cwbyte Tm(4) 'setting days
I2cwbyte Tm(5) 'setting month
I2cwbyte &B00000000 'timer ... to 0
I2cstop
End Sub
Sub Setalert(s1 As Byte , M1 As Byte , H1 As Byte , D1 As Byte , Month1 As Byte)
Tm(1) = Makebcd(s1) 'seconds
Tm(2) = Makebcd(m1) 'minutes
Tm(3) = Makebcd(h1) 'hours
Tm(4) = Makebcd(d1) 'days
Tm(5) = Makebcd(month1) 'months
'hier alarm-regiser
I2cstart
I2cwbyte &HA0 'write address
I2cwbyte 8 'jmp to control/status register
I2cwbyte &B10110000 'alarm control register
I2cwbyte &B00000000 '100tel
I2cwbyte Tm(1) 'sec
I2cwbyte Tm(2) 'min
I2cwbyte Tm(3) 'hours
I2cwbyte Tm(4) 'date
I2cwbyte Tm(5) 'month
I2cwbyte &B00000000 'alarm timer
I2cstop
End Sub
Onls:
Portb.1 = 0
Waitms 100
Portb.1 = 1
Waitms 100
Incr Cnt
I2cstart 'generate start
I2cwbyte &HA0 'write address
I2cwbyte 0 'jmp to control/status register
I2cwbyte &B00000100 'control/status register
I2cstop
Call Setalert(0 , Cnt , 12 , 1 , 8)
Return
Lesezeichen