parent
1802d9a6b2
commit
32c1be7e54
@ -1,42 +0,0 @@ |
||||
#pragma once |
||||
|
||||
//
|
||||
// Pin definitions for Arduino (Pro Mini with ATmega328P)
|
||||
//
|
||||
|
||||
#include "pins.h" |
||||
|
||||
#define D0 D,0 |
||||
#define D1 D,1 |
||||
#define D2 D,2 |
||||
#define D3 D,3 |
||||
#define D4 D,4 |
||||
#define D5 D,5 |
||||
#define D6 D,6 |
||||
#define D7 D,7 |
||||
#define D8 B,0 |
||||
#define D9 B,1 |
||||
#define D10 B,2 |
||||
|
||||
// MOSI MISO SCK - not good for input
|
||||
#define D11 B,3 |
||||
#define D12 B,4 |
||||
#define D13 B,5 |
||||
|
||||
#define D14 C,0 |
||||
#define D15 C,1 |
||||
#define D16 C,2 |
||||
#define D17 C,3 |
||||
#define D18 C,4 |
||||
#define D19 C,5 |
||||
#define D20 C,6 |
||||
#define D21 C,7 |
||||
|
||||
#define A0 C,0 |
||||
#define A1 C,1 |
||||
#define A2 C,2 |
||||
#define A3 C,3 |
||||
#define A4 C,4 |
||||
#define A5 C,5 |
||||
#define A6 C,6 |
||||
#define A7 C,7 |
@ -0,0 +1,276 @@ |
||||
#include <avr/io.h> |
||||
#include <stdbool.h> |
||||
#include <stdint.h> |
||||
|
||||
#include "calc.h" |
||||
#include "iopins.h" |
||||
|
||||
|
||||
void set_dir_n(const uint8_t pin, const uint8_t d) |
||||
{ |
||||
switch(pin) { |
||||
case 0: set_dir(0, d); return; |
||||
case 1: set_dir(1, d); return; |
||||
case 2: set_dir(2, d); return; |
||||
case 3: set_dir(3, d); return; |
||||
case 4: set_dir(4, d); return; |
||||
case 5: set_dir(5, d); return; |
||||
case 6: set_dir(6, d); return; |
||||
case 7: set_dir(7, d); return; |
||||
case 8: set_dir(8, d); return; |
||||
case 9: set_dir(9, d); return; |
||||
case 10: set_dir(10, d); return; |
||||
case 11: set_dir(11, d); return; |
||||
case 12: set_dir(12, d); return; |
||||
case 13: set_dir(13, d); return; |
||||
case 14: set_dir(14, d); return; |
||||
case 15: set_dir(15, d); return; |
||||
case 16: set_dir(16, d); return; |
||||
case 17: set_dir(17, d); return; |
||||
case 18: set_dir(18, d); return; |
||||
case 19: set_dir(19, d); return; |
||||
case 20: set_dir(20, d); return; |
||||
case 21: set_dir(21, d); return; |
||||
} |
||||
} |
||||
|
||||
void as_input_n(const uint8_t pin) |
||||
{ |
||||
switch(pin) { |
||||
case 0: as_input(0); return; |
||||
case 1: as_input(1); return; |
||||
case 2: as_input(2); return; |
||||
case 3: as_input(3); return; |
||||
case 4: as_input(4); return; |
||||
case 5: as_input(5); return; |
||||
case 6: as_input(6); return; |
||||
case 7: as_input(7); return; |
||||
case 8: as_input(8); return; |
||||
case 9: as_input(9); return; |
||||
case 10: as_input(10); return; |
||||
case 11: as_input(11); return; |
||||
case 12: as_input(12); return; |
||||
case 13: as_input(13); return; |
||||
case 14: as_input(14); return; |
||||
case 15: as_input(15); return; |
||||
case 16: as_input(16); return; |
||||
case 17: as_input(17); return; |
||||
case 18: as_input(18); return; |
||||
case 19: as_input(19); return; |
||||
case 20: as_input(20); return; |
||||
case 21: as_input(21); return; |
||||
} |
||||
} |
||||
|
||||
|
||||
void as_input_pu_n(const uint8_t pin) |
||||
{ |
||||
switch(pin) { |
||||
case 0: as_input_pu(0); return; |
||||
case 1: as_input_pu(1); return; |
||||
case 2: as_input_pu(2); return; |
||||
case 3: as_input_pu(3); return; |
||||
case 4: as_input_pu(4); return; |
||||
case 5: as_input_pu(5); return; |
||||
case 6: as_input_pu(6); return; |
||||
case 7: as_input_pu(7); return; |
||||
case 8: as_input_pu(8); return; |
||||
case 9: as_input_pu(9); return; |
||||
case 10: as_input_pu(10); return; |
||||
case 11: as_input_pu(11); return; |
||||
case 12: as_input_pu(12); return; |
||||
case 13: as_input_pu(13); return; |
||||
case 14: as_input_pu(14); return; |
||||
case 15: as_input_pu(15); return; |
||||
case 16: as_input_pu(16); return; |
||||
case 17: as_input_pu(17); return; |
||||
case 18: as_input_pu(18); return; |
||||
case 19: as_input_pu(19); return; |
||||
case 20: as_input_pu(20); return; |
||||
case 21: as_input_pu(21); return; |
||||
} |
||||
} |
||||
|
||||
|
||||
void as_output_n(const uint8_t pin) |
||||
{ |
||||
switch(pin) { |
||||
case 0: as_output(0); return; |
||||
case 1: as_output(1); return; |
||||
case 2: as_output(2); return; |
||||
case 3: as_output(3); return; |
||||
case 4: as_output(4); return; |
||||
case 5: as_output(5); return; |
||||
case 6: as_output(6); return; |
||||
case 7: as_output(7); return; |
||||
case 8: as_output(8); return; |
||||
case 9: as_output(9); return; |
||||
case 10: as_output(10); return; |
||||
case 11: as_output(11); return; |
||||
case 12: as_output(12); return; |
||||
case 13: as_output(13); return; |
||||
case 14: as_output(14); return; |
||||
case 15: as_output(15); return; |
||||
case 16: as_output(16); return; |
||||
case 17: as_output(17); return; |
||||
case 18: as_output(18); return; |
||||
case 19: as_output(19); return; |
||||
case 20: as_output(20); return; |
||||
case 21: as_output(21); return; |
||||
} |
||||
} |
||||
|
||||
void set_pin_n(const uint8_t pin, const uint8_t v) |
||||
{ |
||||
switch(pin) { |
||||
case 0: set_pin(0, v); return; |
||||
case 1: set_pin(1, v); return; |
||||
case 2: set_pin(2, v); return; |
||||
case 3: set_pin(3, v); return; |
||||
case 4: set_pin(4, v); return; |
||||
case 5: set_pin(5, v); return; |
||||
case 6: set_pin(6, v); return; |
||||
case 7: set_pin(7, v); return; |
||||
case 8: set_pin(8, v); return; |
||||
case 9: set_pin(9, v); return; |
||||
case 10: set_pin(10, v); return; |
||||
case 11: set_pin(11, v); return; |
||||
case 12: set_pin(12, v); return; |
||||
case 13: set_pin(13, v); return; |
||||
case 14: set_pin(14, v); return; |
||||
case 15: set_pin(15, v); return; |
||||
case 16: set_pin(16, v); return; |
||||
case 17: set_pin(17, v); return; |
||||
case 18: set_pin(18, v); return; |
||||
case 19: set_pin(19, v); return; |
||||
case 20: set_pin(20, v); return; |
||||
case 21: set_pin(21, v); return; |
||||
} |
||||
} |
||||
|
||||
void set_low_n(const uint8_t pin) |
||||
{ |
||||
switch(pin) { |
||||
case 0: set_low(0); return; |
||||
case 1: set_low(1); return; |
||||
case 2: set_low(2); return; |
||||
case 3: set_low(3); return; |
||||
case 4: set_low(4); return; |
||||
case 5: set_low(5); return; |
||||
case 6: set_low(6); return; |
||||
case 7: set_low(7); return; |
||||
case 8: set_low(8); return; |
||||
case 9: set_low(9); return; |
||||
case 10: set_low(10); return; |
||||
case 11: set_low(11); return; |
||||
case 12: set_low(12); return; |
||||
case 13: set_low(13); return; |
||||
case 14: set_low(14); return; |
||||
case 15: set_low(15); return; |
||||
case 16: set_low(16); return; |
||||
case 17: set_low(17); return; |
||||
case 18: set_low(18); return; |
||||
case 19: set_low(19); return; |
||||
case 20: set_low(20); return; |
||||
case 21: set_low(21); return; |
||||
} |
||||
} |
||||
|
||||
void set_high_n(const uint8_t pin) |
||||
{ |
||||
switch(pin) { |
||||
case 0: set_high(0); return; |
||||
case 1: set_high(1); return; |
||||
case 2: set_high(2); return; |
||||
case 3: set_high(3); return; |
||||
case 4: set_high(4); return; |
||||
case 5: set_high(5); return; |
||||
case 6: set_high(6); return; |
||||
case 7: set_high(7); return; |
||||
case 8: set_high(8); return; |
||||
case 9: set_high(9); return; |
||||
case 10: set_high(10); return; |
||||
case 11: set_high(11); return; |
||||
case 12: set_high(12); return; |
||||
case 13: set_high(13); return; |
||||
case 14: set_high(14); return; |
||||
case 15: set_high(15); return; |
||||
case 16: set_high(16); return; |
||||
case 17: set_high(17); return; |
||||
case 18: set_high(18); return; |
||||
case 19: set_high(19); return; |
||||
case 20: set_high(20); return; |
||||
case 21: set_high(21); return; |
||||
} |
||||
} |
||||
|
||||
|
||||
void toggle_pin_n(const uint8_t pin) |
||||
{ |
||||
switch(pin) { |
||||
case 0: toggle_pin(0); return; |
||||
case 1: toggle_pin(1); return; |
||||
case 2: toggle_pin(2); return; |
||||
case 3: toggle_pin(3); return; |
||||
case 4: toggle_pin(4); return; |
||||
case 5: toggle_pin(5); return; |
||||
case 6: toggle_pin(6); return; |
||||
case 7: toggle_pin(7); return; |
||||
case 8: toggle_pin(8); return; |
||||
case 9: toggle_pin(9); return; |
||||
case 10: toggle_pin(10); return; |
||||
case 11: toggle_pin(11); return; |
||||
case 12: toggle_pin(12); return; |
||||
case 13: toggle_pin(13); return; |
||||
case 14: toggle_pin(14); return; |
||||
case 15: toggle_pin(15); return; |
||||
case 16: toggle_pin(16); return; |
||||
case 17: toggle_pin(17); return; |
||||
case 18: toggle_pin(18); return; |
||||
case 19: toggle_pin(19); return; |
||||
case 20: toggle_pin(20); return; |
||||
case 21: toggle_pin(21); return; |
||||
} |
||||
} |
||||
|
||||
|
||||
bool get_pin_n(const uint8_t pin) |
||||
{ |
||||
switch(pin) { |
||||
case 0: return get_pin(0); |
||||
case 1: return get_pin(1); |
||||
case 2: return get_pin(2); |
||||
case 3: return get_pin(3); |
||||
case 4: return get_pin(4); |
||||
case 5: return get_pin(5); |
||||
case 6: return get_pin(6); |
||||
case 7: return get_pin(7); |
||||
case 8: return get_pin(8); |
||||
case 9: return get_pin(9); |
||||
case 10: return get_pin(10); |
||||
case 11: return get_pin(11); |
||||
case 12: return get_pin(12); |
||||
case 13: return get_pin(13); |
||||
case 14: return get_pin(14); |
||||
case 15: return get_pin(15); |
||||
case 16: return get_pin(16); |
||||
case 17: return get_pin(17); |
||||
case 18: return get_pin(18); |
||||
case 19: return get_pin(19); |
||||
case 20: return get_pin(20); |
||||
case 21: return get_pin(21); |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
|
||||
bool is_low_n(const uint8_t pin) |
||||
{ |
||||
return !get_pin_n(pin); |
||||
} |
||||
|
||||
|
||||
bool is_high_n(const uint8_t pin) |
||||
{ |
||||
return get_pin_n(pin); |
||||
} |
@ -0,0 +1,213 @@ |
||||
#pragma once |
||||
|
||||
//
|
||||
// * Utilities for pin aliasing / numbering. *
|
||||
//
|
||||
// Designed for Arduino.
|
||||
//
|
||||
// If you know the pin number beforehand, you can use the macros.
|
||||
//
|
||||
// If you need to use a variable for pin number, use the `_n` functions.
|
||||
// They are much slower, so always check if you really need them
|
||||
// - and they aren't fit for things where precise timing is required.
|
||||
//
|
||||
|
||||
#include <avr/io.h> |
||||
#include <stdbool.h> |
||||
#include <stdint.h> |
||||
|
||||
#include "calc.h" |
||||
|
||||
|
||||
// type: pointer to port
|
||||
typedef volatile uint8_t* PORT_P; |
||||
|
||||
|
||||
/** Pin numbering reference */ |
||||
#define D0 0 |
||||
#define D1 1 |
||||
#define D2 2 |
||||
#define D3 3 |
||||
#define D4 4 |
||||
#define D5 5 |
||||
#define D6 6 |
||||
#define D7 7 |
||||
#define D8 8 |
||||
#define D9 9 |
||||
#define D10 10 |
||||
#define D11 11 |
||||
#define D12 12 |
||||
#define D13 13 |
||||
#define D14 14 |
||||
#define D15 15 |
||||
#define D16 16 |
||||
#define D17 17 |
||||
#define D18 18 |
||||
#define D19 19 |
||||
#define D20 20 |
||||
#define D21 21 |
||||
#define A0 14 |
||||
#define A1 15 |
||||
#define A2 16 |
||||
#define A3 17 |
||||
#define A4 18 |
||||
#define A5 19 |
||||
#define A6 20 |
||||
#define A7 21 |
||||
|
||||
|
||||
#define _ddr(pin) _DDR_##pin |
||||
#define _pin(pin) _PIN_##pin |
||||
#define _pn(pin) _PN_##pin |
||||
#define _port(pin) _PORT_##pin |
||||
|
||||
|
||||
/** Set pin direction */ |
||||
#define set_dir(pin, d) set_bit( _ddr(pin), _pn(pin), d ) |
||||
void set_dir_n(const uint8_t pin, const uint8_t d); |
||||
|
||||
|
||||
/** Configure pin as input */ |
||||
#define as_input(pin) cbi( _ddr(pin), _pn(pin) ) |
||||
void as_input_n(const uint8_t pin); |
||||
|
||||
|
||||
/** Configure pin as input, with pull-up enabled */ |
||||
#define as_input_pu(pin) { as_input(pin); set_high(pin); } |
||||
void as_input_pu_n(const uint8_t pin); |
||||
|
||||
|
||||
/** Configure pin as output */ |
||||
#define as_output(pin) sbi( _ddr(pin), _pn(pin) ) |
||||
void as_output_n(const uint8_t pin); |
||||
|
||||
|
||||
/** Write value to a pin */ |
||||
#define set_pin(pin, v) set_bit( _port(pin), _pn(pin), v ) |
||||
void set_pin_n(const uint8_t pin, const uint8_t v); |
||||
|
||||
|
||||
/** Write 0 to a pin */ |
||||
#define set_low(pin) cbi( _port(pin), _pn(pin) ) |
||||
void set_low_n(const uint8_t pin); |
||||
|
||||
|
||||
/** Write 1 to a pin */ |
||||
#define set_high(pin) sbi( _port(pin), _pn(pin) ) |
||||
void set_high_n(const uint8_t pin); |
||||
|
||||
|
||||
/** Toggle a pin state */ |
||||
#define toggle_pin(pin) sbi( _pin(pin), _pn(pin) ) |
||||
void toggle_pin_n(const uint8_t pin); |
||||
|
||||
|
||||
/** Read a pin value */ |
||||
#define get_pin(pin) get_bit( _pin(pin), _pn(pin) ) |
||||
bool get_pin_n(const uint8_t pin); |
||||
|
||||
|
||||
/** CHeck if pin is low */ |
||||
#define is_low(pin) (get_pin(pin) == 0) |
||||
bool is_low_n(const uint8_t pin); |
||||
|
||||
|
||||
/** CHeck if pin is high */ |
||||
#define is_high(pin) (get_pin(pin) != 0) |
||||
bool is_high_n(const uint8_t pin); |
||||
|
||||
|
||||
|
||||
// Helper macros
|
||||
|
||||
#define _PORT_0 PORTD |
||||
#define _PORT_1 PORTD |
||||
#define _PORT_2 PORTD |
||||
#define _PORT_3 PORTD |
||||
#define _PORT_4 PORTD |
||||
#define _PORT_5 PORTD |
||||
#define _PORT_6 PORTD |
||||
#define _PORT_7 PORTD |
||||
#define _PORT_8 PORTB |
||||
#define _PORT_9 PORTB |
||||
#define _PORT_10 PORTB |
||||
#define _PORT_11 PORTB |
||||
#define _PORT_12 PORTB |
||||
#define _PORT_13 PORTB |
||||
#define _PORT_14 PORTC |
||||
#define _PORT_15 PORTC |
||||
#define _PORT_16 PORTC |
||||
#define _PORT_17 PORTC |
||||
#define _PORT_18 PORTC |
||||
#define _PORT_19 PORTC |
||||
#define _PORT_20 PORTC |
||||
#define _PORT_21 PORTC |
||||
|
||||
#define _PIN_0 PIND |
||||
#define _PIN_1 PIND |
||||
#define _PIN_2 PIND |
||||
#define _PIN_3 PIND |
||||
#define _PIN_4 PIND |
||||
#define _PIN_5 PIND |
||||
#define _PIN_6 PIND |
||||
#define _PIN_7 PIND |
||||
#define _PIN_8 PINB |
||||
#define _PIN_9 PINB |
||||
#define _PIN_10 PINB |
||||
#define _PIN_11 PINB |
||||
#define _PIN_12 PINB |
||||
#define _PIN_13 PINB |
||||
#define _PIN_14 PINC |
||||
#define _PIN_15 PINC |
||||
#define _PIN_16 PINC |
||||
#define _PIN_17 PINC |
||||
#define _PIN_18 PINC |
||||
#define _PIN_19 PINC |
||||
#define _PIN_20 PINC |
||||
#define _PIN_21 PINC |
||||
|
||||
#define _DDR_0 DDRD |
||||
#define _DDR_1 DDRD |
||||
#define _DDR_2 DDRD |
||||
#define _DDR_3 DDRD |
||||
#define _DDR_4 DDRD |
||||
#define _DDR_5 DDRD |
||||
#define _DDR_6 DDRD |
||||
#define _DDR_7 DDRD |
||||
#define _DDR_8 DDRB |
||||
#define _DDR_9 DDRB |
||||
#define _DDR_10 DDRB |
||||
#define _DDR_11 DDRB |
||||
#define _DDR_12 DDRB |
||||
#define _DDR_13 DDRB |
||||
#define _DDR_14 DDRC |
||||
#define _DDR_15 DDRC |
||||
#define _DDR_16 DDRC |
||||
#define _DDR_17 DDRC |
||||
#define _DDR_18 DDRC |
||||
#define _DDR_19 DDRC |
||||
#define _DDR_20 DDRC |
||||
#define _DDR_21 DDRC |
||||
|
||||
#define _PN_0 0 |
||||
#define _PN_1 1 |
||||
#define _PN_2 2 |
||||
#define _PN_3 3 |
||||
#define _PN_4 4 |
||||
#define _PN_5 5 |
||||
#define _PN_6 6 |
||||
#define _PN_7 7 |
||||
#define _PN_8 0 |
||||
#define _PN_9 1 |
||||
#define _PN_10 2 |
||||
#define _PN_11 3 |
||||
#define _PN_12 4 |
||||
#define _PN_13 5 |
||||
#define _PN_14 0 |
||||
#define _PN_15 1 |
||||
#define _PN_16 2 |
||||
#define _PN_17 3 |
||||
#define _PN_18 4 |
||||
#define _PN_19 5 |
||||
#define _PN_20 6 |
||||
#define _PN_21 7 |
@ -1,22 +0,0 @@ |
||||
#pragma once |
||||
|
||||
//
|
||||
// Custom loops
|
||||
//
|
||||
|
||||
// Repeat code n times (uint8_t counter)
|
||||
#define repeat(count) repeat_aux(count, _repeat_##__COUNTER__) |
||||
#define repeat_aux(count, cntvar) for (uint8_t cntvar = 0; cntvar < (count); cntvar++) |
||||
|
||||
// Repeat code n times (uint16_t counter)
|
||||
#define repeatx(count) repeatx_aux(count, _repeatx_##__COUNTER__) |
||||
#define repeatx_aux(count, cntvar) for (uint16_t cntvar = 0; cntvar < (count); cntvar++) |
||||
|
||||
// Repeat with custom counter name (uint8_t)
|
||||
#define loop(var, count) repeat_aux(count, var) |
||||
// ..., uint16_t
|
||||
#define loopx(var, count) repeatx_aux(count, var) |
||||
|
||||
// Do until condition is met
|
||||
#define until(what) while(!(what)) |
||||
|
@ -1,6 +0,0 @@ |
||||
#pragma once |
||||
|
||||
// Weird constructs for the compiler
|
||||
|
||||
// general macros
|
||||
#define SECTION(pos) __attribute__((naked, used, section(pos))) |
@ -1,129 +0,0 @@ |
||||
#pragma once |
||||
|
||||
//
|
||||
// This file provides macros for pin manipulation.
|
||||
//
|
||||
// You can define your application pins like so:
|
||||
//
|
||||
// // Led at PORTB, pin 1
|
||||
// #define LED B,1
|
||||
//
|
||||
// // Switch at PORTD, pin 7
|
||||
// #define SW1 D,7
|
||||
//
|
||||
// Now you can use macros from this file to wirh with the pins, eg:
|
||||
//
|
||||
// as_output(LED);
|
||||
// as_input(SW1);
|
||||
// pullup_on(SW1);
|
||||
//
|
||||
// toggle_pin(LED);
|
||||
// while (pin_is_low(SW1));
|
||||
//
|
||||
// - The macros io2XXX() can be used to get literal name of register associated with the pin.
|
||||
// - io2n() provides pin number.
|
||||
// - The underscored and _aux macros are internal and should not be used elsewhere.
|
||||
// - The io_pack() macro is used to pass pin (io) to other macro without expanding it.
|
||||
//
|
||||
|
||||
#include <avr/io.h> |
||||
#include "calc.h" |
||||
|
||||
// Helpers
|
||||
// Get particular register associated with the name X (eg. D -> PORTD)
|
||||
#define _reg_ddr(X) DDR ## X |
||||
#define _reg_port(X) PORT ## X |
||||
#define _reg_pin(X) PIN ## X |
||||
#define _io2ddr_aux(reg, bit) _reg_ddr(reg) |
||||
#define _io2port_aux(reg, bit) _reg_port(reg) |
||||
#define _io2pin_aux(reg, bit) _reg_pin(reg) |
||||
#define _io2n_aux(reg, bit) bit |
||||
|
||||
|
||||
// === Convert A,1 to corresponding register and pin number ===
|
||||
|
||||
#define io2ddr(io) _io2ddr_aux(io) |
||||
#define io2port(io) _io2port_aux(io) |
||||
#define io2pin(io) _io2pin_aux(io) |
||||
#define io2n(io) _io2n_aux(io) |
||||
|
||||
// === covert "A", "1" to "A,1" for passing on to another macro ===
|
||||
#define io_pack(port, bit) port, bit |
||||
|
||||
|
||||
// === Useful types for ports and pins ===
|
||||
|
||||
// pointer to port
|
||||
typedef volatile uint8_t* PORT_P; |
||||
// number of bit in port
|
||||
typedef uint8_t BIT_N; |
||||
|
||||
|
||||
// === pin manipulation ===
|
||||
|
||||
// Helpers
|
||||
#define _set_pin_aux(port, bit) sbi(_reg_port(port), (bit)) |
||||
#define _clear_pin_aux(port, bit) cbi(_reg_port(port), (bit)) |
||||
#define _read_pin_aux(port, bit) get_bit(_reg_pin(port), (bit)) |
||||
#define _write_pin_aux(port, bit, value) set_bit(_reg_port(port), (bit), (value)) |
||||
#define _toggle_pin_aux(port, bit) sbi(_reg_pin(port), (bit)) |
||||
|
||||
|
||||
// Set pin to HIGH
|
||||
#define pin_up(io) _set_pin_aux(io) |
||||
#define pin_high(io) _set_pin_aux(io) |
||||
|
||||
// Set pin to LOW
|
||||
#define pin_down(io) _clear_pin_aux(io) |
||||
#define pin_low(io) _clear_pin_aux(io) |
||||
|
||||
// Get input pin value
|
||||
#define get_pin(io) _read_pin_aux(io) |
||||
#define read_pin(io) _read_pin_aux(io) |
||||
|
||||
// Check if pin is low or high
|
||||
#define pin_is_low(io) !_read_pin_aux(io) |
||||
#define pin_is_high(io) _read_pin_aux(io) |
||||
|
||||
// Write a value to pin
|
||||
#define set_pin(io, value) _write_pin_aux(io, (value)) |
||||
#define write_pin(io, value) _write_pin_aux(io, (value)) |
||||
#define toggle_pin(io) _toggle_pin_aux(io) |
||||
|
||||
|
||||
// === Setting pin direction ===
|
||||
|
||||
// Helpers
|
||||
#define _as_input_aux(port, bit) cbi(_reg_ddr(port), (bit)) |
||||
#define _as_output_aux(port, bit) sbi(_reg_ddr(port), (bit)) |
||||
#define _set_dir_aux(port, bit, dir) write_bit(_reg_ddr(port), (bit), (dir)) |
||||
|
||||
|
||||
// Pin as input (_pu ... with pull-up)
|
||||
#define as_input(io) _as_input_aux(io) |
||||
#define as_input_pu(io) do { _as_input_aux(io); _pullup_enable_aux(io); } while(0) |
||||
|
||||
// Pin as output
|
||||
#define as_output(io) _as_output_aux(io) |
||||
|
||||
// Set direction (1 ... output)
|
||||
#define set_dir(io, dir) _set_dir_aux(io, (dir)) |
||||
|
||||
|
||||
// === Setting pullup ===
|
||||
|
||||
// Helpers
|
||||
#define _pullup_enable_aux(port, bit) sbi(_reg_port(port), (bit)) |
||||
#define _pullup_disable_aux(port, bit) cbi(_reg_port(port), (bit)) |
||||
#define _set_pullup_aux(port, bit, on) write_bit(_reg_port(port), (bit), (on)) |
||||
|
||||
// Enable pullup
|
||||
#define pullup_enable(io) _pullup_enable_aux(io) |
||||
#define pullup_on(io) _pullup_enable_aux(io) |
||||
|
||||
// Disable pullup
|
||||
#define pullup_disable(io) _pullup_disable_aux(io) |
||||
#define pullup_off(io) _pullup_disable_aux(io) |
||||
|
||||
// Set pullup to value (1 ... pullup enabled)
|
||||
#define set_pullup(io, on) _set_pullup_aux(io, on) |
Loading…
Reference in new issue