www.mikrocontroller.net

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


Autor: nils (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
#define maxWrite    0x50
#define maxRead     0x51

unsigned short read_max(uint8_t ctrl_byte) {  
   unsigned short result=0;
   unsigned short value=0;
   i2c_start_wait(maxWrite);
   i2c_write(ctrl_byte);
   i2c_stop();
   i2c_start_wait(maxRead);
   value=i2c_readAck();
   value<<=8;
   value|=(uint16_t)i2c_readNak();
   i2c_stop();
   value>>=4;
   result=value;
  
  return (unsigned short)result;

}

int main() {
   .....
  for(;;) {
    lcd_set_cursor(10,20);
    sprintf(str, " %04x", (unsigned int)read_max(0x8C));
    lcd_puts(small_font, str);
        
    _delay_ms(50);
    lcd_clear();
  }
   .......

Ich hoffe mir kann hierbei jemand helfen...

Autor: nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zum Feierabend hin hochschieb

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was mir sons noch auffällt, AGND ist auch mit GND verbunden?

Autor: nils (Gast)
Datum:

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

Autor: TheMexican (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.