Forum: Mikrocontroller und Digitale Elektronik ADS1112 über i2c ansprechen


von Sven Müller (Gast)


Lesenswert?

Hallo, ich versuche seit einigen Tagen erfolglos einen 16 Bit AD Wandler
aus dem Hause analog anzusprechen.
Ich programmiere in C mit Codevision. Mein Quellcode ist unten.
1. Vermutung: die Slave Adresse ist nicht richtig gesetzt. Laut
Datenblatt ist das 1001000. Aber auf ein i2c_write(adress) kommt kein
ack.
2. Vielleicht ist es auch ein Hardware Problem, der den ich habe hat
leider ein sehr kleines SMD Package, was ich mir zwar mit draht auf
einen 8 Pol IC sockel adaptiert habe, aber wer weiß ob da ein Problem
ist..ich kann mit dem Oszi kein rechteck auf scl feststellen. liegt das
direkt nach init an?

Pullup sind drin.
Fällt einem noch ein i2c 16Bit AD Wandler mit DIP gehäuse ein?
Code:

#include <mega16.h>

// I2C Bus functions
#asm
   .equ __i2c_port=0x18
   .equ __sda_bit=0
   .equ __scl_bit=1
#endasm
#include <i2c.h>

// Standard Input/Output functions
#include <stdio.h>
#define adress 0b1001000
#define read 0b10111100


void main(void)
{

unsigned int help=0, data1, data2;

// Port B initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In
Func7=In
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T
State7=T
PORTB=0x00;
DDRB=0x00;

/
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x67;

// I2C Bus initialization
i2c_init();



while (1)
      {
      // Place your code here

        help=i2c_start();
  printf("\n\nStart1  = %u",help);

  help = i2c_write(adress);
  printf("\n\nadresse1  = %u",help);

  help = i2c_write(read);
  printf("\n\nregister  = %u",help);


  help=i2c_start();
  printf("\n\nStart2  = %u",help);

  help = i2c_write(adress);
  printf("\n\nRead_adress  = %u",help);

  data1 = i2c_read(1);
  data2 = i2c_read(0);

  i2c_stop();

   printf("\nData: %u %u",data1, data2);
      };
}

von Beginner (Gast)


Lesenswert?

Hi,
hab das Datenblatt und deinen Code nur überflogen.

denke deine ansprech routine für den chip stimmt nicht.
hier mal mein code:

i2c_start();
i2c_write(0x68);  //Adresse senden
i2c_write(0x61);        // Konfigurationsbyte
i2c_stop();

i2c_start();
i2c_write(0x69);   //Adresse zum lesen senden
value = i2c_read();      //Daten lesen
value1 = i2c_read(0);    //Daten lesen
i2c_stop();

so funktioniert das bei mir.

ich denke das solte dir helfen.

mfg
Beginner

von Sven Müller (Gast)


Lesenswert?

Ja, ich habe es ja fast so. nur woher hast du die Adresse 68 und zum
lesen 69? ich dachte cavr setzt automatisch ob gelesen oder geschrieben
werden soll..

wie hast du die Adressbits am Baustein? ich habe beide log. 0.

Danke schonmal, Sven

von Peter D. (peda)


Lesenswert?

"ich dachte cavr setzt automatisch..."

Wenn man schon schwarze Kistchen aufeinander stapelt, dann sollte man
wenigstens auch deren Funktionsbeschreibung lesen und nicht "denken"
wie es sein könnte.

Ich hege ja eine Abneigung gegen Black-Boxes, da ich nicht glaube, daß
sie 100% fehlerfrei programmiert sind (weil ich selber auch mal Fehler
mache).

Solch einfache Sachen wie I2C programmiere ich daher selber.


Peter

von Sven Müller (Gast)


Lesenswert?

Ok. ich würde es vielleicht auch selbst machen. aber hier habe ich nicht
ganz soviel zeit. und konnte schon mehrfach lesen das i2c von cavr gut
funktioniert.

Ich möchte hier auch keine Diskussion ob man alles per hand coden
sollte oder nicht. jeder so wie er es mag.

Ok, ich gebe es zu, ich habe es gelesen, aber falsch verstanden.
manchmal stellt man sich etwas anders vor als es ist.

Ich freue mich jedenfalls das ich dieses Forum kenne wo ich
konstruktive Beiträge verfassen und hilfreiche Antworten bekommen.

Mit freundlichen Gruß, Sven

von Beginner (Gast)


Lesenswert?

Hi,

ähm, das war jetzt nicht der Code den du benutzen sollst.
Das ist der Code wie ich ihn beim PIC benutze!
Die Adresse ist für einen anderen Chip.
Wie sich der avr verhält weiß ich nicht, da ich ihn nicht kenne.


Mfg
 Beginner

von Sven Müller (Gast)


Lesenswert?

HAllo, ich nochmal..

Kann ihn jetzt ansprechen, es lag an einem Hardwareproblem (schäm..)

Der Code ist fast richtig, nur wie schon oben gesagt man muss ihn für
schreiben und lesen unterschiedlich adressieren.

Das nächste Problem: ich bekomme ja zwei 8 Bit worte zurück. wie packe
ich die jetzt in eine Int Zahl? ICh will ja meine Spannung berechnen
und laut Datenblatt ist der min Code &#8722;32,768 das verstehe ich so
dasa das 0V entspricht und 32,767 der Referenzspannung.

Ich habe es mit zahl = (upper<<8) | lower; probiert, aber irgendwie
kommt das nicht hin..

Was mache ich falsch?

Danke schonmal.

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.