Zwei Signale verarbeiten mit Flagg

Gast #3096576
Lesenswert?

Ich möchte folgendes realisieren:

wenn Eingangspin-PC0 high ==>  Licht leuchtet PD0 low(low aktiv)
wenn Eingangspin-PC0 high und PC1-Taster gedrückt wurde ==> PDO 
(high)aus sofort stop

so könnte es aussehen
i=1;
if (PINC & (1<<PC0)&&i)// also wenn an diesem PIN DauerHIGH&&Flagg 
gesetzt
{
i=0;
(PORTD &= ~(1<<PINC0))// dann schalte die LAMPE ein(lowAktiv)
}      // wenn PC1 gedrückt wurde
if (PINC &(1<<PC1))
i=1;//Flagg setzen


WIE VEREINE ICH NUN DIESE SIGNALE

VIELEN DANK DEN KREATIEVEN
#3096621
Lesenswert?

Kenia schrieb:
> Ich möchte folgendes realisieren:
>
> wenn Eingangspin-PC0 high ==>  Licht leuchtet PD0 low(low aktiv)
> wenn Eingangspin-PC0 high und PC1-Taster gedrückt wurde ==> PDO
> (high)aus sofort stop

Mit anderen Worten.
Das Licht leuchtet nur dann, wenn gilt
    PCO ist high   UND
    PC1 ist high
in allen anderen Fällen ist das Licht aus.

(Ich geh mal davon aus, das Taster gedrückt ein Low-Signal bedeutet)

Wozu du da ein Flag brauchst sehe ich da überhaupt noch nicht.

> WIE VEREINE ICH NUN DIESE SIGNALE
>
> VIELEN DANK DEN KREATIEVEN

Na komm. So schwer ist das nicht.
Da muss man ein bischen mit den logischen Operationen umgehen können. 
Und das musst du so und so irgendwann mal lernen. Also warum nicht hier 
und jetzt?



Allerdings:
In diesem Kauderwelsch
1
i=1;
2
if (PINC & (1<<PC0)&&i)// also wenn an diesem PIN DauerHIGH&&Flagg 
3
gesetzt
4
{
5
i=0;
6
(PORTD &= ~(1<<PINC0))// dann schalte die LAMPE ein(lowAktiv)
7
}      // wenn PC1 gedrückt wurde
8
if (PINC &(1<<PC1))
9
i=1;//Flagg setzen
würde ich auch den Überblick verlieren. Es hat schon seinen Grund, warum 
die mit dem grauslichsten und unübersichtlichsten Code sehr oft die mit 
den nicht funktionierenden Programmen sind.
Gast #3096993
Lesenswert?

OK nun etwas genauer:

Der PIN-PC0 ist als Eingang definiert, wenn dieser beschaltet wird 
leuchtet das Licht am Ausgangsport-PD0
Wenn nun an anderer Stelle ein Taster, also auch wieder ein 
Eingangspin-PC1 ganz kurz gedrückt wird, geht das Licht aus.
#3097011
Lesenswert?

Kenia schrieb:
> OK nun etwas genauer:
>
> Der PIN-PC0 ist als Eingang definiert, wenn dieser beschaltet wird
> leuchtet das Licht am Ausgangsport-PD0
> Wenn nun an anderer Stelle ein Taster, also auch wieder ein
> Eingangspin-PC1 ganz kurz gedrückt wird, geht das Licht aus.


Ja. ok.

In dem Fall wäre ein Flag keine so schlechte Idee.
Aber nenn es nicht i. Gib ihm einen ordentlichen Namen, der seine 
Funktion wiederspiegelt. Zb irgendwas mit NotstopActive oder so. Denn 
dann liest sich das alles gleich viel einfacher.

PS: Wie wird diese Sperre eigentlich wieder aufgehoben?
Darüber solltest du dir mal Gedanken machen. Dann fällt dir vielleicht 
auf, wo in deinem Original Code ein Problem existiert.
Gast #3097030
Lesenswert?

hier noch weitere Ideen als Nachtrag:


#define Eingang1 (PINC & (1<<PC0))
#define Eingang2 !(PINC & (1<<PC1))

#define Ausgang (PORTD |= (1<<PD0))
#define AUS  (PORTD &= ~(1<<PD0))
int main(void)
{
//  2 EINGÄNGE
DDRC &= ~(1 << PC0);//als Eingang geschaltet bleibt dann an Einschalter
DDRC &= ~(1 << PC1);// ist im Prinzip ein __/|__Öffner in Reihe zu PC0
//PULLI
PINC |= (1 << PC0);
PINC |= (1 << PC1);

// Ausgang
PORTD |= (1<<PD0);

    while(1)
    {
    if(Eingang1&&Eingang2)
      Ausgang;
      else
      AUS;
  }
}
Gast #3097032
Lesenswert?

> PS: Wie wird diese Sperre eigentlich wieder aufgehoben?
> Darüber solltest du dir mal Gedanken machen. Dann fällt dir vielleicht
> auf, wo in deinem Original Code ein Problem existiert.

Diese Sperre wird von einem anderen angedachten  Schalter an einem 
anderen Pin aufgehoben Schalter 1 wird stromlos
#3097042
Lesenswert?

Ja. Schön.
Jetzt hast du aber die Regeln ein wenig verändert. Du hast einen Art 
Notstop eingeführt, nach dessen Betätigung der Haupttaster an PC0 keine 
Funktion mehr haben soll

Also
1
int main()
2
{
3
  int NotstopActivated;
4

5
...

dieser Notstop ist natürlich am Anfang abgeschaltet (0 ist aus, 1 ist 
ein)

Also
1
int main()
2
{
3
  int NotstopActivated;
4

5

6
  ...
7

8
  NotstopActivated = 0;
9

10
  ...
11

12
  while(1)
13
  {
14
    ....


Damit kommen wir zur Logik:
Wenn darf bzw. soll das Licht brennen. Es darf nur dann brennen wenn der 
Eingang1 (PC0) betätigt wird UND der Notstop noch nicht betätigt wurde. 
Ob der Notstop betätigt wurde sagt und die Variable NotstopActivated. 
Solange die 0 ist, ist alles in Ordnung. Also

1
int main()
2
{
3
  int NotstopActivated;
4

5

6
  ...
7

8
  NotstopActivated = 0;
9

10
  ...
11

12
  while(1)
13
  {
14
    if( Eingang1 && NotstopActivated == 0 )
15
      Ausgang;
16
    else
17
      AUS;


Was wissen wir noch über die Logik.
Na, sobald der PC1 betätigt wird, soll das als Notstop gelten und alle 
Aktivität am Pin eingestellt werden. Dazu reicht es, das Flag 
entsprechend zu stellen, denn darin wird ja festgehalten ob der Notstop 
betätigt wurde
1
int main()
2
{
3
  int NotstopActivated;
4

5

6
  ...
7

8
  NotstopActivated = 0;
9

10
  ...
11

12
  while(1)
13
  {
14
    if( Eingang1 && NotstopActivated == 0 )
15
      Ausgang;
16
    else
17
      AUS;
18

19
    if( Eingang2 )
20
      NotstopActivated = 1;
21
  }
22
}
Gast #3097068
Lesenswert?

Gefühlt würde ich elektrisch sagen: Ein Schließer C0 und ein Öffner C1.
Trotzdem tun mir die Augen weh.

// Ausgang
PORTD |= (1<<PD0);

... schaltet den Pull Up ein

besser
DDRD |= (1<<PD0);

Wenn den Rest der Compiler frisst, geht's.

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