Witam
W oparciu o kod znaleziony na forum Elektroda mam programik wyświetlający adresy układów w magistrali I2C ( TWI ).
Kod jest taki:
W sumie spora kobyła i może pokazać tylko 6 adresów. Zastanawiam się, czy da się to napisać, żeby było "lżejsze" ( na Atmega8 zajmuje 26% ), poza tym problem będzie w przypadku, jak będzie więcej układów.
Drugie pytanie jest takie, czy da się "wyciągnąć" więcej informacji na temat układu. Czyli, żeby uzyskać coś takiego:
24L32 adres 162
24L32 adres 163
PCF8591 adres 144
W oparciu o kod znaleziony na forum Elektroda mam programik wyświetlający adresy układów w magistrali I2C ( TWI ).
Kod jest taki:
Code:
$regfile = "m8def.dat" 'definicja procesora
$crystal = 4000000 'taktowanie procesora
$hwstack = 32 ' rozmiar stosu sprzętowego
$swstack = 10 ' rozmiar stosu
$framesize = 40 ' rozmiar ramki
Config Debounce = 30
'********************* Konfiguracja wyświetlacza
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portc.3 , Rs = Portc.1
Config Lcd = 24 * 2
'********************* Konfiguracja znaku specjalnego LCD
Deflcdchar 0 , 8 , 20 , 8 , 32 , 32 , 32 , 32 , 32 ' znak stopnia celcjusza
'********************* Konfiguracja magistrali I2C
Config I2cdelay = 10 ' domyślnie tryb Slow
Config Sda = Portc.4
Config Scl = Portc.5
'********************* Konfiguracja podświetlania
Config Portb.0 = Output 'Podswietlanie Niebieskie
Reset Portb.0
Config Portb.1 = Output 'Podswietlanie Czerwone
Reset Portb.1
Config Portb.2 = Output 'Podswietlanie Zielone
Reset Portb.2
Config Portd.2 = Input 'wejście - przycisk do GND
Set Portd.2
'********************* Konfiguracja magistrali 1-Wire
Config 1wire = Portc.0
'********************* Konfiguracja Timer2
Config Timer1 = Timer , Prescale = 64 'dla kwarc = 4000000 Hz Prescale = 64 przepełnienie co 16us
Enable Timer1
Enable Interrupts
On Timer1 Czas
Timer1 = 34286 '31250 x 16us = 0,5 s , 65536 - 31250 = 34286
'********************* Deklaracje zmiennych
Dim Odczyt As Byte
Dim Odczyt1 As Byte
Dim Temp As Byte
Dim Twi1 As Bit
Dim Twi2 As Bit
Dim Twi3 As Bit
Dim Twi4 As Bit
Dim Twi5 As Bit
Dim Twi6 As Bit
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Byte
Dim E As Byte
Dim F As Byte
Dim N As Byte
'********************* Deklaracja podprogramów
Declare Sub Przeszukaj_i2c
Declare Sub Wyswietla_adres
'********************* Przypisanie przyjaznych nazw do poszczególnych portów - Aliasów
Niebieski Alias Portb.0
Czerwony Alias Portb.1
Zielony Alias Portb.2
Szukaj Alias Pind.2
'********************* Wartości początkowe
Niebieski = 1
Twi1 = 0
Twi2 = 0
Twi3 = 0
Twi4 = 0
Twi5 = 0
Twi6 = 0
Cursor Off
Cls
'**************** Program główny
Do
Locate 1 , 1
Lcd A
Locate 1 , 5
Lcd B
Locate 1 , 9
Lcd C
Locate 2 , 1
Lcd D
Locate 2 , 5
Lcd E
Locate 2 , 9
Lcd F
'If Szukaj = 0 Then
Call Przeszukaj_i2c
'End If
Loop
End
'*********************** Podprogram szukania adresu układu I2C
Przeszukaj_i2c:
For Temp = 100 To 255 'Zakres szukania 100 - 255
I2cstart 'Warunek startu
Waitms 20
I2cwbyte Temp
Waitms 20
I2cstop 'Warunek stopu
If Err = 0 Then 'Jeśli nie ma błędów to
'Locate 2 , 13 'wyświetlaj wartość zmiennej Temp
'Lcd Temp
'Flaga_twi = 1
Gosub Wyswietl_adres
End If
Waitms 200
Next Temp
Return
Wyswietl_adres:
If Temp <> 0 And Twi1 = 0 Then
A = Temp
Locate 1 , 1
Lcd A
Twi1 = 1
Elseif Temp <> A And Twi1 = 1 And A > B Then
B = Temp
Locate 1 , 5
Lcd B
Twi2 = 1
Elseif Temp <> B And Twi1 = 1 And Twi2 = 1 And B > C Then
C = Temp
Locate 1 , 9
Lcd C
Twi3 = 1
Elseif Temp <> C And Twi1 = 1 And Twi2 = 1 And Twi3 = 1 And C > D Then
D = Temp
Locate 2 , 1
Lcd D
Twi4 = 1
Elseif Temp <> D And Twi1 = 1 And Twi2 = 1 And Twi3 = 1 And Twi4 = 1 And D > E Then
E = Temp
Locate 2 , 5
Lcd E
Twi5 = 1
Else
If Temp <> D And Twi1 = 1 And Twi2 = 1 And Twi3 = 1 And Twi4 = 1 And Twi5 = 1 And E > F Then
F = Temp
Locate 2 , 9
Lcd F
Twi6 = 1
End If
End If
Return
W sumie spora kobyła i może pokazać tylko 6 adresów. Zastanawiam się, czy da się to napisać, żeby było "lżejsze" ( na Atmega8 zajmuje 26% ), poza tym problem będzie w przypadku, jak będzie więcej układów.
Drugie pytanie jest takie, czy da się "wyciągnąć" więcej informacji na temat układu. Czyli, żeby uzyskać coś takiego:
24L32 adres 162
24L32 adres 163
PCF8591 adres 144