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.
in og. Quelle stehts so drinn... Der Aufruf in der init
1 | // set i2c bit rate to 100KHz
|
2 | i2cSetBitrate(100); |
und die Funktion dazu
1 | void i2cSetBitrate(u16 bitrateKHz) |
2 | {
|
3 | u08 bitrate_div; |
4 | // set i2c bitrate
|
5 | // SCL freq = F_CPU/(16+2*TWBR))
|
6 | #ifdef TWPS0
|
7 | // for processors with additional bitrate division (mega128)
|
8 | // SCL freq = F_CPU/(16+2*TWBR*4^TWPS)
|
9 | // set TWPS to zero
|
10 | cbi(TWSR, TWPS0); |
11 | cbi(TWSR, TWPS1); |
12 | #endif
|
13 | // calculate bitrate division
|
14 | bitrate_div = ((F_CPU/1000l)/bitrateKHz); |
15 | if(bitrate_div >= 16) |
16 | bitrate_div = (bitrate_div-16)/2; |
17 | outb(TWBR, bitrate_div); |
18 | }
|
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.
Den Quellcode findet Ihr im Anhang. Und Debugger schreibt man mit zwei g ;)
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
> Der heutige Tag (Tag Nr.3) war von Erfolg gekrönt :)
Fleiß führt so gut wie immer ins Ziel.
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.
1 | ldi r16, 0x30 |
2 | mov ASCII_1, r16 |
3 | |
4 | ldi r16, 0x37 |
5 | mov ASCII_2, r16 |
6 | |
7 | ;Status Byte aufbereiten |
8 | push Status ;Status Byte sichern |
9 | push r16 ;Hilfsregister sichern |
10 | mov r16, Status ;Status Byte nach R16 kopieren |
11 | andi Status, 0xf0 ;unteres Nibble löschen |
12 | swap Status ;Nibbles tauschen |
13 | andi r16, 0x0f ;oberes Nibble vom Hilfsregister löschen |
14 | ;HEX zu ASCII Umwandlung |
15 | cpi Status, 10 |
16 | brge plus1_30 |
17 | add Status, ASCII_1 |
18 | rcall ausgabe_1 |
19 | rjmp Stelle_2 |
20 | plus1_30: |
21 | add Status, ASCII_2 |
22 | rcall ausgabe_1 |
23 | Stelle_2: |
24 | cpi r16, 10 |
25 | brge plus2_30 |
26 | add r16, ASCII_1 |
27 | rjmp ausgabe_2 |
28 | plus2_30: |
29 | add r16, ASCII_2 |
30 | rjmp ausgabe_2 |
31 | ausgabe_1: |
32 | mov r18, Status |
33 | rcall sendbyte |
34 | ret
|
35 | ausgabe_2: |
36 | mov r18, r16 |
37 | rcall sendbyte |
38 | rcall zeilenumbruch |
39 | pop r16 ;Hilfsregister zurückholen |
40 | pop Status ;Status Byte zurückholen |
kann ich leider nicht mehr ändern, deshalb Tschuligung für die falschen Tags :-(
ähm, ich finde dort nicht die Antwort auf meine Frage?! Ein kleiner Hinweis wäre nicht schlecht gewesen...
@ 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
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.