Ich habs in der Zwischenzeit geschafft das Ganze mal aufzubauen.
Allerdings hab ich jetzt für die ersten Versuche eine etwas abgeänderte Hardware verwendet:
Ein ATmega 8 (Code poste ich weiter unten noch) läuft mit 5 Volt.
Als I2C Sensor hab ich ein Lux Plug von Jeelabs genommen (http://jeelabs.net/projects/hardware/wiki/Lux_Plug) da ich da die I2C Adresse kenne. Beim Heading Board ist mir die Adresse nicht bekannt - konnte sie noch in keinem Datenblatt finden. Außerdem benötigt das Heading Board ein Master Clock Signal mit 32 kHz. Das kann ja eigentlich ohne Probleme vom ATmega erzeugt werden, muss dann aber auch auf 3,3 Volt gebracht werden...
Zurück zum momentanen Aufbau: Ich hab die Spannungsversorgung vom Sensor an 3,3 Volt angeschlossen. SDL und SDA sind am ATmega8 laut Datenblatt an Pin C4 und C5 angeschlossen und die Pullups(1kOhm) gehen auf 3,3 Volt.
Vom ATmega gehen die UART Leitungen (RXD und TXD) zu einer USBtoUART Bridge, damit ich am PC über Hterm die Ausgabe des Controllers verfolgen kann.
Hier mal der Code, der auf dem ATmega läuft:
Code:
' BASCOM-Programm
' I2C-Scanner mit ATMega8
'
' In: beliebige I2C-Slaves an C.4=SDA und C.5=SCL
' Out: SerialOut über UART
' Funktion dieses Demo-Programmes:
' Scannen der Slave-Adressen
'$sim
$regfile = "m8def.dat" ' benutzter Mikrocontroller
$crystal = 8000000 ' Taktfrequenz
$hwstack = 40 ' Hardware Stack
$swstack = 32 ' SW Stack
$framesize = 60 ' Frame
$baud = 9600
Waitms 250
Config Sda = Portc.4
Config Scl = Portc.5
'Config I2cdelay = 20
I2cinit
Dim Slaveadresse As Byte
Dim Lux As Byte
Lux = 0
Do
Print "I2C Slaves"
Print "suchen..."
Wait 2
For Slaveadresse = 0 To 254 Step 1
I2cstart 'Startbedingung senden
I2cwbyte Slaveadresse ' Addresse senden
If Err = 0 Then 'I2C-Slave gefunden?
Print "Slave dec: " ; Slaveadresse
Print "h" ; Hex(slaveadresse) ; " b" ; Bin(slaveadresse)
Wait 2
End If
I2cstop 'Bus freigeben
Next
Print "Ende Scan"
Wait 2
I2cstart
I2creceive &H72 , Lux
Print "Lux72: " ; Lux
I2cstop
I2cstart
I2creceive &H73 , Lux
Print "Lux73: " ; Lux
I2cstop
I2cstart
I2creceive &H74 , Lux
Print "Lux74: " ; Lux
I2cstop
I2cstart
I2creceive &H75 , Lux
Print "Lux75: " ; Lux
I2cstop
Loop
End
Die 4 Blöcke mit den 4 Adressen zum Ende des codes kommen daher, dass ich als Ausgabe der eigentlichen Programmes diese 4 Adressen zurück bekommen hab.
Laut Datenblatt sollte die Adresse 0x39 sein.
Bei den Adressen &H72 und &H73 bekomme ich einen Wert von 0 zurück, bei den Adressen &H74 und &H75 bekomme ich einen Wert von 255 zurück. Diese Werte verändern sich leider nie.
Eigentlich sollten doch nur die ungeraden Adressen die zum Lesen sein?!
Hat mir evtl. jemand nen Tipp, wo meine Fehler bzw. meine Fehler liegen könnten - ich bin etwas ratlos.
[edit]
Ich hab gerade einen Schaltplan gefunden, wo jemand als Pullups gegen 3,3 Volt 10kOhm verwendet. Kann es daran liegen, dass ich die falschen Pullups verwende(1kOhm)?
[edit]
[edit]
Ich bin mir ziemlich sicher, dass ich den Fehler in meinem Code und in meinen Gedanken gefunden hab:
Nachdem das Modul ja mit 7 bit Adressen arbeitet, ich aber 8 bit Adressen abfrage finde ich binär: 01110010
Die Adresse ist aber eigentlich nur 0111001 und somit dezimal 57 anstatt 72 oder was auch immer...
Hier (http://www.rn-wissen.de/index.php/I2..._7-Bit-Adresse) hab ich herausgefunden, dass bei 7 bit Adressen das 8 byte das lesen oder schreiben angibt wobei 1 für lesen steht. Also sollte ich mit der Adresse 011100101 meinen Sensor auslesen können?! Dezimal wäre das dann die 229 (also die ungerade Adresse) und die 228 (also die gerade Adresse) um zu schreiben.
[edit]
Viele Grüße
e.
Lesezeichen