mikrocontroller.net

Forum: Compiler & IDEs flankenerkennung mit exklusiv oder


Autor: programmier_würstchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

uint8_t PortAlt;

int main()
{
  uint8_t PortNeu;

  ...

  PortAlt = ....;

  while( 1 ) {

    PortNeu = ....;
    if( PortNeu ^ PortAlt ) { 
      // irgendein Pin hat gewechselt
    }
    PortAlt = PortNeu;
  }
}

Autor: programmier_würstchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich habe es so versucht
uint8_t mask = (1<<PC);
if (PORTC &^mask)
{
  tick++;
  mask ^= 0xff;
}

aber es reagiert nich nur auf änderung des PinC3

irgend wie sitz ich total auf der Leitung

Vielendank für Eure Hilfe

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
programmier_würstchen schrieb:
> Also ich habe es so versucht
>
> uint8_t mask = (1<<PC);
> if (PORTC &^mask)
> {
>   tick++;
>   mask ^= 0xff;
> }
> 

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

Autor: programmier_würstchen (Gast)
Datum:

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

Jetzt habe ich es so versucht


uint8_t old,tick;

int main(void)
{
  while(1)
  {
    if (old^PORTC)
    {
      tick++;
      old = PORTC;  
    }
  }

}

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

Danke

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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!

#include <avr/io.h>

uint8_t old;
uint8_t tick;
uint8_t new;

int main(void)
{
  old = PINC;

  while(1)
  {
    new = PINC;

    if ( ( old ^ new ) & ( 1 << PC3) )  // Nur bei Änderung
                                        // aber die Änderung darf auch nicht
                                        // irgendwo sein. Sie muss am PIN C3 sein
    {
      tick++;
    }

    old = new;
  }
}

Autor: programmier_würstchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: programmier_würstchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Endschuldige habe

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


übersehen

Danke

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 
:-)

Autor: programmier_würstchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Endschuldigung

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.