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
Hi, schick mal einen Ausschnitt deines Schaltplan's und eine genaue bezeichnung deiner verwendeten (relevanten) Bauteile.
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?
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
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
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
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
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.
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;
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.