mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit MAX127 und I2C


Autor: Patrik K. (pakr)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
HAllo

ich habe seit tagen ein problem mit dem auslesen eines DAC's --> MAX127.

ich kann ihn zwar ansprechen und konfigurieren, aber nicht auslesen. 
jedesmal wenn ich ihn mit dem read anspreche bleiben beide leitungen SCL 
und SDA down. vielleicht hat ja jemand eine idee... ich weiß nicht mehr 
weiter.

im bild sieht man wie er konfiguriert wird... aber beim read gibt er auf

ich benutzte den pic24f128ga010 mit dem c30 compiler

hier der code
            IdleI2C1();
            StartI2C1();
            IdleI2C1();  
            MasterWriteI2C1(0x50); // Adresse Write
            if(I2C1STATbits.ACKSTAT==0);
            for(j=0;j<=100;j++);
            
            MasterWriteI2C1(adcval);   //Konfig wert ch1 lesen 0x90
            if(I2C1STATbits.ACKSTAT==1);
            for(j=0;j<=100;j++);
            
            StopI2C1();
            for(j=0;j<=100;j++);

            IdleI2C1();  
            StartI2C1();  // Starten zum auslesen
            
            IdleI2C1();  
            MasterWriteI2C1(0x51);
            if(I2C1STATbits.ACKSTAT==0);
            for(j=0;j<=100;j++);
          

            
            I2C1CONbits.RCEN = 1;     // LESEN 1
            while(I2C1CONbits.RCEN);
            I2C1STATbits.I2COV = 0;
            DataBytes[0]=I2C1RCV;
            I2C1CONbits.ACKDT = 0;    // ACK
            I2C1CONbits.ACKEN = 1;
            
            for(j=0;j<=100;j++);
            I2C1CONbits.RCEN = 1;     // LESEN 2
            while(I2C1CONbits.RCEN);
            I2C1STATbits.I2COV = 0;
            DataBytes[1]=I2C1RCV;
            
            for(j=0;j<=100;j++);
            I2C1CONbits.ACKDT = 1;   // NACK
            I2C1CONbits.ACKEN = 1;
            StopI2C1();    // STOP

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kondensatoren vergessen?

Ich kenne mich werder mit PIC noch dem Compiler aus, aber in der Regel 
optimieren die Compiler den Code und eliminieren Deine leeren 
for()-Schleifen.

Poste mal den ganzen Code. Sind Deine Adress-Bits ok?

Autor: Patrik K. (pakr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die referenz kondensatoren?

nein.mit dem BusPirtaten funktionert es tadellos.

und die for()-schleifen werden definitiv nicht weg optimiert.

die adressen sind alle ok. sonst würde er mir kein ACKNOWLEGE geben.

Autor: hanne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wozu ist das denn gut ???

   StopI2C1();

Nach dem Adressieren sollen doch sofort die Werte kommen?

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Patrik K. schrieb:
> if(I2C1STATbits.ACKSTAT==0);

Erkläre uns bitte was du damit bezweckst?! Wenn I2C1STATbits.ACKSTAT 
gleich 0 dann tue nichts und sonst auch nichts! Bei aller Liebe aber 
fange nicht mit PIC an bevor du C kannst. Wenn du bezwecken möchtest, 
dass gewartet wird bis diese Bedingung erfüllt ist dann ist hierfür eine 
while-Schleife von Nöten. Eine If ist hier so falsch, dass es fälscher 
nicht mehr geht. Wir vom Compiler übrigens optimiert (es passiert ja so 
und so bei egal ob I2C1STATbits.ACKSTAT==0 oder I2C1STATbits.ACKSTAT != 
0 nichts).

Gleiches gilt für solche Schleifen

>             for(j=0;j<=100;j++);

Nachdem nichts passiert wird es wegoptimiert.

Ganz ehrlich: Sonderlich viel Ahnung von C-Programmieren hast du nicht 
oder ? Ich kann dir nur einen Tipp geben wie ich es gemacht habe. Ich 
habe ANSI C (ganz normales C) gelernt (hab mir dazu ein Buch gekauft und 
2 Monate lang alle Aufgaben durchgemacht) und dann hab ich zusammen mit 
meinen Assemblerkentnissen ein korrektes C Programm auf die Beine 
gestellt.

> if(I2C1STATbits.ACKSTAT==0);

Sowas ist einfach nur eine Katastrophe in diesem Kontext. Dass der 
Compiler die for-Schleifen eliminiert kann man nicht wissen aber bei der 
If-Schleife ist einfach ein Mega-Denkfeheler bzw. Unkenntniss über C 
vorhanden.

In diesem Sinne versuch es richtig zu lernen du wirst sonst auch später 
keinen Spaß haben.

Gruß

PS nicht persönlich nehmen ich will dich nicht beleidigen oder 
demütigen. =)

Autor: Patrik K. (pakr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lehrmann Michael schrieb:
> Patrik K. schrieb:
>> if(I2C1STATbits.ACKSTAT==0);

Ziel war folgendes ... wenn  dort nicht null wie erwartet steht, dann 
hängt er sich auf.... zu debuggen.
>
> Erkläre uns bitte was du damit bezweckst?! Wenn I2C1STATbits.ACKSTAT
> gleich 0 dann tue nichts und sonst auch nichts! Bei aller Liebe aber
> fange nicht mit PIC an bevor du C kannst. Wenn du bezwecken möchtest,
> dass gewartet wird bis diese Bedingung erfüllt ist dann ist hierfür eine
> while-Schleife von Nöten. Eine If ist hier so falsch, dass es fälscher
> nicht mehr geht. Wir vom Compiler übrigens optimiert (es passiert ja so
> und so bei egal ob I2C1STATbits.ACKSTAT==0 oder I2C1STATbits.ACKSTAT !=
> 0 nichts).
>
> Gleiches gilt für solche Schleifen
>
>>             for(j=0;j<=100;j++);

Wie schon erwähnt... die wird nicht wegoptimiert. Mit nicht meine ich 
nicht und nix anderes.

> Nachdem nichts passiert wird es wegoptimiert.

>
> PS nicht persönlich nehmen ich will dich nicht beleidigen oder
> demütigen. =)
ja, ich versuche es nicht persöhnlich zu nehmen.

Autor: Patrik K. (pakr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hanne schrieb:
> wozu ist das denn gut ???
>
>    StopI2C1();
>
> Nach dem Adressieren sollen doch sofort die Werte kommen?

Ich brauche ein Stop nach dem ich den max127 konfiguriert habe... schau 
mal bitte ins datenblatt.

der zweite befehl (lesen) erwartet auch ein START ADRESSE READ READ STOP

des wegen muß die kommunikation gestopt und danach zum lesen wieder 
gestartet werden.

Autor: Patrik K. (pakr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UND

vor dem if(I2C1STATbits.ACKSTAT==0);
steht ein MasterRead... das Checkt die register eigentlich vorher schon 
ab. ich hatte am anfang ein paar ungereimtheiten mit den status flags.

Autor: Patrik K. (pakr)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also laut datenblatt 
http://datasheets.maxim-ic.com/en/ds/MAX127-MAX128B.pdf
soll man angeblich nach dem man den max127  konfiguriert hat die 
kommunikation stoppen und danach wieder starten.

ich  habe es jetzt mit einem RESTART versucht. jetzt bin ich ein wenig 
weiter gekommen.

leider ist das zweite byte definitiv nicht korrekt, denn die letzten 4 
bits sollen angeblich mit nullen aufgefüllt sein. und dann wird auch 
noch die SDA line down gehalten.

hat jemand eine idee?

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.