mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADS1112 über i2c ansprechen


Autor: Sven Müller (Gast)
Datum:

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

Autor: Beginner (Gast)
Datum:

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

Autor: Sven Müller (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Sven Müller (Gast)
Datum:

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

Autor: Beginner (Gast)
Datum:

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

Autor: Sven Müller (Gast)
Datum:

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

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.