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
    		}
    	}
    }
    

    😃


Anmelden zum Antworten