I2C-Adressen suchen
Verfasst: Do 3. Jan 2013, 13:41
Manchmal stößt man auf ein I2C-Gerät mit unbekannter Adresse. Mit einem einfachen BASCOM-Programm (s. u. ) kann man den Attiny die Adressen angeschlossener I2C-Geräte ermitteln lassen. Entscheidende Ideen sind:
1. Wenn ein I2C-Gerät korrekt adressiert wird, sendet es ein Acknowledge-Bit. In BASCOM kann man dieses über die Systemvariable Err abfragen.
2. Wenn ein I2C-Gerät im Readmodus adressiert wird (ungerade Adresse), dann stellt es einen Ausgabewert bereit. Dieser muss mit dem Parameter NACK ausgelesen werden.
Hier das Programm:
1. Wenn ein I2C-Gerät korrekt adressiert wird, sendet es ein Acknowledge-Bit. In BASCOM kann man dieses über die Systemvariable Err abfragen.
2. Wenn ein I2C-Gerät im Readmodus adressiert wird (ungerade Adresse), dann stellt es einen Ausgabewert bereit. Dieser muss mit dem Parameter NACK ausgelesen werden.
Hier das Programm:
Code: Alles auswählen
' Attiny-Platine von E. Eube, G. Heinrichs und U. Ihlefeldt
' Sucht die Adressen aller angeschlossenen I2C-Geräte und gibt sie auf LCD aus.
' Pull-Up-Widerstände nicht vergessen!
'----------------------------------------------------------------------------
$regfile = "attiny2313.dat" 'Attiny2313
$crystal = 4000000 '4 MHz
'**********************************************************
'******************* Deklarationen ************************
Dim Fehler As Byte
Dim Adresse As Byte
Dim Dummy As Byte
Dim Typ As Byte
'****************** Initialisierung ***********************
Ddrb = &B11111111 'Port B als Ausgangsport
Ddrd = &B01110000 'D4, D5, D6 als Ausgang; Rest als Eingang
Portd = &B10001111 'Eingänge auf high legen
Waitms 50 'u. A. zum Aufladen des Kondensators bei Ta0
Config Lcd = 16 * 2 'LCD konfigurieren
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.6
Cursor Off
Config Scl = Portb.7 'Konfigurieren von I2C
Config Sda = Portb.5
'**********************************************************
'******************** Hauptprogramm ***********************
Cls
Lcd "I2C-Adr."
Locate 2 , 1
Lcd "suchen"
Wait 2
Cls
For Adresse = 0 To 255
Cls
Lcd Adresse
I2cstart
I2cwbyte Adresse
If Err = 0 Then
Locate 1 , 1
Lcd Adresse
Locate 2 , 1
Typ = Adresse Mod 2
If Typ = 0 Then 'Write-Gerät
Lcd "Write"
Else 'Read-Gerät
I2crbyte Dummy , Nack 'Kein Acknowledge
Lcd "Read" 'Read-Baustein erwartet Lesevorgang
End If
Wait 5
End If
I2cstop
Waitms 10
Next Adresse
Cls
Lcd "Suchen"
Locate 2 , 1
Lcd "beendet"
End