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
hmmm. kann sein dass das so funktioniert. hab ich noch nicht versucht... ansonsten kannste die ports mit inp() und outp() ansprechen.
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
Übrigens: wenn du externes RAM verwenden willst, musst du vorher das SRE-Bit im MCUCR setzen! MfG Andreas
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.