Forum: Mikrocontroller und Digitale Elektronik Probleme mit MAX127 und I2C


von Patrik K. (pakr)


Angehängte Dateien:

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
1
            IdleI2C1();
2
            StartI2C1();
3
            IdleI2C1();  
4
            MasterWriteI2C1(0x50); // Adresse Write
5
            if(I2C1STATbits.ACKSTAT==0);
6
            for(j=0;j<=100;j++);
7
            
8
            MasterWriteI2C1(adcval);   //Konfig wert ch1 lesen 0x90
9
            if(I2C1STATbits.ACKSTAT==1);
10
            for(j=0;j<=100;j++);
11
            
12
            StopI2C1();
13
            for(j=0;j<=100;j++);
14
15
            IdleI2C1();  
16
            StartI2C1();  // Starten zum auslesen
17
            
18
            IdleI2C1();  
19
            MasterWriteI2C1(0x51);
20
            if(I2C1STATbits.ACKSTAT==0);
21
            for(j=0;j<=100;j++);
22
          
23
24
            
25
            I2C1CONbits.RCEN = 1;     // LESEN 1
26
            while(I2C1CONbits.RCEN);
27
            I2C1STATbits.I2COV = 0;
28
            DataBytes[0]=I2C1RCV;
29
            I2C1CONbits.ACKDT = 0;    // ACK
30
            I2C1CONbits.ACKEN = 1;
31
            
32
            for(j=0;j<=100;j++);
33
            I2C1CONbits.RCEN = 1;     // LESEN 2
34
            while(I2C1CONbits.RCEN);
35
            I2C1STATbits.I2COV = 0;
36
            DataBytes[1]=I2C1RCV;
37
            
38
            for(j=0;j<=100;j++);
39
            I2C1CONbits.ACKDT = 1;   // NACK
40
            I2C1CONbits.ACKEN = 1;
41
            StopI2C1();    // STOP

von Pete K. (pete77)


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?

von Patrik K. (pakr)


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.

von hanne (Gast)


Lesenswert?

wozu ist das denn gut ???

   StopI2C1();

Nach dem Adressieren sollen doch sofort die Werte kommen?

von Lehrmann M. (ubimbo)


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. =)

von Patrik K. (pakr)


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.

von Patrik K. (pakr)


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.

von Patrik K. (pakr)


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.

von Patrik K. (pakr)


Angehängte Dateien:

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?

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.