Forum: Mikrocontroller und Digitale Elektronik Probleme mit Max127 (i2c adc) und m644p (gcc)


von nils (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein Problem, den Max127 12Bit-ADC auszulesen. Ich bin nach dem 
Datenblatt vorgegangen (das glaube ich zumindest) und bekomme immer nur 
Murks heraus.

Das Datenblatt ist im Anhang, angeschlossen ist er wie im Datenblatt auf 
Seite 1 zu sehen.
Die I2C Lib, die ich verwende, ist die von P. Fleury.

Der Chip wird beim i2c_start() erkannt und ich kann ihm das Control-Byte 
schicken, und auch auslesen.

Doch jenachdem was ich im Controlbyte schicke habe ich unterschiedliche 
Ausgaben, diese jedoch immer gleich, egal ob nun GND oder VCC am Pin 
liegt.

Wenn das Control Byte (Erklärung Seite 10) nun 0x8C ist, dann bekomme 
ich immer 0x0800 heraus.
Wenn es 0x80 ist, bekomme ich 0x0000 heraus.
0x8C bedeutet: Channel 0, input range +-10V
0x80 bedeutet: Channel 0, input range 0..5V
VCC ist 5V.

Die Erklärung der I2C-Datenübertragung ist im Datenblatt auf Seite 12.

Hier der Code:
1
#define maxWrite    0x50
2
#define maxRead     0x51
3
4
unsigned short read_max(uint8_t ctrl_byte) {  
5
   unsigned short result=0;
6
   unsigned short value=0;
7
   i2c_start_wait(maxWrite);
8
   i2c_write(ctrl_byte);
9
   i2c_stop();
10
   i2c_start_wait(maxRead);
11
   value=i2c_readAck();
12
   value<<=8;
13
   value|=(uint16_t)i2c_readNak();
14
   i2c_stop();
15
   value>>=4;
16
   result=value;
17
  
18
  return (unsigned short)result;
19
20
}
21
22
int main() {
23
   .....
24
  for(;;) {
25
    lcd_set_cursor(10,20);
26
    sprintf(str, " %04x", (unsigned int)read_max(0x8C));
27
    lcd_puts(small_font, str);
28
        
29
    _delay_ms(50);
30
    lcd_clear();
31
  }
32
   .......

Ich hoffe mir kann hierbei jemand helfen...

von nils (Gast)


Lesenswert?

zum Feierabend hin hochschieb

von Steffen (Gast)


Lesenswert?

Hast du eventuell eine Lötbrücke zu GND am CH0? Du bekommst bei beiden 
Varianten 0.0 Volt angezeigt. Hast du auch mal einen anderen Channel 
ausprobiert? Ich habe den MAX127 auch schon benutzt und der hat gleich 
auf Anhieb funktioniert.

Deine I2C Kommunikation scheint ja zu funktionieren.

von nils (Gast)


Lesenswert?

Keine Lötbrücken und auch keine anderer Channel funktioniert. Habe mal 
einen zweiten ADC mit der Adresse 0x52 (der andere hat ja 0x50) 
drangemacht, wird auch erkannt usw. - selbes Ergebnis.

Hast du vielleicht noch funktionierenden Quellcode zu deinem und würdest 
da mal vergleichen oder ihn sogar posten?

von Steffen (Gast)


Lesenswert?

Hab da mal einen Light-Controller mit 0-10V Ausgängen mit dem MAX127 zu 
DMX512 gewandelt. Allerdings alles in ASM geschrieben. Mit C komm ich 
noch nicht so gut klar.

Was bedeutet denn eigentlich:

   value=i2c_readAck();
   value<<=8;
   value|=(uint16_t)i2c_readNak();
   i2c_stop();
   value>>=4;

value ist schon als 16Bit Variable deklariert, oder?

von nils (Gast)


Lesenswert?

1.   value=i2c_readAck();
2.   value<<=8;
3.   value|=(uint16_t)i2c_readNak();
4.   i2c_stop();
5.   value>>=4;

Value ist ein unsigned short, 16bit ohne Vorzeichen.

1. er holt das MSB rein, liegt nun im unteren Byte.
2. Er schiebt es 8 bit nach links, also ins obere Byte
3. Er holt und "odert" das untere Byte hinein
4. i2c_stop
5. das ganze noch 4 bit nach rechts schieben weil die unteren 4 bit vom 
LSB ja ungenutzt sind (12bit, 8 im MSB voll, das obere nibble vom LSB 
voll, unteres nibble leer).

von Steffen (Gast)


Lesenswert?

Ja, okay. Hab ich es doch richtig interpretiert. REF und REFADJ auch mit 
den C´s angeschlossen? Also mir kommt es immer noch nach GND auf den 
Channels vor. Denn auslesen kannst du ja scheinbar.

von Steffen (Gast)


Lesenswert?

Was mir sons noch auffällt, AGND ist auch mit GND verbunden?

von nils (Gast)


Lesenswert?

AGND ist mit GND verbunden, an REFADJ 10nF nach GND, an REF 4,7µ und 
100nF an VCC nach GND.

von TheMexican (Gast)


Lesenswert?

Hab leider momentan das gleiche Problem. Hast du es lösen können? Tut 
mir leid wegen der Fred-Leichenschändung.

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
Noch kein Account? Hier anmelden.