Forum: Mikrocontroller und Digitale Elektronik externes EEPROM mit AVR ansteuern


von Bastian (Gast)


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

von Markus Burrer (Gast)


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?

von Bastian (Gast)


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?

von Markus Burrer (Gast)


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

von thkais (Gast)


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.

von Bastian (Gast)


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.

von Matthias (Gast)


Angehängte Dateien:

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

von Izoard (Gast)


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!

von crazy horse (Gast)


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.

von Izoard (Gast)


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?

von Izoard (Gast)


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?

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.