Forum: Mikrocontroller und Digitale Elektronik LPC913 in C Ports definieren


von John G. (Gast)


Lesenswert?

Guten Tag zusammen

Ich möchte gerne ein kleines C-Programm auf den LPC913 laden (LED 
blinken mit 10 LEDs). Ich benutze Keil 3 und würde gerne wissen wie ich 
die Ports initalisieren soll. Meine Idee wäre ca. so:

#include <reg913.h>


int main(void)
{
  P0M2 = 0xFF; // setzt P0 zu open-drain
  P1M2 = 0xD3; // setzt P1 zu open-drain
  P2M2 = 0xFF; // setzt P2 zu open-drain
  P3M2 = 0x03; // setzt P3 zu open-drain

  while (1) {


  }
}


Wie geht das nun genau? Ich weiss das das nicht so schwierig ist, aber 
ich verzweifle an diesen Ports, weil ich aus dem Datenblatt nicht schlau 
werde :D

Ich hoffe ihr könnt mir helfen :D

Lg

von Peter D. (peda)


Lesenswert?

Nimm ein Blatt Papier und schreib in Worten den Programmablauf auf.

Den Editor öffnet man erst, wenn man weiß, was man machen will.


Peter

von John G. (Gast)


Lesenswert?

Ja klar das habe ich ja auch gemacht.

Ein Zufallsgenerator soll eine Zahl zwischen 0-1024 anzeigen und 500 ms 
warten bis der nächste Wert angezeigt wird.

Meine Frage bezieht sich auf das Initaliesieren und definieren der 
Ports, da ich gerne alle Ports auf open drain setzen würde und 1.5 
(Reset) und 1.0 (TxD) nicht beachten möchte.

Wie mache ich das am Besten?

von Ralf (Gast)


Lesenswert?

Moin moin,

> Ein Zufallsgenerator soll eine Zahl zwischen 0-1024
Geht mit 10 LEDs nicht.

> Meine Frage bezieht sich auf das Initaliesieren und definieren der Ports,
> da ich gerne alle Ports auf open drain setzen würde ...
> Wie mache ich das am Besten?
In dem du uns nicht nachfragen lässt, wie die LEDs mit dem Controller 
verbunden sind (H/L-aktiv), einen Link auf's Datenblatt gibst und 
beschreibst, an welcher Stelle des Datenblatts dein Verständnis klemmt 
:)
Und bitte nicht einfach sagen, ich versteh's nicht, sondern WAS du nicht 
verstehst.

Ralf

von John G. (Gast)


Lesenswert?

Ralf schrieb:
> Moin moin,
>
>> Ein Zufallsgenerator soll eine Zahl zwischen 0-1024
> Geht mit 10 LEDs nicht.

Klar geht das : 2^10 Zustände

> In dem du uns nicht nachfragen lässt, wie die LEDs mit dem Controller
> verbunden sind (H/L-aktiv), einen Link auf's Datenblatt gibst und
> beschreibst, an welcher Stelle des Datenblatts dein Verständnis klemmt
> :)
> Und bitte nicht einfach sagen, ich versteh's nicht, sondern WAS du nicht
> verstehst.
>
> Ralf

Datenblatt wäre 
http://www.nxp.com/documents/data_sheet/P89LPC912_913_914.pdf

und ich wollte eigentlich auf jeden Port ein LED setzen ausser auf 1.5 
(da input only) und auf 1.0. Ausserdem programmiere ich mit Keil und in 
der Headerdatei sind ja die Ports definiert. Wenn ich jetzt diese Ports 
wieder global definiere kommt ein Fehler. Ich muss sie ja zuerst auf 
open drain oder quasi bidirectional schalten und danach muss ich ja eine 
Ausgabe an die LEDs senden. Aber wie? :D

Vielen Dank für eure Hilfe

John G.

von John G. (Gast)


Lesenswert?

ach ja und noch eine Frage. Dieser uC hat ja eine UART-Schnittstelle. 
Kann ich nun einfach diesen Adapter dranhängen und dann kann man ihn 
programmieren (natürlich mit dem seriellen USB)

http://www.conrad.de/ce/de/product/197326/MINI-USB-TO-UART-CONVERTER

von Peter D. (peda)


Lesenswert?

John G. schrieb:
>>> Ein Zufallsgenerator soll eine Zahl zwischen 0-1024
>> Geht mit 10 LEDs nicht.
>
> Klar geht das : 2^10 Zustände

Stimmt.
"dazwischen" sind ja nur 1 .. 1023.
Hätte er "von bis" gesagt, dann paßts nicht mehr.


Peter

von Peter D. (peda)


Lesenswert?

John G. schrieb:
> Ich muss sie ja zuerst auf
> open drain oder quasi bidirectional schalten und danach muss ich ja eine
> Ausgabe an die LEDs senden. Aber wie? :D

Du denkst zu monolitisch. Du mußt das Problem in einzelne Aufgaben 
aufteilen.

Fange erstmal mit einer Blink-LED an.
Ports und Konfigurationsregister sind auch nur Variablen.
Wie man in einer Variable einzelne Bits ändert, steht z.B. hier:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=37871&start=all&postdays=0&postorder=asc


Peter

von John G. (Gast)


Lesenswert?

Peter Dannegger schrieb:
>> Klar geht das : 2^10 Zustände
>
> Stimmt.
> "dazwischen" sind ja nur 1 .. 1023.
> Hätte er "von bis" gesagt, dann paßts nicht mehr.
>
>
> Peter

sry meinte natürlich 512 Zustände. Alle dazwischen auch. So kann ich mit 
den LEDs eigentlich jede beliebige Zahl zwischen 0 und 512 darstellen. 
Eigentlich eine binäre Anzeige mit den LEDs einfach mit 
zufallsgenerierten Zahlen

von John G. (Gast)


Lesenswert?

Peter Dannegger schrieb:
> John G. schrieb:
>> Ich muss sie ja zuerst auf
>> open drain oder quasi bidirectional schalten und danach muss ich ja eine
>> Ausgabe an die LEDs senden. Aber wie? :D
>
> Du denkst zu monolitisch. Du mußt das Problem in einzelne Aufgaben
> aufteilen.
>
> Fange erstmal mit einer Blink-LED an.
> Ports und Konfigurationsregister sind auch nur Variablen.
> Wie man in einer Variable einzelne Bits ändert, steht z.B. hier:
> http://www.avrfreaks.net/index.php?name=PNphpBB2&f...
>
>
> Peter

Ja ok ich fange mal mit den Blink LEDs an. Aber wie setze ich die I/O's 
auf quasi-bidirectional?

einfach mit folgenden Befehlen?

  P0M1 = 0; // setzt P0 zu quasi-bidirectional
  P0M2 = 0; // setzt P0 zu quasi-bidirectional
  P1M1 = 0; // setzt P1 zu quasi-bidirectional
  P1M2 = 0; // setzt P1 zu quasi-bidirectional
  P2M1 = 0; // setzt P2 zu quasi-bidirectional
  P2M2 = 0; // setzt P2 zu quasi-bidirectional
  P3M1 = 0; // setzt P3 zu quasi-bidirectional
  P3M2 = 0; // setzt P3 zu quasi-bidirectional

Dann schreit der Compiler, dass er die Namen nicht überschreiben kann, 
da sie im Header definiert sind.

Vielen Dank für eure Hilfe

John G.

von Peter D. (peda)


Lesenswert?

John G. schrieb:
> Dann schreit der Compiler, dass er die Namen nicht überschreiben kann,
> da sie im Header definiert sind.

Der Compiler sagt Dir also:
"error in blah.c, line 123: ich schreie"

Du mußt schon den exakten Wortlaut der 1. Fehlermeldung posten 
(copy&paste)!

Und das C-File als Anhang, damit man die Zeilennummer zuordnen kann.


Peter

von John G. (Gast)


Lesenswert?

so jetzt bin ich ein Stück weiter. Das File sieht so aus:

/*---------------------------------------------------------------------- 
--------
Blinklicht
------------------------------------------------------------------------ 
------*/

#include <reg913.h>
#include <stdlib.h>
#define F_CPU 1000000UL  // 1 MHz

  P0M1^6 = 0;
  P0M1^5 = 0;
  P0M1^4 = 0;
  P0M1^2 = 0;
  P0M2^6 = 0; // setzt P0.6 zu quasi-bidirectional
  P0M2^5 = 0; // setzt P0.5 zu quasi-bidirectional
  P0M2^4 = 0; // setzt P0.4 zu quasi-bidirectional
  P0M2^2 = 0; // setzt P0.2 zu quasi-bidirectional
  P1M1^0 = 0;
  P1M1^1 = 0;
  P1M2^0 = 0; // setzt P1.0 zu quasi-bidirectional
  P1M2^1 = 0; // setzt P1.1 zu quasi-bidirectional
  P2M1^5 = 0;
  P2M1^3 = 0;
  P2M1^2 = 0;
  P2M2^5 = 0; // setzt P2.5 zu quasi-bidirectional
  P2M2^3 = 0; // setzt P2.3 zu quasi-bidirectional
  P2M2^2 = 0; // setzt P2.2 zu quasi-bidirectional
  P3M1^1 = 0;
  P3M1^0 = 0;
  P3M2^1 = 0; // setzt P3.1 zu quasi-bidirectional
  P3M2^0 = 0; // setzt P3.0 zu quasi-bidirectional


int main(void)
{

  while (1) {


  }
}

0 Fehler bei der Bezeichnung. Kann man es so nun machen? Wie kann ich 
nun alle Ausgänge zusammennehmen? Denn es gibt ja zwei "modes". Muss ich 
nun Mode 1 oder Mode 2 oder einfach:

allLEDs = P0^2 & P0^4 usw. schreiben?

von Ralf (Gast)


Lesenswert?

Peter Dannegger schrieb:
>>>> Ein Zufallsgenerator soll eine Zahl zwischen 0-1024
>>> Geht mit 10 LEDs nicht.
>>
>> Klar geht das : 2^10 Zustände
>
> Stimmt.
> "dazwischen" sind ja nur 1 .. 1023.
> Hätte er "von bis" gesagt, dann paßts nicht mehr.
oO Du willst es wirklich so weit runterbrechen? =)
Okay, bitte sehr: Wenn einer "zwischen" und "bis" (angedeutet durch den 
Bindestrich) in einem Satz schreibt, zusammen mit einer Angabe, wieviele 
Werte er darstellen will und wieviele binäre Anzeigeeinheiten er hat, 
dann geh ich wie sonst auch in der Elektronik erstmal vorsichtshalber 
vom WorstCase aus, und das heisst ich weise darauf hin, dass es nicht 
passt ;)

> Dann schreit der Compiler, dass er die Namen nicht überschreiben kann,
> da sie im Header definiert sind.
Dann behaupte ich, die gezeigten Codezeilen sind NICHT die 
fehlerverursachenden, sondern die liegen irgendwo weiter oben.
Wie Peter geschrieben hat, poste mal die komplette Fehlermeldung, und 
auch den bisherigen Code.

Ralf

von John G. (Gast)


Lesenswert?

>> Dann schreit der Compiler, dass er die Namen nicht überschreiben kann,
>> da sie im Header definiert sind.
> Dann behaupte ich, die gezeigten Codezeilen sind NICHT die
> fehlerverursachenden, sondern die liegen irgendwo weiter oben.
> Wie Peter geschrieben hat, poste mal die komplette Fehlermeldung, und
> auch den bisherigen Code.
>
> Ralf

/*---------------------------------------------------------------------- 
--------
Blinklicht
------------------------------------------------------------------------ 
------*/

#include <reg913.h>
#include <stdlib.h>

  P0M1^6 = 0;
  P0M1^5 = 0;
  P0M1^4 = 0;
  P0M1^2 = 0;
  P0M2^6 = 0; // setzt P0.6 zu quasi-bidirectional
  P0M2^5 = 0; // setzt P0.5 zu quasi-bidirectional
  P0M2^4 = 0; // setzt P0.4 zu quasi-bidirectional
  P0M2^2 = 0; // setzt P0.2 zu quasi-bidirectional
  P1M1^0 = 0;
  P1M1^1 = 0;
  P1M2^0 = 0; // setzt P1.0 zu quasi-bidirectional
  P1M2^1 = 0; // setzt P1.1 zu quasi-bidirectional
  P2M1^5 = 0;
  P2M1^3 = 0;
  P2M1^2 = 0;
  P2M2^5 = 0; // setzt P2.5 zu quasi-bidirectional
  P2M2^3 = 0; // setzt P2.3 zu quasi-bidirectional
  P2M2^2 = 0; // setzt P2.2 zu quasi-bidirectional
  P3M1^1 = 0;
  P3M1^0 = 0;
  P3M2^1 = 0; // setzt P3.1 zu quasi-bidirectional
  P3M2^0 = 0; // setzt P3.0 zu quasi-bidirectional


int main(void)
{

  while (1) {

  allLEDs = P0^2 & P0^4 &  P0^5 & P0^6 & P1^0 & P1^1 & P2^2 & P2^3 & 
P2^5 & P3^0 & P3^1;


  }
}

(8)    Error C129 missing ; before ^

von R. W. (quakeman)


Lesenswert?

John G. schrieb:
>   P0M1^6 = 0;
>   P0M1^5 = 0;
>   P0M1^4 = 0;
>   P0M1^2 = 0;
>   P0M2^6 = 0; // setzt P0.6 zu quasi-bidirectional
>   P0M2^5 = 0; // setzt P0.5 zu quasi-bidirectional
>   P0M2^4 = 0; // setzt P0.4 zu quasi-bidirectional
>   P0M2^2 = 0; // setzt P0.2 zu quasi-bidirectional
>   P1M1^0 = 0;
>   P1M1^1 = 0;
>   P1M2^0 = 0; // setzt P1.0 zu quasi-bidirectional
>   P1M2^1 = 0; // setzt P1.1 zu quasi-bidirectional
>   P2M1^5 = 0;
>   P2M1^3 = 0;
>   P2M1^2 = 0;
>   P2M2^5 = 0; // setzt P2.5 zu quasi-bidirectional
>   P2M2^3 = 0; // setzt P2.3 zu quasi-bidirectional
>   P2M2^2 = 0; // setzt P2.2 zu quasi-bidirectional
>   P3M1^1 = 0;
>   P3M1^0 = 0;
>   P3M2^1 = 0; // setzt P3.1 zu quasi-bidirectional
>   P3M2^0 = 0; // setzt P3.0 zu quasi-bidirectional

Um alle Ports des P913 auf quasi-bidirectional zu stellen, abgesehen von 
P1.5/Reset kannst du folgenden Ablauf verwenden:

-=Pin nicht vorhanden
x=Pin vorhanden
R=Reset Pin

P0
-xxx-x--
10001011=8B

P1
--R---xx
11111100=FC

P2
--x-xx--
11010011=D3

P3
------xx
11111100=FC

Daraus folgt:
P0M1 &= 0x8B;
P1M1 &= 0xFC
P2M1 &= 0xD3
P3M1 &= 0xFC

PxM2 muss nicht verändert werden, da diese SFR nach dem Einschalten alle 
auf 0 stehen.

>   allLEDs = P0^2 & P0^4 &  P0^5 & P0^6 & P1^0 & P1^1 & P2^2 & P2^3 &
> P2^5 & P3^0 & P3^1;

Wo ist denn deine Deklaration von "allLEDs" und was soll diese Zeile 
deiner Meinung nach überhaupt bewirken?

Ciao,
     Rainer

von John G. (Gast)


Lesenswert?

Fox Mulder schrieb:
> P0M1 &= 0x8B;
>
> P1M1 &= 0xFC
>
> P2M1 &= 0xD3
>
> P3M1 &= 0xFC

vielen Dank. Nun sieht mein Programm wie folgt aus:

/*---------------------------------------------------------------------- 
--------
Blinklicht
------------------------------------------------------------------------ 
------*/

#include <reg913.h>


P0M1 &= 0x8B;
P1M1 &= 0xFC;
P2M1 &= 0xD3;
P3M1 &= 0xFC;

int main(void)
{

  int allLEDs = P0^2 & P0^4 &  P0^5 & P0^6 & P1^0 & P1^1 & P2^2 & P2^3 & 
P2^5 & P3^0 & P3^1;

  while (1) {

  allLEDs = 1 //delay?
  allLEDs = 0 //delay?

  }
}

wie kann ich nun den delay einstellen?

und es kommt immernoch die Fehlermeldung:
C:\PROGRAM FILES\C51\EXAMPLES\HELLO\Blinklicht.C(8): error C129: missing 
';' before '&='

von Peter D. (peda)


Lesenswert?

Ein MC ist kein FPGA. Du kannst daher keine Drähte ziehen zwischen den 
Variablen.
Du mußt jedesmal die eine Variable in die andere kopieren, wenn sie sich 
ändern soll.
Und wenn Du nur einzelne Bits kopieren willst, geht das nur so, wie hier 
beschrieben:
Beitrag "Re: LPC913 in C Ports definieren"


Peter

von John G. (Gast)


Lesenswert?

*----------------------------------------------------------------------- 
-------
Blinklicht
------------------------------------------------------------------------ 
------*/

#include <reg913.h>


P0M1 &= 0x8B;
P1M1 &= 0xFC;
P2M1 &= 0xD3;
P3M1 &= 0xFC;

int main(void)
{

  //int allLEDs = P0^2 & P0^4 & P0^5 & P0^6 & P1^0 & P1^1 & P2^2 & P2^3 
& P2^5 & P3^0 & P3^1;

  while (1) {

  P0^2 = 1;
  P0^4 = 1;
  P0^5 = 1;
  P0^6 = 1;
  P1^1 = 1;
  P2^2 = 1;
  P2^3 = 1;
  P2^5 = 1;
  P3^0 = 1;
  P3^1 = 1;

  //delay

  P0^2 = 0;
  P0^4 = 0;
  P0^5 = 0;
  P0^6 = 0;
  P1^1 = 0;
  P2^2 = 0;
  P2^3 = 0;
  P2^5 = 0;
  P3^0 = 0;
  P3^1 = 0;

  //delay

  }
}

so?
In der Headerdatei sind P3^1 usw. schon als sbit definiert worden und 
sind daher ja einzelne Bits die zusammen auf 1 oder 0 gesetzt werden 
können. Oder irre ich micht?

Lg John

von Karl H. (kbuchegg)


Lesenswert?

1
*------------------------------------------------------------------------------
2
Blinklicht
3
------------------------------------------------------------------------------*/
4
5
#include <reg913.h>
6
7
8
P0M1 &= 0x8B;
9
P1M1 &= 0xFC;
10
P2M1 &= 0xD3;
11
P3M1 &= 0xFC;

Seit wann ist es denn in C erlaubt, dass man ausführbare Anweisungen 
ausserhalb von Funktionen hat?

Du musst schon nach den C-Regeln spielen! Wenn du die nicht kennst, dann 
kauf dir erst mal ein C-Buch und eigne dir Grundkentnisse in C an.

1
#include <reg913.h>
2
3
int main(void)
4
{
5
  int i;
6
7
  P0M2 = 0xFF;
8
9
  while (1) {
10
    for( i = 0; i < 256; ++i )
11
      P0 = i;
12
  }
13
}

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.