Guten Abend allerseits Somal vorwegs, ich bin absoluter Anfänger was das Programmieren von Mikrocontrollern angeht. =)) Also ich hab mir heute das MP2103-Board hier aus dem Forum gebastelt (http://www.mikrocontroller.net/articles/MP2103-Stick:_Ein_Mini-Mikrocontroller-Board_mit_USB_und_bis_zu_4MB_Datenspeicher) Das funktioniert auch wunderbar und ich kann das Beispiel (Blinken des LEDs) erfolgreich laden. Nun möchte ich selber ein Programm im Keil uVision schreiben. Nun möchte ich für ein erstes Programm einmal ein Ausgangsport (P0.0) ansteuern, so dass dieser immer von 0 auf 1 wechselt. Kann mir da mal jemand helfen? Währe sehr nett, bin blutiger Anfänger in diesem Thema. =) Grüsse Andy
Vieleich mal ein kurzer Code, den ich geschrieben hab. Hoffentlich ist dieser nicht total falsh xD | #include <LPC2103.H> int i; void delay() { for(i=0;i<=9000;i++); } int main () { IODIR = 0x00000080 ;//pin P0.7 configured as output while (1) { IOCLR = 0x00000080 ;//P0.7 goes LOW delay(); IOSET = 0x00000080 ;//P0.7 goes HIGH delay(); IOCLR = 0x00000080 ;//P0.7 goes LOW delay(); } } | Währe nett, wenn mir jemand sagen könnte, warum das nicht geht. Ach ja, dieses File kompliliere ich mit Keil uVision in ein Hex-File, welches ich mit dem Programm Flash Magic auf den "Stick" lade. grüsse
Bitte, würde mich wirklich sehr freuen über eine Hilfreiche Antwort. Ich hab auch shon eine Seite gefunden mit einem Beispielprogramm, jedoch bin ich anscheinend zu blöde, um dies zum laufen zu bringen... grüsse
Eine wertvolle Teilinformation! Welche Seite ist das genau? Ich würde gerne die delay() und die bei dir nicht vorhandene Initialisierung des LPC absichern. Vor deinem letztem Beitrag sah es für mich Langsamdenker so aus, dass man ab Adam und Eva erklären müsste. Jetzt sieht es so aus, als ob man erst bei Noah und Haikal anfangen muss :-) Bzw. Kläre mal diesen Widerspruch auf, bzw. kontrolliere wo du die LED wie angeschlossen hast (Schaltplanskizze wäre nicht schlecht) >> ich für ein erstes Programm einmal ein Ausgangsport (P0.0) ansteuern, so ^^^^ > IODIR = 0x00000080 ;//pin P0.7 configured as output... ^^ ^^^^
Pinselx. Pins sind mehrfach belegt.wähle die gpio Funktion aus. Kurzer Beitrag...aber schreib vom Handy und das sukkt
So guten Abend miteinander. Erstmals vielen Dank für die Antworten. =) Ach ja, tut mir leid, in meinem Programm ist ein Widerspruch. Zuerst hab ich geschrieben, das der erste Ausgangsport angesteuert werden muss, und im Programm hab ich den 7 Ausgangsport angesteuert. Dies kommt daher, da es mir eigentlich keine Rolle spielt, welcher Ausgang, da ich jediglich das Signal messen möchte. Ob dies nun am Ausgang 1 oder am Ausgang 7 ist ist mir egal. =) Wie muss ich den den LPC initiallisieren? Tut mir leid, aber ich hab wirklich nur wenig Ahnung davon, aber wäre sehr froh über Hilfsbereite Leute hier in diesem Forum, die sich die Zeit nehmen können, mich zu unterstützen. =) Grüsse
Selbststudium. Suche nach dem lpc2xxx Insider guide.findest du bei hitex.
Ja natürlich, Klar. Ich möchte mir das ganze schon selbst beibringen, aber über einen kleinen Ansatz wäre ich sehr dankbar. Nur schon mal um einen ersten Erfolg zu erzielen. Wen ich erstmal weiss, wie ich die Ausgänge ansteuern kann, kann ich dann selbstständig weitmachen..=) grüsse edit: Ach ja, dein Tipp mit diesem Insider Guide gefällt mir. Das ist ein Buch, richtig? http://www.ehitex.de/p_info.php?xPD=98&products_id=180
Das ist die Luxusversion mit höher aufgelösten Grafiken zum Ausdrucken. Hier gibt es eine kostenlose Fassung: http://www.hitex.com/index.php?id=download-insiders-guides0 Andreas Bucher schrieb: > da ich jediglich das Signal messen möchte. Ob dies nun am > Ausgang 1 oder am Ausgang 7 ist ist mir egal. Solange du auch am richtigen Pin misst... Ich verwende kein uVision, kann da also nicht wirklich weiterhelfen. Falls das aber jemand kann, würde der wohl den gesamten Code sehen wollen. Wegen der Initialisierung und auch der Projekteinstellungen. Was mir aber am Code auffällt ist die Variable 'i' für delay(). Versuche doch mal die als
1 | volatile int i; |
zu definieren. Es könnte nämlich sein das der Compiler die for-Schleife weg optimiert. In der Schleife passiert ja nichts. Wenn du mit einem Multimeter misst würde der Pin dann zu schnell toggeln um eine vernünftige Anzeige zu erhalten. Bei einem Scope wäre es aber egal. Desweiteren haben die 2101, 2102 und 2103 soweit ich weiß bereits dieses fast-IO Feature. Wenn das aktiv ist funktionieren die IODIR, IOSET und IOCLR Register nicht. Dann mußt du FIODIR und Co verwenden. - Michael
Hallo, der LPC2103 wird folgendermaßen initialisert: Zuerst der ARM-Kern mit dem Assembler-File crt0.S (bei Keil heißt es Startup.S). Dort wird der Stack, das Interruptsystem und der Einsprung zum C-Programm vorbereitet. Ist dieses File in Dein Projekt eingebunden müsste Dein Programm eigentlich schon funktionieren. Der LPC2103 läuft jetzt zwar nur mit der Frequenz des angeschlossenen Quarzes, also mit 14,7456MHz, aber für Tests sollte es reichten. Dann werden die Peripherie-Einheiten, also PLL, MAM, VIC, GPIO, TIMER .., je nach Bedarf initialisiert. Soll der LPC mit höherer Taktrate arbeiten, als der der Quarzfrequenz, muss die PLL initialisiert werden. Dieses geschieht in meinen beiden Beispielen in der Funktion lowInit(). In der Funktion sysInit() wird der Interrupt-Controller initialisiert. Ab jetzt werden die Peripherie-Einheiten initialisiert, die benötigt werden. Dazu den entsprechenden Abschnitt im Usermanual durcharbeiten, besonders den Teil, welcher die Register des entsprechenden Peripherie-Blocks beschreibt (Register description). http://www.keil.com/dd/chip/3974.htm Ich hoffe das hilft
@michael: Vielen Dank für deinen Link, hört sich natürlich viel besser an, wen das gratis ist =)Ich werde dies mal in Ruhe studieren. @mario: Danke auch dir für deine Hilfe: Also wie du geschrieben hast, muss ich das Startup.S file einbinden, was ich auch gemacht hab. Trozdem scheint es nicht zu funktionieren -.- Irgendwie hab ich so langsam das Gefühl, dass ich mein Hex-File gar nicht auf den Controller lade?? Muss ich in meinem Programm nicht noch irgendwas mit den PINSEL0 machen? Weiss nicht genau, für was das diese verwendet werden, aber ich hab irgendwo davon gelesen..? grüsse
nein!!! alle Pins sind nach Reset als GPIO geschaltet. Reduziere mal Dein Programm das Pin nur auf H oder L zu schalten. z.B. #define LED 1<<7 #include <LPC2103.H> int main () { IODIR = LED ;//pin P0.7 configured as output IOCLR = LED ;//P0.7 goes LOW // oder // IOSET = LED ;//P0.7 goes HIGH poste mal Dein komplettes Projekt, gepackt
nimm Pin 0.14, der steuert die LED auf dem Stick an. #define LED 1<<14 #include <LPC2103.H> int main () { IODIR = LED ;//pin P0.14 configured as output //IOCLR = LED ;// LED aus IOSET = LED ;// LED an }
Hab dein Programm so übernommen, passiert nix. -.- Also komisch ist, dass mein Port 0.7 die ganze Zeit auf High steht, egal was ich mache. Irgendwie schliess ich daraus, dass ich mal ein Programm auf den Controller geladen habe, aber dieser Programm nicht mehr ändern kann.?? Naja, hier mal das komplette Programm im Anhang
Stimmt, hab ich beim Probieren ersetzt. Hab den Wert nun so geändert, dass er die LED direkt auf dem Print ansteuern soll. Aber das LED leuchtet bei mir sowiso schon die ganze Zeit. Ist das so nicht richtig? Und der Ausgangspin P0.7 bleibt bei mir weiterhin auf High, obwhol ich ihn zurückgesetzt hab. grüsse
ja die LED ist, wenn sie nicht angesteuert wird an. Das kannst Du sehen, wenn Du den Reset-Knopf drückt hälst. Mir fällt aber noch was ein: Flash-Magic startet, glaube ich, das geladene Programm nicht automatisch. Also beide Schibeschalter von S2 auf off (Richtung Steckerleisten) und Reset drücken.
Guten Morgen zusammen und danke für die Antworten =) Also, das main.hex programm ist sehr warscheinlich dies aus dem Artikel des MP2103. Richtig? Das läuft bei mir problemlos, sprich das LED blinkt. Dieses Programm verstehe ich aber hinten und vorne nicht, da es auch noch sehr viele Textbasierende Sachen hat. (für den Hyper-Terminal) Deshalb dachte ich, das ich ein eigenes, kleines Programm schreibe, um das LED blinken zu lassen. Das mit den Dip-Schaltenr auf OFF stellen und Reset drücken denke ich, dass dies nicht nötig ist, da das Testprogramm (main.hex) problemlos nach dem laden startet. Grüsse
hier das simple Blink-Programm ohne jeden Ballast für WinARM. Es wird nur der ARM-Core und das GPIO-Pin 14 initialisiert. vielleicht hilft`s
Aaaaaaaaaaaaaaah... Vielen Dank, ich kann erste Vortschritte Melden. =) Dein Hex-File funktioniert bei mir, jedoch wenn ich das Programm in KeiluVision kopiere(Main.c) dann funktioniert es nicht. Ich schliesse daraus, dass das Hex-File fehlerhaft generiert wird. Ich lade mir nun mal WinArm und melde mich dann nochmals. Vielen Dank Mario, für deine Hilfe =)) PS. Hast du demfall auch solch ein Board (MP2103)? =) grüsse
Ich glaube zu wissen, wesshalb Deine Programme nicht laufen: Du kompilierst nicht für den Flash-Adressbereich (0-0x7FFF) sondern für den RAM-Bereich (0x40000000-0x40001FFF). Dein Hex-File beginnt mit der Zeile: :020000040000FA Das bedeutet, dass Dein Programm bei der Adresse 0x40000000 beginnt. Wenn Flash-Magic dieses in den RAM läd, was ich vermute, und anschließend Reset ausgelöst wird, passiert garnichts. Schau mal in Deinen Einstellungen im uVision nach und vergleiche mit einem funktionierenden Projekt.
Yesss, deine Antwort war völlig Korrekt, habs nun mit dem Keil zum laufen gebracht. Respekt, hätte ich nie selber rausbekommen. Also ich bedanke mich bei dir vielmals. Hast mir sehr viel geholfen, vielen Dank. =)) Ihc wünsch dir noch einen schönen Abend, und bis zu meinem nächsten Problem. xD grüsse
Mario Pieschel schrieb: > Ich glaube zu wissen, wesshalb Deine Programme nicht laufen: > Du kompilierst nicht für den Flash-Adressbereich (0-0x7FFF) sondern für > den RAM-Bereich (0x40000000-0x40001FFF). > Dein Hex-File beginnt mit der Zeile: > :020000040000FA > > Das bedeutet, dass Dein Programm bei der Adresse 0x40000000 beginnt. Hmmm. Eigentlich genau nicht: Extended Linear Address Record Typ 04: Dieser Datensatztyp unterstützt die volle 32bit-Adressierung. Das Datenfeld enthält die oberen 16 Bit einer 32bit-Adresse. : 02 0000 04 Adresse(high word) Prüfsumme Adresse ist also 0x0000xxxx Warum es bei ihm nun funktioniert, weiß ich aber auch nicht ... Gruß Jobst
Hmm naja gut, was genau das Problem war weiss ich eigenltich nicht, aber ich hab folgendes gemacht: Im Keil uVision hab ich in den Einstellungen ein Hacken bei "Use Memory Layout from Target Dialog" gesetzt. Dabei wurden die R/O Base und R/W Base grau markiert. Da dachte ich, dass dies etwas mit den Rom/ Flash zu tun hat. Ist das nicht der Fall? Und noch eine Frage, ich bin in der zwischen Zeit ein bisschen weiter gekommen mit meinem Programmierkenntnissen, jedoch auch nur bescheiden..xD Hier mal mein Code, wäre froh, wenn sich den jemand anschauen und mir sagen könnte, ob ich das einigermassen richtig mache xD grüsse
1 | #define FOSC 14745000 // Die Frequenz der Taktquelle
|
2 | #define PLL_M 4 // Der Multiplikator für den CPU-Takt
|
3 | #define PLL_P 2 // Der Teiler für F_CCO (muss zwischen 156 MHz und 320 MHz liegen)
|
4 | #define CCLK (PLL_M * FOSC) // Die CPU frequenz nochmal als Zahlenwert definiert
|
5 | #define PLOCK (1<<10) // Das PLOCK-Bit im PLLSTAT-Register gibt an, ob die PLL auf die konfigurierte Frequenz eingestellt ist.
|
6 | |
7 | |
8 | #include "LPC2103.h" |
9 | |
10 | |
11 | int i, t,n; |
12 | |
13 | void InitPLL(void) |
14 | {
|
15 | PLLCFG = (PLL_M-1)|((PLL_P-1)<<5); // M=4 und P=2 (Multiplikatoren von 0 sind nicht erlaubt) |
16 | |
17 | PLLCON = 0x01; // PLL aktivieren |
18 | |
19 | PLLFEED = 0xAA; //PLL Feed-Sequenz |
20 | PLLFEED = 0x55; |
21 | while ( !( PLLSTAT & PLOCK ) ); // Darauf warten, dass die Änderungen übernommen werden |
22 | |
23 | MAMTIM = 3; |
24 | |
25 | PLLCON = 0x03; // PLL aktivieren und mit dem internen Taktgeber verbinden |
26 | PLLFEED = 0xAA; //PLL Feed Sequence |
27 | PLLFEED = 0x55; |
28 | }
|
29 | |
30 | void delay() |
31 | {
|
32 | for (i=0; i<=50000; i++); |
33 | }
|
34 | |
35 | int main() |
36 | {
|
37 | |
38 | InitPLL(); |
39 | |
40 | |
41 | |
42 | while(1) |
43 | {
|
44 | IODIR = 0x0000FFF0; |
45 | for (t=0x00000010; t <= 0x00001000; t = t<<1) |
46 | {
|
47 | IOSET = t; |
48 | delay(); |
49 | }
|
50 | for (n=0x00000010; n <= 0x00001000; n = n<<1) |
51 | {
|
52 | IOCLR = n; |
53 | delay(); |
54 | }
|
55 | |
56 | }
|
57 | |
58 | }
|
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.