Forum: PC-Programmierung Flankenerkennung in C


von Lucas S. (luxx1995)


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

von Thomas R. (r3tr0)


Lesenswert?

Pin Change Interrupt eventuell?
Wird ausgelöst bei steigender und fallender Flanke.

von Erik (Gast)


Lesenswert?

Entprellen nicht vergessen.

von Wegstaben V. (wegstabenverbuchsler)


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) ?

von Dussel (Gast)


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?

von Udo S. (urschmitt)


Lesenswert?

Kein Mensch versteht genau was du möchtest?

Eventuell passt ja PeDas Entprellroutine für dein Problem.

von Yalu X. (yalu) (Moderator)


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.

von PittyJ (Gast)


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.

von MaWin (Gast)


Lesenswert?

Lucas S. schrieb:
> Vielleicht hat ja jemand Ahnung

Schon. Folgenden code ausreichend oft wiederholen:
1
static uint8_t alt=0;
2
uint8_t taster=PIND; 
3
uint8_t steigend=taster&^alt;
4
uint8_t fallend=^taster&alt;
5
if(steigend&1)
6
 // Eingang PD0 runtergedrückt
7
if(fallend&1)
8
 // Eingang PD0 losgelassen
9
if(steigend&2)
10
 // Eingang PD1 runtergedrückt
11
if(fallend&2)
12
 // Eingang PD1 losgelassen
13
:
14
if(steigend&0x80)
15
 // Eingang PD7 runtergedrückt
16
if(fallend&0x80)
17
 // Eingang PD7 losgelassen
18
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

von DPA (Gast)


Lesenswert?

MaWin schrieb:
> uint8_t steigend=taster&^alt;
> uint8_t fallend=^taster&alt;

Ist deine Alt-Gr Taste defekt?

von Sebastian S. (amateur)


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.

von Venkman (Gast)


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.
1
  alt: 0 0 0 0 0 1 1 1 0
2
 tast: 0 0 0 0 1 1 1 0 0
3
 ~alt: 1 1 1 1 1 0 0 0 1
4
~tast: 1 1 1 1 0 0 0 1 1
5
6
~alt & tast : 0 0 0 0 1 0 0 0 0
7
                      |   
8
                      |          
9
                      steigend, wechsel von 0 auf 1
10
11
alt & ~tast : 0 0 0 0 0 0 0 1 0 
12
                            |   
13
                            |          
14
                            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
von Peter D. (peda)


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?

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.