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
Nimm ein Blatt Papier und schreib in Worten den Programmablauf auf. Den Editor öffnet man erst, wenn man weiß, was man machen will. Peter
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?
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
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.
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
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
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
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
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.
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
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?
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
>> 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 ^
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
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 '&='
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
*----------------------------------------------------------------------- ------- 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.