Loop in ATTiny ändern

Gast #3166510
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
                      }


                    }
Gast #3166532
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
Moderator (Firma: Titel) Persönliche Seite #3166553
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?
Gast #3166589
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.
Gast #3167451
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????
#3167506
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... ;-)
#3167517
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
  }
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren