Forum: Mikrocontroller und Digitale Elektronik Blutrausch wegen i2c


von Metaller (Gast)


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

von Metaller (Gast)


Angehängte Dateien:

Lesenswert?

Habe den Anhang vergessen ;)

von Peter D. (peda)


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

von Metaller (Gast)


Angehängte Dateien:

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.

von Jan B (Gast)


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

von OliverSo (Gast)


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

von Markus (Gast)


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

von Axel R. (Gast)


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/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.

von SiO2 (Gast)


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.

von Axel R. (Gast)


Lesenswert?

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
 }

von Metaller (Gast)


Angehängte Dateien:

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.

von Metaller (Gast)


Angehängte Dateien:

Lesenswert?

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

von Lothar S. (magic33)


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

von Unbekannter (Gast)


Lesenswert?

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

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

von pacer (Gast)


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.
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

von pacer (Gast)


Lesenswert?

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

von ??? (Gast)


Lesenswert?


von pacer (Gast)


Lesenswert?

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

von D. S. (jasmin)


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

von pacer (Gast)


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

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.