Forum: Mikrocontroller und Digitale Elektronik Start-Stopp-Funktion für Knightrider Lauflicht programmieren


von Mario F. (ti_launchpad_f28027)


Lesenswert?

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
von Student (Gast)


Lesenswert?

- 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)

von Mario F. (Gast)


Lesenswert?

Nein auf die Rechenzeit kommt es nicht drauf an.

Danke für Deine Hilfe!

von MaWin (Gast)


Lesenswert?

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.

von Mario F. (Gast)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Mario F. (Gast)


Lesenswert?

Hallo Marc Vesely!

Danke für den Tipp.

Das ist echt sehr nett und hilft mir sehr.

LG.
Mario

von Falk B. (falk)


Lesenswert?

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
von Mario F. (Gast)


Lesenswert?

Hallo Falk!

Danke für den Tipp!

Aber irgendwie funktioniert das nicht.

LG.

Mario

von Falk B. (falk)


Lesenswert?

Es ist unvollständig, die Initialisierung fehlt!

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

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
von Mario F. (Gast)


Lesenswert?

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!

von Falk B. (falk)


Lesenswert?

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

von Mario F. (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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

von Mario F. (Gast)


Lesenswert?

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