Forum: Mikrocontroller und Digitale Elektronik Hardware TWI "hängt"


von Sirko Pöhlmann (Gast)


Lesenswert?

Hallo!
Ich benutze (oder will es) den Hardware TWI am Atmega32 und möchte mich
mit einem EEPROM BR24C64 unterhalten. Dazu hab ich hier auch Code
gefunden
(http://www.mikrocontroller.net/attachment.php/93965/Unbenannt.txt) ,
was sehr gehofen hat. Nach Einbindung des Codes in mein Programm ist es
so das der MC den Code auch abarbeitet ( Start,Stop,Write Routinen) in
der READ Routine aber "stehenbleibt", und zwar genau an dem Punkt wo
ich die Daten abfordere
  ldi  r16,0x00
  rcall  H_TWI_DATA

Die WRITE Routine mit Start und Stop und allem läuft er wie gesagt ohne
Probleme durch, auch wenn ich natürlich nicht weiß ob er erfogreich
ist.

Das Festfahren ist nicht "absolut", der Tastaturinterrupt der
Folientastatur des Hauptprogramms befreit mich wieder, ich vermute also
eher das der MC endlos auf irgendwas wartet oder so.

Ich vermute das es mit dem NO ACKNOLEDGE zusammenhängen könnte,
selbiges tritt nur an dieser Stelle auf.
Unsicher bin ich mir auch hinsichtlich des Setzen von: TWSR und TWBR.
Ich arbeite mit 4MHZ und habe abweichend von bluemoles Code TWSR=0x01
und TWBR=0x0B.

Wer kann mir etwas weiterhelfen?

von Uwe (Gast)


Lesenswert?

Da ich nur noch in C progge will ich mich jetzt nicht durch den source
durchkämpfen. Lies doch einfach bei jedem TWI Interrupt das
Statusregister aus und lass es z.B. auf 8 Leds anzeigen.
So siehst Du genau was der TWI gerade macht.
Die "Werte" des Statusregisters bzw. Bedeutung findest Du im
Datenblatt des Mega32.


MfG   Uwe

von Poe (Gast)


Lesenswert?

Hallo!

hm. Den Interrupt hab ich derzeit gar nicht in Gebrauch. Ich bin
Portmäßig auch schon ganz schön belegt wegen noh zusätzlicher LEDS. Mal
sehen ob ich da was hinbekomme.. trotzdem Danke :-)!

Ich hab gerade festgestellt das die Busfrequent vermutlich auch im
argen liegt. Die sollte doch so bei 100khz bis 400khz liegen, oder kann
die auch deutlich langsamer sein? Mit den günstigsten Parametern (
TWBR=10) und TWPS=1) schaffe ich gerade 27,7khz.



byPö

von thkais (Gast)


Lesenswert?

Der TWI (oder I²C) nutzt eine synchrone Übertragung - wenn es sein muß,
kannst Du da mit 1/10 Hz arbeiten. Das mache ich beispielsweise, wenn
ich auf Fehlersuche bin - an SDA und SCL eine LED und den Takt so weit
herunterfahren, daß man die Übertragung sehen kann. Man sollte den Bus
von der Frequenz her so weit herunterfahren, wie es geht, dadurch wird
er weniger störanfällig und man kann größere Leitungslängen
realisieren. Ich arbeite teilweise nur mit 1 kHz.
Hast Du Dir denn schon mal die Theorie des I²C verinnerlicht? Beim
Lesen muß der Master zum Schluß ein Acknowledge-Bit senden, evtl.
liegts daran. Wenn die Schreib-Routine funktioniert, sollte man andere
Fehler ausschließen können.

von Uwe (Gast)


Lesenswert?

dieses Acknowledge Bit das thkais meint, muß im TWI Control Register –
TWCR Bitnr. 6 gesetzt werden

Den Interrupt mußt du auch nicht nutzen, nur wenn er auftritt den
Status auf ne 8 bit Anzzeige (Leds) und aus der IR-Routine wieder
rausspringen.

Bei langsamen Busgeschwindigkeiten kann man dann schön den ganzen
Busverkehr beobachten.

MfG  Uwe

von Sirko Pöhlmann (Gast)


Lesenswert?

ok, danke, ich sehe mal was ich machen kann. Derzeit bin ich soweit das
ich ihn mit 100khz betreibe und die Write/Readroutinen ohne hänger
durchlaufen. Nur leider steht zum Schluß nix im TWDR Ergebnisregister.

Das Ackn. Bit kommt im Vorlagencode gar nicht vor, und auch bei einem
anderen Codebeispiel zum TWI wird es nicht verwendet ?? Ich dachte das
wird nur vom System gehändelt. Soll das heißen ich müßte noch irgendwo
mit sbi TWCR,TWEA oder so hantieren?

meine Lesehauptroutine sieht so aus:
rcall  H_TWI_START    ;Start

ldi  r16,EEPROM+TWIwr  ; IC Adressieren und schreiben
rcall  H_TWI_DATA

ldi  r16,0x00    ;Pointer auf Speicherplatz setzen
rcall  H_TWI_DATA    ;Befehle/Daten auf Bus legen
ldi  r16,0x00    ;Pointer auf Speicherplatz setzen
rcall  H_TWI_DATA    ;Befehle/Daten auf Bus legen

rcall  H_TWI_SSTART    ;Neues Start zeichen

ldi  r16,EEPROM+TWIrd  ; IC Adressieren und schreiben
rcall  H_TWI_DATA

ldi  r16,0x00
rcall  H_TWI_DATA    ;Leeres Datenpaket schicken

rcall  H_TWI_STOP

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.