Hallo zusammen,
ich habe schon das Forum und Google durchsucht, ich finde leider nix.
Ich habe einen A/D-Wandler PCF8591 an einen ATTiny2313 angeschlossen.
Ich bekomme aber die Werte nicht ausgelesen.
Der Bus scheint vorhanden zu sein, da schon mal "> I2C - OK <" auf dem
Display erscheint. Allerdings erscheint die Meldung auch, wenn ich die
Adresse #define PCF8591 0b10010000 auf #define PCF8591 0b10010011
ändere.
Wenn ich die Masse des PCF8591 entferne, kommt "> I2C - Error <".
Aber ich bekomme immer nur die 4 Analogwerte "238,238,238,236"
angezeigt.
Habe auch schon den IC getauscht.
Diese Werte werden allerdings auch bei "> I2C - Error <" angezeigt.
Bin echt ratlos. Das Probleme mit dem PCF8591 habe ich schon oft im
Forum gefunden, aber leider keine Lösung....
PS: Am 1. Eingang ist ein Poit (0-5V), die anderen sind unbelegt...
SDA & SCL sind mit PullUp-Widerständen 4,7k angeschlossen
1
#define PCF8591 0b10010000 // Grundadresse aus Datenblatt
2
3
voidmain()
4
{
5
unsignedcharret;
6
charBuffer[10];
7
8
lcd_ini();
9
lcd_gotopos(1,1);
10
lcd_writetext("Analog-INPUT");
11
12
i2c_init();// init I2C interface
13
14
ret=i2c_start(PCF8591+I2C_WRITE);// set device address and write mode
15
if(ret){
16
i2c_stop;
17
lcd_gotopos(4,1);
18
lcd_writetext("> I2C - Error <");
19
}else{
20
lcd_gotopos(4,1);
21
lcd_writetext
22
23
i2c_write(0b01000100);// Kontrollbyte: Bit 7 = immer 1
24
// Analog Out enable=false Bit 6
25
// 4 Kanäle, 0..5V Bit 4&5
26
// Autoincrement Flag an Bit 3
27
// Kanal Null selektiert Bit 2
28
// Null auf Start- D/A-Wandler Bit 0&1
29
i2c_write(0b00000000);// wenn OUT an, dann 0=0Volt, 255=5Volt
Wo hast du die Adress-pins des pcf angeschlossen? (Ich kann im
Datenblatt - das hast du doch auch gelesen? - nichts finden, was dafür
spricht die nicht anzuschließen).
Dieser Kommentar ist unnötig verwirrend:
1
i2c_write(0b01000100);
2
// Kontrollbyte: Bit 7 = immer 1 -> Besser: bit7 ist ungenutzt
3
// Analog Out enable=false Bit 6 -> Du schaltest es aber an
4
// 4 Kanäle, 0..5V Bit 4&5
5
// Autoincrement Flag an Bit 3 -> Das ist aber bit 2, Bit 3 ist auch ungenutzt
6
// Kanal Null selektiert Bit 2
7
// Null auf Start- D/A-Wandler Bit 0&1 -> Tippfehler?
Ich würde sowas bevorzugen:
1
#define PCF8591_ANA_OUT (1<<6)
2
3
#define PCF8591_SINGLE 0
4
#define PCF8591_3DIFF (1<<4)
5
#define PCF8591_1DIFF_2SINGLE (2<<4)
6
#define PCF8591_2DIFF (3<<4)
7
8
#define PCF8591_AUTOINCR (1<<2)
9
10
#define PCF8591_ADCHANNEL(_n) ((_n) & 3)
11
12
//...
13
i2c_write(PCF8591_ANA_OUT
14
|PCF8591_SINGLE
15
|PCF8591_AUTOINCR
16
|PCF8591_ADCHANNEL(0));
17
// ...
Außerdem misst der PCF während dem Auslesen (Im Datenblatt unter 'A/D
Conversion'ist sogar ein Bild davon). Um deine 4 Kanäle zu lesen, musst
du demnach 5 Bytes lesen (oder besser: ein Dummybyte nach der
Initialisierung).
hth, Jörg
So, habe einen Fehler gefunden...
bem Auslesen hatte ich
1
ret=i2c_readAck;
, es muß aber
1
ret=i2c_readAck();
geschrieben werden, sonst zeigt es wirre Zahlen.
Allerdings steht jetzt 4 x 255 da, obwohl am AIN0 nur ca. 3V anliegen.
Habe zum Test mal ein EEprom dazugeschalten. Aber der ausgelesene Wert
ist auch 255 statt 09...
1
// EEPROM 24C16
2
//==============
3
ret=i2c_start(EEPROM24C16+I2C_WRITE);// set device address and write mode
>Habe zum Test mal ein EEprom dazugeschalten. Aber der ausgelesene Wert>ist auch 255 statt 09...
Ein EEPROM benötigt Zeit für die Programmierung.
So 10-20ms warten nach i2cstop ist eine Lösung.
Oder Acknowledge Polling anwenden.
OK, ich habe jetzt nach jedem i2C_stop 50ms Wartezeit.
Aber immer noch 255.
Wie kann ich testen, ob der Bus funktioniert ???
Sind die Ports am Prozessor egal ???
Ich habe SCL an PB1 und SDA an PB0, ist auch so in der i2cmaster.s
eingetragen.
Der Prozessor läuft mit intern 4 MHZ
OK, FEHLER gefunden...
habe im BUS alle Adressen durchlaufen lassen, die richtigen Adressen
wurden gefunden...
Der Fehler war klein aber fein...
Hatte überall i2c_stop; statt i2c_stop();
Was so ein paar Klammern ausmachen...
Danke trotzdem