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
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.
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 | } |
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!
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
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!
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
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!
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.