#define pulsPin 10 // OC1B bzw. PB6 #define IN1 0 #define IN2 1 #define IN3 2 #define IN4 3 uint8_t taste, taste_alt; void setup() { pinMode(pulsPin, OUTPUT); digitalWrite(pulsPin, HIGH); // OC1B bzw. PB6 pinMode(IN1, INPUT_PULLUP); pinMode(IN2, INPUT_PULLUP); pinMode(IN3, INPUT_PULLUP); pinMode(IN4, INPUT_PULLUP); pinMode(13, OUTPUT); digitalWrite(13, HIGH); // VCC close to pulsPin for indicator LED active LOW DDRF = B11111111; PORTF = 0; } void loop() { taste = 0; if(!digitalRead(IN1)) taste = 1; // höchste Priorität else if(!digitalRead(IN2)) taste = 2; else if(!digitalRead(IN3)) taste = 3; else if(!digitalRead(IN4)) taste = 4; // niedrigste Priorität if (taste != taste_alt) { switch (taste) { case 1: initTimer1(32-1, 1600-1, 1); break; case 2: initTimer1(32-1, 64-1, 1); break; case 3: initTimer1(250-1, 25000-1, 64); break; case 4: stopTimer1(); digitalWrite(pulsPin, LOW); break; default: stopTimer1(); digitalWrite(pulsPin, HIGH); break; } taste_alt = taste; } delay(2); } void initTimer1 (uint16_t duty, uint16_t periode, uint16_t prescaler) { PORTF = 1; //D0 high stopTimer1(); TCCR1A = _BV(WGM11) | _BV(WGM10); TCCR1B = _BV(WGM13) | _BV(WGM12); OCR1A = periode; OCR1B = duty; // Pulsweite, OCR1B <= OCR1A // set new Prescaler Clock Select Bits PORTF = 2; //D1 high TCCR1A |= _BV(COM1B0) | _BV(COM1B1); PORTF = 16; //D2 high switch (prescaler) { case 1 : TCCR1B |= _BV(CS10); break; case 8 : TCCR1B |= _BV(CS11); break; case 64 : TCCR1B |= _BV(CS11) | _BV(CS10); break; case 256 : TCCR1B |= _BV(CS12); break; case 1024 : TCCR1B |= _BV(CS12) | _BV(CS10); break; default : stopTimer1(); break; // otherwise timer remains stopped } PORTF = 0; //Dn low } void stopTimer1 () { TCCR1B = 0; // Reset, stop timer first TCCR1A = 0; // Reset TIMSK1 = 0; // Reset (disable Timer Compare Interrupts) OCR1A = 0; // Reset periode OCR1B = 0; // Reset duty TCNT1 = 0; // initialize counter value to 0 }