Hallo!
Ich habe mir einen LPC2106 besorgt und habe Crossworks als IDE.
Habe keine Ahnung mit welche Befehle ich Pins auf 1 und wieder auf 0
setze oder wie ich sonstige Funktionen des ARMs programmiere.
Das Problem ist ja, dass es so viele verschiedene Header-Files gibt.
Kann mir jemand helfen oder ist in diesem Forum schon so ein Beitrag.
Tut mir leid, dass ich mit so einfachen Sachen störe, aber jeder muss
mal anfangen.
Mfg Kroko
Hm,
prinzipiell mußt Du erstmal gar kein Header File verwenden um einen
Port zu togglen.
Es gibt lt. Usermanual S. 81 für die GPIO 4 Register mit denen Du
Arbeiten kannst. Ablaufen tut das nach folgenden Schema:
- Solls n Ausgang oder n Eingang sein ? Register: IODIR
- Für den Ausgang kannst Du dann mit Register IOCLR und IOSET den Port
Pin setzen oder net.
Das Headerfile dient nur um dir das Leben einfacher zu Machen. Das
Register IODIR liegt an Addresse: 0xE0028008
Du darfst natürlich mit
(*((DWORD *)0xE0028008)) = 0x12345678;
auf das Register zugreifen - Im Allgemeinen schauts mit
IODIR = 0x12345678;
besser aus.
Was das Ding sonst noch kann steht im Datenblatt bzw. Usermanual drin.
Ohne das gibts kein weiterkommen.
cu
>Selbstverständlich braucht man ein Headerfile für die>Registerdefinitionen, und zwar hier das LPC210x.h.
So ein Schmarrn. Niemand zwingt einen, ein Headerfile zu verwenden.
*((unsigned int *) 0x12345678) = 12345;
funktioniert doch genauso. Im Header steht zwar nichts anderes drin,
aber gerade am Anfang kann es schonmal nützlich sein, das alles selbst
zu machen, um es besser zu verstehen.
Nicht umsonst, aber kostenlos.
Nur BRAUCHT man eben keinen Header, nicht zwingend. Und da Kroko wohl
grundsätzliche Probleme hat, kann man das zu Lernzwecken auch mal
weglassen.
@Karl:
Man muß sich das Leben aber auch nicht unnötig erschweren:
Bindet man das Definitions-H-File ein, kann man die Peripherals unter
dem Namen exakt wie im Datenblatt ansprechen. Das ist doch besser als:
*((unsigned int *) 0x12345678) = 12345;
Oder???
Sowas macht nur den Code unleserlich.
Wie Kroko, so habe ich vor gut 2 Jahren auch mit C angefangen,
unmittelbar danach kam der ARM-Controller.
Um die Register-Definitionen, habe ich mich nie gekümmert, sondern sie
sofort eingebunden.
Wem das zu schwer ist, für den ist aber auch der ARM-Controller eine
Nummer zu hoch, oder?
Haben wir heute Vollmond, oder was?
Und gegen Polen haben wir doch auch gewonnen.
Gruß
Dietmar
Die Argumentation von Karl ist schon nachvollziehbar. Wenn man sowas
noch nie "von Hand" gemacht hat, ist man eine Abstraktionsebene
weiter von der Hardware entfernt, und so auch eine Ebene weiter davon,
zu verstehen, was da eigentlich vor sich geht.
Daß das ein echtes Problem sein kann, sieht man in Anbetracht mancher
Anfängerfragen.
Es ist auch durchaus sinnvoll und lehrreich, das Compilat solcher
einfach(st)en Programme auf Assemblerebene anzusehen, um
nachzuvollziehen, was der Compiler da anstellt. Das setzt eine gewisse
Grundkenntnis in Assembler voraus, aber die sind bei der Beschäftigung
mit Microcontrollern sowieso ratsam. Zugegeben, ARM-Assembler ist schon
ziemlich ... heftig, damit sollte man vielleicht nicht gerade anfangen.
Natürlich ist es sinnvoll, im täglichen Einsatz alle Hilfsmittel zu
verwenden, die einem das Leben einfacher machen, aber es ist eben auch
sehr wichtig, zu verstehen, was das Hilfsmittel macht, das einem das
Leben einfacher macht.
Ganz plumpes Beispiel: Erst wer mit Hammer und Meißel einen Schlitz in
die Wand gestemmt hat, weiß die Errungenschaft der Schlitzfräse richtig
zu schätzen :)
Und nur mit diesem Wissen hat man dann auch die Chance, sich mal eben
so eine Headerdatei an einen neuen bislang nicht vom Compilerhersteller
mit einer Headerdatei gewürdigten Controller zu erstellen.
@Rufus T. Firefly:
Schwülstige Wortlaute, ohne Ende:
Mit einem ARM7 aus dem Nichts anzufangen, ist mir ehrlich gesagt sehr
suspekt.
Ein 8080, und mit Assembler anfangen, wäre da eher geeignet.
Gruß
Dietmar
ist es nicht egal mit welchem Prozessor man anfängt. Am Ende ist es doch
immer nur Bit-Geschupse in den Registern, ob nun 8051, AVR, ARM, PIC,
...
Das einzige was bei den Prozessoren unterschiedlich schwer ist, ist die
Beschaltung, aber die scheint er ja schon fertig zu haben, denn sonst
würde er ja nicht schon programmieren wollen, oder?
Also ich kann mich den konstruktiven Beiträgen nur anschließen und Dir
empfehlen mal wenigstens ein Programm entweder in ASM zu schreiben oder
halt in C ohne Header-File.
Danach kannst es Dir ja einfacher machen und die Header-Files
einbinden.
Gruss
Sebastian
@Kroko:
Dann kopier dir wenigstens ein paar #defines aus dem
Register-Headerfile in das Main-C-File. Und wenn es nur die sind, die
die I/O-Ports betreffen.
Ein Bit mit: IOSET1 = (0x01 << 7); zu setzen, ist doch eleganter und
übersichtlicher als *((unsigned int *) 0x12345678) = 12345;
Oder?
Gruß :-)
Dietmar
@Kroko:
Um welches Demoboard handelt es sich?
@Sebastian:
Ein ARM7 wie die LPC2000 ist schon ein anderes Kaliber als ein 8051.
Irgendwann muß man sich da auch mal mit solchen Dingen wie der
Startup.s (Stack-Initialisierung für alle Betriebsmodi, usw.)
beschäftigen, den Betriebsmodi, dem Interrupt-Controller, und eventuell
auch mit Pipelining-Effekten und einigen anderen Feinheiten, die ein
8051 so nicht hat.
Natürlich, so ein modernes ARM Demoboard kann man am Schreibtisch
betreiben und braucht (zunächst) keine Laborausstattung, das ist schon
eine feine Sache.
Ich hatte ja ursprünglich auch gemeint, einzig und alleine nur das
Register-H-File einzubinden, und weiter nichts. Das haben sogar die
einfachen Beispiele wie "Hello World".
Gruß
Dietmar