Hallo, Ich habe sehr wenig Ahnung in Sachen Programmieren, aber im Geschäft muss ich ein bestehendes Programm ändern. Gegeben ist ein Loop der die Helligkeit eines LEDs von max auf min und von min auf max ändert nur wenn die Taste PINB3 gedrückt ist. Ich möchte dass der Loop nur einseitig lauft und einmal bei min stehen bleibt bis die Taste erneut gedruckt wird und dann wieder bei max stehen bleibt bis die Taste wieder gedrückt wird. if(!(PINB & (1<<PINB3)) && StatusFlag.oneS) ///Taster wird gedrückt { { if(StatusFlag.AD3_UP) { if(sAD3<32) // wenn sAD3 Wert kleiner 32 ist { sAD3++; } else StatusFlag.AD3_UP=0; } else { if(sAD3>3) // wenn sAD3 Wert größer 3 ist { sAD3--; } else StatusFlag.AD3_UP=1; } vielen Dank } }
Sehe keinen loop. Nur einige if-Abfragen. So wird das nichts. Poste alles.
kann ich leider nicht sry. Der überprüft ob, StatusFlag.AD3_UP=1 ist. Wenn StatusFlag.AD3_UP!=1 ist springt er auf else und macht sAD3-- bis es nicht mehr >3 ist. Dann wird StatusFlag.AD3_UP=1 und sAD3 wird hoch gezählt bis nicht mehr <32 ist. Das wiederholt er solange die Taste gedruckt ist. Wie kann ich ihm sagen, dass er bis nächter Tastendruck die Stellung halten soll. Wenn sAD3 nicht mehr >3 ist und sAD3 nicht mehr <32 ist? 1x drucken von max auf min 1x drucken von min auf max
Dimi schrieb: > if(!(PINB & (1<<PINB3)) && StatusFlag.oneS) ///Taster wird gedrückt Das ist ja mal eine verbastelte Abfrage.... > Wie kann ich ihm sagen, dass er bis nächter Tastendruck die Stellung > halten soll. Du meinst also, dass du nicht eine halbe Minute den Taster gedrückt halten musst? Sondern du einen Start-Stop-Taster hast?
Lothar Miller schrieb: > Du meinst also, dass du nicht eine halbe Minute den Taster gedrückt > halten musst? Sondern du einen Start-Stop-Taster hast? Ne, ich halte den Taster gedruckt bis es entweder nicht mehr >3(min Wert erreicht hat) ist oder nicht mehr <32 (max Wert erreicht hat) ist. Wenn er den Wert erreicht hat, soll er nochmal warten bis die Taste erneut gedruckt wird. Dan soll er in die entgegen gesetzte Richtung fahren. Das Problem ist: Wenn der nicht bei min oder max stehen bleibt, kann ich nie die max Helligkeit / min Helligkeit genau einstellen.
Dann benutzt du dein Stausflag falsch. Das sollte ja genau das garantieren, dass es nur bei erreichen eines der beiden Extremwerte umgeswitcht wird.
Ja da hast du Recht. Wenn den StatusFlag nicht vergleiche, dann macht er nur bis min und wartet, weil er für max den StatusFlag wieder vergleichen will. Ich kann doch auch theoretisch sagen... if(!(PINB & (1<<PINB3))&& (sAD3==3)) { if(sAD3<32) { sAD3++; } else break; } if(!(PINB & (1<<PINB3))&&(sAD3==32)) { if(sAD3>3) { sAD3--; } else break; //damit er auf Anfang zurück //springt } danke????
Dimi schrieb: > Wenn den StatusFlag nicht vergleiche, dann macht er > nur bis min und wartet, Wenn StatusFlag nicht gesetzt wird, dann macht er bis min und wartet.
Moin Nimm nen Timer, damit deine Zählschritte auch als spürbare Schritte fungieren, sonst zählst du in Nullkommanix auf die Endwerte. Prinzip (bin kein C-Programmierer): 'Das Timerflag wird im Timer-Int gesetzt, z.B. ca. alle 150ms 'Entprellung kann hier entfallen, da der Taster über das AND nur alle 150ms involviert ist If StatusFlag=1 then While Wert<32 AND Taster=On And Timerflag=1 incr Wert clear Timerflag Loop If Wert=32 AND Taster=Off then Reset Statusflag Elseif StatusFlag=0 While Wert>3 AND Taster=On And Timerflag=1 decr Wert clear Timerflag Loop If Wert=3 AND Taster=Off then Set Statusflag End if Ohne Gewähr... ;-)
Es ist immer eine schlechte Idee, Pins direkt im Programm abzufragen. Das Tasten entprellen und auswerten ist fast immer in einem Programm nötig. Daher lohnt es sich, eine eigene Funktion dafür zu schreiben. Dann kann man sie einfach aufrufen und muß sich nicht jedes mal neu den Kopf darüber zerbrechen. Außerdem vermeidet man Verzögerungen oder Seiteneffekte durch unterschiedliche Laufzeit der Mainloop. Hier gibt es schon was fertiges: Beitrag "Universelle Tastenabfrage" Und so einfach wird das dann damit:
1 | for(;;){ // main loop |
2 | if( get_key_press( 1<<KEY0 )){ // single press |
3 | step = -step; // toggle up /down |
4 | }
|
5 | if( get_key_rpt( 1<<KEY0 )){ // repeat |
6 | dimmval += step; |
7 | if( dimmval < 3 ) |
8 | dimmval = 3; |
9 | if( dimmval > 31 ) |
10 | dimmval = 31; |
11 | }
|
12 | PORTB = (dimmval << 1) | 1; // debug output |
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.