bitte um Hilfe zum I2c debuggen INA219-Modul

Gast #4645012
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
Gast #4645059
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..
Gast #4645062
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 ;)
#4645065
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.
Gast #4645067
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
#4645154
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
Gast #4645392
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 ;-)
(Firma: Vescomp) #4645443
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
 ...
(Firma: Vescomp) #4645454
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.
#4645757
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
Gast #4646133
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!
#4646229
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

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