Forum: Compiler & IDEs Verständnisproblem Programmablauf


von Mike (Gast)


Lesenswert?

Hey
Ich habe ein kleines Verständnisproblem bezüglich des Programmablaufs.
Geplant ist ein RGB Controller, welcher erstmal nur zwischen ‚fixer 
Farbe‘ und ‚Regenbogenverlauf‘ wechseln kann.
Das Problem was ich derzeit habe ist, dass wenn ich einmal im 
Regenbogenverlauf bin, komm ich nicht mehr hinaus, da der Regenbogen ja 
in einer Endlosschleife abläuft.

Eine Möglichkeit wäre ja zb. eine Variable zu nehmen, welche 0 ist. In 
der ISR setze ich diese Variable auf 1 und die Abbruchbedingung für die 
while Schleife wäre dann while(var = 0).
Jedoch habe ich dann das Problem, dass immer die aktuelle Runde 
durchlaufen wird, und dann erst abgebrochen wird.
Ich würde natürlich wollen dass sofort wenn das Ereignis eintritt aus 
dem Verlauf gesprungen wird.
Wie kann ich das am besten anstellen?

Danke lg
Mike

von Peter II (Gast)


Lesenswert?

Mike schrieb:
> Wie kann ich das am besten anstellen?

an einer geeigneten stelle einfach ein

if ( var==1 ) {
  return;
};

geht nur wenn das ganze auch eine prozedur ist.

von Karl H. (kbuchegg)


Lesenswert?

Oder aber so wie man das auf einem µC grundsätzlich macht:

Immer nur ein kleines bischen Arbeit erledigen lassen. Erst dadurch dass 
dieses kleine bischen in der Hauptschleife immer und immer wieder zum 
Zug kommt, wird dann die komplette Arbeit erledigt.


1
  while( 1 )  {         // Die Hauptschleife. Das ist die einzige
2
                        // while Schleife die länger laufen darf
3
4
    if( Pin .... )      // wie steht der Schalter? Regenbogen oder normal
5
    {
6
       Einzelfarbe ausgeben
7
    }
8
9
    else 
10
    {
11
      nächste Farbe im Regenbogen ausgeben
12
      wichtig: hier wird nur auf die eine nächste Farbe weitergeschaltet
13
      keiensfalls wird hier der komplette Regenbogen durchlaufen
14
      Die nächste Farbe im Regenbogen kommt dann, wenn das Programm
15
      erneut in diesen Zweig kommt
16
    }
17
  }

von Mike (Gast)


Lesenswert?

Ah okay das klingt logisch.
Das bedeutet, wenn ich jez annehme dass mein Regenbogen aus 100 
verschiedenen Farben besteht, dann würde das ungefähr so aussehen:
1
main()
2
{
3
  i = 0;
4
5
 while(1)
6
 {
7
   if(var = 1)
8
   {
9
     weißAnzeigen();
10
   }
11
 
12
   else if (var = 0)
13
   {
14
     setzeFarbe(i);
15
     i++;
16
   }
17
 }
18
}
19
20
21
ISR()
22
{
23
  //var togglen
24
}

Somit würde an die Funktion setzeFarbe immer nur der Wert übergeben 
werden welcher angezeigt werden soll. Die Variable i würde hier in dem 
Beispiel die verschiedenen Farbtöne repräsentieren.
Habe ich das richtig verstanden?

Danke für die Antworten!

von Karl H. (kbuchegg)


Lesenswert?

Mike schrieb:
> Ah okay das klingt logisch.
> Das bedeutet, wenn ich jez annehme dass mein Regenbogen aus 100
> verschiedenen Farben besteht, dann würde das ungefähr so aussehen:
>
> [code]
>
> main()
> {
>   i = 0;
>
>  while(1)
>  {
>    if(var = 1)
>    {
>      weißAnzeigen();
>    }
>
>    else if (var = 0)

wenn var sowieso nur 0 oder 1 sein kann, dann brauchst du den Test 
nicht. Jeder unnötige Test ist nur eine Fehlerquelle mehr

> ISR()
> {
>   //var togglen
> }

Wozu?
Ich meine, wozu brauchst du da eine ISR?
Lass doch dein Programm ständig den Eingang bei jedem Durchlauf durch 
die Hauptschleife abfragen! Ein Durchlauf druch die Hauptschleife dauert 
maximal ein paar µSekunden. So schnell kannst du als Mensch gar nicht 
schalten, dass dein Programm das nicht mitkriegen würde.

Tastenabfrage (oder Schalter abfragen) mittels eines Interrupts ist 
Unsinn und macht nur Probleme! Den Themenkreis 'Entprellen' musst du 
sowieso getrennt davon angehen. Ein externer Interrupt ist da keine 
Lösung dafür.
Entprellung

> Somit würde an die Funktion setzeFarbe immer nur der Wert übergeben
> werden welcher angezeigt werden soll. Die Variable i würde hier in dem
> Beispiel die verschiedenen Farbtöne repräsentieren.
> Habe ich das richtig verstanden?

Ganz genau

von Mike (Gast)


Lesenswert?

Okay, verstehe wie dus meinst.
Stimmt, ist eigentlich unnötig. Ich werd mich jetzt mal ransetzen und 
herumprobieren.
Danke für die Hilfe.

Schönen Abend noch!

von Karl H. (kbuchegg)


Lesenswert?

Mike schrieb:
> Okay, verstehe wie dus meinst.
> Stimmt, ist eigentlich unnötig. Ich werd mich jetzt mal ransetzen und
> herumprobieren.

Eines noch.

Die Idee mit

   Tastendruck schaltet zwischen den Modi hin und her

ist zwar naheliegend, ist aber erstaunlich schwierig, wenn man es 
richtig machen will. Der Grund ist das bereits angesprochene 
Tastenprellen: Du drückst einmal drauf und dein µC registriert 3 bis 8 
Schaltvorgänge.

Einfacher ist es fürs erste, wenn du entweder

* 2 Taster nimmst. Einer schaltet in den Normalmodus, der andere
  in den Regenbogenmodus

* oder nur 1 Taster, der gedrückt gehalten werden muss und je nachdem
  ob er gedrückt oder nicht gedrückt ist unterschiedliche Dinge bewirkt.

  Oder eine Variation davon, die elektrisch identisch ist:
  ein Schiebeschalter

von Mike (Gast)


Lesenswert?

Danke für den Tipp.
Ich denke ich werde es mit mehreren Tastern lösen. Ist für mich die 
komfortabelste Möglichkeit :)

Außerdem: Hab gerade ein bisschen herumprobiert und das Programm läuft 
schon :D
Jedenfalls das Grundgerüst

Herzlichen Dank nochmal für deine kompetente Hilfe!

von Matthias L. (Gast)


Lesenswert?


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.