Forum: Mikrocontroller und Digitale Elektronik LPC2103 Anfängerprogramm


von Peter P. (andy__1990)


Lesenswert?

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

von Peter P. (andy__1990)


Lesenswert?

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

von Peter P. (andy__1990)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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...
                  ^^        ^^^^

von lpc dude (Gast)


Lesenswert?

Pinselx.
Pins sind mehrfach belegt.wähle die gpio Funktion aus.

Kurzer Beitrag...aber schreib vom Handy und das sukkt

von Peter P. (andy__1990)


Lesenswert?

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

von lpc dude (Gast)


Lesenswert?

Selbststudium.
Suche nach dem lpc2xxx Insider guide.findest du bei hitex.

von Peter P. (andy__1990)


Lesenswert?

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

von Michael G. (let)


Lesenswert?

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

von Mario P. (mariopieschel)


Lesenswert?

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

von Peter P. (andy__1990)


Lesenswert?

@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

von Mario P. (mariopieschel)


Lesenswert?

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

von Mario P. (mariopieschel)


Lesenswert?

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

}

von Peter P. (andy__1990)


Angehängte Dateien:

Lesenswert?

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

von Mario P. (mariopieschel)


Lesenswert?

Fehler!!!

//flasch
#define LED 1<<8

//richtig
#define LED 1<<7

von Peter P. (andy__1990)


Lesenswert?

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

von Mario P. (mariopieschel)


Lesenswert?

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.

von Mario P. (mariopieschel)


Angehängte Dateien:

Lesenswert?

Lade mal das Programm in Deinen Stick.
und schreibe ob die LED blinkt

von Peter P. (andy__1990)


Lesenswert?

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

von Mario P. (mariopieschel)


Angehängte Dateien:

Lesenswert?

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

von Peter P. (andy__1990)


Lesenswert?

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

von Mario P. (mariopieschel)


Lesenswert?

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.

von Peter P. (andy__1990)


Lesenswert?

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

von Jobst M. (jobstens-de)


Lesenswert?

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

von Peter P. (andy__1990)


Lesenswert?

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
Noch kein Account? Hier anmelden.