flankenerkennung mit exklusiv oder

Gast #1366985
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
#1366989
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
}
Gast #1367013
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
#1367042
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
Gast #1367095
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
#1367099
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
}
Gast #1367107
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
#1367128
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 
:-)

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