+/*
+ * Asking Riddles at the Entrance to Garage
+ *
+ * (c) 2017 Martin Mares <mj@ucw.cz>
+ */
+
+/*
+ * Pin assignment (component side view; "*" marks inverted signals)
+ *
+ * +-------------------+
+ * | RESET* VCC |
+ * button | PB3 SCK |
+ * output | PB4 MISO |
+ * | GND PB0=MOSI | diagnostic LED*
+ * +-------------------+
+ */
+
+#define F_CPU 1200000UL
+
+#include <avr/io.h>
+#include <avr/sleep.h>
+#include <util/delay.h>
+
+typedef uint8_t byte;
+
+#define B(x) (1U<<(x))
+
+static void sleep(uint16_t millisec)
+{
+ while (millisec) {
+ _delay_ms(1);
+ millisec--;
+ }
+}
+
+int main(void)
+{
+ DDRB |= B(PB0); // PB0: output
+ DDRB |= B(PB4); // PB4: output
+ PORTB &= ~B(PB3); // PB3: input, no pullup
+
+ for (byte i=0; i<5; i++) {
+ PORTB &= ~B(PB0);
+ sleep(100);
+ PORTB |= B(PB0);
+ sleep(100);
+ }
+
+ for (;;) {
+ sleep(10);
+ if (PINB & B(PB3)) {
+ PORTB &= ~B(PB0);
+ PORTB |= B(PB4);
+ } else {
+ PORTB |= B(PB0);
+ PORTB &= ~B(PB4);
+ }
+ }
+
+ for (;;) {
+ set_sleep_mode(SLEEP_MODE_PWR_DOWN);
+ sleep_mode();
+ }
+}