mikrocontroller.net

Forum: PC-Programmierung Flankenerkennung in C


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Lucas S. (luxx1995)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi ich hab da mal eine Frage,
ich will über die Arduino IDE ein Programm schreiben, wobei ich des 
Öfteren eine positive und negative Flanke auswerten muss.
Ich brauche deswegen eine universelle Funktion für Flanken.
Einzelne Flanken sind kein Problem, aber da ich für mehrere Flanken ja 
auch mehrere Speicher brauche funktioniert das nicht ohne weiteres mit 
einer einfachen Funktion.
Ich hab schon an malloc und so gedacht, aber so ganz klar ist mir das 
nicht mehr.
Vielleicht hat ja jemand Ahnung

Danke im Voraus

Autor: Thomas R. (r3tr0)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pin Change Interrupt eventuell?
Wird ausgelöst bei steigender und fallender Flanke.

Autor: Erik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entprellen nicht vergessen.

Autor: Wegstaben V. (wegstabenverbuchsler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lucas S. schrieb:
> Ich hab schon an malloc und so gedacht,

http://www.c-howto.de/tutorial/arrays-felder/speicherverwaltung/

malloc = memory allocation, Speicherreservierung.

Wo vermutest du bei malloc einen Zusammenhang mit Flanken(-Erkennung) ?

Autor: Dussel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst pro Pin Speicher für mehrere Zeitpunkte. Da die Anzahl der 
Pins beim Compilieren bekannt sein dürfte, könntest du einfach ein 
zweidimensionales Array benutzen.
Oder was meinst du?

Autor: Udo S. (urschmitt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kein Mensch versteht genau was du möchtest?

Eventuell passt ja PeDas Entprellroutine für dein Problem.

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lucas S. schrieb:
> Einzelne Flanken sind kein Problem, aber da ich für mehrere Flanken ja
> auch mehrere Speicher brauche funktioniert das nicht ohne weiteres mit
> einer einfachen Funktion.

Eine Kombination mehrerer gleichartiger Speicher, die sich in einer
Programmschleife bearbeiten lassen, nennt man Array (s. Beitrag von
Dussel).

Informiere dich also über Arrays und Schleifen, dann wirst du vermutlich
die Lösung deines Problems finden.

Autor: PittyJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gestern bei der WM war es mit der Flankenerkennung auch nicht weit her.

Ich verstehe aber den Zusammenhang mit malloc nicht ganz. Allerdings ist 
Arduino-Code ja C++, und du kannst auf new ausweichen.

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lucas S. schrieb:
> Vielleicht hat ja jemand Ahnung

Schon. Folgenden code ausreichend oft wiederholen:
static uint8_t alt=0;
uint8_t taster=PIND; 
uint8_t steigend=taster&^alt;
uint8_t fallend=^taster&alt;
if(steigend&1)
 // Eingang PD0 runtergedrückt
if(fallend&1)
 // Eingang PD0 losgelassen
if(steigend&2)
 // Eingang PD1 runtergedrückt
if(fallend&2)
 // Eingang PD1 losgelassen
:
if(steigend&0x80)
 // Eingang PD7 runtergedrückt
if(fallend&0x80)
 // Eingang PD7 losgelassen
alt=taster;
Ich befürchte aber, bis du das verstehst,  musst du noch viele 
Grundlagen über das Programmieren erlernen. Mit malloc bist du dermassen 
auf dem falschen Dampfer...

Ic

Autor: DPA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MaWin schrieb:
> uint8_t steigend=taster&^alt;
> uint8_t fallend=^taster&alt;

Ist deine Alt-Gr Taste defekt?

Autor: Sebastian S. (amateur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Lucas
Da fehlen noch relativ viele Informationen.
Geht es, im Großen und Ganzen um die Erkennung eines Tasters/Schalters 
bzw. dessen Stellung, oder geht es darum ein Signal zu bewerten, dass 
sich entweder um µV/Woche oder um KV/µs ändert? Da gibt es nämlich den 
einen oder anderen Unterschied.

Autor: Venkman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Will versuchen zu helfen. Wahrscheinlich geht aber die Formatierung 
kaputt.
Steigend heißt ja i.d.R. Wechsel von 0 auf 1. Also neuer Wert und der 
invertierte Wert 'von vorher' beide 1.
  alt: 0 0 0 0 0 1 1 1 0
 tast: 0 0 0 0 1 1 1 0 0
 ~alt: 1 1 1 1 1 0 0 0 1
~tast: 1 1 1 1 0 0 0 1 1

~alt & tast : 0 0 0 0 1 0 0 0 0
                      |   
                      |          
                      steigend, wechsel von 0 auf 1

alt & ~tast : 0 0 0 0 0 0 0 1 0 
                            |   
                            |          
                            fallend, wechsel von 1 auf 0

Reicht das als Erklärung für MaWin's post? Ob das jetzt ein Eigentor 
oder Bösartigkeit ist, weiß ich nicht.
Das Beispiel oben ist ja nur auf ein bit bezogen. Wie in MaWin's post zu 
sehen sei das dann auf ein ganzes Register zu erweitern.

Der Einwand ob das interne Signale sein sollen, oder etwas was von außen 
reinkommt (also ggf. entprellt werden muss) ist aber nicht von der Hand 
zu weisen. Da kommt dann Pedas Routine ins Spiel.

Deine Frage kommt aber tatsächlich etwas wenig mit Bedacht formuliert 
rüber nach dem Motto ich hau mal paar verwandte Begriffe raus und warte 
ab.
Das erklärt wohl den Reflex von z.B. user MaWin :-)

[Mod: Absatz formatiert]

: Bearbeitet durch Moderator
Autor: Peter D. (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lucas S. schrieb:
> Einzelne Flanken sind kein Problem, aber da ich für mehrere Flanken ja
> auch mehrere Speicher brauche funktioniert das nicht ohne weiteres mit
> einer einfachen Funktion.

Warum willst Du denn mehrere Flanken speichern, soll das ein 
Logikanalysator werden?

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.

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