Forum: Compiler & IDEs flankenerkennung mit exklusiv oder


von programmier_würstchen (Gast)


Lesenswert?

Hallo,
ich habe irgend wie im Hinterkopf das man mit einer einfachen if abfrage 
und einem exklusivoder einen  Flankenwächsel erkennen  kann!
Mein Problem ist aber das ich es einfach nicht hinkriege!! Wäre sehr 
nett wenn mir jemand auf die Sprünge helfen könnte!!!

Vielen Dank
programmier_würstchen

von Karl H. (kbuchegg)


Lesenswert?

programmier_würstchen schrieb:
> Hallo,
> ich habe irgend wie im Hinterkopf das man mit einer einfachen if abfrage
> und einem exklusivoder einen  Flankenwächsel erkennen  kann!

Stimmt ... fast. Man muss sich auch den neuen Zustand bis zur nächsten 
Abfrage retten. Also immer: neuen Zustand mit Zustand unmittelbar davor 
vergleichen und danach den neuen Zustand als alten Zustand für die 
nächste Vergleichsrunde wegspeichern.

> Mein Problem ist aber das ich es einfach nicht hinkriege!! Wäre sehr
> nett wenn mir jemand auf die Sprünge helfen könnte!!!

Zeig doch einfach was du hast
und jemand von hier zeigt dir wo dein Fehler liegt.

An dem 3 Zeiler kann man eigentlich nicht allzuviel falsch machen, 
sodass dein Problem möglicherweise ganz woanders liegt
1
uint8_t PortAlt;
2
3
int main()
4
{
5
  uint8_t PortNeu;
6
7
  ...
8
9
  PortAlt = ....;
10
11
  while( 1 ) {
12
13
    PortNeu = ....;
14
    if( PortNeu ^ PortAlt ) { 
15
      // irgendein Pin hat gewechselt
16
    }
17
    PortAlt = PortNeu;
18
  }
19
}

von programmier_würstchen (Gast)


Lesenswert?

Also ich habe es so versucht
1
uint8_t mask = (1<<PC);
2
if (PORTC &^mask)
3
{
4
  tick++;
5
  mask ^= 0xff;
6
}

aber es reagiert nich nur auf änderung des PinC3

irgend wie sitz ich total auf der Leitung

Vielendank für Eure Hilfe

von Karl H. (kbuchegg)


Lesenswert?

programmier_würstchen schrieb:
> Also ich habe es so versucht
>
1
> uint8_t mask = (1<<PC);
2
> if (PORTC &^mask)
3
> {
4
>   tick++;
5
>   mask ^= 0xff;
6
> }
7
>

was soll das & da drinnen?

Du brauchst eine XOR-Verknüpfung, keine UND-Verknüpfung.
Und ausserdem kannst du eine 'Änderung' nur dann detektieren, wenn du 
den aktuellen Zustand mit einem Zustand von Früher vergleichst. Das 
impliziert schon das Wörtchen 'Änderung'.

Und im Übrigen wird ein Port ausgelesen, in dem man das PIN Register 
ausliest, nicht das PORT Register.

PORT   Ausgänge (oder Steuerung der Pullup)
PIN    Eingänge

von programmier_würstchen (Gast)


Lesenswert?

Das mit dem PORT und PIn ist mir klar aber zum testen hat sich das 
RunLed angeboten

Jetzt habe ich es so versucht

1
uint8_t old,tick;
2
3
int main(void)
4
{
5
  while(1)
6
  {
7
    if (old^PORTC)
8
    {
9
      tick++;
10
      old = PORTC;  
11
    }
12
  }
13
14
}

aber ich möchte das ich nur bei änderung des Portc3 tick incrementiert 
wirt!
Endschuldige mich für meine Dummen Fragen !!!

Danke

von Karl H. (kbuchegg)


Lesenswert?

programmier_würstchen schrieb:
> Das mit dem PORT und PIn ist mir klar

anscheinend nicht.
Du machst das immer noch falsch.

> aber ich möchte das ich nur bei änderung des Portc3 tick incrementiert
> wirt!

Wie soll sich denn in deinem Programm am PORTC irgendeine Änderung 
ergeben? PORTx ist die Bezeichnung für die Ausgänge. Die Eingänge fragt 
man mit PINx ab!

1
#include <avr/io.h>
2
3
uint8_t old;
4
uint8_t tick;
5
uint8_t new;
6
7
int main(void)
8
{
9
  old = PINC;
10
11
  while(1)
12
  {
13
    new = PINC;
14
15
    if ( ( old ^ new ) & ( 1 << PC3) )  // Nur bei Änderung
16
                                        // aber die Änderung darf auch nicht
17
                                        // irgendwo sein. Sie muss am PIN C3 sein
18
    {
19
      tick++;
20
    }
21
22
    old = new;
23
  }
24
}

von programmier_würstchen (Gast)


Lesenswert?

Ich ändere in einem Timerinterrupt Portc3

nur zur simulation!!!!

(Nachher werde ich das über einen externen Eingang machen und 
endsprechend auf Pin  umschreiben )
Nochmal zu meiner Frage wie ich nur auf änderung des einen Bit 
(PORTC3)reagieren kann???

Danke für deine nette Hilfe

von programmier_würstchen (Gast)


Lesenswert?

Endschuldige habe

if ( ( old ^ new ) & ( 1 << PC3) )  // Nur bei Änderung


übersehen

Danke

von Karl H. (kbuchegg)


Lesenswert?

programmier_würstchen schrieb:
> Ich ändere in einem Timerinterrupt Portc3
>
> nur zur simulation!!!!
>
> (Nachher werde ich das über einen externen Eingang machen und
> endsprechend auf Pin  umschreiben )

AH ja.
Immer erst die möglichst komplizierte und fehlerträchtigste Variante 
benutzen und anderen auch nichts davon erzählen. Wär ja auch zu einfach 
:-)

von programmier_würstchen (Gast)


Lesenswert?

Endschuldigung

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.