www.mikrocontroller.net

Forum: Compiler & IDEs External memory schreiben lesen??


Autor: GuidoF (Gast)
Datum:

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

Autor: Jonas Diemer (Gast)
Datum:

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

inp() und outp() ansprechen.

Autor: GuidoF (Gast)
Datum:

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

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry. hab ich wohl nicht richtig nachgedacht... :-)

Autor: Mario (Gast)
Datum:

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

Autor: GuidoF (Gast)
Datum:

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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

MfG
Andreas

Autor: GuidoF (Gast)
Datum:

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

Autor: Jonas Diemer (Gast)
Datum:

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

Autor: GuidoF (Gast)
Datum:

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

Autor: Jonas Diemer (Gast)
Datum:

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

Autor: GuidoF (Gast)
Datum:

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

Autor: Jonas Diemer (Gast)
Datum:

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

Autor: igor (Gast)
Datum:

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

  char byte@0X8000;
  byte = 0x80;

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.