AVRDUDE_MCU=attiny861
AVRDUDE_PROGRAMMER=usbasp
-CFLAGS=-Wall -Os -mmcu=$(MCU) -DUSE_LOGGING=1 -DF_CPU=1000000UL
+CFLAGS=-Wall -Os -mmcu=$(MCU) -DUSE_LOGGING=1 -DF_CPU=1000000UL -std=gnu99
LDFLAGS=
AVRDUDE_FLAGS= -p$(AVRDUDE_MCU) -c $(AVRDUDE_PROGRAMMER)
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
+#include <util/atomic.h>
#include "lights.h"
void pwm_off(unsigned char n)
{
- pwm[n] = 0;
-
- switch (n) {
- case 0: DDRB &= ~_BV(PB1); break;
- case 1: DDRB &= ~_BV(PB3); break;
- case 2: DDRB &= ~_BV(PB5); break;
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+ pwm[n] = 0;
+
+ switch (n) {
+ case 0: DDRB &= ~_BV(PB1); break;
+ case 1: DDRB &= ~_BV(PB3); break;
+ case 2: DDRB &= ~_BV(PB5); break;
+ }
}
}
case 0:
TC1H = hi;
OCR1A = lo;
- DDRB |= _BV(PB1);
break;
case 1:
TC1H = hi;
OCR1B = lo;
- DDRB |= _BV(PB3);
break;
case 2:
TC1H = hi;
OCR1D = lo;
- DDRB |= _BV(PB5);
break;
}
}
if (((stride + (1 << PWM_STEP_SHIFT)) >> PWM_STEP_SHIFT) >= PWM_MAX)
stride = PWM_MAX << PWM_STEP_SHIFT;
- pwm[n] = stride;
- pwm_update_hw(n);
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+ pwm[n] = stride;
+
+ pwm_update_hw(n);
+
+ switch(n) {
+ case 0: DDRB |= _BV(PB1); break;
+ case 1: DDRB |= _BV(PB3); break;
+ case 2: DDRB |= _BV(PB5); break;
+ }
+ }
}
void pwm_timer()