Forum: Compiler & IDEs External memory schreiben lesen??


von GuidoF (Gast)


Lesenswert?

Moin moin!

Verzeiht mir meine Anfängerfrage... ich habe, was den AVR GCC angeht 
noch leichte Verständnisschwierigkeiten :( Hab vorher nur in Assembler 
programmiert und mich den GCC noch nicht so sehr auseinandergesetzt.

Meine Frage: Wie werden Daten an eine bestimte Adresse geschrieben oder 
gelesen? Ich habe in einem Source z.B. folgendes gelesen:

*LCD_DATA=tmp

und LCD_DATA war in einem Header definiert mit:

#define        LCD_DATA        (unsigned char *)0xF000

Versteh ich das richtig, das LCD_DATA ein Pointer au die Adress F000 ist 
und ich die Daten an diesen Pointer übergebe? Wenn ja, wäre das ja super 
einfach. Das zu verstehen ist allerdings nicht so ganz einfach, weil der 
Compiler halt wohl speziell für diesen CPU Typ gebastelt worden ist.

Werden so die WR / RD Signale auch gleich miterzeugt? Und was kann man 
ggf. tun um diese zu verlängern (mehr als nötig)

Genug gefragt

Gruß, Guido

von Jonas Diemer (Gast)


Lesenswert?

hmmm. kann sein dass das so funktioniert. hab ich noch nicht versucht... 
ansonsten kannste die ports mit

inp() und outp() ansprechen.

von GuidoF (Gast)


Lesenswert?

s mit inp() unt outp() - das ist nicht ernst gemeint, oder? Was, wenn 
ich an Adress und Datenbus 64KB Speiher dranhängen möchte?? In Assambler 
(8051) würde ich den Bereich mit MOVX addr beschreiben / lesen. Mit 
inp() und outp() erzeuge ich aber weder WR/RD Signal noch das ALE.

Guido

von Jonas Diemer (Gast)


Lesenswert?

sorry. hab ich wohl nicht richtig nachgedacht... :-)

von Mario (Gast)


Lesenswert?

Hallo,

ich frage mich warum du überhaupt auf eine bestimmte Adresse schreiben 
willst - ist das LCD Memory-mapped? Ansonsten könnte dir die Adresse ja 
egal sein.

Ansonsten müsste es möglich sein es so zu machen (nicht getestet):

char* LCD_DATA; // Vereinbaren eines Ponters

LCD_DATA = (char*) 0xF000; // Adresse setzen

*LCD_DATA = 'X'; // Wert zuweisen

Ciao
    Mario

von GuidoF (Gast)


Lesenswert?

Hi Mario!

>ich frage mich warum du überhaupt auf eine bestimmte Adresse schreiben willst - 
ist das LCD Memory-mapped?

nein, im Moment noch nicht, soll aber.

>LCD_DATA = (char*) 0xF000; // Adresse setzen

ahja, das ist es, was ich wissen wollte. Der AVR GCC übernimmt dann die 
ganze Aufgabe bzw. setzt Adresse, latched und schreibt die Daten an 
[AD0..7] Das war mir nicht ganz klar als blutiger C neuling.

Gibt es denn nict irgendwo eine gute Beschreibung wo ich mir den ganzen 
Kram anlernen kann? Als neuling steht man ganz schön blöd vor zeilen wie 
diesen hier:

1<<DATA oder

DATA>>4

wenn ich das nachlesen könnte, müßt ich weniger dumm fragen :-)

Gruß, Guido

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Übrigens: wenn du externes RAM verwenden willst, musst du vorher das 
SRE-Bit im MCUCR setzen!

MfG
Andreas

von GuidoF (Gast)


Lesenswert?

Si, hab ich schon geußt outp( (1<<SRE) ,MCUCR); Trotzdem Danke für den 
Tip!!

(data>>4) denke ich bedeutet wohl soviel wie ein left shift in Assembler
Was aber letztendlich 1<<SRE genau macht, weiß ich immer noch nicht 
ganz. Mein C Guru ist die nächsten 10 Tage leider auf Tour muh

Inzwischen läuft der AVR GCC für den mega128 bei mir mit AVR Studio 4 
zusammen und debuggen klappt auch bestens - daher komme ich jetzt sehr 
schnell Stück für Stück weiter.

Gruß, Guido

von Jonas Diemer (Gast)


Lesenswert?

also da kann ich aber helfen:

1<<Data ist ein Left-shift der zahl 1=0x01=0b00000001.

das bedeutet nix anderes als ein byte, in dem das bit an der position 
<DATA> gesetzt ist.

von GuidoF (Gast)


Lesenswert?

aha, also quasi ein Bitset - warum macht man das nicht mit OR?

Nun ja, ich werds wohl noch rausfinden :-) Ebenso wie ich noch 
rausfinden möchte, warum ein compilat im AVR Simulator einwandfrei 
funktioniert, im prozessor selbst aber keinen Muks von sich gibt :( Die 
gcctest goodies funktionieren alle, mein bastellernsource nicht :(

Gruß, Guido

von Jonas Diemer (Gast)


Lesenswert?

weil's mit or nicht geht.

1<<DATA (z.B. mit DATA=4) ist einfach übersichtlicher als 0x08 
(binärzahlen kann gcc ja nicht).

es ist ja immer ziel, programmcode zu schreiben, der sich selbst 
erklärt...

deswegen ist ein

enable_external_int(1<<INT0);

besser als

outp(0x40, GIMSK);

oder womöglich noch
outp(0x40, 0x3B );

von GuidoF (Gast)


Lesenswert?

immer noch etwas verwirrend, aber ich beuge mich der Allgemeinheit und 
mache mit diesen Methoden mit :) Übersichtlich und selbsterklräend ist 
es schon, dagegen hab ich nicts einzuwenden.

Ich schau mir den dissassemblierten Code nachher mal an, vielleicht 
blick ich dann nochn bisschen mehr durch. Es ist, wie schon mal gesagt, 
ziemich schwierig in die Umgebung des AVR GCC einzusteigen, wenn man 
vorer nie was damit zu tun hatte.

Mach ich für das andere Problem nen neune Thread auf?...

Gruß, Guido

von Jonas Diemer (Gast)


Lesenswert?

is wohl am besten. besonders, wenn jemand später ein ähnliches problem 
(wie dein neues) hat. ausserdem geht die site (des neuen probs) dann 
schneller zu laden, weil nicht so viele für das neue problem irrelevante 
postings drin sind.

von igor (Gast)


Lesenswert?

Bei IAR C ist es möglich auf die Adresse auch ohne Pointer zuzugreifen:

  char byte@0X8000;
  byte = 0x80;

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.