'Mikrocontroller Setup $lib "mcsbyte.lbx" $regfile = "m16def.dat" $regfile = "8515def.dat" $crystal = 19999998 $baud = 19200 'Display Setup Config Lcdpin = Pin , Db4 = Porta.6 , Db5 = Porta.5 , Db6 = Porta.4 , Db7 = Porta.3 , E = Porta.7 , Rs = Porta.2 ' Natürlich so wie es wirklich angeschlossen ist (4-Bit-Modus) Config Lcd = 20 * 4 Config Pind.2 = Input Config Pind.4 = Input 'Variablen 'Checksum Variablen Dim Crc_l As Integer Dim Crc_h As Integer Dim New As Byte Dim Tmp As Byte Dim Bcclo As Byte Dim Bcchi As Byte Dim X As String * 10 Dim Crce As Word Dim Crcs As Word 'Sende & Empfangs Variablen Dim Packets(10) As Byte Dim Packete(8) As Byte 'WR Variablen Dim Wradr As Byte Dim Wrtyp As String * 10 Dim Anzahl As Integer 'Display & Line Variablen Dim Line1 As String * 20 Dim Line2 As String * 20 Dim Line3 As String * 20 Dim Line4 As String * 20 'Sendepaket Variablen Dim Adr As Byte Dim Command As Byte Dim Par1 As Byte Dim Par2 As Byte Dim Par3 As Byte Dim Par4 As Byte Dim Par5 As Byte Dim Par6 As Byte 'Empfangspaket Variablen Dim State As Byte 'Paket Variablen Declare Sub Paketinit 'Subroutines Declare Sub Sendewr Declare Sub Empfangewr Declare Sub Crc Declare Sub Lcdout Declare Sub Status Declare Sub Abfrageroutine 'WR Statusabfragen Declare Sub Adr2 Declare Sub Adr3 Declare Sub Adr4 Declare Sub Adr5 Declare Sub Adr6 Declare Sub Adr7 Declare Sub Adr8 Declare Sub Adr9 Declare Sub Adr10 Declare Sub Adr11 Declare Sub Adr12 Declare Sub Adr13 'Clock 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 variables Dim Tm1(5) As Byte At &H60 Dim I As Byte , Temp As Byte '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.1 Config Scl = Portc.0 'power LED Portd.5 = 1 'Setup Comports 'Serial 1 Configuration Config Serialin = Buffered , Size = 8 Config Serialout = Buffered , Size = 10 Config Pinb.7 = Output 'LCD init Initlcd Line1 = " " Line2 = " BOOT" Line3 = " " Line4 = "Alexander Gosub Lcdout 'Setze Zeit Call Settime(56 , 1 , 1 , 29 , 11) 'Hauptprogramm Do If Pind.2 = 1 Then End If If Pind.4 = 1 Then Gosub Abfrageroutine End If Loop '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 'SUBs 'Anfrage an WR stellen Sub Sendewr Gosub Crc Line2 = " Status " Line3 = " sende Anfrage" Gosub Lcdout Printbin Packets(1) ; 10 Return End Sub Sendewr ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 'Status vom WR empfangen Sub Empfangewr Inputbin Packete(1) , 8 State = Packete(2) Gosub Status Return End Sub Empfangewr '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 'Checksumme berechnen Sub Crc Bcclo = &HFF Bcchi = &HFF New = Packets(1) New = New Xor Bcclo Tmp = New Shift Tmp , Left , 4 New = Tmp Xor New Tmp = New Shift Tmp , Right , 5 Bcclo = Bcchi Bcchi = New Xor Tmp Tmp = New Shift Tmp , Left , 3 Bcclo = Bcclo Xor Tmp Shift Tmp , Right , 4 Bcclo = Bcclo Xor Tmp New = Packets(2) New = New Xor Bcclo Tmp = New Shift Tmp , Left , 4 New = Tmp Xor New Tmp = New Shift Tmp , Right , 5 Bcclo = Bcchi Bcchi = New Xor Tmp Tmp = New Shift Tmp , Left , 3 Bcclo = Bcclo Xor Tmp Shift Tmp , Right , 4 Bcclo = Bcclo Xor Tmp New = Packets(3) New = New Xor Bcclo Tmp = New Shift Tmp , Left , 4 New = Tmp Xor New Tmp = New Shift Tmp , Right , 5 Bcclo = Bcchi Bcchi = New Xor Tmp Tmp = New Shift Tmp , Left , 3 Bcclo = Bcclo Xor Tmp Shift Tmp , Right , 4 Bcclo = Bcclo Xor Tmp New = Packets(4) New = New Xor Bcclo Tmp = New Shift Tmp , Left , 4 New = Tmp Xor New Tmp = New Shift Tmp , Right , 5 Bcclo = Bcchi Bcchi = New Xor Tmp Tmp = New Shift Tmp , Left , 3 Bcclo = Bcclo Xor Tmp Shift Tmp , Right , 4 Bcclo = Bcclo Xor Tmp New = Packets(5) New = New Xor Bcclo Tmp = New Shift Tmp , Left , 4 New = Tmp Xor New Tmp = New Shift Tmp , Right , 5 Bcclo = Bcchi Bcchi = New Xor Tmp Tmp = New Shift Tmp , Left , 3 Bcclo = Bcclo Xor Tmp Shift Tmp , Right , 4 Bcclo = Bcclo Xor Tmp New = Packets(6) New = New Xor Bcclo Tmp = New Shift Tmp , Left , 4 New = Tmp Xor New Tmp = New Shift Tmp , Right , 5 Bcclo = Bcchi Bcchi = New Xor Tmp Tmp = New Shift Tmp , Left , 3 Bcclo = Bcclo Xor Tmp Shift Tmp , Right , 4 Bcclo = Bcclo Xor Tmp New = Packets(7) New = New Xor Bcclo Tmp = New Shift Tmp , Left , 4 New = Tmp Xor New Tmp = New Shift Tmp , Right , 5 Bcclo = Bcchi Bcchi = New Xor Tmp Tmp = New Shift Tmp , Left , 3 Bcclo = Bcclo Xor Tmp Shift Tmp , Right , 4 Bcclo = Bcclo Xor Tmp New = Packets(8) New = New Xor Bcclo Tmp = New Shift Tmp , Left , 4 New = Tmp Xor New Tmp = New Shift Tmp , Right , 5 Bcclo = Bcchi Bcchi = New Xor Tmp Tmp = New Shift Tmp , Left , 3 Bcclo = Bcclo Xor Tmp Shift Tmp , Right , 4 Bcclo = Bcclo Xor Tmp Crc_l = Bcclo Xor &HFF Crc_h = Bcchi Xor &HFF Return End Sub Clc '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 'LCD Ausgabe Sub Lcdout Cls Locate 1 , 1 '1. Zeile Lcd Line1 Locate 2 , 1 '2. Zeile Lcd Line2 Locate 3 , 1 '3. Zeile Lcd Line3 Locate 4 , 1 '4. Zeile Lcd Line4 Return End Sub Lcdout '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 'Status Auswertung Sub Status If State = 006 Then Line3 = Str(adr) + " ok" X = Str(adr) + " ok" Else Line3 = Str(adr) + " Fehler" X = Str(adr) + " Fehler" Print Chr(27) ; "[2;2f"; ' VT100 emulation set pos to 2,2 Print Hex(h) ; ":" ; Hex(m) ; ":" ; Hex(s) ; End If Serout X , 0 , B , 7 , 4800 , 0 , 8 , 1 Gosub Lcdout Return End Sub Status '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 'Abfrageroutine sequenziell Sub Abfrageroutine Command = 050 Gosub Adr2 Gosub Sendewr Gosub Empfangewr Wait 2 Gosub Adr3 Gosub Sendewr Gosub Empfangewr Wait 2 Gosub Adr4 Gosub Sendewr Gosub Empfangewr Wait 2 Gosub Adr5 Gosub Sendewr Gosub Empfangewr Wait 2 Gosub Adr6 Gosub Sendewr Gosub Empfangewr Wait 2 Gosub Adr7 Gosub Sendewr Gosub Empfangewr Wait 2 Gosub Adr8 Gosub Sendewr Gosub Empfangewr Wait 2 Gosub Adr9 Gosub Sendewr Gosub Empfangewr Wait 2 Gosub Adr10 Gosub Sendewr Gosub Empfangewr Wait 2 Gosub Adr11 Gosub Sendewr Gosub Empfangewr Wait 2 Gosub Adr12 Gosub Sendewr Gosub Empfangewr Wait 2 Gosub Adr13 Gosub Sendewr Gosub Empfangewr Wait 2 Return End Sub Abfrageroutine 'Paketinitialisierung Sub Paketinit 'Init Packets Packets(1) = Adr 'Adr Packets(2) = Command 'command Packets(3) = Par1 'Par1 Packets(4) = Par2 'Par2 Packets(5) = Par3 'Par3 Packets(6) = Par4 'Par4 Packets(7) = Par5 'Par5 Packets(8) = Par6 'Par6 Packets(9) = Crc_l Packets(10) = Crc_h Return End Sub Paketinit 'WR Subs Status Sub Adr2 Adr = 002 Command = Command Par1 = 000 Par2 = 032 Par3 = 032 Par4 = 032 Par5 = 032 Par6 = 032 Crc_l = 037 Crc_h = 135 Gosub Paketinit Return End Sub Adr2 Sub Adr3 Adr = 003 Command = Command Par1 = 000 Par2 = 032 Par3 = 032 Par4 = 032 Par5 = 032 Par6 = 032 Crc_l = 154 Crc_h = 006 Gosub Paketinit Return End Sub Adr3 Sub Adr4 Adr = 004 Command = Command Par1 = 000 Par2 = 032 Par3 = 032 Par4 = 032 Par5 = 032 Par6 = 032 Crc_l = 148 Crc_h = 154 Gosub Paketinit Return End Sub Adr4 Sub Adr5 Adr = 005 Command = Command Par1 = 000 Par2 = 032 Par3 = 032 Par4 = 032 Par5 = 032 Par6 = 032 Crc_l = 043 Crc_h = 027 Gosub Paketinit Return End Sub Adr5 Sub Adr6 Adr = 006 Command = Command Par1 = 000 Par2 = 032 Par3 = 032 Par4 = 032 Par5 = 032 Par6 = 032 Crc_l = 251 Crc_h = 145 Gosub Paketinit Return End Sub Adr6 Sub Adr7 Adr = 007 Command = Command Par1 = 000 Par2 = 032 Par3 = 032 Par4 = 032 Par5 = 032 Par6 = 032 Crc_l = 068 Crc_h = 016 Gosub Paketinit Return End Sub Adr7 Sub Adr8 Adr = 008 Command = Command Par1 = 000 Par2 = 032 Par3 = 032 Par4 = 032 Par5 = 032 Par6 = 032 Crc_l = 246 Crc_h = 161 Gosub Paketinit Return End Sub Adr8 Sub Adr9 Adr = 009 Command = Command Par1 = 000 Par2 = 032 Par3 = 032 Par4 = 032 Par5 = 032 Par6 = 032 Crc_l = 073 Crc_h = 032 Gosub Paketinit Return End Sub Adr9 Sub Adr10 Adr = 010 Command = Command Par1 = 000 Par2 = 032 Par3 = 032 Par4 = 032 Par5 = 032 Par6 = 032 Crc_l = 153 Crc_h = 170 Gosub Paketinit Return End Sub Adr10 Sub Adr11 Adr = 011 Command = Command Par1 = 000 Par2 = 032 Par3 = 032 Par4 = 032 Par5 = 032 Par6 = 032 Crc_l = 038 Crc_h = 043 Gosub Paketinit Return End Sub Adr11 Sub Adr12 Adr = 012 Command = Command Par1 = 000 Par2 = 032 Par3 = 032 Par4 = 032 Par5 = 032 Par6 = 032 Crc_l = 040 Crc_h = 183 Gosub Paketinit Return End Sub Adr12 Sub Adr13 Adr = 013 Command = Command Par1 = 000 Par2 = 032 Par3 = 032 Par4 = 032 Par5 = 032 Par6 = 032 Crc_l = 151 Crc_h = 054 Gosub Paketinit Return End Sub Adr13 ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 Tm1(1) = 2 ' point to second register I2creceive &HA0 , Tm1(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 'seconds Tm1(2) = Makebcd(m1) 'minutes Tm1(3) = Makebcd(h1) 'hours Tm1(4) = Makebcd(d1) 'days Tm1(5) = Makebcd(month1) 'months I2cstart 'generate start I2cwbyte &HA0 'write address I2cwbyte &H00 'select control register I2cwbyte &H08 'set year and day bit for masking I2cstart 'repeated start I2cwbyte &HA0 'write mode I2cwbyte 2 'select seconds Register For I = 1 To 5 I2cwbyte Tm1(i) Next 'write seconds I2cstop End Sub End 'end program