Forum: Mikrocontroller und Digitale Elektronik Zwei Signale verarbeiten mit Flagg


von Kenia (Gast)


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

von Karl H. (kbuchegg)


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.

von Kenia (Gast)


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.

von Jens G. (jensig)


Lesenswert?

Nimm ein RS-FlipFlop ...

von Karl H. (kbuchegg)


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.

von Kenia (Gast)


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;
  }
}

von Kenia (Gast)


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

von Karl H. (kbuchegg)


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
}

von Karl H. (kbuchegg)


Lesenswert?

Kenia schrieb:

> Diese Sperre wird von einem anderen angedachten  Schalter an einem
> anderen Pin aufgehoben Schalter 1 wird stromlos

Den darfst du jetzt selber ins Programm einbauen.

von Karl H. (kbuchegg)


Lesenswert?

> //PULLI
> PINC |= (1 << PC0);
> PINC |= (1 << PC1);

PORTC.
Die Pullups werden über PORTC eingeschaltet

von amateur (Gast)


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.

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.