flankenerkennung mit exklusiv oder

Gast #1366985
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
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
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.