#include #include "io.h" #include "general.h" /** **************************************************************** * io_info * * @Brief !!! FOR INTERNAL USE ONLY !!! *******************************************************************/ uint8_t io_info(uint8_t ionr) { switch(ionr) { case 22: case 53: case 37: case 21: case 0 : case 54: case 41: case 17: case 15: case 62: case 49: return 0; case 23: case 52: case 36: case 20: case 1 : case 55: case 40: case 16: case 14: case 63: case 48: return 1; case 24: case 51: case 35: case 19: case 56: case 39: case 64: return 2; case 25: case 50: case 34: case 18: case 5 : case 57: case 6 : case 65: return 3; case 26: case 10: case 33: case 2 : case 58: case 7 : case 66: case 45: return 4; case 27: case 11: case 32: case 3 : case 59: case 4 : case 8 : case 67: case 44: return 5; case 28: case 12: case 31: case 60: case 68: case 43: return 6; case 29: case 13: case 30: case 38: case 61: case 69: return 7; } return 255; } /** **************************************************************** * io_set_ * * @Brief !!! FOR INTERNAL USE ONLY !!! *******************************************************************/ inline void io_set_(volatile uint8_t *ddr, volatile uint8_t *port, uint8_t pinnr, uint8_t status) { switch(status) { case 0: *ddr |= (1 << pinnr); *port &= ~(1 << pinnr); break; case 1: default: *ddr |= (1 << pinnr); *port |= (1 << pinnr); break; case 2: *ddr |= (1 << pinnr); break; case 3: *ddr &= ~(1 << pinnr); break; case 4: *ddr &= ~(1 << pinnr); *port |= (1 << pinnr); break; case 5: *ddr &= ~(1 << pinnr); *port &= ~(1 << pinnr); break; case 6: *port |= (1 << pinnr); break; case 7: *port &= ~(1 << pinnr); break; } } /** **************************************************************** * io_get_ * * @Brief !!! FOR INTERNAL USE ONLY !!! *******************************************************************/ inline uint8_t io_get_(volatile uint8_t *pin, uint8_t pinnr) { if (*pin & (1 << pinnr)) return FALSE; return TRUE; } /** **************************************************************** * set_io * * @Brief Set status of a pin * * @Param ionr Number of the Arduino Mega pin * @Param var Status to set * 0 = Output low * 1 = Output high * 2 = Output * 3 = Input * 4 = Input with internal pullup * 5 = Input without internal pullup * 6 = Enable internal pullup * 7 = Disable internal pullup * * @Return none *******************************************************************/ void set_io(uint8_t pin, uint8_t status) { switch (pin) { case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: io_set_(&DDRA,&PORTA,io_info(pin),status); break; case 10: case 11: case 12: case 13: case 50: case 51: case 52: case 53: io_set_(&DDRB,&PORTB,io_info(pin),status); break; case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: io_set_(&DDRC,&PORTC,io_info(pin),status); break; case 18: case 19: case 20: case 21: case 38: io_set_(&DDRD,&PORTD,io_info(pin),status); break; case 0 : case 1 : case 2 : case 3 : case 5 : io_set_(&DDRE,&PORTE,io_info(pin),status); break; case 54: case 55: case 56: case 57: case 58: case 59: case 60: case 61: io_set_(&DDRF,&PORTF,io_info(pin),status); break; case 4: case 39: case 40: case 41: io_set_(&DDRG,&PORTG,io_info(pin),status); break; case 16: case 17: case 6 : case 7 : case 8 : case 9 : io_set_(&DDRH,&PORTH,io_info(pin),status); break; case 14: case 15: io_set_(&DDRJ,&PORTJ,io_info(pin),status); break; case 62: case 63: case 64: case 65: case 66: case 67: case 68: case 69: io_set_(&DDRK,&PORTK,io_info(pin),status); break; case 42: case 43: case 44: case 45: case 46 : case 47: case 48: case 49: io_set_(&DDRL,&PORTL,io_info(pin),status); break; } } /** **************************************************************** * get_io * * @Brief Get status of a pin * * @Param pin Number of the Arduino Mega pin * * @Return 0 = LOW, 1=HIGH, 255 = Port unknown *******************************************************************/ uint8_t get_io(uint8_t pin) { switch (pin) { case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: return io_get_(&PINA, io_info(pin)); break; case 10: case 11: case 12: case 13: case 50: case 51: case 52: case 53: return io_get_(&PINB, io_info(pin)); break; case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: return io_get_(&PINC, io_info(pin)); break; case 18: case 19: case 20: case 21: case 38: return io_get_(&PIND, io_info(pin)); break; case 0 : case 1 : case 2 : case 3 : case 5 : return io_get_(&PINE, io_info(pin)); break; case 54: case 55: case 56: case 57: case 58: case 59: case 60: case 61: return io_get_(&PINF, io_info(pin)); break; case 4: case 39: case 40: case 41: return io_get_(&PING, io_info(pin)); break; case 16: case 17: case 6 : case 7 : case 8 : case 9 : return io_get_(&PINH, io_info(pin)); break; case 14: case 15: return io_get_(&PINJ, io_info(pin)); break; case 62: case 63: case 64: case 65: case 66: case 67: case 68: case 69: return io_get_(&PINK, io_info(pin)); break; case 42: case 43: case 44: case 45: case 46 : case 47: case 48: case 49: return io_get_(&PINL, io_info(pin)); break; } return 255; }