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?
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
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ö
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.