ich habe mich nach langen Jahren mal wieder mit meinen AVR-Controllern beschäftigt und versuche einen externen Ram beim ATMega162 anzusprechen. Ich bekomme es aber nicht hin.
In exakt derselben Hardware funktioniert es aber mit einem AT90S8515 mit derselben Software.
Als Ram habe ich einen 62256 und als Latch einen 74HCT573.
Der einzige Unterschied ist in der Software folgendes:
#if defined(AVR_ATmega162)
1
MCUCR = (1<<SRE) | (1<<SRW10);
#elif defined(AVR_AT90S8515)
1
MCUCR = (1<<SRE) | (1<<SRW);
#endif
Ansonsten ist die Software vollkommen identisch.
Hat jemand einen Tipp für mich woran es liegen könnte.
Für eine Antwort im Voraus vielen Dank.
Viele Grüße
Was geht denn nicht? Wie testest du? Mal alle Verbindungen geprüft? Mal den RAM "zu Fuß" per Software angesprochen? Dann weiß man wenigstens, daß alle Verbindungen stimmen.
Also bitte Schaltplan und Programm hier hereinstellen.
Das hatte ich vergessen zu erwähnen. Es handelt sich um ein STK200. Das habe ich genommen, weil ich dort externen RAM gesteckt habe. Auf meinem STK500 ginge es nur über das STK501. Auf demselben Sockel hatte es mit dem AT90S8515 funktioniert.
Mal den RAM "zu Fuß" per Software angesprochen? Dann weiß man
wenigstens, daß alle Verbindungen stimmen.
Das habe ich gemacht. Aber ich will nicht ausschließen, dass mir dabei Fehler passiert sind, weil ich nach mehreren Stunden nicht mehr so konzentriert war.
Ein Unterschied ist allerdings der Start des XMEM, da der M162 1kB
intern hat.
Das hatte ich berücksichtigt. Beim AT90S8515 habe ich als Adresse 0x0260 genommen und beim ATmega162 0x0500. Zumindest habe ich es so in Erinnerung. Der PC ist schon aus. Aber ich weiss, dass ich die unterschiedlichen Adressen berücksichtigt hatte.
Sobald wie ich dazu komme, werde ich das nochmal so ausprobieren, wie Falk vorgeschlagen hat und mich dann wieder melden und den Code des Programms hier einstellen.
MCUCR = (1<<SRE) | (1<<SRW10);
Hat jemand einen Tipp für mich woran es liegen könnte.
Kann es zufällig sein, dass Du den SRAM in dem unteren Adressraum hast und die Waitstates für die obere Hälfte einstellst? Bei einem 70ns-SRAM und einem langsamen LATCH wie hier würde ich es zuerst auch mit zwei Waitstates probieren und wenn es läuft, dann damit runter auf 1 gehen – natürlich in der richtigen Hälfte des Adressraums. Dem Datenblatt nach befinden sich die anderen Bits in dem EMCUCR (Extended MCU Control Register).
Es gab mal die Info, daß bei vollen 16 MHz ein HCT zu langsam ist und
man ein ACT Latch braucht.
Die exakte Bezeichnung ist: MM74HCT573N
Was mich irritiert ist, dass es mit einem AT90S8515 funktioniert. Aber nicht mit dem ATmega162. Auf dem AT90S8515 läuft auch eine Software mit fast 7K Flash und die erheblich mehr RAM benötigt als beide Controller intern haben.
Ich werde das in den nächsten Tagen, wie von Dir vorgeschlagen, mit einem kurzen Testprogramm, was nur den RAM anspricht, überprüfen und mich dass wieder melden.
Eigentlich hatte ich nicht vor auf dem STK200 zu löten. Ich wollte mit der Angabe, dass es 4MHz fest verbaut sind, auch nur sagen, dass es nicht an einer zu hohen Quarzfrequenz liegt.
Einfach mal messen ob alle Signale richtig am RAM ankommen.
Daran habe ich auch gedacht. Aber da es mit einem AT90S8515 auf demselben Steckplatz funktioniert, bin ich erstmal davon ausgegangen, dass da alles ok ist.
Ich werde das am Wochenende sowohl von der Softwareseite testen als auch elektrisch durch messen und mich dann wieder melden.
Ohne Ihnen zu nahe treten zu wollen - es ist das alte Lied: Programm auf das nötige Minimum reduzieren und hier vorstellen (mitsamt Fuse-Einstellungen). Sollte ein eventueller Programmfehler dann nicht auf Anhieb erkennbar sein, so findet sich sicher der Eine oder Andere, der bereit wäre, seine alte Hardware hervorzuholen und mal kurz wieder in Betrieb zu nehmen.
Ich habe mir jetzt ein kurzes Testprogramm geschrieben. Darin habe ich für den ATMega162 die von Gregor und Peter genannten Hinweise berücksichtigt.
Mit dem AT90S8515 funktioniert es einwandfrei. Da sehe ich die LED an PB2 (TEST_FAIL) nicht. Um sicher zu gehen, habe ich den Befehl zur Aufschaltung des externen Rams (MCUCR = (1<<SRE) | (1<<SRW); für den AT90S8515 auskommentiert, dann sehe ich auch TEST_FAIL. Also liegt es nicht an der Hardware.
Mit dem ATMega162 läuft der Ramtest auf Fehler. Die einzelnen Versuche habe ich im untenstehenden Code auskommentiert.
Kann es zufällig sein, dass Du den SRAM in dem unteren Adressraum hast
und die Waitstates für die obere Hälfte einstellst?
Das habe ich noch nicht so richtig verstanden, wie Du das meinst. Laut Datenblatt wird der externe Ram hinter den internen gehangen. Ich hatte alle Flags des EMCUCR unverändert gelassen. Wenn ich das Datenblatt richtig verstanden habe, waren weder für die oberen noch unteren Adressen Wait-States vorhanden.
Hier die Software meiner heutigen Tests:
1
#include<avr/io.h>
2
3
#if defined(__AVR_ATmega162__)
4
#define SRAM_START_ADR 0x0500
5
#define SRAM_END_ADR 0x7FFF
6
#elif defined(__AVR_AT90S8515__)
7
#define SRAM_START_ADR 0x260
8
#define SRAM_END_ADR 0x7FFF
9
#else
10
#error "Ram Start- und Endadresse nicht definiert"
11
#endif
12
13
#define LED_PORT PORTB
14
#define LED_DDR DDRB
15
16
#define TEST_1 0
17
#define TEST_2 1
18
#define TEST_FAIL 2
19
#define TEST_ENDE 7
20
21
22
intmain(void)
23
{
24
uint8_t*p;
25
26
// externen Ram aufschalten
27
#if defined(__AVR_ATmega162__)
28
// Versuch 1, ohne EMCUCR
29
MCUCR=(1<<SRE)|(1<<SRW10);
30
31
// Versuch 2, ohne EMCUCR
32
// MCUCR = (1<<SRE) | (0<<SRW10);
33
34
// Versuch 3, mit MCUCR und 2 Wait-States Lesen/Schreiben, 1 Wait-State bei Adressausgabe
Das habe ich noch nicht so richtig verstanden, wie Du das meinst. Laut
Datenblatt wird der externe Ram hinter den internen gehangen. Ich hatte
alle Flags des EMCUCR unverändert gelassen. Wenn ich das Datenblatt
richtig verstanden habe, waren weder für die oberen noch unteren
Adressen Wait-States vorhanden.
Ich habe jetzt im Datenblatt gesehen (im Anhang), dass, wenn alle SRL-Bits auf Null gesetzt sind, dann die Waitsates des gesamten Adressraums einfach nur über die Bits des Uppersectors eingestellt werden, insofern dürfte Deine Annahme am Anfang mit „MCUCR = (1<<SRE) | (1<<SRW10);” ausgereicht haben, um den gesamten Adressraum mit einem Waitstate zu betreiben, und meine demnach falsch war, da ich die gelöschten SRLs nicht berücksichtigt habe. Es schadet aber nicht und kostet auch nichts, das auch einmal so wie unten zu probieren, denn in irgendwelche Erratas, wo Designfehler aufgeführt werden, habe ich jetzt nicht nachgeschaut:
Viel interessanter wäre auch zu wissen, wo der Compiler/Linker den Stapel hier platziert, denn der könnte Dir hier bei dem Test, wo Du alle Bytes durchgehst, oder später im Betrieb einen Strich durch die Rechnung machen. Normalerweise müsste der Stapel am Ende des internen SRAMs platziert worden sein und dann abwärts in die Tiefe gehen und seine Betrachtung somit egal sein, aber überprüfen sollte man es trotzdem (am besten auch den generierten Assemblercode anschauen) und den RAM-Test würde ich auch erstmal nur mit einem einzigen Byte an z.B. Adresse 0x4001 oder 0x5000 ohne irgendwelche komplexen Schleifenausdrücke und Inkrementationen probieren, also irgendwo in der Mitte des externen Speichers. Einfach nur ein Byte (mit dem Muster) dort reinschreiben, wo der Pointer zeigt, anschließend an der Stelle auslesen und vergleichen.
aber ich würde den RAM-Test trotzdem
erstmal nur mit einem einzigen Byte an z.B. Adresse 0x4001 oder 0x5000
ohne irgendwelche komplexen Schleifenausdrücke und Inkrementationen
probieren, also irgendwo in der Mitte des externen Speichers.
Hätte ich morgen gemacht. Aber nach dem Hinweis von Axel dämmerte mir was, dass ich das Bit für JTag beim Auslesen der Fuses in AVR-Studio gesehen hatte. Eigentlich wollte ich morgen erst wieder dran gehen. Aber das hatte mir keine Ruhe gelassen und musste das noch ausprobieren.
Die Application Note AVR087 wird sofort gespeichert. Die kannte ich gar nicht.
Ganz lieben Dank an alle, die sich die Mühe gemacht haben, damit zu beschäftigen.