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
Nix Kombiniertes ! Der AVR läuft als Master, das EEPROM als Slave. Dazu gibts aber reichlich Code, auch in ASM. Welcher Prozessor ? LG EC
@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
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
Na prima. Werd's mal versuchen. Danke für den Hinweis. Gruß Gerald
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.
Wie sähe die Sache denn aus, wenn ich Daten empfangen möchte? In meinem Fall von einem Ultraschallsensor....
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.