Hallo! Ich hab da mal eine Frage und zwar weiß ich nicht wie ich eine Start-Stopp-Funktion für das Knightrider Lauflicht in C programmieren soll. Kann mir da jemand helfen? Also ich habe das TI Launchpad F28027 mit 4 LEDs, ich hab das Lauflicht über eine for-Schleife programmiert. [while(1) { for (counter = 0; counter < 7; counter++) { if (counter == 0) { GpioDataRegs.GPACLEAR.all = 0x8; // turns LED4(GPIO3) on } if (counter == 1) { GpioDataRegs.GPASET.bit.GPIO3 = 1; // turns LED1 off GpioDataRegs.GPACLEAR.all = 0x4; // turns LED3(GPIO2) on } if (counter == 2) { GpioDataRegs.GPASET.bit.GPIO2 = 1; // turns LED2 off GpioDataRegs.GPACLEAR.all = 0x2; // turns LED2(GPIO2) on } if (counter == 3) { GpioDataRegs.GPASET.bit.GPIO1 = 1; // turns LED3 off GpioDataRegs.GPACLEAR.all = 0x1; // turns LED1(GPIO0) on } if (counter == 4) { GpioDataRegs.GPASET.bit.GPIO0 = 1; // turns LED1 off GpioDataRegs.GPACLEAR.all = 0x2; // turns LED2(GPIO1) on } if (counter == 5) { GpioDataRegs.GPASET.bit.GPIO1 = 1; // turns LED1(GPIO0) off GpioDataRegs.GPACLEAR.all = 0x4; // turns LED1(GPIO0) on } if (counter == 6) { GpioDataRegs.GPASET.bit.GPIO2 = 1; // turns LED1(GPIO0) off GpioDataRegs.GPACLEAR.all = 0x8; // turns LED1(GPIO0) on } for(i = 0; i < 1000000; i++) { EALLOW; SysCtrlRegs.WDKEY = 0x55; SysCtrlRegs.WDKEY = 0xAA; EDIS; } } }] Danke schon mal im Voraus. LG. Mario
:
Verschoben durch User
- Nutze eine bool Variable "laufend" und nutze die anstatt des true in der while. - Packe dann den ganzen Code in eine Funktion und rufe diese mit einer Endlosschleife auf. Da verschenkst du natürlich Rechenzeit, aber darum geht es dir wohl eh nicht momentan? Mit laufend kannst du dann regulieren ob es laufen soll oder nicht. z.B. via Vergleich eines Inputpins (Dann brauchst du nur nen Schalter der dauerhaft eine Spannung anlegt) oder via Interrupt (Taster statt Schalter)
Nein auf die Rechenzeit kommt es nicht drauf an. Danke für Deine Hilfe!
Mario F. schrieb: > ich hab das Lauflicht über eine for-Schleife programmiert. Findest du nicht, dass dein Programm ungefähr 10 x so lang wie nötig ist und damit wartungs- und änderungsunfreundlich ? Ja, einen PortPin Zustand sollte man schon einlesen. Ist da ein Schalter dran, kann er direkt das Lauflicht stoppen.
Hallo MaWin! Ja klar ist das Programm bissl lang, aber es funktioniert. Bin ja auch noch Anfänger. Ja da ist ein Schalter dran am Port GPIO12. Danke für den Tipp! LG. Mario
Mario F. schrieb: > Kann mir da jemand helfen? Lege eine IF-Abfrage auf Schalterzustand gleich nach 'while(1)'
1 | while(1) |
2 | {
|
3 | if (schalter == ON) { |
4 | // dein Knightrider code
|
5 | }
|
6 | else { |
7 | // alles aus
|
8 | // oder bleib stehen
|
9 | }
|
10 | }
|
:
Bearbeitet durch User
Hallo Marc Vesely! Danke für den Tipp. Das ist echt sehr nett und hilft mir sehr. LG. Mario
1 | #include "F2802x_Examples.h" |
2 | |
3 | #define LIGHTSHOW_CNT 8
|
4 | |
5 | void knight_rider(void) { |
6 | static int cnt; |
7 | const int lightshow[LIGHTSHOW_CNT] = {0x0, 0x1, 0x2, 0x4, 0x8, 0x4, 0x2, 0x1}; |
8 | |
9 | GpioDataRegs.GPADAT = (GpioDataRegs.GPADAT & ~0xF) | lightshow[cnt]; |
10 | if (++cnt >= LIGHTSHOW_CNT) cnt=0; |
11 | }
|
12 | |
13 | int main(void) { |
14 | |
15 | // Initialisierung etc.
|
16 | |
17 | |
18 | while (1) { |
19 | if (GpioDataRegs.GPADAT.bit.GPIO12) { |
20 | knight_rider(); |
21 | } else { |
22 | // stop light show, do nothing
|
23 | }
|
24 | |
25 | DELAY_US(100000); |
26 | }
|
27 | |
28 | }
|
:
Bearbeitet durch User
Hallo Falk! Danke für den Tipp! Aber irgendwie funktioniert das nicht. LG. Mario
Es ist unvollständig, die Initialisierung fehlt!
Hier ein komplettes CCS5 Projekt. Kleiner Tip für Anfänger. ACHTUNG!!! Die Projekte vom CCS initialisieren statische und globale Variablen ohne explizite Initialisierung NICHT mit 0, wie es der Rest der Compiler dieser Welt tut!!! Wenn man das will, muss man das per ASM-Schnipsel selber machen! Den hab ich aber im Moment nicht hier. Also Workaround muss man ALLE statischen und globalen Variablen EXPLIZIT initialisieren. Also überall bei der Definition einen Initialwert zuweisen!
:
Bearbeitet durch User
Hallo Falk! Da wären wir gleich bei der nächsten Frage. Wie kann ich CCS-Projekte direkt öffnen? Also wir müssen im Praktikum immer ein neues Projekt erstellen und danach das Projekt vom vorhergehenden Mal, welches in eine Zip-Datei gesichert wurde wieder importieren. LG. Mario P.S.: Trotzdem erstmal vielen Dank für das Programm!
@Mario F. (Gast) >Wie kann ich CCS-Projekte direkt öffnen? Man muss sie in den Workspace importieren. Menu Project -> Import existing CCS project >Also wir müssen im Praktikum immer ein neues Projekt erstellen Das muss man nicht. >und >danach das Projekt vom vorhergehenden Mal, welches in eine Zip-Datei >gesichert wurde wieder importieren. Das muss man.
Hallo Falk! Danke erstmal. Ja okay verstehe, aber was mach ich wenn ich keine Zip-Datei habe? Also kann man das Projekt auch so irgendwie öffnen? LG. Mario
@ Mario F. (Gast) >Ja okay verstehe, aber was mach ich wenn ich keine Zip-Datei habe? Das ZIP ist doch nur zum Packen und Zusammenfassen der Daten. Man kann das Projektverzeichnis auch normal kopieren und importieren. >Also kann man das Projekt auch so irgendwie öffnen? Ja, mittels Import in den Workspace.
Hallo Falk! Okay, danke schön! LG. Mario
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.