Hallo, ich versuche ein EEPROM 93C86 (Datenblatt im Anhang) mit einem ATMega16 auszulesen und habe mir dafür einen asm Code gebastelt (siehe Anhang). Leider stimmen Ein- und Ausgabe nie überein. Jetzt weiß ich nicht, ist das EEPROM defekt oder liegt es an meinem Code. Kann jemand helfen?
Hast Du das dumme Zerobit beachtet? "A dummy zero bit precedes the 8-bit (If ORG pin is low or A-Version devices) or 16-bit (If ORG pin is high or B-version devices) output string." MfG
> Hast Du das dumme Zerobit beachtet?
Eigentlich müßte es damit erschlagen sein:
1 | read: ;READ |
2 | ldi Flag, 0x02 |
3 | rcall opcode ;opcode 10 |
4 | rcall address ;Adresse ist vorgegeben |
5 | ldi temp, 2 |
6 | mov cnt, temp ;2 bytes je Adresse |
7 | !! rcall Takt !! |
8 | read_loop: |
9 | rcall read_byte |
d.h. ein Takt vor der eigentlichen Leseroutine
Sehe ich das richtig, dass in §address 9 Adressbits ausgegeben werden - warum nicht 10?
Mit einem PICkel waer das nich passiert. Da tuts der Code von Mikrotschip.
> warum nicht 10?
Du stellst aber schwierige Fragen! Ich habe keine Ahnung warum da 9
steht. Das habe ich natürlich sofort geändert. Leider hat sich am
Ergebnis nichts geändert. Ich bekomme immer nur 0xFFFF
Ich kann aus dem Datenblatt nicht herauslesen, dass das 'chip deselect' nach §writeall_exit zulässig ist, würde also, zumindest vorläufig, statt der Abfrage auf Ready/Busy einfach ein rcall WAIT_50ms anfügen.
> Ich bekomme immer nur 0xFFFF
Das ist typischerweise der Inhalt bei leeren EEPROMs. Kann also sein,
daß schon das Schreiben schiefgeht.
Ich muß mal schauen ob ich noch ein Fetzen Code für 93C EEPROMS habe.
Edit:
Du kannst es mal damit probieren. Das habe ich mal benutzt um diese
EEPROMS aus Motorsteuergeräten auszulesen, der Code ist nicht sonderlich
optimiert. Die Delays musst Du Dir selber bauen, die waren auch sehr
konservativ ausgelegt, da mir Geschwindigkeit bei den paar Bytes
unwichtig war.
:
Bearbeitet durch User
> Ich kann aus dem Datenblatt nicht herauslesen, dass das 'chip deselect' > nach §writeall_exit zulässig ist Sorry für die Verwirrung. Ich muß gestehen, daß ich mir dieses Datenblatt nicht so genau angesehen habe, da ich davon ausgegangen war, daß sie alle gleich sind. Mein EEPROM entspricht dem anliegenden Datenblatt und das unterscheidet sich genau in diesem Punkt. Mir ist aber auch nicht ganz klar, was passiert wenn ich §writeall nutze und dann nur 2 bytes übergebe, wie ich es gemacht habe. Entscheidend ist es aber nicht, da sich §write genau so verhält. > Du kannst es mal damit probieren Vorab schon mal danke, aber das muß ich erst verdauen.
Mach mit Ruhe. Wie gesagt das ist ein Quick'n'Dirty-Ansatz, der nichts weiter können mußte, um diese 93C56-EEPROMs zu lesen und zu beschreiben. Wenn die 256 Byte oder wieviel das waren dabei 10 Sekunden dauern, dann ist das halt so. Da gibts bestimmt viel Optimierungspotential und es kann auch sein, daß für die Adressierung der großen 93C-Typen noch ein oder zwei Adressbits hinzugefügt werden müssen. So genau habe ich das Protokoll jetzt nicht mehr im Kopf. Um die Methodik zu erkennen oder dieses Write-Enable (EWEN) sollte es aber reichen.
Hallo Ben, in der Zwischenzeit habe ich deinen Code auf meine Verhältnisse angepaßt (siehe Anlage) und siehe da, es funktioniert. Allerdings noch mit einem kleinen Schönheitsfehler. Das erste gelesene Byte ist OK, aber beim zweiten sind die 2 LSBs immer 11, egal welche Adresse ich wähle und welchen Wert ich reinschreibe. Ich habe schon alles mögliche versucht, komme aber nicht dahinter. Kannst du dir vorstellen, woran das liegt?
Noch ein Nachtrag: Wenn ich z.B. 3 Adressen 3 mal nacheinander schreibe, bekomme ich folgende Ausgaben: 10101010 10101011 ; 10010010 10010011 ; 00100100 00100111 10101010 10101000 ; 10010010 10010011 ; 00100100 00100111 10101010 10101001 ; 10010010 10010011 ; 00100100 00100111 wobei das erste Byte immer korrekt ist.
Zur Abwechslung mal eine vielleicht dumme Frage: an welcher Programmstelle wird dieses "dummy zero bit" abgehandelt? Ich finde sie nicht.
> Zur Abwechslung mal eine vielleicht dumme Frage: an welcher > Programmstelle wird dieses "dummy zero bit" abgehandelt? Ich finde sie > nicht. Wie heißt es so schön: Dumme Fragen gibt es nicht! Am Code von Ben habe ich nur das unbedingt Nötige geändert. Ich habe daher auch zum zero bit nichts eingefügt. Trotzdem wird aber anscheinend richtig gelesen?? In meinem Code, mit dem ich ebenfalls lesen kann, hatte ich ja vor der Leseroutine einen Takt eingefügt. Wie ich aber festgestellt habe, reicht das nicht. Ich habe daher wie folgt geändert:
1 | read_byte: |
2 | clr Dat_low |
3 | ldi temp, 8 |
4 | mov cnt1, temp |
5 | rcall Takt |
6 | rcall WAIT_1ms |
7 | in temp, PinA ;Zero bit |
8 | read_byte_loop: |
9 | rcall Takt |
10 | rcall WAIT_1ms |
11 | in temp, PinA |
12 | andi temp, 8 ;Wert DO Pin |
13 | lsr temp ;zum LSB verschieben |
14 | lsr temp |
15 | lsr temp |
16 | or Dat_low, temp ;Daten übernehmen |
17 | dec cnt1 |
18 | tst cnt1 |
19 | breq read_loop_exit |
20 | lsl Dat_low ;nach links verschieben für nächsten Wert |
21 | rjmp read_byte_loop |
22 | read_loop_exit: |
23 | ret |
24 | read_exit: |
25 | cbi PORTA, CS |
26 | ret |
Vorab: ich habe kein solches EEPROM, kann mich folglich nur auf das stützen, was Sie liefern, also die beiden Datenblätter und Ihr Programm. Bei Letzterem nehme ich die aktuelle Version, also die von Ben Stromkraft abgeleitete, und da sehe ich nichts von "dummy zero bit"; es gibt dort auch kein Label read_byte, also ist mir unklar, wie&wo ich den zuletzt gezeigten Programmteil einfügen soll; falls sich dies aber auf Ihre ursprüngliche Version bezieht, nun, die hat ja offenbar gar nicht funktioniert.
Hast Du daran gedacht, daß der 93C86 zwei Adressbits mehr braucht als die kleineren 93C56? Muss mir Deinen Code mal durchlesen, aber testen kann ich ihn im Moment 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.