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
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
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
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
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
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.
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
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 );
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
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.