Forum: Mikrocontroller und Digitale Elektronik Loop in ATTiny ändern


von Dimi (Gast)


Lesenswert?

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
                      }


                    }

von Cyblord -. (cyblord)


Lesenswert?

Sehe keinen loop. Nur einige if-Abfragen. So wird das nichts.
Poste alles.

von Dimi (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

von Dimi (Gast)


Lesenswert?

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.

von Michael S. (mikel_x)


Lesenswert?

Dann benutzt du dein Stausflag falsch. Das sollte ja genau das 
garantieren, dass es nur bei erreichen eines der beiden Extremwerte 
umgeswitcht wird.

von Dimi (Gast)


Lesenswert?

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

von Dimi (Gast)


Lesenswert?

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.

von Dimi (Gast)


Lesenswert?

Dimi schrieb:
> danke????

Danke!!!!

von Michael S. (mikel_x)


Lesenswert?

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

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

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
  }

von Dimi (Gast)


Lesenswert?

Danke euch allen. Ich werde es mal ausprobieren.

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.