Forum: Mikrocontroller und Digitale Elektronik uC Flankenerkennung


von Anton (Gast)


Lesenswert?

Hallo Community,

ich beschäftige mich neuerdings mit uC-Programmierung und habe eine 
Frage bzgl Flankenerkennung.

Ich muss eine Tastatur (4x4 Tasten) einlesen und dabei eine positive 
Flanke
(Drücken) und eine negative Flanke (Loslassen) erkennen. Die Zustände 
der Tasten lege ich in einer 16-Bit Variablen ab. Je nach Taste wird 
dann ein Display ein oder ausgeschaltet (Nur nebenbei)

Leider habe ich keine Ahnung wie ich diese Flankenerkennung durchführen 
kann bzw wie ich aus meiner 16-Bit Variablen jetz bestimmen kann ob da 
eine positive oder negative Flanke anliegt.

Hier mein Code bis jetzt:

1
#include <XC161.h>
2
3
#define D_IC2 (*(unsigned short volatile *)0x100002)  //IC2 initialisieren
4
#define D_IC3 (*(unsigned short volatile *)0x100004)  //IC3 initialisieren
5
6
sbit P_IC3 = P7^6;                  // IC3 aktivieren
7
sbit Display = P7^4;                 // Hintergrundbeleuchtung
8
9
unsigned short readKeys(void) {     // 16-Bit darum short
10
  
11
  unsigned short var1;              // 16-Bit Variable für Tastenzustände
12
  int i=0,k=0;
13
  
14
  for(i=0; i<4; i++) {              // 4 Transistoren 0-3
15
    
16
    D_IC3 = (1 << i);               // Transistoren durchschalten  (0x00000001) 1 i-mal nach links schieben
17
    for(k=0; k<=100, k++) {}        // Wartezeit
18
    
19
    var1 = var1 | (P5&OxF);          // Alter Wert von var wird mit einberechnet // P5&OxF  -> Schalter drücken = 0  1111 & 1101 -> 1101
20
      
21
    if(i != 3) { 
22
      
23
      var1 = (var1 << 4); }          // Letzten Zustand merken bzw 4Bit nach links schieben
24
    
25
  }
26
    var1 = ~var1;                    // Negieren damit Pos-Flanke Drücken & Neg-Flanke Loslassen
27
    return var1;
28
}
29
30
void main (void){
31
  
32
  unsigned static short    keyState=0, keyEventPos, keyEventNeg, keyStateLast;
33
    
34
  DP7=0x00F0;  // P7-Port Ausgangsport
35
  DP5=0x0000;  // P5-Port Eingangsport
36
  
37
  while(1) {
38
    
39
    P_IC3 = 0;  // Warum??
40
    
41
    keyStateLast = keyState;           // Letzten Zustand merken
42
    keyState = readKeys();            // Funktionsaufruf Tasten einlesen
43
    
44
    D_IC2        = keyState|(keyState>>8);               // LED-Ansteuerung 1-8
45
46
}

von Easylife (Gast)


Lesenswert?

XOR heisst dein gesuchter Operator.

in C schreibt man den mit dem Zeichen "^"


diff = (last_state ^ new_state);

in diff sind alle bits high, die sich bei last_state und new_state 
unterscheiden.

Wenn du wissen willst, welche bits in new_state 1 sind, die in 
last_state 0 sind (rising edge):

rising = (diff & new_state);

umgekehrt:

falling = (diff & last_state);

Beispiel:

int main(int argc, char **argv)
{
        unsigned char last_state = 0xf0; // 11110000
        unsigned char new_state  = 0xc3; // 11000011

        unsigned char diff    = last_state ^ new_state;
        unsigned char rising  = diff & new_state;
        unsigned char falling = diff & last_state;

        printf("d: 0x%02x\n", diff);
        printf("r: 0x%02x\n", rising);
        printf("f: 0x%02x\n", falling);
}

gibt folgendes aus:

d: 0x33  (binär 00110011)
r: 0x03  (binär 00000011)
f: 0x30  (binär 00110000)

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.