Zitat Zitat von davil
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