Witam serdecznie!
Mam wielki problem z bascomem i magistralą i²c.
Otóż kiedyś, gdy miałem bascoma 1.11.7.7 magistrala i²c działała bez problemów, teraz mam Bascoma 1.11.9.5 i nie mogę się skomunikować z żadnym układem i²c. Zegar i pamięć eeprom w ogóle nie odpowiadają, testowałem na 2 płytkach (jednej własnej konstrukcji, druga BASCOM KIT AVT2500) i 2 procesorach (90S2313 i Mega1280) i efekt ten sam - brak komunikacji, zawsze otrzymuję wartość 0 na wyjściu. Układy są na pewno sprawne, gdyż z tą starszą wersją bascoma bez problemu działał mi zegar, dokładnie ten sam, który teraz nie odpowiada...
Zamieszczam poniżej kod którego aktualnie używam:
Program wyświetla potem:
00:00:00
00-00
Z góry dzięki za pomoc
Mam wielki problem z bascomem i magistralą i²c.
Otóż kiedyś, gdy miałem bascoma 1.11.7.7 magistrala i²c działała bez problemów, teraz mam Bascoma 1.11.9.5 i nie mogę się skomunikować z żadnym układem i²c. Zegar i pamięć eeprom w ogóle nie odpowiadają, testowałem na 2 płytkach (jednej własnej konstrukcji, druga BASCOM KIT AVT2500) i 2 procesorach (90S2313 i Mega1280) i efekt ten sam - brak komunikacji, zawsze otrzymuję wartość 0 na wyjściu. Układy są na pewno sprawne, gdyż z tą starszą wersją bascoma bez problemu działał mi zegar, dokładnie ten sam, który teraz nie odpowiada...
Zamieszczam poniżej kod którego aktualnie używam:
'Program przygotowany dla zestawu EvB 4.3 firmy And-Tech.pl
'Definicja procesora dla:
' Mega16 wpisać m16def.dat
' Mega32 wpisać m32def.dat
' Mega644p wpisać m644pdef.dat
'$regfile = "m32def.dat"
'Częstotliwość kwarcu domyślnie 16MHz
'$crystal = 16000000
$regfile = "m1280def.dat"
'$regfile = "2313def.dat"
$crystal = 11059200
$lib "glcd.lib"
Config Graphlcd = 240 * 64 , Dataport = Porte , Controlport = Porth , Ce = 0 , Cd = 1 , Wr = 2 , Rd = 3 , Reset = 4 , Fs = 5 , Mode = 6
'Config Lcd = 16 * 2
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 'default use 10 for the SW stack
$framesize = 40 'default use 40 for the frame space
' use the alternative library
'Podłączenie pinów LCD do mikroprocesora
'BL = PortC.1
'Rs = PortC.2
'E = PortC.3
'Db4 = PortC.4
'Db5 = PortC.5
'Db6 = PortC.6
'Db7 = PortC.7
'Config Lcdpin = Pin , Rs = Portc.2 , E = Portc.3 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7
'Config Lcd = 16 * 2
Dim A As Byte
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 Tm(5) As Byte 'At &H60 Overlay
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
'konfiguracja pinów magistrali I2C - nie zmieniamy tego
$lib "i2c_twi.lbx" ' we do not use software emulated I2C but the TWI
'Config I2cdelay = 5
Config Sda = Portd.1
Config Scl = Portd.0
'Aktywacja maistrali I2C
I2cinit
Twbr = 12
Twsr = 0
'Ustaw datę ic zas
'Call Settime(56 , 1 , 1 , 29 , 11)
Cls
Cursor Off
Locate 1 , 1
Lcd "PCF8583 Sample"
Wait 2
Cls
'Pętla nieskończona
Do
Call Gettime
Locate 1 , 1
Lcd Hex(h) ; ":" ; Hex(m) ; ":" ; Hex(s)
Locate 2 , 1
Lcd Hex(d) ; "-" ; Hex(month)
Wait 1
Loop
End
'Funkcja odczytująca zegar PCF8583
Sub Gettime()
Tm(1) = 2
I2creceive 162 , Tm(1) , 1 , 5
End Sub
'Funkcja ustawiająca zegar PCF8583
Sub Settime(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
I2cstart 'generate start
I2cwbyte 162 'write address
I2cwbyte 0 'select control register
I2cwbyte 8 'set year and day bit for masking
I2cstart 'repeated start
I2cwbyte 162 'write mode
I2cwbyte 2 'select seconds Register
For I = 1 To 5
I2cwbyte Tm(i)
Next 'write seconds
I2cstop
End Sub
Program wyświetla potem:
00:00:00
00-00
Z góry dzięki za pomoc