Forum: Mikrocontroller und Digitale Elektronik I²C Modifizierung 7-Bit --> 10-Bit


von Tom (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen !!

Ich wende mich noch mal verzweifelt an euch da ich mit meinen Nerven am 
ende bin. Versuche in einer Applikation mir Sensorwerte eines VTI 
3000-D02 an zwei Displays auszugeben.

Dabei benutze ich einen ATmega 16. Die Zwei Displays hängen am Port A 
der auch zu A/D-Wandlung benutzt wird. Auf jeden fall funktionieren die 
zwei Displays soweit. Nur das auslesen des Sensor mit I²C gelingt gar 
nicht. Hab in älteren Applikationen mit den A/D-Wandlern ADS1100 von TI 
gearbeitet (7-Bit Adressierung) und versuche das I²C-Protokoll das ich 
dort verwendet hab so zu modifizieren das ich auch den VTI-Sensor 
(10-Bit Adressierung) ansprechen kann.

Habe mal Spaßes halber das Protokoll so wie es war (in der ADS1100 
Applikation) auf den µC geladen und jetzt steigen mir die zwei Displays 
aus und zeigen nichts mehr an !!

Hat dafür jemand eine Erklärung ???
Vor allem wie könnte ich das Protokoll modifizieren um auch den 
VTI-Sensor zu verwenden ?

Hab das bestehende Protokoll mal angehängt, eventuell habt ihr ja ein 
paar Vorschläge oder Anregungen. Bin mit meinem Latein am ende…

von m_bedded (Gast)


Lesenswert?

warum können die Displays aussteigen?

- Diplay-Variablen im Speicher verletzt (String mit Länge x deklariert, 
aber mehr als x Chars darein geschrieben, dabei die benachbarte 
Display-Variablen erwischt -> Teilprogramm Display durcheinander)

- Unsaubere Interrupt-Handling bei I2C (vergessen, Flag zurückzusetzen). 
uC kommt einfach nicht mehr aus dem Interrupt raus, dadurch 'keine Zeit' 
für Display

- irgendwas globales - Stack reichen nicht mehr aus usw.?

- vielleicht gefällt Dir "AVR155: Accessing I2C Using the AVR 2-Wire 
Serial Interface" besser?

von Tom (Gast)


Lesenswert?

Danke !!

Werde die sachen mal überprüfen und schauen was davon in frage kommt.

> vielleicht gefällt Dir "AVR155: Accessing I2C Using the AVR 2-Wire
> Serial Interface" besser?

Wo krieg ich das den her ??

von Carbolo C. (carbolo)


Lesenswert?

> Wo krieg ich das den her ??

Google hilft :-)

2.ter Treffer mit "AVR155"

von Tom (Gast)


Lesenswert?

Hab’s schon raus !!

Der kommt wirklich aus dem I²C-Interrupt nicht mehr raus.
Danke noch mal, allerdings bezog sich die I²C-Frage nicht auf die 
Displays sondern auf den Sensor.

Mal im Bezug auf die Modifikation des I²C-Protokolls von 7-Bit auf 
10-Bit zum ansprechen des VTI-Sensors. Ist das Thema allgemein unbeliebt 
oder hat da niemand irgendwelche erfahrungswerte gesammelt.

Das währe das Hauptproblem.

von AxelR. (Gast)


Lesenswert?

Das Thema ist EXTREM unbeliebt.
Der AVR kann nicht zwischen SLAVE-ACK und DATA-ACK unterscheiden.
Man bekommt es hin, muss aber ziemlich tricksen.
Ich bin jetzt auf den SPI Typ umgestiegen. (Der braucht auch nur die 
Hälfte Strom).
http://www.mikrocontroller.net/search?query=vti&forums%5B%5D=1&forums%5B%5D=9&forums%5B%5D=10&forums%5B%5D=2&forums%5B%5D=4&forums%5B%5D=3&forums%5B%5D=6&forums%5B%5D=17&forums%5B%5D=11&forums%5B%5D=8&forums%5B%5D=12&forums%5B%5D=14&forums%5B%5D=7&forums%5B%5D=5&forums%5B%5D=15&forums%5B%5D=13&forums%5B%5D=16&max_age=-

von AxelR. (Gast)


Lesenswert?

Der AVR kann natürlich zwischen slave-ak und data-ack unterscheiden, 
aber das ACK vom Low Adress Byte wird bereits vom AVR als Data-Ack 
interpretiert.
Du schickst ja erst das Magic Word 1FF1 (oderso, habe ich jetzt nicht im 
Kopf) und bekommst ein SLVE-ACK (von allen 10Bit devices?), jetzt 
schickst Du die eigentlich Adresse, also das LowByte und bekommst vom 
angesprochenen Gerät ein ACK. Dieses Ack ist aber kein DATA-ACK, sondern 
dein eigentliches Slave-Ack.
Kann ich irgentwie nicht erklären... ;-(

von AxelR. (Gast)


Lesenswert?


von Peter D. (peda)


Lesenswert?

AxelR. wrote:
> Das Thema ist EXTREM unbeliebt.
> Der AVR kann nicht zwischen SLAVE-ACK und DATA-ACK unterscheiden.

Kann er woll, das ACK auf das 2.Byte ist für den Controller immer ein 
DATA-ACK.
Wenn Du es anders interpretierst, ist das Dein Bier.

Daraus ergibt sich, daß das R/W-Bit immer auf Write stehen muß, sonst 
könnte man das 2.Byte (Data) ja nicht senden.

Um nun trotzdem zu lesen, muß man nochmal Repeat-Start, Adreßbyte+Read 
schicken.
D.h. der 10Bit-Adressen IC muß sich merken, daß er schon adressiert 
wurde und sich nach dem Repeat-Start nur mit dem 7Bit-Adreßbyte+Read 
zufrieden geben.

Wer mal mit I2C-EEPROMs gearbeitet hat, sollte das ja schon kennen. Die 
haben sogar 7+8+8=23 Bit Adressen (24C512).


Peter

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.