Forum: Compiler & IDEs Toggeln einer LED


von Achim S. (achims)


Lesenswert?

Hallo
in einem Code verwende ich das folgende Stück Code:
1
// Prüfen, ob der Taster 1 betätigt wurde
2
    if ( !(PINA & (1<<PINA1)) )
3
    {
4
      // LED an PA 4 aus, PA 5 an
5
      //PORTA &= ~(1<<PA4);
6
      PORTA |= (1<<PA5);  
7
      PORTA ^= (1<<PA4);
8
    }
9
    else
10
    {
11
      //LED an PA 4 an, Pin 5 aus
12
      PORTA |= (1<<PA4);
13
      PORTA &= ~(1<<PA5);
14
    }
Habe den Pin PA4 erst eingeschaltet, dann aus, je nach Taster 1. Danach 
kabe ich die Zeile auskommentiert und durch

PORTA ^= (1<<PA4);

ersetzt. Das Stück Code geht. PA4 schaltet beim betätigen von PA4 um.
Von der Funktion her, soll aber PA5 aus und PA4 einschalten bzw. nach 
else genau anders herum. Wie mache ich das beim toggeln?
achim

von Falk B. (falk)


Lesenswert?

@ Achim Seeger (achims)

>in einem Code verwende ich das folgende Stück Code:

>// Prüfen, ob der Taster 1 betätigt wurde
>    if ( !(PINA & (1<<PINA1)) )

Ohne Entprellung wird das meistens nichts. Und ohne Flankenerkennung 
erst recht nicht.

>    {
>      // LED an PA 4 aus, PA 5 an

Nö, PA4 wird invertiert, neudeutsch "getoggelt".

>      //PORTA &= ~(1<<PA4);
>      PORTA |= (1<<PA5);
>      PORTA ^= (1<<PA4);
>    }
>    else
>    {
>      //LED an PA 4 an, Pin 5 aus
>      PORTA |= (1<<PA4);
>      PORTA &= ~(1<<PA5);
>    }

>Habe den Pin PA4 erst eingeschaltet, dann aus, je nach Taster 1. Danach
>kabe ich die Zeile auskommentiert und durch

>PORTA ^= (1<<PA4);

>ersetzt. Das Stück Code geht. PA4 schaltet beim betätigen von PA4 um.
>Von der Funktion her, soll aber PA5 aus und PA4 einschalten bzw. nach
>else genau anders herum. Wie mache ich das beim toggeln?

Siehe ganz oben.

von Karl H. (kbuchegg)


Lesenswert?

Achim Seeger schrieb
>
> ersetzt. Das Stück Code geht. PA4 schaltet beim betätigen von PA4 um.
> Von der Funktion her, soll aber PA5 aus und PA4 einschalten bzw. nach
> else genau anders herum. Wie mache ich das beim toggeln?

Die Frage ist aber eigentlich, warum du hier ueberhaupt ein Toggeln 
einsetzen willst?

Wenn du eine klare Ein/Aus Abhaengigkeit eines Ausgangs haben willst, 
dann programmier das auch als solches. Beim Toggeln drehst du die 
Polaritaet eines Ausgangs immer nur einfach um, ohne eine Sicherheit 
darueber zu haben, ob sich daraus eine 1 oder eine 0 ergibt. Es haengt 
also immer vom vorherigen Zustand ab. Benoetigst du aber klare 
Verhaeltnisse, dann sorg auch dafuer. Das ist das einfachste und 
zuverlaessigste, weil du dann von keinen Voraussetzungen abhaengig bist.

von Achim S. (achims)


Lesenswert?

Hallo Karl Heinz, Hallo Falk
es hat nur die Aufgabe das toggeln kennen zu lernen. Benutze sonst immer 
eine Entprellung (einfach oder mit Timer. Klare Verhältnisse sind dabei 
nicht so wichtig, nur die einfache Art wie man es macht
achim

von Karl H. (kbuchegg)


Lesenswert?

Achim Seeger schrieb:
> Hallo Karl Heinz, Hallo Falk
> es hat nur die Aufgabe das toggeln kennen zu lernen.

Na ja. Was willst du da groß kennen lernen.
Toggeln ist einfach nur 'umdrehen'. Wenn der Ausgang auf 1 ist, dann ist 
er danach auf 0 und umgekehrt.

Das ist praktisch, wenn man tatsächlich einfach nur umdrehen will, ohne 
sich um 0 oder 1 kümmern zu müssen.
Wenn man aber gezielt einen Ausgang auf 0 oder 1 schalten will, und zwar 
unabhängig vom aktuell vorliegenden Zustand, dann nimmt man kein Toggeln 
sondern setzt den Ausgang eben gezielt auf 0 oder 1. Was soll man sich 
damit abmühen, einen Ausgang erst mal auf 0 zu setzen um ihn danach 
gleich anschliessend mit einem Toggle auf 1 zu setzen, wenn man ihn 
gleich einfach auf 1 hätte setzen können? Ist doch sinnfrei, so 
vorzugehen.

: Bearbeitet durch User
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.