Hallo, ich habe einen funktionierenden Schaltungsaufbau mit einem ATMEGA162, einem 74HCT573 und einem 32k RAM. Zur Fehlersuche auf einer größeren Platine versuche ich nun schon mehrere Tage diese Schaltung nicht mit der im ATMEGA eingebauten RAM Steuerung, sondern nur mit ASM Befehlen zu realisieren. Dann wäre ich in der Lage den Ablauf schrittweise durchzugehen. Leider hatte ich bisher nicht den gewünschten Erfolg! Hat jemand eventuell schon einen fertigen Code, oder kann mir dabei helfen? Gruß Bruno
Ich arbeite gerade auch an einer Platine mit externem Ram. Sobald ich sie fertig gelötet habe, werde ich auch bald den Ram testen. Ich kann (wenn es bei mir funktioniert) meinen Code posten. Ich verwende einen ATmega8515 mit 128kB Ram. BTW: Was hast du alles schon probiert?
Hallo Samuel, ich nehme aber an, du wirst auch das Control Register MCUCR nutzen. Dann hat man mit der RAM Steuerung ja relativ wenig zu tun, da alles die Hardware macht. Wie schon gesagt habe ich dafür schon einen funktionierenden Code. Ich versuche aber das ganze mit direkter Steuerung der einzelnen Ports zu realisieren, d.h. ohne MCUCR. Oder was machst du?
Ich werde MCUCR nutzen, da ich den Ram sonst nicht schnell genug ansprechen kann. Warum nutzt du es nicht? Die Ports brauchst du so oder so.
Wie gesagt, hoffe ich damit einen Fehler auf einer größeren Platine zu finden.
>Jobst
Wenn ich das so genau wüßte!
Jedenfalls kann ich das RAM nicht richtig ansprechen.
>Knut
Ich habe ein kleines Programm, mit dem ich die Funktion teste (in jede
Adresse einen Wert schreiben und wieder lesen).
Dabei bekomme ich schon bei der ersten Adresse eine Fehlermeldung.
Mit welcher Frequenz arbeitest du? Bei >8MHz sind die 74HCTs zu langsam und man bekommt schnell mal undefinierbare Fehler. Hab auch im Kopf, dass die Leiterbahnen max 17cm lang sein sollten um Reflexionen zu vermeiden. Um das XMEM-Interface zu umgehen, musst du nur die einzelnen Arbeitsschritte 'von Hand' durchgehen (nur Prinzip): PORTA, PORTC, ALE, RD, WR als Ausgang; ALE, RD, WR high
1 | READ: |
2 | out PORTA, AddLow |
3 | out PORTC, AddHigh |
4 | cbi PORTE, ALE |
5 | out DDRA, 0b00000000 |
6 | cbi PORTD, RD |
7 | nop |
8 | in data, PINA |
9 | sbi PORTD, RD |
10 | sbi PORTE, ALE |
11 | |
12 | WRITE: |
13 | out PORTA, AddLow |
14 | out PORTC, AddHigh |
15 | cbi PORTE, ALE |
16 | out PORTA, data |
17 | cbi PORTD, WR |
18 | sbi PORTD, WR |
19 | sbi PORTE, ALE |
Mark
Hallo Mark, herzlichen Dank für die Info. Werde ich mir genauer ansehen. Den 74HCT habe ich übrigends mit 16MHz ohne Probleme laufen. Ergebnis kommt! Bruno
Hier bin ich wieder. Leider immer noch ohne Erfolg! Ich habe zwar in meinem Code einen gravierenden Fehler festgestellt (statt beim Lesen das DDRA umzustellen, hatte ich den PORT umgestellt), aber genützt hat das auch nichts. Da ich ja langsam blind werde, stelle ich meinen Code mal hier rein: Check: ldi XL,LOW(RAMEND) ; Register XL ist R26, LSB RAM-Adresse ldi XH,HIGH(RAMEND) ; Register XH ist R27, MSB RAM-Adresse ldi soll,0b10101010 ; Bitmuster fuer Test Checkloop: inc XL ; Erhoehe Adresszaehler um 1 brne RAMcheck ; Nicht Null, MSB ok inc XH ; Erhoehe MSB der Adresse breq Ende ; Null, MSB uebergelaufen, raus rcall Ausgabe ; Anzeige von XH mit LCDs RAMcheck: rcall Schreiben rcall Lesen cp Daten,soll ; Vergleiche gelesen mit geschrieben brne Ende ; Nicht gleich, raus com soll ; Drehe alle Bits im Bitmuster um (XOR FF) rcall Schreiben rcall Lesen cp Daten,soll ; Vergleichen brne Ende ; Nicht gleich, raus com soll ; wieder umdrehen rjmp Checkloop ; Weitermachen Schreiben: out PORTA, XL out PORTC, XH cbi PORTE, 1 ; XL mit ALE in Zwischenspeicher out PORTA, soll ; Daten an PortA cbi PORTD, 6 sbi PORTD, 6 ; Daten schreiben in RAM mit steigender Flanke (nur RAM AS7C..!!!) sbi PORTE, 1 ret Lesen: out PORTA, XL out PORTC, XH cbi PORTE, 1 ; XL mit ALE in Zwischenspeicher ldi temp, 0 out DDRA, temp cbi PORTD, 7 nop in Daten, PORTA ; Daten in Register übernehmen ldi temp, 0xFF out DDRA, temp sbi PORTD, 7 sbi PORTE, 1 ret Ende: ldi temp, 0 out PORTB, temp ; auf die LEDs rcall warten ldi temp, 0xFF out PORTB, temp ; auf die LEDs rcall warten rjmp ende ; Loop fuer immer Ausgabe: com XH ; XOR FF der obersten RAM-Adresse out PORTB, XH ; auf die LEDs rcall warten com XH ret Vielleicht fällt dir ja etwas auf. Ich habe es übrigends auch mit 4MHz versucht.
direkt auffällig ist 'in Daten, PORTA' das sollte PINA heißen, sonst gibt's nur XL zurück. Der Rest sind nur Vermutungen, was noch sein könnte: Ich unterstelle mal, dass die Initialisierungen nur nicht mitkopiert wurden, sonst würden nur Pull-ups aktiviert die vermutlich nicht ausreichen. Wenn du den RAM ohne XMEM ansprichst, hast du die Adressen von 0x0000 bis zur Größe des RAMs zur Verfügung, das mapping mit dem internen SRAM entfällt (das mit 'RAMEND' ist unnütz). Fehlerfrei würde das nur funktionieren, wenn du einen 64kByte-RAM verwendest. Du könntest auch mal verschiedene 'Ende'-Routinen verwenden um die Fehlerquellen (Überlauf, Lesefehler) zu unterscheiden. Sind !CE und !OE richtig angeschlossen? Versuch vielleicht erstmal nur ein festes Byte zu schreiben und zu lesen, wenn das auch nicht klappt, nur zwei Adressen abwechselnd in's Latch schreiben, lang genug lassen um's mit LED/Multimeter oder so zu überprüfen.
Das mit PORTA und PINA war schon mal ein sehr guter Tip. Ich muß gestehen, ich hatte das absichtlich abgeändert weil ich dachte es wäre ein Versehen. Ich verstehe es auch nach wie vor nicht ganz, da ich aus den diversen Informationen etwas anderes herauslese. Auch in google bin ich nicht fündig geworden. Jedenfalls schreibt und liest jetzt das Programm schon mal richtig aus. Allerdings kommt dann nach einer unterschiedlichen Anzahl von Adressen (XL max ca. 40) wieder ein Lesefehler. Irgendwo scheint das timing nicht ganz zu funktionieren, oder? Auch der Hinweis betr. RAMEND ist nützlich, auch wenn es bei diesem Problem keinen Einfluß hat. Hinweis: Das Programm selbst basiert auf ein einem Testprogramm mit XMEM und auch die beim Testen benutzte Schaltung habe ich mehrfach mit XMEM getestet.
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.