www.mikrocontroller.net

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


Autor: Gerald (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ecslowhand (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gerald (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ecslowhand (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gerald (Gast)
Datum:

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

Autor: Bastler (Gast)
Datum:
Angehängte Dateien:
  • TWI.txt (1,66 KB, 1023 Downloads)

Bewertung
0 lesenswert
nicht 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

Autor: Gerald (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Florian M. (timmee-sp)
Datum:

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

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Florian M. (timmee-sp)
Datum:

Bewertung
0 lesenswert
nicht 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 ...  :-(

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Florian M. (timmee-sp)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.