Für mich einfachste Lösung wäre den AVR auch mit 3,3 V zu versorgen.
Für mich einfachste Lösung wäre den AVR auch mit 3,3 V zu versorgen.
MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!
Hey PICture:
es handelt sich um folgendes ATmega128 Board:
http://www.avr-tools.de/component/pa...d,29/vmcchk,1/
Im Datenblatt steht dass entweder 5 Volt oder 7-20 Volt mgl. sind.
Man kann zwar den ATmega direkt mit Spannung versorgen, aber der Rest an ICs benötigt wohl 5 Volt. Und zwei Spannungsversorgungen sind nicht mgl.
Grüße
e.
Dann kannst du es wirklich nicht machen, wenn es noch mehr Hardware gibt, die 5 V benötigt. Ich habe nur an deinen letzten Schaltplan gedacht (kenne AVR's nur grob).
MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!
Das von Jeelabs is ja nur ne Breakout Platine ohne weitere Bestückung und da is folgende Sensorplatine dabei, die ich noch nicht auf das Breakoutboard gelötet hab:
http://www.kosmodrom.com.ua/pdf/HDPM01.pdf
Im Datenblatt is zu finden dass die Spannung von 2,4-5,25V mgl. ist.
Weiter unten findet man aber auch die Angabe, dass 2,2-3,6V der mgl. Bereich ist.
Evtl. weiß jemand mehr zu diesem Sensor?
[edit]
@PICture: Ja ich hab auf dem Schaltplan nur nen AVR gezeichnet, da wäre das mit den 3,3 Volt mgl. Bei dem letATwork Modul leider nicht. Deshalb beschäftigt mich die Sache mit dem 3,3Volt I2C ja auch so...
[edit]
Grüße
e.
Am Dienstag werd ich das mit den Pullups auf dem Steckbrett mal testen. Bei TI hab ich jetzt noch mal Samples bestellt, die seit heute auf dem Weg zu mir sind.
Dabei handelt es sich dann um folgende ICs:
http://www.ti.com/lit/ds/symlink/tca9406.pdf
Dafür werd ich also nebenbei auch mal ein Layout entwerfen, damit ich es dann letztendlich mit denen aufbauen kann.
Grüße e.
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:
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.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
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.
Geändert von extremesports (03.05.2012 um 21:57 Uhr)
Hmmm... woran liegt es nur, dass das nicht will wie ich?
Hab es gerade noch mal getestet aber es funktioniert noch nicht.
Hier mal der aktuelle Code:
Und was Hterm dabei ausgibt: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 = 10 I2cinit Dim Slaveadresse As Byte Dim Lux As Byte Lux = 0 Dim Lux01 As Byte Dim Lux02 As Byte Do Print "I2C Slaves" Print "suchen..." Wait 2 For Slaveadresse = 0 To 254 Step 1 ' für alle geraden Adressen 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 I2cwbyte &H72 , Lux If Err = 0 Then Print "Lux72: " ; Lux Waitms 250 Else Print "Lux72: no ACK" End If I2cstop I2cstart I2cwbyte &H73 , Lux If Err = 0 Then Print "Lux73: " ; Lux Waitms 250 Else Print "Lux73: no ACK" End If I2cstop I2cstart I2cwbyte &H74 , Lux If Err = 0 Then Print "Lux74: " ; Lux Waitms 250 Else Print "Lux74: no ACK" End If I2cstop I2cstart I2cwbyte &H75 , Lux If Err = 0 Then Print "Lux75: " ; Lux Waitms 250 Else Print "Lux75: no ACK" End If I2cstop I2cinit I2cstart I2cwbyte 57 '0x39 I2cwbyte 140 '0x8C I2crbyte Lux01 , Ack I2cwbyte 109 '0x6d I2crbyte Lux02 , Nack Print "erster Wert: " ; Lux01 Print "zweiter Wert: " ; Lux02 I2cinit Loop End
Falls da mal jemand drüber schauen kann und mir evtl. Fehler im Code aufzeigt, damit ich nachbessern kann...
Viele Grüße
e.
Zuerst mal dazu: der I2C Bus ist digital und nicht analog. Trotzdem gibt es ein furchtbares rumgeeier mit den Pullups. Das kommt wohl daher, daß keiner mehr mit digitaler Logic, Opencollector-Ausgängen und Wired-Ors umgehen kann. Also ganz kurz: der High-Pegel sowohl von SDA als auch SCL wird nur durch die Pullups gebildet. Der Wert ist eigentlich egal, solange damit gegen die Eigangsströme aller Busteilnehmer ein High erzeugt werden kann. Da reicht leicht 1 µA oder weniger. Aber: je größer die Kapazität der Busleitung ist, desto länger dauert es das High zu erreichen. Wenn man es also zügig haben will, sollte man die Pullups klein machen. Die Grenze sind da die 3 mA, die das normgerechte Maximum für einen I2C Ausgang sind (obwohl die meisten auch mehr leisten können). Bei wenigen cm Bus und nur zwei drei Bausteinen am Bus, passen zwischen 50k und 1k, läßt sich leicht ausrechen (oder einfach mit dem Scope sehen).
Jetzt zu dem Code:
Du scanst über 256 Busadressen, der I2C hat aber nur 128. Und bevor jetzt gleich gemault wird, so stehts in der Spec. Diese Adresse wird in den obersten 7 Bit des ersten Bytes eines Telegrams übertragen. Das unterste Bit zeigt an, ob es ein Read oder Write werden wird.
Also: I2CWRITE(Adresse << 1 | RW_Bit)
Da ich dein Basic ? nicht kenne, eine art pseudo C. Wenn man nur den Bus scannen will, sollte man nur Writes schicken und dann mit Stop abbrechen. Manche einfachen Slaves wollen nach einem Read unbedingt daß der Master etwas liest und hängen bis zum nächsten Reset.
Wenn mein Hex-Rechner richtig funktioniert, ist 0x39 << 1 | 0 gleich 0x72, also gar nicht so falsch.
Da ich nicht weiß, was die Funktion "I2creceive" macht, kann ich dazu wenig sagen, nur mit 0x39 << 1 | 0 als erstes Byte kann man nur schreiben, lesen kann man mit 0x39 << 1 | 1 .
MfG Klebwax
Strom fließt auch durch krumme Drähte !
Lesezeichen