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
SPI ist das einfachere Protokoll. Für EEproms ist aber I2C das gebräuchlichere. Für beides gibt es wahrscheinlich Codebeispiele im Netz.
such immer noch einen kompakten ASM Beispielcode für AVR via TWI-Int. Einfach nix zu finden im Netz :-(
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?
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
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
@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
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
Hi, hab ich's übersehen oder liest Du nicht das SPI Datenregister in READEEPROM? Es sollte doch ein "in r16, SPDR" dort stehen, oder ?
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".
Noch eine kleine Frage. Kann ich denn durch eine anfänglich Fehlerhafte Beschaltung das eeprom verbraten haben?
So, nächster Fehler gefunden: In SPIINIT wird "out PORTB, r16" ersetzt durch "out DDRB, r16" Funktionier trotzdem nicht.
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.