mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Blutrausch wegen i2c


Autor: Metaller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Metaller (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Habe den Anhang vergessen ;)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Metaller (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Jan B (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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/do...
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.

Autor: SiO2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in og. Quelle stehts so drinn...

Der Aufruf in der init
     // set i2c bit rate to 100KHz
     i2cSetBitrate(100);
und die Funktion dazu
 void i2cSetBitrate(u16 bitrateKHz)
 {
     u08 bitrate_div;
     // set i2c bitrate
     // SCL freq = F_CPU/(16+2*TWBR))
     #ifdef TWPS0
         // for processors with additional bitrate division (mega128)
         // SCL freq = F_CPU/(16+2*TWBR*4^TWPS)
         // set TWPS to zero
         cbi(TWSR, TWPS0);
         cbi(TWSR, TWPS1);
     #endif
     // calculate bitrate division   
     bitrate_div = ((F_CPU/1000l)/bitrateKHz);
     if(bitrate_div >= 16)
         bitrate_div = (bitrate_div-16)/2;
     outb(TWBR, bitrate_div);
 }
 

Autor: Metaller (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Metaller (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Den Quellcode findet Ihr im Anhang. Und Debugger schreibt man mit zwei g 
;)

Autor: Lothar Sammel (magic33)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Der heutige Tag (Tag Nr.3) war von Erfolg gekrönt :)

Fleiß führt so gut wie immer ins Ziel.

Autor: pacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
  ldi r16, 0x30
  mov ASCII_1, r16

  ldi r16, 0x37
  mov ASCII_2, r16

;Status Byte aufbereiten
  push Status      ;Status Byte sichern
  push r16      ;Hilfsregister sichern
  mov r16, Status    ;Status Byte nach R16 kopieren
  andi Status, 0xf0  ;unteres Nibble löschen
  swap Status      ;Nibbles tauschen
  andi r16, 0x0f    ;oberes Nibble vom Hilfsregister löschen 
;HEX zu ASCII Umwandlung
  cpi Status, 10
  brge plus1_30
  add Status, ASCII_1
  rcall ausgabe_1
  rjmp Stelle_2
plus1_30:
  add Status, ASCII_2
  rcall ausgabe_1
Stelle_2:
  cpi r16, 10
  brge plus2_30
  add r16, ASCII_1
  rjmp ausgabe_2
plus2_30:
  add r16, ASCII_2
  rjmp ausgabe_2
ausgabe_1:
  mov r18, Status
  rcall sendbyte
  ret
ausgabe_2:
  mov r18, r16
  rcall sendbyte
  rcall zeilenumbruch  
  pop r16        ;Hilfsregister zurückholen
  pop Status      ;Status Byte zurückholen

Autor: pacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann ich leider nicht mehr ändern, deshalb Tschuligung für die falschen 
Tags :-(

Autor: ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: pacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ähm, ich finde dort nicht die Antwort auf meine Frage?!
Ein kleiner Hinweis wäre nicht schlecht gewesen...

Autor: D. S. (jasmin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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

Autor: pacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.