Hi @all,
ich habe jetzt schon so einiges gelesen was I2C (TWI) betrifft, komme
allerdings nicht wirklich weiter. Ich möchte gerne einen EEPROM 24C512
per Software I2C an meinen ATMega8 hängen programmieren tue ich in ASM,
habe jetzt einfach mal folgende fragen:
1. teilweise habe ich gelesen, das es nur über externen PullUp
geht, teilweise hab ich auch schon gelesen direkt an die Ports
zu hängen... welches Stimmt jetzt oder Geht beides ?
2. Wie muss ich jetzt den EEPROM Ansprechen ? A0-A3 ist auf GND ?
4. Wie spreche ich dann Die Adressen im EEPROM zum lesen an ?
5. Wie spreche ich die Adressen über 255 Byte an ist ja dann schon 16
bitig oder ??
6. Und zu guter letzt was muss ich machen um etwas zu schreiben.
Hauptsächlich geht es mir um den Abflauf, den Code bekomm ich dann
schon irgendwie gebacken.
Hoffe das ich Die fragen jetzt nicht allzudoof gestellt habe, und
bedanke mich ;)
Gruß Dennis
Hi Jochen,
danke erstmal für Deine Antwort, so habe mir jetzt meine Adapter
Platine fertig gemacht für mein EEPROM (Habe mir so ein kleines
Testboard Set gebastelt) Habe als Pull-Up jetzt von der Datenleitung zu
VCC einen 4k7 genommen ist das Ok, oder ist der zu Hoch ?
Wenn ich das mit dem 24C32 (oder 64 oder 256 etc...) richtig verstanden
habe, muss ich einmal I2C_Start dann 8 Bit senden die z.b. in Form von
0b10100001 (0xA1) ist zum lesen, dann in den Empfangsmodus gehen und 9
Bit empfangen (1. Bit ein ACK), richtig ?
Gruß Dennis
Hi Hagen,
ja die Pull-Up wieder stände habe ich so gesetzt.
Wie ich am Anfang schon geschrieben hatte muss ich leider SoftwareSPI
nutzen, da ich bereits kaum noch Port´s frei habe.
Was C betrifft, komme ich wesentlich weniger mit klar wie mit ASM :(
kommt aber bestimmt als nächstes, eine runde C lernen ;)
Gruß Dennis
Hallo nochmal Dennis,
Also ich denke Du wirst im Netzt auch Sourcen für ein SW I2C in ASM
finde.
Was die Ansteuerung angeht gibt es mehrere Möglichkeiten zum lesen und
schreiben. Wenn Du dazu konkret fragen oder Problem hast kannse es ja
noch mal hier posten oder mich anmailen.
Grüßle, der Jochen
Hi @all nochmal,
so die nacht war super lang, und ich bin immer noch nicht
weitergekommen :(
Ich habe jetzt einfach mal den EEPROM 24c32 mit 0x09 gefüllt um dieses
dann einfach mal auszulesen und dann auf PortD auszugeben,
bekomme aber irgendwie immer nur 0xFF zurück :(
Ich habe mal im Anhang meine Test ASM Datei gepostet, vieleicht mache
ich ja auch was Grundlegendes Falsch.
Bitte um Hilfe.
P.S: Der EEPROM ist jetzt so angeschlossen, SDA (Pin5) an PC1 über
einen PullUp von 4k7, das gleiche für SCL (Pin6) an PC0
Gruß Dennis
So wie ich das jetzt auf die Schnelle sehe schreibst und ließt Du
gleichzeitig in einem I2C-Zyklus also zwischen i2c_start und i2c_stop.
Das geht nicht. Du mußt das jeweils einzeln machen. So wie ich das sehe
versuchst Du vom Chip mit der Adresse A0h + 1 für lesen ab der
Speicherstelle 0001h zu lesen, was hat da dann das 3 putchar zu
suchen.
Ist das ein SW TWI? Bin net so der Assembler Crack.
Wenn Du da nicht weiterkommst können wir vielleicht nacher mal per ICQ
oder so schwätzen muss jetzt mal einkaufen nacher hab ich aber Zeit.
Kannst Dich ja sonst mal per eMail melden.
Grüßle der Jochen
Hi Jochen,
danke Dir. Ich blicke in dem Datenblatt leider nicht wirklich durch,
so wie ich das verstanden habe muss ich die Speicheradresse in 2
schritten übergeben also MSB dann LSB sonst wird es ab 255byte
schlecht... oder habe ich da was falsch verstanden...
ICQ ist schlecht bei mir, gehe immer schnell per handy online.
Kann dich höchstens anrufen wenn du möchtest oder umgekehrt.
Gruß Dennis
Okay, versuche mal dir klar zu machen wie ich denke das es gehen müsste
(allerdings ohne Garantie da ich mich mit ASM net so auskenne)
Daten aus bestimmter Stelle des EEProm lesen wie folgt:
rcall i2c_start
ldi r16, 0b10100000
rcall pause
rcall pause
rcall putbyte
-> Hier wird der Baustein mit der Adr. A0h im Schreibe-Modus
angesprochen da die Adresse des zu lesenden Bytes an den Baustein
übergeben werden muss also schreiben:
ldi r16, 0b00000000
rcall putbyte
ldi r16, 0b00000001
rcall putbyte
->hier werden die zwei Adressbytes geschrieben
rcall i2c_start
ldi r16, 0b10100001
rcall putbyte
-> hier kommt nun eine Repeated-Startbedinung hin siehe dazu Datenblatt
Seite 12 [Random Read]. Da muss dan jetzt auch die 1 rein fürs lesen.
rcall getbyte
rcall i2c_stop
-> So nun müsste das gelesene Byte im r16 stehen
Daten an bestimmter Stelle im EEProm schreiben wie folgt:
rcall i2c_start
ldi r16, 0b10100001
rcall putbyte
-> Adresse + Schreibmodus an EEPROM
ldi r16, 0b00000000
rcall putbyte
ldi r16, 0b00000000
rcall putbyte
-> Adresse an die geschrieben werden soll 00h
ldi r16, 0b0101010101
rcall putbyte
-> den Wert 55h schreiben
rcall i2c_stop
siehe dazu auch Datenblatt S. 11 Figure 2 Byte Write
So, damit sollte es eigentlich funtionieren. Was ich Dir nicht sagen
kann ist ob deine ASM Routinen für das I2C okay sind. Meiner Ansicht
nach sollte das ein SW-I2C sein, wenn ja Frag ich mich aber wo z.B. Die
Pins für den I2C deffinieert werden - oder sind das Pin 0 & 1 vom
PortC?.
Naja, vielleicht hilft das erst mal.
Grüßle der Jochen
Oh mist, da ist ein Fehler beim Schreiben in EEPROM muss natürlich wie
folgt aussehen:
rcall i2c_start
ldi r16, 0b10100000
^da muss ne Null hin, wir wollwn ja was schreiben
rcall putbyte
ldi r16, 0b00000000
rcall putbyte
ldi r16, 0b00000000
rcall putbyte
ldi r16, 0b0101010101
rcall putbyte
rcall i2c_stop
Hi Jochen,
SUPER!!! ;) Ich danke Dir für Deine Hilfe habe erst einfach mal Byte´s
geschrieben, um zu schauen ob überhaupt erstmal das Timing hinhaut.
Dann mit PC ausgelesen supi, geht ;) jetzt habe ich folgenden Code:
rcall i2c_start
ldi r16, 0b10100000
rcall putbyte
ldi r16, 0b00000000
rcall putbyte
ldi r16, 0b00000001
rcall putbyte
rcall i2c_start
ldi r16, 0b10100001
rcall putbyte
rcall getbyte
rcall i2c_stop
und auch dieser geht ;) Bekomme jetzt meine EEPROM Daten, ist echt
super wie jeder jedem Hilft hier ;)
Dickes Lob an Dich für dein Engagement.
Gruß Dennis
Mir wurde hier am Anfang auch sehr viel geholfen deshalb helfe ich nun
gerne auch Leuten die die selben Problem haben die ich hatte.
Schön das es nun tut.
Jochen
Zu früh gefreut :(
die routine scheint zu funktionieren, nur bekomme ich bei jedem 2. bis
3. mal Datenmüll, jetzt hab ich mal mein Oszi an die SDA leitung
gehängt und gesehen, das der EEPROM die Leitung nicht ganz auf 0 zieht.
habe jetzt als PullUP schon 1k5 und 4k7 ausprobiert, bei beiden das
gleiche.
Was könnte das sein ?
Gruß Dennis
Spontan würde ich da jetzt auf ein Timingproblem tippen. Ich weiß leider
nicht wie das da mit dem SW-I2C aussieht. Meines Wissens kann der I2C
max 400kHz. kann allso sein wenn Dein Prozessor "zu schnell" getaktet
ist Du ein paar Wartezyklen einbinden musst.
Ein anderes Problem könnte noch der EEPROM in der Form machen das der
ne gewisse Zweit braucht um Daten zu schreiben. In dieser Zeit ist
keine Kommunikation mit dem Chip möglich. Sollt aber bei Dir nicht der
Fall sein da Du so wie ich das sehe nur lesen tust.
Ich würde es erst mal mit ein paar Verzögerungen testen und wenn das
keinen Erfolg bringt darauf hoffen das Dir vielleicht jemand anderes
helfen kann.
Der Jochen
Hey Jochen ;)
also im Moment bin ich Online. Habe es im übrigen gestern Abend noch
geschaft, so wie der Fehler aussah, hat der EEPROM die Stop Condition
nicht richtig empfangen, habe mir noch mal eine andere Routine
Angeschaut, und habe gesehen das der Fehler im I2C_STOP liegt.
Jetzt haut es hin ;)
Endlich bekomm ich auf mein Grafik display ein wenig mehr wie nur
"."
Also weiter im Basteln, jetzt muss ich mal schauen, ob ich Irgendwo
Font´s finde. Ansonsten heist es selber schreiben... uff..
Gruß Dennis