mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik extmem atmega128


Autor: Stefan Haller (stefan0985)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes E. (k1ngarthur) Benutzerseite
Datum:

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

Autor: Stefan Haller (stefan0985)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan Haller (stefan0985)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: cvnc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du keine Unterlagen beibringst, Glaskugel hilft hier nicht.

Gast

Autor: Stefan Haller (stefan0985)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Haller (stefan0985)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Haller (stefan0985)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Haller (stefan0985)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Haller (stefan0985)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.