Forum: Mikrocontroller und Digitale Elektronik externes EEPROM


von Greiner (Gast)


Lesenswert?

Hallo,
Ich würde gerne ein externes EEPROM an einen Controller (ATMega 168) 
anschließen. Jetzt habe ich natürlich die Qual der Wahl was ich genau 
nehme. I2C SPI oder Microwire.
Ich habe bis jetzt noch nichts externes an einen Controller angebunden. 
Welches der üblichen Protokolle wäre denn am einfachsten zu 
implementieren? Vorteile/Nachteile?

Vielen Dank für eure Hilfe

Greiner

von Sam .. (sam1994)


Lesenswert?

SPI ist das einfachere Protokoll. Für EEproms ist aber I2C das 
gebräuchlichere. Für beides gibt es wahrscheinlich Codebeispiele im 
Netz.

von TimH (Gast)


Lesenswert?

such immer noch einen kompakten ASM Beispielcode für AVR via TWI-Int. 
Einfach nix zu finden im Netz :-(

von Sam .. (sam1994)


Lesenswert?


von Greiner (Gast)


Lesenswert?

So, meine Teile sind jetzt gekommen und ich hab schon ein wenig 
rumgebastelt. Wenig erfolgreich....
Ich hab jetzt alles wieder auseinander gerissen und fange systematisch 
von vorne an :)
Ich hab dieses EEPROM: 
http://www.produktinfo.conrad.com/datenblaetter/150000-174999/150260-da-01-en-EEPROM_25LC040_I_P.pdf

und diesen Controller: 
http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf

Erstmal richtig anschließen:

Pins am EEPROM werden verbunden mit:

CS --> GND  hab nur das eine EEPROM deshalb lass ich es die ganze Zeit 
aktiv.
SO --> MISO
WP --> VCC brauch ich nicht
VSS --> GND
SI --> MOSI
SCK --> SCK
HOLD --> VCC brauch ich auch nicht
VCC --> VCC

soweit alles richtig?

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Der CS muss an den Controller angeschlossen sein, darüber werden die 
Bytegrenzen synchronisiert. Auch wenn es nur einen Slave gibt, muss CS 
angesteuert werden.

Ansonsten ist es richtig angeschlossen.

Grüße,

Peter

von PETROV (Gast)


Lesenswert?

Warum machst Du Dir das Leben so schwer.

Mit 24LCxxx I2C-Eproms ist die Sache sehr einfach.

Schreiben:
Deviceadresse senden
Eprom High Adresse senden
Eprom Low Adresse senden
Datenbytes senden

Lesen:
Deviceadresse senden
Eprom High Adresse senden
Eprom Low Adresse senden
Datenbytes Empfangen

Gruß Peter

von TimH (Gast)


Lesenswert?

@Peter
Der von Samuel K. angegebene Beitrag zeigt doch, wie "sehr einfach" die 
Sache ist. Immerhin ein ASM-Code, aber "Das komplette TWI arbeitet im 
Polling Mode, also nicht Interrupt basiert." - das scheint mir nun 
leider noch nicht die effizienteste Methode zu sein. Kennt jemand noch 
eine Quelle die den TWI-Int verwendet und in einer modularen Form 
daherkommt die sich bequem in eigene ASM-Programme einpassen lässt? Ich 
benötige eine Ansteuerung für ein 24LC512...

Gruß Tim

von Greiner (Gast)


Lesenswert?

So ich habe weiter gebastelt, nur leider funktionier es nicht. Hardware 
mäßig müsste alles stimmen, deshalb werd ich mal den code Posten.
1
SPIINIT:
2
        ldi r16,(1<<DDB3)|(1<<DDB5)|(1<<DDB2)
3
        out DDRB,r16
4
        ldi r16, (1<<DDB2)
5
        out PORTB,r16
6
        ldi r16,(1<<SPE)|(1<<MSTR)
7
        out SPCR,r16
8
        ret
9
10
11
WRITEEEPROM:  
12
        ldi r16, 0
13
        out PORTB, r16
14
        ldi r16, 0b00000110
15
        out SPDR, r16
16
      wait:
17
        in r16, SPSR
18
        sbrs r16, SPIF
19
        rjmp wait
20
        ldi r16, (1<<DDB2)
21
        out PORTB, r16
22
        ldi r16, 0
23
        out PORTB, r16
24
        ldi r16, 0b00000010
25
        out SPDR, r16
26
      wait1:
27
        in r16, SPSR
28
        sbrs r16, SPIF
29
        rjmp wait1
30
        out SPDR, r17
31
      wait2:
32
        in r16, SPSR
33
        sbrs r16, SPIF
34
        rjmp wait2
35
        out SPDR, r18
36
      wait3:
37
        in r16, SPSR
38
        sbrs r16, SPIF
39
        rjmp wait3
40
        ret
41
42
READEEPROM:  ldi r16, 0
43
        out PORTB, r16
44
        ldi r16, 0b00000011
45
        out SPDR,r16
46
      wait8:
47
        in r16, SPSR
48
        sbrs r16, SPIF
49
        rjmp wait8
50
        out SPDR, r17
51
      wait9:
52
        in r16, SPSR
53
        sbrs r16, SPIF
54
        rjmp wait9
55
        out SPDR, r17
56
      wait10:
57
        in r16, SPSR
58
        sbrs r16, SPIF
59
        rjmp wait10
60
        rcall DELAY
61
        ret

SPIINIT initalisert den SPI Modus als Master.
WRITEERPOM schreibt den in r18 respeicherten Wert an die Adresse die in 
r17 angegeben ist.
READEEPROM lädt den aus dem eeprom an der Adresse in r17 gespeicherten 
Wert in r16.
Die ganzen Funktionen können erstmal nur auf die vordere Hälfte des 
eeprom zugreifen, da das achte Adressbit überall Null ist. Zum 
ausprobieren dürfte das aber egal sein.
Wenn ich nun z.b. den Wert 0x41 ins eeprom schreibe, dann lese und ihn 
mir dann auf meinem LCD ausgeben lasse erscheint nur ein schwarzer 
Kasten anstell eines A. (das LCD funktioniert sonst einwandfrei, daran 
liegt es nicht)

vielen Dank für eure Hilfe
Freiner

von Niemand (Gast)


Lesenswert?

Hi,
hab ich's übersehen oder liest Du nicht das SPI Datenregister in 
READEEPROM?
Es sollte doch ein "in r16, SPDR" dort stehen, oder ?

von Greiner (Gast)


Lesenswert?

Ja, das ist richtig. Hab wohl beim kopieren Mist gemacht. Das "in r16, 
SPDR" steht jetzt ganz am Ende von READEEPROM, natürlich vor dem ret ;)
Trotzdem bleibt das Problem erhalten, angezeigt wird nur ein schwarzer 
kasten und kein "A".

von Greiner (Gast)


Lesenswert?

Noch eine kleine Frage. Kann ich denn durch eine anfänglich Fehlerhafte 
Beschaltung das eeprom verbraten haben?

von Greiner (Gast)


Lesenswert?

So, nächster Fehler gefunden: In SPIINIT wird "out PORTB, r16" ersetzt 
durch "out DDRB, r16"
Funktionier trotzdem nicht.

von Niemand (Gast)


Lesenswert?

Ne, war schon richtig so. Du setzt ja CS standarmäßig auf high!

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.