Flankenwechsel erkennung..
-
fricky schrieb:
dann musst du dir mal eben selbst was basteln: http://static.flickr.com/119/308483274_0ae3c17aa3_o.jpg
Wah, ein 74'XX- Grab?
Nein danke, dann doch lieber ein paar Zeilen ABEL oder VHDML für'n Coolrunner.
Wenn's wirklich in Soft sein muß, geht's bei niedrigen Frequenzen dann doch anders. Ich hab' mal ein bisserl gekramt und aus meinen MELPS77- ASM- Gruften das Ding hier geholt und nach C portiert, aber noch nicht gedebuggt, also keine Garantie auf Richtigkeit. Dafür ist es allgemein gehalten, war 'ne Buttonfield- Auswertung, die ich ums Debouncing gekürzt und um die Zählerauswertung erweitert habe. Die nicht ausgewerteten Bits bleiben stehen, in dieser Form wird nur eine einzige Flanke der Restbits detektiert. Läßt sich natürlich beliebig - auch performanceoptimiert- zurechtbiegen:
static char mask = 15; // maskiert die überwachten bits, hier 0 bis 3 const char bit = 2; // das wollen wir zählen, binary 0000'0100 static unsigned int counts[8]; static char fallenbits = 0, raisedbits = 0, lastport = port, nowport; // init: port = HW- Port lastport &= mask; void pollme(char mask, char bit) // mich bitte zyklisch aufrufen { char changed, killmask; nowport = port & mask; // nur die untersuchten Bits behalten if (nowport != lastport) // hat sich was gerührt? { changed = lastport ^ nowport; // ahja, und welche bits? raisedbits |= changed & nowport; // Lo->Hi- Übergang fallenbits |= changed & (nowport ^ 255); // Hi->Lo- Übergang lastport = nowport; // jetzigen Zustand merken // Auswertung killmask = 1 << bit; // Achtung: Performance- Killer if (killmask & raisedbits) { counts[bit]++; raisedbits &= killmask ^ 255; // Ausgewertetes Bit löschen } } }