SwitchPort INP_RAISE(BitNum) steigende _und_ fallende Flanken auswerten?

puk
Benutzer
Avatar
Gender: n/a
Age: 54
Posts: 2
Registered: 04 / 2021
Subject:

SwitchPort INP_RAISE(BitNum) steigende _und_ fallende Flanken auswerten?

 · 
Posted: 12.04.2021 - 13:11  ·  #1
Hallo,

wir moechten sowohl steigende als auch fallende Flanken auswerten koennen. Leider kann man sich nur zur Compile-Zeit mit dem Define der Edgematrix festlegen ob steigend oder fallend. Gibt es eine Moeglichkeit, zur Laufzeit beide Zustandsaenderungen abzufragen?

Hintergrund: Es soll abgefragt werden, ob ein Klinkenstecker ein- oder ausgesteckt wurde. Die Buchse hat einen Oefnner dafuer. Ein Pollen mit INP_STABLE() ist moeglich, aber INP_RAISE() waere eleganter.

/Alois
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Re: SwitchPort INP_RAISE(BitNum) steigende _und_ fallende Flanken auswerten?

 · 
Posted: 12.04.2021 - 14:00  ·  #2
Hallo Alois,

wieso fragst du nicht einfach den PortPin selber ab? Übrigens ein PCint müßte das können.

Harry
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: SwitchPort INP_RAISE(BitNum) steigende _und_ fallende Flanken auswerten?

 · 
Posted: 12.04.2021 - 16:12  ·  #3
Quote by puk

Hallo,

wir moechten sowohl steigende als auch fallende Flanken auswerten koennen. Leider kann man sich nur zur Compile-Zeit mit dem Define der Edgematrix festlegen ob steigend oder fallend. Gibt es eine Moeglichkeit, zur Laufzeit beide Zustandsaenderungen abzufragen?

Hintergrund: Es soll abgefragt werden, ob ein Klinkenstecker ein- oder ausgesteckt wurde. Die Buchse hat einen Oefnner dafuer. Ein Pollen mit INP_STABLE() ist moeglich, aber INP_RAISE() waere eleganter.

/Alois

Hallo,

es gibt viele Möglichkeiten dazu.

ich entprelle die Eingänge über Software und dann erzeuge ich eine Steigende und fallende Flanke mit Zwischenspeichern, das hatte ich vor vielen Jahren mal mit der Siemens SPS S5 gelernt und im Prinzip mache ich das Heute noch so:

Du nimmst Dir einen Hilfsbool und einen Flankenbool
Code

var
 Hilfsbool : boolean;
 Flankenbool : boolean;

// in der Abfrage gehst Du wie folgt vor

if (DeinEingang) then 

// 2. Durchlauf setze Flankenmerker zurück, dieser soll nur 1x High bleiben
if Flankenbool then // beim 1. Durchlauf ist dieser false
 Flankenbool:=false;
endif;

// 1. Durchlauf setze Hilfsbool  und steigende Flanke
 if not Hilfsbool then
  Hilfsbool := true;  
  Flankenbool:=true;  
 endif;

else  // wenn Eingang nicht mehr da beide Merker aus false setzen
 Hilfsbool :=false;
 Flankenbool:=false;
endif;


Das ist jetzt sehr grob aufgebaut, aber so kann man es am besten verstehen.
Man kann das Ganze deutlich kompakter aufbauen.

Das selbe Prinzip machst Du mit der fallenden Flanke. Aber ich dachte rolf hätte da auch eine Routine für, aber ich nutze diese nicht.

Thorsten
puk
Benutzer
Avatar
Gender: n/a
Age: 54
Posts: 2
Registered: 04 / 2021
Subject:

Re: SwitchPort INP_RAISE(BitNum) steigende _und_ fallende Flanken auswerten?

 · 
Posted: 12.04.2021 - 16:57  ·  #4
Hallo Harry und Thorsten,

vielen lieben Dank fuer eure Ideen. Der externe Interrupt des AVR waere schoen, aber bietet leider keine Entprellung. Der Interrupt wird ausgeloest, wenn der Pin-Change laenger als 50 ns oder laenger als ein Clock-Zyklus anliegt, also viel zu kurz fuer einen prellenden Kontakt. Das Entprellen muesste ich von Hand programmieren oder eine Sperrzeit einbauen, oder so. Moeglicherweise programmiere ich dann den Switchport nach ...

Die Auswertung der Flanke, wie von dir, Thorsten, gezeigt, habe ich so aehnlich programmiert. Das funktioniert sehr gut.

Es waere halt eine elegante Loesung, wenn der Switchport eine Umschaltung der Edgematrix zur Laufzeit koennte :-)

Viele Gruesse
Alois
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: SwitchPort INP_RAISE(BitNum) steigende _und_ fallende Flanken auswerten?

 · 
Posted: 13.04.2021 - 10:56  ·  #5
Quote by puk

Hallo Harry und Thorsten,

vielen lieben Dank fuer eure Ideen. Der externe Interrupt des AVR waere schoen, aber bietet leider keine Entprellung. Der Interrupt wird ausgeloest, wenn der Pin-Change laenger als 50 ns oder laenger als ein Clock-Zyklus anliegt, also viel zu kurz fuer einen prellenden Kontakt. Das Entprellen muesste ich von Hand programmieren oder eine Sperrzeit einbauen, oder so. Moeglicherweise programmiere ich dann den Switchport nach ...

Die Auswertung der Flanke, wie von dir, Thorsten, gezeigt, habe ich so aehnlich programmiert. Das funktioniert sehr gut.

Es waere halt eine elegante Loesung, wenn der Switchport eine Umschaltung der Edgematrix zur Laufzeit koennte :-)

Viele Gruesse
Alois


Hallo Alois,

die Entsprellung mache ich mir per Software ganz einfach. ich nehme ein Array[0..x] of Byte lege dort meine gelesenen Werte ab und erzeuge mir eine Art FIFO Register, ich verschiebe immer das Byte 1 nach 0, 2 nach 1, 3 nach 2 usw., am Ende wird dann der letzte gelesene Wert eingetragen.

Dann nehme ich einfach ByteWert:= Array[0] AND Array[1] ANDArray[2] AND usw. das Ganze natürlich als FOR Schleife.

ByteWert nutze ich dann als Auswertung, somit entprelle ich diese Werte.

Thorsten
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   95   109 · Page-Gen-Time: 0.031142s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI