// Einlesen paralleler Signale mit Schieberegistern, // 2-fach FIFO für stabiles Signal // und Zaehlen positiver Aenderungen // Abfrageintervall nach Bedarf per ISR #define SR_BITS 8 #define SR_ANZAHL 10 #define ZAEHLER_ANZAHL (SR_ANZAHL * SR_BITS) uint32_t zaehler[ZAEHLER_ANZAHL]; // Zaehler in Software uint8_t sr_byte_neu[SR_ANZAHL]; // aktuelles Eingangsmuster uint8_t sr_byte_alt[SR_ANZAHL]; // alt-neu Zustaende muessen gleich sein uint8_t sr_entprellt[SR_ANZAHL]; // um das entprellte Bitmuster zu aendern uint8_t platzhalter; // Initialisierung + strobe ausgeben void sr_init(void) { } // hier 8 bit einlesen uint8_t lese_sr(void) { return platzhalter; } void zaehle_ereignisse(void) { uint8_t sr_index, // aktuelle SR-Nummer bit_index, // aktuelles Bit bei Auswertung akt_zaehler = 0; // Zaehlernummer: 0 -> ZAEHLER_ANZAHL-1 uint8_t temp_L, // zu loeschende entprellte Bits temp_H, // zu setzende enprellte Bits temp, // entprelltes Bitmuster zu SR sr_wechsel; // aktivierte Eingaenge sr_init(); // Schieberegister laden // alle SR einlesen, bewerten und pos. Wechsel bei Signalen als Zaehlimpuls for(sr_index = 0; sr_index < SR_ANZAHL; sr_index++) { sr_byte_neu[sr_index] = lese_sr(); // Aenderung auf stabile '1' ermitteln temp_H = sr_byte_alt[sr_index] & sr_byte_neu[sr_index]; // Aenderung auf stabile '0' ermitteln temp_L = ~(sr_byte_alt[sr_index] | sr_byte_neu[sr_index]); // 2-fach FIFO sr_byte_alt[sr_index] = sr_byte_neu[sr_index]; temp = sr_entprellt[sr_index]; // letztes Bitmuster temp |= (temp_H ^ temp) & temp_H; // bit setzen bei pos. Aenderung temp ^= (temp_L & temp); // bit loeschen bei neg. Aenderung // nur pos. Aenderungen ermitteln sr_wechsel = (sr_entprellt[sr_index] ^ temp) & temp; sr_entprellt[sr_index] = temp; // akt. Bitmuster merken // alle positiven Bits in 'sr_wechsel' als Zaehlimpuls verwenden for(bit_index = 0; bit_index < SR_BITS; bit_index++) { if(sr_wechsel & 1) zaehler[akt_zaehler]++; sr_wechsel >>= 1; // Bit0 zuerst akt_zaehler++; } } }