Hallo Leute,
nachdem ich seit mehr als drei Tagen so ein popligen LM75 nicht ans
laufen bekommen habe, habe ich mir selber ein softwaremößiges I2C
Protokoll gebastelt (s. Anhang).
Alle Versuche mit dem eingebauten TWI-Anschluß des Mega8 haben nicht
gefruchtet. Selbst die beiden Programme aus diesem Forum haben auch
nicht bei mir funktioniert. Ich dachte erst, daß es an den internen
und/oder externen Pull-Up's liegen könnte und habe alle möglichen
Widerstandswerte auprobiert. Hat alles nix geholfen :( Bis ich endlich
festgestellt habe, daß der andere uC im System die Leitungen immer
runterzog. Das war der erste Tag.
Tag Nummer zwei bestand darin, sich mit dem Datenblatt herumzuschlagen.
Echt besch... beschrieben die ganze Sache was den TWI-Anschluß
anbetrifft. Trozdem habe ich es irgendwie hinbekommen einen Source zu
schreiben, welcher natürlich auch nicht funktionierte. So ging dieser
Tag auch ohne Erfolg zu Ende und ich hätte fast die ganzen Klamotten aus
dem Fenster geworfen.
Der heutige Tag (Tag Nr.3) war von Erfolg gekrönt :) Ich habe mich
nochmals in ruhe an den PC gesetzt und mir das Datenblatt vom LM75 zur
Hand genommen und das Protokoll von Hand, Schritt für Schritt, in den uC
getippt. Bis ich endlich ein Lebenszeichen von dem LM in der Form eines
ACK erhielt :) :) :) Darauf aufbauend habe ich mich dann um den Rest
gekümmert, welches dann auch funktionierte. Ich habe bewußt das Low-Byte
nicht abgefragt, da mich im Moment der Kommawert nicht interessiert.
Auch wenn ich das jetzt von Hand hinbekommen habe, möchte ich es doch
trotzdem mit dem TWI-Anschluß machen. Kann mir jemand eine gute
Erklärung, Tipp, Link, Quellcode in ASM, oder dergleichen geben?
Vielen Dank... Metaller
Das Hardware-I2C ist sehr universell und daher für nen popeligen
Single-Master reichlich oversized.
Daher ist es durchaus ne gute Idee, den Single-Master in Software zu
machen, ergibt kleineren Code, ist universeller (alle Pins möglich) und
schneller zu programmieren.
Und wenn das HW-I2C nicht gepuffert mit Interrupthandler arbeitet, ist
es auch genauso schnell.
Hier mal der Code, den ich verwende:
http://home.tiscali.de/peterd/appl/soft/c51/eeprom/index.htm
Einmal sind da die Grundfunktionen und dann Routinen für I2C-EEPROM.
Beim AVR muß man nur ändern, daß vom PINx-Register gelesen wird bzw. der
invertierte Wert auf das DDRx-Register geschrieben wird (PORTx einmalig
zu Anfang auf Low setzen).
Peter
Danke Peter für den Hinweis.
Im Anhang habe ich meinen überarbeiteten Quellcode hinterlegt, für die
von Euch die schnell mal mit I2C etwas testen wollen. Falls ich das
Hardware-TWI-Gezuppel zum laufen bringe, dann werde ich es Euch auch
noch wissen lassen. Ansonsten bin ich immer noch für jeden Vorschlag
dankbar.
Hallo,
>>Blutrausch wegen i2c
Volles Verständnis !
Bei mir war es ein DS1931 Temp.Sensor den ich mir
augekuckt hatte um mal eben(!) die Hardware TWI-Funktion
des Mega8 auszuprobieren.
Als ich es nach etlichen Stunden endlich am Laufen hatte,
war ich dem Wahnsinn nahe.
Und dabei war es nur eine einfache Single-Master mit
Slave Kommunikation in ASM.
Ich will seitdem nie wieder was mit dem I2C-Bus zu tun haben.
(wenn es sich irgendwie vermeiden lässt)
Gruß Jan
http://homepage.hispeed.ch/peterfleury/avr-software.html
Hat allerdings bei mir zunächst nicht funktionert :-) Wenn ich mich
recht erinnere, lag das wohl daran, daß das Hardware-TWI die gewünschten
100kHz I2C-Takt bei nur 1Mhz Prozessortakt nicht schafft (beim Mega32).
Datenblatt lesen (und ein externer Quarz) hat mir dann weitergeholfen.
Oliver
Hallo!
Ich hatte bis jetzt ganz gute Erfahrung mit dem mega8 HW-TWI...
Bei meinem ersten Projekt hab ich zwar ca. 2 Stunden mit dem ASM
herumgesch****en, aber dann hats endlich geklappt...
Seitdem begreif ich das ganze und hatte bislang in ASM keine Probs mehr.
Anders is es da im CPP :-(
Is aber egal, mach sowieso lieber alles im ASM.
Markus
Hi Metaller,
ich kann das sehr gut nachvollziehen!
Ich musste auch von einem Tag auf den anderen mit diesem I2C arbeiten.
Hatte auch einen Mega8 in der Mache. Vorher auch überhaupt noch nichts
gemacht.
Die Kollegen arbeiteten vor meiner Zeit mit AMD186, PIC und RTC und
erzählten mir, wie schlimm das alles sei. So von wegen Busblokaden usw.
Ich war allerdings neu in der Firma und recht motiviert.
Neue Besen kehren gut - man kennt das von anderen...
Meine Erfahrungen mitm AVR waren recht brauchbar. Hatte bisher alles in
ASM programmiert. Kurz vorab bin ich auf FASTAvr gestossen und mich
damit recht schnell angefreundet (im Gegnsatz zu BASCOM- - gehört aber
nicht hierher).
Kurzum:
I2C Interruptgesteuert funktioniert astrein!
Wie konnte ich das nun so schnell umsetzen?
Sieh Dir mal den Code hier an (alle anderen natürlich auch, die mit I2C
auf Kriegsfuß stehen)
http://hubbard.engr.scu.edu/embedded/avr/avrlib/docs/html/i2c_8c-source.html
Das habe ich dann solange durchgelesen, bis ich es verstanden hatte und
dann 1 zu 1 nach FASTAvr portiert. Geht 1A :-))
Da Du ja tatsächlich nur die SingleMaster Read&Writes brauchst, kannst
Du einen grossen Teil der Source auskommentieren.
Eigentlich ist es ja ganz einfach:
der I2C Interrupt kommt bei jedem Pup auf dem I2C. Der Grund für den
Interrupt steht dann im TWSR. dort wird beim Int als erstes nachgeshen,
was da drinn steht und in Abhängigkeit davon Bytes in den Empfangspuffer
geschrieben oder ausgegeben usw.
Ich hatte zum Testen den Inhalt vom TWSR auf einen Port gegeben und dort
anzeigen lassen. (In der Firma haben wir einen Logiganalyser). Du kannst
den Inhalt vom TWSR aber auch über die USAR ausgeben. da sieht man dann
schon mal was wann wo passiert.
irgentwo läuft bei mir zusätzlich ein Timer im Sekundentakt, der von
TWSR nachgeladen wird und beim Timeout den Bus wieder freimacht. ist
aber bisher noch nicht vorgekommen.
Viel Spass noch
Viele Grüße
AxelR.
Kann es sein, das die Formel im AVR-Datenblatt nicht korrekt ist? man
wuerde AVR als master nochnicht mal 400kHz hinbekommen.
Bei mir lief es auch erst nicht richtig, aber ich hatte nen push zuwenig
;) in meiner HW-Variante(ohne int). Den Int finde ich etwas bloed, da
man den aktuellen status was gerade gemacht wurde speichern muss (oder
nicht? mir ist jedenfalls nichts eingefallen) um zu wissen, ob der int
gerade ein ack oder startbit anzeigt bzw. daten gesendet wurden.
Ich möchte mich bei Euch allen für die Hilfe bedanken. Endlich hat das
TWI-Gezuppel geklappt :) So ein RS-Debuger ist was feines, kann ich nur
jedem empfehlen.
Vielen Dank... Metaller
PS: Im Anhang ist ein Screenshot vom terminal.
Also ich habe am Mega 8 120 der porterweiterungsplatinen hängen und
betreibe die alle via software I2C und nicht am internen TWI sogar das
nutzen der SDA/SCL pun's habe ich mir abgewöht es geht sogar soweit das
ich den port wechsle um damit keine schwirigkeiten zu haben
die anlag enthält 1200 PCF8574 die Via PCA9544 je zu 16modulen gekoppelt
sind
http://de.geocities.com/magic33_de/4module.jpg
Hallo,
Danke an Metaller für seinen aufschlussreichen Code.
Was ich allerdings nicht verstanden habe, wieso wird beim Umwandeln in
eine Hexzahl auf das jeweilige Nibble die Zahl ASCII_2=0x37 hinzuaddiert
(bei Zahl >= 10) sollte hier nicht die Zahl 0x41 stehen?
@Peter, dein Link funktionert leider nicht mehr, die Softwarelösung
würde mich ebenfalls interessieren.
@ Axel,
ok gehört nicht hierin, aber vielleicht kannst Du mir ein paar
Hintergrundinfos zu Deinem Statement geben:
"Kurz vorab bin ich auf FASTAvr gestossen und mich
damit recht schnell angefreundet (im Gegnsatz zu BASCOM- - gehört aber
nicht hierher)."
Vielleicht kaufe ich mir einmal FastAvr.
Es sieht aber so aus, als würde da nicht mehr weiterentwickelt; schon
perfekt ?
Dietmar
will ja nicht meckern, aber wenn es nicht hierein gehört, warum machst
du nicht einen neuen Thread auf?
Alternativ hättest du mir auch schnell bei meinem Problem helfen können.
Aber so ist das einfach nur unhöflich.
Gruß, pacer