Forum: Mikrocontroller und Digitale Elektronik extmem atmega128


von Stefan H. (stefan0985)


Lesenswert?

Hallo

ich komme mit meinem Problem gerade überhaupt nicht weiter. Wär echt 
super wenn mir jemand helfen kann.
Ich habe ein GateArray, welches ich als externen Speicher verwende.
Wenn ich auf das Array auf Adresse 100(lowbyte) und 300 (highbyte) einen 
Werte schreibe und diesen Wert mit meinem uC (atmega128) lesen möchte 
funktioniert das.
Wenn ich auf das Array auf Adresse 101(lowbyte) und 301 (highbyte) einen 
Werte schreibe und diesen Wert mit meinem uC (atmega128) lesen möchte 
bekomme ich den Wert der auf 100 und 300 steht.
Alle anderen Adressen, kann ich gar nicht lesen.
Das beschreiben des GateArrays von extern (sprich nicht mit uC) 
funktioniert 100% (wurde ausführlich getest). wenn ich also eine Wert in 
100, 300, 101, 301, oder höher schreibe steht der da auch. Es ist also 
sicher ein Software problem.

Folgendermaßen gehe ich vor.

Initialisieren des extmem:


#define MA_MCUCSR_CPU          0x80        /* MCU control/status 
register */
#define MA_MCUCSR_CPU_MASK     0x9F        /* Used bits */
#define MA_XMCRA_CPU_MASK      0x7E        /* Used bits */
#define MA_XMCRA_CPU           0x1A        /* External memory control 
register A */
#define MA_XMCRB_CPU_MASK      0x87        /* Used bits */
#define MA_XMCRB_CPU           0x06        /* External memory control 
register B */
#define MA_MCUCR_CPU           0x80        /* MCU control register */


void SRAM_Init()
{

    MCUCSR   = ( MCUCSR & ~MA_MCUCSR_CPU_MASK ) | MA_MCUCSR_CPU;
    MCUCR    = MA_MCUCR_CPU;
    XMCRA    = ( XMCRA & ~MA_XMCRA_CPU_MASK ) | MA_XMCRA_CPU;
    XMCRB    = ( XMCRB & ~MA_XMCRB_CPU_MASK ) | MA_XMCRB_CPU;
}


static char *FPGA_Write_lowbyte = (char *)EXT_MEM+0x100;
static char *FPGA_Write_highbyte = (char *)EXT_MEM+0x300;
.
.
.
arra[0]=*(FPGA_Write_lowbyte+0x00);
arra[1]=*(FPGA_Write_highbyte+0x00);
arra[2]=*(FPGA_Write_lowbyte+0x01);
arra[3]=*(FPGA_Write_highbyte+0x01);

diese Werte gebe ich mir dann über meine serielle schnittstelle aus.
und wie gesagt höhere Adressen kann ich gar nicht lesen (da bekomm ich 
nur 0x00)

hat jemand eine idee?

wär echt super

danke schon mal

stefan

von Hannes E. (k1ngarthur) Benutzerseite


Lesenswert?

Hi,
schick mal einen Ausschnitt deines Schaltplan's und eine genaue 
bezeichnung deiner verwendeten (relevanten) Bauteile.

von Stefan H. (stefan0985)


Lesenswert?

Es ist folgendermaßen.
Ich schreib gerade meine diplomarbeit bei einer Firma. Ich kann also 
leider die ausschnitte des schaltplans nicht posten/verschicken.
 Der Teil meiner Schaltung mit dem uC und dem FPGA, ist schon im Einsatz 
(und funktioniert also auch). Mit dem bestehenden Programm funktioniert 
auch alles auch auf meiner Platine.
Die Initialisierung habe ich auch aus dem Programm (welches getestet ist 
und funktioniert) rauskopiert, eben so wie ich daten aus dem gatearray 
lesen kann (arra[0]=*(FPGA_Write_lowbyte+0x00);). deshalb bin ich ja so 
verzweifelt, weil es nicht funktioniert oder nur teilweise (ich kann ja 
eine adresse auslesen).
der einzige unterschied ist, dass ich avr studio zum compilieren 
verwende und das andere programm mit IAR embedded workbench compiliert 
wurde.
ich habe aber als ich mit programmieren begonnen habe mit avr studio 
angefangen und wollte dann nicht mittendrin auf das IAR umsteigen.

könnnte das problem eventuell mit dem compiler zusammenhängen?

von Stefan H. (stefan0985)


Lesenswert?

Niemand eine Idee? ich lese immer wieder irgendwelche sachen die ich im 
makefile einstellen muss. kann es vllt daran liegen?
ich weiß echt nicht mehr weiter bin um jede hilfe dankbar

von cvnc (Gast)


Lesenswert?

Wenn Du keine Unterlagen beibringst, Glaskugel hilft hier nicht.

Gast

von Stefan H. (stefan0985)


Angehängte Dateien:

Lesenswert?

hast du natürlich recht, hätte das hier vllt schon früher posten sollen, 
sorry.
ich hoffe das hilft weiter um mir zu helfen.

vielen dank

von Stefan H. (stefan0985)


Lesenswert?

hmm qualität lässt zu wünschen übrig tut mir leid.
links ist mein uC der an AD0-AD7 seinen Adress- und Daten bust hat. an 
ALE natürlich AdressLatchEnable. \RD und \WR Read strobe und Write 
strobe.
rechts ist halt das GateArray, habe ich aber nur der 
vollständigkeitshalber hinzugefügt

von Helmut L. (helmi1)


Lesenswert?

Wenn du nur die Addressen  A0..A7 einbindest in deiner Logik wie kann 
man dann die Addressen 100H und 300H unterscheiden ?

Schreibt doch mal hart codiert auf die Addressen drauf

Also


unsigned char  *p,wert;

p = 0x101;    // Pointer setzen

*p = 0xaa;    // schreiben
wert = *p;    // lesen


Was macht er dann ?


Gruss Helmi

von Stefan H. (stefan0985)


Lesenswert?

Helmut Lenzen schrieb:
> Wenn du nur die Addressen  A0..A7 einbindest in deiner Logik wie kann
> man dann die Addressen 100H und 300H unterscheiden ?

hab ich oben vergessen. A9 und A8 sind ja für den Adressbus auch noch 
vorhanden um 100 und 300 zu unterscheiden

habe jetzt das programm folgendermaßen geändert. im ergebnis hat sich 
aber leider nichts geändert.

unsigned char *a;
unsigned char *b;
unsigned char *c;
unsigned char *d;

char Line[7];
unsigned char Wert[4];


int main(void)
{
//EXMEM initialisieren (siehe oben)

while(1)
{
a=0x2100;
b=0x2300;
c=0x2101;
d=0x2301;

Wert[0]=*a;
Wert[1]=*b;
Wert[2]=*c;
Wert[3]=*d;


ich bekomme für a,b, c, d die Warnung "assignment makes pointer from 
integer without a cast"
wenn ich en zweites mal compilier kommt die warnung jedoch nicht mehr.

schreiben funktioniert (jedoch nur auf einer anderen Adresse) ich kann 
auf 100, 300, 101, 301 mit uC nur lesen, die Werte die vom uC gelesen 
werden sollen kommen über eine andere Schnittstelle rein.

von Helmut L. (helmi1)


Lesenswert?

Stefan Haller schrieb:
> ich bekomme für a,b, c, d die Warnung "assignment makes pointer from
> integer without a cast"

Dann schreib mal folgendes

a = (unsigned char*)0x2100;

von Helmut L. (helmi1)


Lesenswert?

Dir ist aber bekannt das beim ATMega128 intern auf Addresse 100H 
Speicher liegt ?

Externes RAM faengt erst bei 1100H an.
Versuch mal dein externes RAM auf andere Addresse zu legen.

von Stefan H. (stefan0985)


Lesenswert?

Helmut Lenzen schrieb:
> Dir ist aber bekannt das beim ATMega128 intern auf Addresse 100H
> Speicher liegt ?
>
> Externes RAM faengt erst bei 1100H an.
> Versuch mal dein externes RAM auf andere Addresse zu legen.

Ich fang doch bei 0x2100 an

a=0x2100;
b=0x2300;

ich habe irgendwie das gefühl, dass ich im makefile was ändern muss. 
kann das sein?

bin echt dankbar für deine hilfe

von Helmut L. (helmi1)


Lesenswert?

Stefan Haller schrieb:
> A9 und A8 sind ja für den Adressbus auch noch
> vorhanden um 100 und 300 zu unterscheiden

Damit bekommst du aber keine Addressen von 0x2100.

Egal wie A8 u. A9 stehen es bleibt unter 0x0400.  Du must A13 mit 
ausdekodieren.

von Stefan H. (stefan0985)


Lesenswert?

das mit adresse 2000+x stimmt natürlich, ist aber egal, da ich nur über 
1000 kommen muss, damit der prozessor weiß, dass ich externe daten 
ansprechen möchte und somit RD oder WR setzt.
habe den fehler aber inzwischen gefunden, es werden nur gerade adressen 
angesprochen, da A0 nicht auskodiert wird.

vielen vielen dank helmuth für deine unterstützung

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.