/* * Q-Touch-Test mit Tiny25 (auch 85) * Sensor an SNSK * 120R - 33nF zwischen SNSK uns SNS */ #include #include #include #include #include "sbit.h" //#include "uart.h" // multiple definitions for H/L #define EIN 1 #define ON 1 #define AUS 0 #define OFF 0 #define LOW 0 #define HIGH 1 #define OUTPUT 1 #define INPUT 0 // Ports #define SNSK PORT_B3 #define SNSK_DIR DDR_B3 #define SNSK_PIN PIN_B3 #define SNS PORT_B4 #define SNS_DIR DDR_B4 #define SNS_PIN PIN_B4 #define LEDP PORT_B1 #define LEDP_DIR DDR_B1 // Konstanten #define MAXCNT 1000 #define DELTA 50 int16_t get_sensor_cnt(void) { int16_t cnt = MAXCNT; SNS_DIR = SNSK_DIR = INPUT; SNSK = 1; // Pullup SNSK_DIR = OUTPUT; // strong HIGH, lade Cx // Loop ATOMIC_BLOCK(ATOMIC_FORCEON) { do { SNSK_DIR = INPUT; // weak HIGH SNSK = 0; // Pull off: HiZ // 2. charge Transfer SNS_DIR = OUTPUT; // LOW, da SNS immer 0 // Read SNSK SNS_DIR = INPUT; SNSK = 1; // weak HIGH SNSK_DIR = OUTPUT; // strong HIGH: Lade Cx (Kapazität des Sensors) if (--cnt == 0) break; } while (SNS_PIN == 1); } SNS_DIR = OUTPUT; SNS = SNSK = 0; return cnt; } int main () { int16_t sens_cnt, i=1, sens_old; uint8_t flag_pressed=0; LEDP_DIR = OUTPUT; LEDP = OFF; SNS_DIR = SNSK_DIR = OUTPUT; SNS = SNSK = 0; get_sensor_cnt(); // dummy _delay_ms(5); sens_old = get_sensor_cnt(); _delay_ms(5); while (1) { sens_cnt = get_sensor_cnt(); // neue Abtastung _delay_ms(20); i++; if (i%100 == 0 && flag_pressed==0) sens_old = (3*sens_old + sens_cnt+2)/4; else if (sens_cnt < sens_old) sens_old--; if (sens_old < 0) sens_old=0; // sollte nicht notwendig sein, aber: int if (sens_cnt-sens_old > DELTA && !flag_pressed) {flag_pressed=1; LEDP ^=1;} if (sens_cnt-sens_old < (DELTA+1) && flag_pressed) {flag_pressed=0;} } }