Forum: Mikrocontroller und Digitale Elektronik bitte um Hilfe zum I2c debuggen INA219-Modul


von i2c twi (Gast)


Lesenswert?

https://www.adafruit.com/product/904

Hallo an alle, ich versuche dieses Modul per i2c anzusteuern, bin aber 
gerade mit meinem Latein am Ende. Ich hatte hier..

Beitrag "Frage zu i2c NOT ACK bei ATMega328P"

..schon mal andiskutiert und dachte eigentlich alles verstanden zu 
haben, aber ich bekomme kein ACK :-(

Jetzt habe ich ein ganz einfaches Testprogramm, Hardware ist ein Arduino 
R3 Clone, per ISP angeschlossen. Was kann ich noch an systematischer 
Fehlersuche tun / messen? Ich bekomme immer einen falschen Status 
zurück:

Ausgabe:

1
i2c start
2
wert1=08
3
wert2=20

Mein auf das Problem reduzierte Testprogramm (Bascom, aber ich hoffe 
einfach zu lesen):

1
$regfile = "m328pdef.dat"
2
$crystal = 16000000
3
$baud = 115200
4
$swstack = 64
5
$hwstack = 64
6
$framesize = 64
7
8
Dim T_status As Byte
9
10
Print "i2c start"
11
12
Twsr = &B00000000                                           'max prescaler speed = 1
13
Twbr = &B00001100                                           '=12 for max. twi = 400MHz
14
Twcr = &B10100101                                           'twi start
15
16
Waitms 1
17
T_status = Twsr And &B11111000
18
Print "wert1=" ; Hex(t_status)
19
20
Twdr = &H40                                                 'datenbyte=Adresse
21
Twcr = &B10000101
22
Waitms 1
23
T_status = Twsr And &B11111000
24
Print "wert2=" ; Hex(t_status)
25
Do : Loop
26
27
End

von Bastian W. (jackfrost)


Lesenswert?

Laut adafruit ist die 0x40 die 7 Bit Adresse. Dafehlt ja noch das R/W 
Bit. Versuch mal ob du mit 0x80 eine Antwort bekommst wenn du due 
Adresse 0x40 eingestellt hast.

Gruß JackFrost

von i2c twi (Gast)


Lesenswert?

Das habe ich nicht kapiert.. r/w ist doch das LSB, oder?? Oder warum 80?

Ich würde eigentlich nur erstmal gerne ein ACK auf meine Adresse 
bekommen, sprich der Statuscode sollte 0x18 statt 0x20 sein..

von EgonZwegon (Gast)


Lesenswert?

Guck dir vielleicht erstmal dein Adressbyte in Ruhe an. Der Windoof 
Taschenrechner hat einen "Programmierer" Modus, der dabei tatsächlich 
ganz hilfreich sein kann.

Ich habe so den leisen Verdacht, dass dir ein paar wesentliche 
Grundlagen in Sachen Hexadezimalsystem feheln... Ist ja keine Schande ;)

von Julian .. (juliank)


Lesenswert?

i2c twi schrieb:
> ..schon mal andiskutiert und dachte eigentlich alles verstanden zu
> haben, aber ich bekomme kein ACK :-(

Schaun wir mal...

> Jetzt habe ich ein ganz einfaches Testprogramm,...

Sehr gut!

> Ausgabe:
>
>
1
> i2c start
2
> wert1=08
3
> wert2=20
4
>

Ok, TWI wird Master und bekommt dann kein ACK vom Slave...

> Mein auf das Problem reduzierte Testprogramm (Bascom, aber ich hoffe
> einfach zu lesen):

geht schon....

>
1
> Twdr = &H40  'datenbyte=Adresse
2
>

Da ist dein Fehler. Die Adresse von IC ist 0x40. Das TWI möchte aber
Adresse + R/W Bit....

7 Bit adresse | R/W
Bit 7..1      | Bit 0
Zusammen 8 Bit für TWDR.

Also 0x40 1 Bit nach links schieben = 0x80 und dann
1 addieren für Lesen oder 0 für Schreiben.
Das Ergebnis kommt dann ins TWDR.

von Peter (Gast)


Lesenswert?

i2c twi schrieb:
> Das habe ich nicht kapiert.. r/w ist doch das LSB, oder?? Oder warum 80?

Das musst im Grunde du wissen - es geht darum was deine I2C Library 
erwartet:

+ entweder eine 7Bit Adresse (wie du sie angegeben hast "Twdr =  H40") 
oder
+ eine 8Bit Adresse bei der die Library dann das LSB ignoriert / 
selbstständig anpasst, dann hättest du eine falsche Adresse angegeben

von Bastian W. (jackfrost)


Lesenswert?

Es werden die 7Bit der Adresse und dann das R/W Bit gesendet. Damit du 
auf die vollen 8 Bit kommst schiebst du die Adresse um ein Bit nach 
links und addierst das R/W Bit. Das LSB kommt als letztes. Schau dir das 
mal im Datenblatt auf Seite 11 an.

Gruß JackFrost

von Jobst M. (jobstens-de)


Lesenswert?

Meeeeeensch, das kann doch nicht sein, dass Du das immer noch nicht 
hinbekommen hast. Genügend Tips gab es doch ...

Try this:
1
$regfile = "m328pdef.dat"
2
$crystal = 16000000
3
$baud = 115200
4
$swstack = 64
5
$hwstack = 64
6
$framesize = 64
7
8
Dim T_status As Byte
9
10
Print "i2c start"
11
12
'init
13
    Twsr = 0                 'prescaler = 1
14
    Twbr = 255               '30kHz = erstmal langsam!
15
    Twcr = 0                 'TWI Reset!
16
17
18
19
FOR TwiAddr = 8 to 119   'Schleife, alle gültigen Adressen durchlaufen
20
21
    Print "STA : ";
22
    Twcr = &B10100100        'STA senden
23
24
    GOSUB Auswertung         'Was kam dabei heraus?
25
26
    Print "Adresse " ; Hex(TwiAddr) ; " : ";
27
    Twdr = TwiAddr * 2       'datenbyte=Adresse + RW=0=Write
28
    Twcr = &B10000100        'Verschicken
29
30
    GOSUB Auswertung         'Was kam dabei heraus?
31
32
    Print "STO : ";
33
    Twcr = &B10010100        'STO senden
34
35
    GOSUB Auswertung         'Was kam dabei heraus?
36
37
    Twcr = 0                 'TWI Reset!
38
    Print ""
39
40
NEXT
41
42
Do : Loop
43
44
End
45
46
47
Auswertung:
48
    IF TWCR AND 128 = 0 THEN GOTO Auswertung
49
    T_status = Twsr And &HF8
50
    IF T_status = &H08 THEN PRINT "STA gesendet ";
51
    IF T_status = &H18 THEN PRINT "ACK erhalten! ";
52
    Print Hex(t_status)
53
RETURN

Habe ich jetzt mal eben so ohne BASCOM-Kenntnisse zusammengeschustert. 
Kann also irgendwo haken.


Gruß

Jobst

von i2c twi (Gast)


Lesenswert?

Julian .. schrieb:
> Also 0x40 1 Bit nach links schieben = 0x80 und dann
> 1 addieren für Lesen oder 0 für Schreiben.
> Das Ergebnis kommt dann ins TWDR.

Ahhh na da habe ich mich ja prima selbst hereingelegt.. daran wird's 
liegen. ich dachte halt man muss die "1" addieren.. Aber im 
Timing-Diagramm ganz genau hingeschaut sehe ich es jetzt auch!

Peter schrieb:
> Das musst im Grunde du wissen - es geht darum was deine I2C Library
> erwartet

Alles Hardware, nix Library.. :-)

Jobst M. schrieb:
> Meeeeeensch, das kann doch nicht sein, dass Du das immer noch nicht
> hinbekommen hast. Genügend Tips gab es doch ...

Halb so wild - ich hatte nur zwischendurch keine Zeit zum Basteln. Danke 
auch für Deine viele Mühe mit dem Programm, aber die Zeile nach 
"Auswertung:" macht mir Angst ;-)

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

i2c twi schrieb:
> Halb so wild - ich hatte nur zwischendurch keine Zeit zum Basteln. Danke
> auch für Deine viele Mühe mit dem Programm
 Programm ist mehr als OK, er hat es so geschrieben, dass du auch
 verstehen kannst, was da vorgeht.

> aber die Zeile nach "Auswertung:" macht mir Angst ;-)

 Du brauchst keine Angst zu haben, das macht die Library auch.

 Oder, um sicher zu gehen, so etwas reinschreiben:
1
 Dim Bw As Word
2
 Dim Rres As Byte
3
4
Auswertung:
5
 Bw = 0
6
 While Bw < 50000         '* Oder wie lange du warten willst...
7
   Rres = Twcr And 128
8
   If Rres <> 0 Then Exit While
9
   Incr Bw
10
 Wend
11
 ...
12
 ...

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

i2c twi schrieb:
> Julian .. schrieb:
>> Also 0x40 1 Bit nach links schieben = 0x80 und dann
>> 1 addieren für Lesen oder 0 für Schreiben.
>> Das Ergebnis kommt dann ins TWDR.
>
> Ahhh na da habe ich mich ja prima selbst hereingelegt.. daran wird's
> liegen. ich dachte halt man muss die "1" addieren.. Aber im

 Ich glaube BASCOM schiebt die Adresse nach links, das solltest du
 nicht machen.

von Rainald (Gast)


Lesenswert?

Marc V. schrieb:
> Ich glaube BASCOM schiebt die Adresse nach links, das solltest du
>  nicht machen.

Nur wenn er i2csend nimmt. I2cwbyte oder seine Variante über die 
Register machen das natürlich nicht.

von Jobst M. (jobstens-de)


Lesenswert?

i2c twi schrieb:
> aber die Zeile nach
> "Auswertung:" macht mir Angst ;-)

Meine Güte, was glaubst Du denn, was passiert?
Weltuntergang?
Probier das doch einfach aus.
Ich habe langsam den Eindruck, dass Du gar keine Lösung haben möchtest. 
Jeden zielführenden Vorschlag lehnst Du ab.
Natürlich kann auch etwas mal nicht funktionieren. Aber das wird man 
nicht herausbekommen, wenn man es nicht ausprobiert.

Also: Probier das jetzt aus und WENN es Probleme gibt (wovon ich 
zumindest an dieser Stelle nicht ausgehe) kann man darüber reden.
Ansonsten: Such Deinen Fehler selbst, ein Forum ist für Dich nicht 
geeignet.


Gruß

Jobst

von i2c twi (Gast)


Lesenswert?

Wie schon vermutet - es lag wirklich nur an dem Adress-Missverständnis.
Jetzt bekomme ich ENDLICH ein ACK.. (0x18 bzw. 0x40 beim READ)

Danke an alle!

@Jobst - da steht doch ein Smilie in meiner Zeile = ist nicht so ernst 
gemeint. Was dahinter steckt: Ich verwende generell kein Goto und würde 
eher eine While-Schleife schreiben, aber das ist nur ein Detail.

Ich hab in deinem Programm mal die fehlenden Variablen u.a. gefixt. 
Ausgabe:

i2c start
STA : STA gesendet 08
Adresse 08 : 20
STO :

Irgendwie wird das Bit nicht mehr gesetzt und er bleibt da beim goto 
hängen.
Aber wie gesagt - ich hab den Fehler ja gefunden und komme erst mal 
klar.

Ihr seid super!

von Jobst M. (jobstens-de)


Lesenswert?

i2c twi schrieb:
> Ich verwende generell kein Goto

Ich verwende das, was mich am schnellsten zum Ziel bringt.
Und: Meine Güte, Du hast ein Softwareschnippsel zum ausprobieren 
bekommen.


i2c twi schrieb:
> Irgendwie wird das Bit nicht mehr gesetzt

Dann nimm die Auswertung für STO weg und warte kurz.


i2c twi schrieb:
> Jetzt bekomme ich ENDLICH ein ACK.

Mein Gott, jetzt hat er's!
Dann ist ja gut ...

;-)


Gruß

Jobst

: Bearbeitet durch User
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.