www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik externes EEPROM mit AVR ansteuern


Autor: Bastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte Daten aus einem externen EEPROM (256kb) in meinen Controller 
(momentan AT90S2313) laden.
Kann ich so einen großen Speicher ansteuern? Womit ginge das einfach? 
seriell oder parallel?
Hat zufällig irgendwer schon fertigen Quelltext als Anschauungsbeispiel?




Danke


Bastian

Autor: Markus Burrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
256kByte? Das wäre dann ein AT24C1024 oä. Also ein serielles I2C EEPROM. 
Ein paralleles kannste beim 2313 schätzungsweise vergessen. Der hätte 
nichtmal genübend Ports
Ansteuerung ist nicht schwer, was solls denn für ne Sprache sein?

Autor: Bastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich programmiere in Assembler.
Momentan hab ich nur den 2313 hier, aber ich würde auch umsteigen auf 
einen größeren wenn das notwendig wird.
Mit dem I²C Bus bzw. der Ansteuerung hab ich leider noch keine 
Erfahrung. Gibts da evtl. gute Tutorials um sich einzuarbeiten?

Autor: Markus Burrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Umsteigen mußt du nur wenn dir der Speicher oder die Ports des 2313 
nicht mehr reichen.
Bei den Application Notes auf der Atmel Seite gab's mal einen Software 
I2C Master. Oder Du verwendet ne Hochsprache wie Pascal oder C. Da gibts 
häufig schon fertige Sachen

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Frage, ob serieller oder paralleler Speicher ist auch eine Frage der 
Geschwindigkeit. Obwohl I²C teilweise recht flott ist (100 kBit/sec, 
wenn spezifiziert auch 400kBit oder mehr)ist Parallel immer schneller.
Seriell hat den enormen Vorteil, daß der Schaltungsaufwand (Anzahl der 
I/Os) sehr gering ist.
Mit einem 2313 kann man auch ein 256KB EEPROM ansteuern, einfach per 
Latch (74373 oder 74573) den Bus multiplexen. Ist aber ein IC-Grab 
(mindestens 3 Latches). Auch möglich sind seriell-> parallel Konverter 
(hab ich gerade die Nummer vergessen), aber dann wirds wieder schlechter 
mit der Geschwindigkeit.

Autor: Bastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist es in Assembler kompliziert, I2C einzubinden? Ich wollte dabei 
bleiben, um möglichst Hardware nah zu schreiben. Ausserdem hab ich mich 
mit Pascal oder C noch nicht befasst.

Autor: Matthias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Bastian,

>Ist es in Assembler kompliziert, I2C einzubinden?
Absolut nicht ...

Ich habe vor einem halben Jahr mal eine kleine Library für den I²C-Bus 
und I²C-EEPROM's in Atmel-Assembler geschrieben. Sie befindet sich im 
Anhang. Sie ist auch einigermaßen dokumentiert.

>Gibts da evtl. gute Tutorials um sich einzuarbeiten?
Die gibt es wie Sand am Meer. Einfach mal googlen ...

>Ich wollte dabei bleiben, um möglichst Hardware nah zu schreiben.

Das kann ich dir auch nur raten ...

>Ausserdem hab ich mich mit Pascal oder C noch nicht befasst.
Ich habe vor einiger Zeit den GCC C Compiler getestet => meiner Meinung 
nach eine absolute Katastrophe !


Gruß Matthias

Autor: Izoard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, sind die Macros im File I2C.asm nicht falsch definiert?

Denn:

.MACRO SCL_Lo                             ;force SCL to 0V
      sbi        SCL_DDR, SCL
.ENDMACRO

(siehe Anhang von Matthias)


So wie ich das verstehe wird die SCL Leitung auf High gesetzt, wie kann
nun diese auf Lo sein?

vielen Dank für die Hilfe!

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann schon sein, ist ja nicht das Port-Register, sondern das
Direction-Register. Steht im entsprechenden Portregister ein 0, wird
der Ausgang auf 0 gesetzt, wenn der Port auf Ausgang (DDRx=1)
geschaltet wird.

Autor: Izoard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach so, der wird einmal als Eingang und einmal als Ausgang benützt! Was
hat das für ein Vorteil???

und wieso wird bei der I2C_start Routine zuerst die I2C-stop- Routine
aufgerufen? Müsste ganz am Schluss der i2c_start - Routine nicht noch
die SCL Leitung auf null gezogen werden?

i2c_start:
        rcall      i2c_stop
        rcall      i2c_delay
        SDA_Lo
        rcall      i2c_delay
        (SCL_lo)=>????
        ret


oder habe ich die I2C Schnittstelle immer noch nicht begriffen?

Autor: Izoard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, hatte das Programm nicht komplett angeschaut! SCL_Lo wird beim
Write-Modul nach GND gezogen...

Habe aber noch was anderes...

Wenn ich die Schreib-Routine durchgehe, komme ich auf 3 Delay Routinen,
von positiver SCL Flanke bis zur nächsten positiven SCL Flanke! Das
entspricht dann aber nicht einem Takt von 100kHz sondern einem von
1/(3*5us) = 66.667kHz!!! Wieso ist das so?

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.