3851942d569243ce2c9ef183897f32c4966123b4
[dmxpainter.git] / src / mcu.h
1 #pragma once
2
3 #include <inttypes.h>
4
5 #include <avr/io.h>
6 #include <avr/interrupt.h>
7
8 #include "util/pins.h"
9
10 #include "config.h"
11
12 /**
13  * Execute a single NOP instruction to delay something by one cycle.
14  */
15 #define nop() asm volatile ("nop")
16
17 /**
18  * Map the ISR NAME_vect to the interrupt function INT_NAME (from config.h).
19  */
20 #define mcu_register_isr(name) \
21   void INT_ ## name (void); \
22   ISR(name ## _vect) { INT_ ## name (); } \
23   int main(void)
24
25
26 #ifdef __AVR_ATmega8__
27 #define  MCU "atmega8"
28 #include "mcu/atmega8.h"
29 #include "mcu/atmega8_pins.h"
30 #else
31 #error Unknown MCU
32 #endif
33
34
35 #ifdef PIN_DEBUG
36 #define mcu_init() do { pin_out(PIN_DEBUG); mcu_debug__ = 0; } while (0)
37 #ifdef REG_DEBUG_FLAG
38 #define mcu_debug__ REG_DEBUG_FLAG
39 #else
40 volatile uint8_t mcu_debug__;
41 #endif
42 #define mcu_debug_set(v) do { mcu_debug__ = v; if (v) { pin_on(PIN_DEBUG); } else { pin_off(PIN_DEBUG); } } while (0)
43 #define mcu_debug()      mcu_debug_set(~mcu_debug__)
44 #else
45 #define mcu_init()
46 #define mcu_debug_set(v)
47 #define mcu_debug()      mcu_debug_set(0xFF)
48 #endif
49 #define mcu_debug_on()   mcu_debug_set(1)
50 #define mcu_debug_off()  mcu_debug_set(0)