const int gatePin = 0;
const int ledPin1 = 3;
const int ledPin2 = 2;
const int ledPinZ = 1;
const int buttonPin = 4;
volatile unsigned long time1 = 0;
volatile unsigned long time2 = 0;
volatile unsigned long time3 = 0;
volatile int mode = 1;
volatile int gate = 1;
static inline void initInterruptChange(void) {
GIMSK |= (1 << PCIE); //Change Interrupt Enable Bit
PCMSK |= (1 << PCINT4); // Pin change interrupt PB4
}
static inline void initTimer1(void) {
TCCR1 |= (1 << CTC1); // clear timer on compare match
TCCR1 |= (1 << CS13) | (1 << CS12) | (1 << CS12);
OCR1C = 122; // count to
TIMSK |= (1 << OCIE1A); // enable compare match interrupt
}
void setup() {
pinMode(buttonPin, INPUT);
pinMode(gatePin, OUTPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPinZ, OUTPUT);
cli();
initInterruptChange();
initTimer1();
sei();
}
ISR(PCINT0_vect) { // Pin Change Interrupt Request
byte buttonPressed = (PINB & (1 << PINB4)) >> PINB4;
if (millis() - time1 > 200) {
if (buttonPressed == 1) {
if (mode == 1 || mode == 2) mode = 3;
else if (mode == 3 || mode == 4) mode = 1;
time1 = millis();
LEDS();
}
}
}
ISR(TIMER1_COMPA_vect) { // Timer/Counter1 Compare Match A
if (millis() - time2 > 600) {
if (mode == 1) mode = 2;
else if (mode == 2) mode = 1;
else if (mode == 3) mode = 4;
else if (mode == 4) mode = 3;
time2 = millis();
LEDS();
}
if (millis() - time3 > 100) {
if (mode == 1 || mode == 2) gate += 5;
if (mode == 3 || mode == 4) gate -= 5;
if (gate > 254) gate = 254;
if (gate < 1) gate = 1;
analogWrite(gatePin, gate);
time3 = millis();
}
}
void LEDS(void) {
digitalWrite(ledPin1, mode == 1);
digitalWrite(ledPin2, mode == 2);
digitalWrite(ledPinZ, mode == 3);
}
void loop() {
}