trennfix/sw: Single timer single delay solution seems to work
[eisenbahn.git] / trennfix / sw / pin_magic.h
1 #ifndef __HACHTIS_PIN_MAGIC_H
2 #define __HACHTIS_PIN_MAGIC_H
3
4 #include <avr/io.h>
5
6 struct __ph_pin__ {
7 volatile uint8_t *addr;
8 uint8_t bitno;
9 };
10
11 #define _PIN(port, bit) ((volatile struct __ph_pin__){&port, bit})
12
13 #define OUTPUT_PIN(pin) (*(pin.addr - 1) |= _BV(pin.bitno))
14 #define INPUT_PIN(pin) (*(pin.addr - 1) &= ~_BV(pin.bitno))
15
16 #define PINON(pin) (*pin.addr |= _BV(pin.bitno))
17 #define PINOFF(pin) (*pin.addr &= ~_BV(pin.bitno))
18
19 #define PINVAL(pin) (*(pin.addr - 2) & _BV(pin.bitno) ? 1 : 0)
20
21 #define setpin(pin, val) ((val) ? PINON(pin) : PINOFF(pin))
22
23 #endif