mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LPC2103 Anfängerprogramm


Autor: Peter Pan (andy__1990)
Datum:

Bewertung
0 lesenswert
nicht 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-Sti...)

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

Autor: Peter Pan (andy__1990)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Pan (andy__1990)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...
                  ^^        ^^^^

Autor: lpc dude (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pinselx.
Pins sind mehrfach belegt.wähle die gpio Funktion aus.

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

Autor: Peter Pan (andy__1990)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: lpc dude (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Selbststudium.
Suche nach dem lpc2xxx Insider guide.findest du bei hitex.

Autor: Peter Pan (andy__1990)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael G. (let)
Datum:

Bewertung
0 lesenswert
nicht 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
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

Autor: Mario Pieschel (mariopieschel)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Pan (andy__1990)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mario Pieschel (mariopieschel)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mario Pieschel (mariopieschel)
Datum:

Bewertung
0 lesenswert
nicht 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

}

Autor: Peter Pan (andy__1990)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Mario Pieschel (mariopieschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fehler!!!

//flasch
#define LED 1<<8

//richtig
#define LED 1<<7

Autor: Peter Pan (andy__1990)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mario Pieschel (mariopieschel)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mario Pieschel (mariopieschel)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Lade mal das Programm in Deinen Stick.
und schreibe ob die LED blinkt

Autor: Peter Pan (andy__1990)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mario Pieschel (mariopieschel)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Pan (andy__1990)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mario Pieschel (mariopieschel)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Pan (andy__1990)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jobst M. (jobstens-de)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Pan (andy__1990)
Datum:

Bewertung
0 lesenswert
nicht 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

#define FOSC  14745000      // Die Frequenz der Taktquelle
#define PLL_M  4          // Der Multiplikator für den CPU-Takt
#define PLL_P  2          // Der Teiler für F_CCO (muss zwischen 156 MHz und 320 MHz liegen)
#define CCLK  (PLL_M * FOSC)      // Die CPU frequenz nochmal als Zahlenwert definiert                
#define PLOCK (1<<10)        // Das PLOCK-Bit im PLLSTAT-Register gibt an, ob die PLL auf die konfigurierte  Frequenz eingestellt ist.


#include "LPC2103.h"


int i, t,n;

void InitPLL(void) 
{
  PLLCFG = (PLL_M-1)|((PLL_P-1)<<5); // M=4 und P=2 (Multiplikatoren von 0 sind nicht erlaubt)
 
  PLLCON = 0x01;           // PLL aktivieren
 
  PLLFEED = 0xAA;            //PLL Feed-Sequenz
  PLLFEED = 0x55;
  while ( !( PLLSTAT & PLOCK ) );   // Darauf warten, dass die Änderungen übernommen werden 
 
  MAMTIM = 3; 
 
  PLLCON = 0x03;             // PLL aktivieren und mit dem internen Taktgeber verbinden
  PLLFEED = 0xAA;             //PLL Feed Sequence
  PLLFEED = 0x55;
}

void delay()
{
for (i=0; i<=50000; i++);
}

int main()
{

InitPLL();  



while(1)
{
    IODIR = 0x0000FFF0;
    for (t=0x00000010; t <= 0x00001000; t = t<<1)
    {      
      IOSET = t;
    delay();
    }
    for (n=0x00000010; n <= 0x00001000; n = n<<1)
    {      
      IOCLR = n;
    delay();
    }

}

}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.