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
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
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
@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.
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.
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 ... :-(
@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!
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)
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