extmem atmega128

OP #1654100
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
OP #1654232
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?
OP #1654942
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
#1654969
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
OP #1655067
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.
OP #1655113
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
OP #1655534
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren