hi Leute! Ich möchte gerne den AD-Wandler mit I2C zum laufen bekommen, aber leider funktoniert es nicht! Habe folgenden Code: void i2c_pcf8591_read( int *d) { int n; // set configuration i2c_bus_start(); i2c_byte_write(0x9F); i2c_ack_slave(); i2c_byte_write(0x04); //control byte i2c_ack_slave(); i2c_byte_read(); // throw the first away i2c_ack_slave(); for(n=0; n<4; n++) { d[n]=i2c_byte_read(); if(n!=3) // no ack after fetching the last byte { i2c_nack_master(); } } i2c_bus_stop(); } Es funktioniert einfach nicht. Kann mir mal jemand einen code schicken der sicherlich funktioniert? Ich weiß nicht was ich falsch mache! mfg, geri
Hier, wird dir aber vermutlich nicht weiterhelfen:
1 | xdata Byte I2C_BUF[5]; |
2 | void i2c_write_sync(Byte addr, Byte length, xdata Byte * dat) { |
3 | // wait till last stop condition is done
|
4 | while (I2CS & bmSTOP); |
5 | |
6 | I2CS|=bmSTART; |
7 | I2DAT=addr;// & ~ bmBIT0; |
8 | while (length) { |
9 | while (! (I2CS & bmDONE)) ; |
10 | I2DAT=*dat; |
11 | ++dat; |
12 | --length; |
13 | }
|
14 | I2CS |= bmSTOP; |
15 | }
|
16 | Byte i2c_read_byte(Byte addr) { |
17 | register Byte dummy; |
18 | // wait till last stop condition is done
|
19 | while (I2CS & bmSTOP); |
20 | |
21 | I2CS|=bmSTART; |
22 | I2DAT=addr; |
23 | while (! (I2CS & bmDONE)) ; |
24 | I2CS|=bmLASTRD; |
25 | dummy=I2DAT; |
26 | while (! (I2CS & bmDONE)) ; |
27 | I2CS |= bmSTOP; |
28 | dummy=I2DAT; |
29 | return dummy; |
30 | }
|
31 | void pcf8591_write(Byte addr, Byte mode, Byte dat) { |
32 | |
33 | I2C_BUF[0]=mode; |
34 | I2C_BUF[1]=dat; |
35 | |
36 | i2c_write_sync(0x90 | (addr << 1),2,I2C_BUF); |
37 | }
|
38 | |
39 | Byte pcf8591_read(Byte addr) { |
40 | return i2c_read_byte(0x91 | (addr << 1)); |
41 | }
|
/Ernst
hi! Danke für die schnelle antwort, jedoch hilft mir das nicht viel! Gibt es noch andere, die diesen baustein schon mal zum laufen bekommen haben? mfg, geri
Wär vielleicht hilfreich zu erfahren, auf welchem uC Du programmierst (Mein Code war z.B. für 'nen EzUSB AN2131SC). Funktionieren deine i2c_* Funktionen? Passt der Hardwaremäsige Busaufbau, funktionieren andere I2C Chips an dem Bus? /Ernst
hi! Andere Chips am Bus funktionieren, ja! Arbeite auf einem Atmel AT89S52! Der Hardwareaufbau ist sicherlich richtig! ist alles überprüft! Ich denke die routinen stimmen auch! die leseroutine brauch ich nur bei diesem chip deswegen kann ich nicht wissen ob sie wirklich funktioniert! mfg, geri
dein i2c_byte_write(0x9F); Soll die adresse für den nachvolgenden Schreibvorgang (config byte) festlegen, oder? stimmt die auch? 0x90 für den Chip, aber 0x0F dazu? ist das nicht eine "lese-addresse", wg. bit0 gesetzt? und für das darauffolgende lesen muss dann nach dem Schreiben des config-bytes erneut die Chip-Adresse gesendet werden (wieder mit Start-Condition), diesmal mit dem 0er Bit gesetzt. /Ernst
Hmm, vielleicht mal ein Pseudo-Code Beispiel für chip-addr 0: START 0x90 0x04 STOP START 0x91 LESE_BYTE LESE_BYTE LESE_BYTE LESE_BYTE STOP
hi! Hab jetzt eine ausgabe zusammengebracht. Er gibt in Hex immer 100 aus das ist dezimal 256! Wieso kann da so sein? mfg, Geri
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.