Probleme mit MAX127 und I2C

OP #1841441
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
Angehängte Dateien:
#1841510
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. =)
OP #1841533
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.
OP #1841540
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.
OP #1842799
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?
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren