You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
3.0 KiB
108 lines
3.0 KiB
10 years ago
|
#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.
|
||
10 years ago
|
- io2n() provides pin number.
|
||
10 years ago
|
- The XXX_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"
|
||
|
|
||
|
|
||
|
// 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 io2ddr(io) io2ddr_aux(io)
|
||
|
#define io2port_aux(reg, bit) reg_port(reg)
|
||
|
#define io2port(io) io2port_aux(io)
|
||
|
#define io2pin_aux(reg, bit) reg_pin(reg)
|
||
|
#define io2pin(io) io2pin_aux(io)
|
||
|
#define io2n_aux(reg, bit) bit
|
||
|
#define io2n(io) io2n_aux(io)
|
||
|
|
||
|
#define io_pack(port, bit) port, bit
|
||
|
|
||
|
|
||
|
// pointer to port
|
||
|
typedef volatile uint8_t* PORT_P;
|
||
|
// number of bit in port
|
||
|
typedef uint8_t BIT_N;
|
||
|
|
||
|
|
||
|
// === pin manipulation ===
|
||
10 years ago
|
#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))
|
||
10 years ago
|
|
||
|
|
||
10 years ago
|
#define pin_up(io) set_pin_aux(io)
|
||
10 years ago
|
#define pin_high(io) set_pin_aux(io)
|
||
|
|
||
10 years ago
|
#define pin_down(io) clear_pin_aux(io)
|
||
10 years ago
|
#define pin_low(io) clear_pin_aux(io)
|
||
|
|
||
10 years ago
|
#define get_pin(io) read_pin_aux(io)
|
||
10 years ago
|
#define read_pin(io) read_pin_aux(io)
|
||
|
|
||
|
#define pin_is_low(io) !read_pin_aux(io)
|
||
|
#define pin_is_high(io) read_pin_aux(io)
|
||
|
|
||
10 years ago
|
#define set_pin(io, value) write_pin_aux(io, (value))
|
||
|
#define write_pin(io, value) write_pin_aux(io, (value))
|
||
10 years ago
|
#define toggle_pin(io) toggle_pin_aux(io)
|
||
|
|
||
|
|
||
|
|
||
|
// setting pin direction
|
||
10 years ago
|
#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))
|
||
10 years ago
|
|
||
|
|
||
|
#define as_input(io) as_input_aux(io)
|
||
10 years ago
|
#define as_input_pu(io) do { as_input_aux(io); pullup_enable_aux(io); } while(0)
|
||
10 years ago
|
|
||
10 years ago
|
#define as_output(io) as_output_aux(io)
|
||
|
#define set_dir(io, dir) set_dir_aux(io, (dir))
|
||
10 years ago
|
|
||
|
|
||
|
// setting pullup
|
||
10 years ago
|
#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))
|
||
10 years ago
|
|
||
|
|
||
|
#define pullup_enable(io) pullup_enable_aux(io)
|
||
|
#define pullup_on(io) pullup_enable_aux(io)
|
||
|
|
||
|
#define pullup_disable(io) pullup_disable_aux(io)
|
||
|
#define pullup_off(io) pullup_disable_aux(io)
|
||
|
|
||
|
#define set_pullup(io, on) set_pullup_aux(io, on)
|