#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, 3200-1, 1); break; case 2: initTimer1(640-1, 3200-1, 1); break; case 3: initTimer1(250-1, 25000-1, 64); break; case 4: resetTimer1(); digitalWrite(pulsPin, LOW); break; default: resetTimer1(); digitalWrite(pulsPin, HIGH); break; } taste_alt = taste; } delay(5); } void initTimer1 (uint16_t duty, uint16_t periode, uint16_t prescaler) { resetTimer1(); PORTF = 1; //D0 high TCCR1A = _BV(WGM11) | _BV(WGM10); TCCR1B = _BV(WGM13) | _BV(WGM12); OCR1A = periode; OCR1B = duty; // Pulsweite, OCR1B <= OCR1A 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 : resetTimer1(); break; // otherwise timer remains stopped } PORTF = 0; //Dn low } void resetTimer1 () { 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 PORTF = 32; // D3 high DDRB &= 0 << 6; // Disable OUTPUT B6 TCCR1A |= _BV(COM1B0) | _BV(COM1B1); // Set at match TCCR1C = _BV(FOC1B); // Force match TCCR1A = 0; // Reset DDRB |= 1 << 6; // Enable OUTPUT B6 PORTF = 0; // Dn low }