Forum: Mikrocontroller und Digitale Elektronik AVR-TWI-ASM EEPROM Ansteuerung


von Gerald (Gast)


Lesenswert?

Hallo,

Ich such mich inzwischen tot nach einem einfachen ASM-Beispiel zur 
Ansteuerung externer EEPROMS a la 24C512 via I2C und unter Nutzung des 
AVR-TWI Moduls... In den Application Notes finden sich zwar Beispiele 
für I2C Master und I2C Slave, aber soweit ich weiß ist da was 
Kombiniertes erforderlich, oder? Vielleicht hat hier mal jemand einen 
Tip oder Link, aber bitteschön nur in Assembler. Danke. Gerald

von ecslowhand (Gast)


Lesenswert?

Nix Kombiniertes !

Der AVR läuft als Master, das EEPROM als Slave.
Dazu gibts aber reichlich Code, auch in ASM.

Welcher Prozessor ?

LG EC

von Gerald (Gast)


Lesenswert?

@EC Sicher? Hab da mal was anderes gelesen. Der Controller wäre ein 
Mega128, da hängt das I2C Maximum von 4 Stück 24C512 dran. Gruß Gerald

von ecslowhand (Gast)


Lesenswert?

JA, sicher !

Wegen der Sourcen: Im Datasheet vom Mega128 stehen doch ASM-Sourcen 
drin.

Der Mega128 läuft als Master Transmitter/Receiver, die Eeproms IMMER als 
Slave.

Die Grundlagen von I2C sind ebenfalls in den Datasheets (Mega128 u. 
AT24C512) ausreichend beschrieben.

Musste "nur" noch Deinen Code schreiben.....

Lg EC

von Gerald (Gast)


Lesenswert?

Na prima. Werd's mal versuchen. Danke für den Hinweis.
Gruß Gerald

von Bastler (Gast)


Angehängte Dateien:

Lesenswert?

Ein Slave, z.B. EEPROM macht von sich aus gar nichts, da übernimmt der 
Master.

Der Anhang müsste helfen.

Wichtig: Bauteilspezifische Adresse senden (hab ich selbst erst 
vergessen).
z.B: Bei einem 24C64 ==> 0xA0

Bei manchen Bauteilen wie LM75 sollte man eine Wartezeit beim zyklischen 
Abfragen einbauen, kann sich sonst aufhängen. Oder man vergisst beide 
Bytes einzulesen.


Schreibbeispiel auf EEPROM:

rcall i2c_start

ldi r17, 0xA0       ;Bausteinadresse + write
rcall i2c_write

ldi r17, 0x00       ; Wordadresse im Baustein
rcall i2c_write

ldi r17, 0x11       ; Daten
rcall i2c_write

rcall i2c_stop

von Gerald (Gast)


Lesenswert?

@Bastler Danke für das Beispiel, es scheint ja einfacher als ich dachte. 
Werds mir nur auf Interrupt umstricken, damit der Programmablauf durch 
die Warteschleifen insbesondere in i2cstart und beim wahlfreiem 
Schreiben nicht unnötig unterbrochen wird !? Gruß Gerald.

von Florian M. (timmee-sp)


Lesenswert?

Wie sähe die Sache denn aus, wenn ich Daten empfangen möchte? In meinem 
Fall von einem Ultraschallsensor....

von Bastler (Gast)


Lesenswert?

prinzipiell ist der Ablauf immer gleich.

- Bauteiladresse ändern (irgendwie logisch an einem BUS)
- letztes Bit der Adresse ändern (0 = write / 1 = read)

dann müsste es mit den obigen Beispiel klappen.
Bei manchen Sensoren / Bauteile muss man mehrere Bytes lesen und dann 
verrechnen.

von Florian M. (timmee-sp)


Lesenswert?

Hallo liebe Leute...

ich hab nun mal ein Paar Tage das I-Net umgekrämpelt, bin aber bei 
meinem Problem leider noch nicht wesentlich weiter gekommen. Das größte 
Problem ist, dass ich Assembler 8051-kompatibel verwende und mir die 
vielen Beispiele nur begrenzt geholfen haben. Ich hab mich mal so ein 
Bisschen am, vom Bastler geposteten, Beispiel aufgehängt, da das recht 
überschaubar und (wenn bisher auch nur teilweise für mich) 
nachvollziehbar ist. Nur kann ich mit den meisten Befehlen nicht viel 
anfangen.

Ich hab herausgefunden, das ich  "ldi" durch eine "mov" ersetzen muss. 
Weiterhin kann ich keinen "rjmp" verwenden, sondern "ljmp" oder "sjmp".

Unklarheiten gibts noch bei "in" und "out". Durch welche befehle müsste 
ich diese ersetzen?

Bedeutet "ret" ind meinem Fall "reti" ?

Was genau passiert hier:
ldi    R16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)

... Ich lade etwas in Register 16, das ist klar... Werden diese 3 
Befehle geladen? Wenn ja gleichzeitig oder nacheinander? Gibts ne andere 
Schreibweise für diese Zeile? Mein Kompiler zieht es vor sich ohne 
Fehlermeldung zu schließen, wenn ich diese Zeile eingebe ...  :-(

von Peter D. (peda)


Lesenswert?

@Florian,

was denn nun, AVR oder 8051 (und welcher konkret)?

Dann schau Dir im Datenblatt die dazugehörende Befehlsreferenz an.

Bloßes Rumraten, welcher AVR-Befehl wohl welchem 8051-Befehl entsprechen 
könnte, bringt Dich genau Null,Nix weiter.

Welcher Assembler, Compiler?


Peter


P.S.:
Es ist äußerst unklug, sich an uralte Threads anzuklemmen, nur weil sie 
entfernt ähnlich klingen.
Nur wenn es wirklich exakt dasselbe Thema ist und noch Fragen zum 
Ursprungspost unklar sind, dann vielleicht.
8051-Fragen in nem AVR-Post sind aber definitiv nicht dasselbe.

Neue Frage -> neuer Thread, so einfach ist das.
Und ein aussagekräftiger Titel ist schonmal die halbe Antwort!

von Florian M. (timmee-sp)


Lesenswert?

Hi,

sorry, bin es aus einem anderen Forum gewöhnt in threads weiter zu 
schreiben, weil man dort gehalten wird, möglichst in bestehenden Themen 
weiter zu schreiben.

Ich habe einen AT89C5131. Als Compiler verwenden wir RIDE (Beides 
vorgaben aus dem Unterricht)

von Peter D. (peda)


Lesenswert?

Florian Meier schrieb:
> sorry, bin es aus einem anderen Forum gewöhnt in threads weiter zu
> schreiben, weil man dort gehalten wird, möglichst in bestehenden Themen
> weiter zu schreiben.

Glaub ich Dir nicht, daß es in anderen Foren gerne gesehen wird, im 
Thread Off-Topic zu werden.

Und Threads >6Monate gelten entweder als gelöst oder veraltet.
Die Menschen, die Compiler und die ICs entwickeln sich ja weiter.


> Ich habe einen AT89C5131. Als Compiler verwenden wir RIDE (Beides
> vorgaben aus dem Unterricht)

Was benutzt der Ride für nen Assembler?
Ich kenne nur den Keil und Metalink.

Der Metalink hat die Eigenschaft, mal zu terminieren. Da hilft dann nur, 
die Source zu kürzen, bis er nicht mehr terminiert. Dann weiß man, daß 
in dem gelöschten Teil ein Fehler liegt. Muß man wohl damit leben, da 
der Metalink ja Freeware ist. Er wird ja auch schon viele Jahre nicht 
mehr gepflegt.

Und mach mal endlich nen Thread auf, der zu Deiner Frage paßt.


Peter

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.