volatile uint8_t burst; void initBurst(void) { pinMode(9, OUTPUT); // OC2B, PH6 // mode 7, top=OCR2A, prescaler 1, non inverted PWM TCCR2A = _BV(COM2B1) | _BV(WGM20) | _BV(WGM21) ; TCCR2B = _BV(WGM22); TIMSK2 |= _BV(OCIE2B); // output compare 2A, trailing pulse edge } uint8_t configBurst(uint8_t cnt, uint8_t period, uint8_t width) { if ( (period < width) || (period - width) < 25) return 1; // zu wenig Zeit von fallender Flanke bis Periodenende TCCR2B = _BV(WGM22); OCR2A = period-1; OCR2B = width-1; TCNT2 = period-2; TIFR2 = _BV(OCF2B); // Interrupt löschen burst = cnt; return 0; } void triggerBurst(void) { TCCR2B = _BV(WGM22) | _BV(CS20); } ISR(TIMER2_COMPB_vect) { if (--burst == 0) { TCCR2B = 0; // Timer 2 STOP } } void setup() { Serial.begin(9600); initBurst(); } void loop() { static int w=30; char c; uint8_t tmp; delay(10); if ( configBurst(3, 100, 100-w) ) { Serial.println(F("Fehler, Pulsbreite muss kleiner als Periode-25 sein!")); } tmp = TIMSK0; // Timer 0 temporär deaktivieren TIMSK0 = 0; triggerBurst(); while(burst) ; // Warte auf Ende TIMSK0 = tmp; // Timer 0 wieder aktiv if (Serial.available() ) { c = Serial.read(); switch (c) { case '+': w++; break; case '-': w--; break; } Serial.println(w); } }