/* (C) 2006 Julian von Mendel 2012 corrections by W. Haslbeck */ #include "config.h" #include "lib.h" #include #include #include #include #include /* GENERAL */ inline void pause(uint16_t ms) { /* pauses the program for the given time; * ms: time in milliseconds (0 - 65535) */ uint16_t i; for(i=0; i < ms/63; i++) _delay_ms(63); _delay_ms(ms%63); } /* IOs */ uint8_t io_info(uint8_t ionr, uint8_t var) { /* returns the requested variable for the pin io_nr; * io_nr: pin * var: 0 * 1 returns number of ADC-port, if it isn't an ADC-port, 255 is returned * 2 returns number of servo, if it isn't a defined servo, 255 is returned */ switch(var) { case 0: switch(ionr) { case 1 : case 9 : case 12: return 6; case 2 : case 14: case 23: return 0; case 3 : case 15: case 24: return 1; case 4 : case 16: case 25: return 2; case 5 : case 17: case 26: return 3; case 6 : case 18: case 27: return 4; case 11: case 19: case 28: return 5; case 10: case 13: return 7; } break; case 1: if (ionr >= 23 && ionr <= 28) return ionr-23; break; case 2: if (ionr == 255) return 255; else if (ionr == SERVO0) return 0; else if (ionr == SERVO1) return 1; else if (ionr == SERVO2) return 2; else if (ionr == SERVO3) return 3; else if (ionr == SERVO4) return 4; else if (ionr == SERVO5) return 5; else if (ionr == SERVO6) return 6; else if (ionr == SERVO7) return 7; else if (ionr == SERVO8) return 8; else if (ionr == SERVO9) return 9; } return 255; } void io_set_(volatile uint8_t *ddr, volatile uint8_t *port, uint8_t pinnr, uint8_t status) { /* sets an io; * status: * 0 deactivated output * 1 activated output * 2 output * 3 input with activated pullup * 4 input with deactivated pullup */ 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); *port |= (1 << pinnr); break; case 4: *ddr &= ~(1 << pinnr); *port &= ~(1 << pinnr); } } void io_set(uint8_t ionr, uint8_t status) { /* sets an io; * ionr: pin * status: * 0 deactivated output * 1 activated output * 2 output * 3 input with activated pullup * 4 input with deactivated pullup */ if (ionr == 1 || (ionr >= 23 && ionr <= 28)) io_set_(&DDRC,&PORTC,io_info(ionr,0),status); else if ((ionr >= 2 && ionr <= 6) || (ionr >= 11 && ionr <= 13)) io_set_(&DDRD,&PORTD,io_info(ionr,0),status); else if ( (ionr >= 14 && ionr <= 19) || (ionr >= 9 && ionr <= 10)) io_set_(&DDRB,&PORTB,io_info(ionr,0),status); } uint8_t io_get(uint8_t ionr) { /* checks the status of the given input pin * io_nr: pin */ if (ionr == 1 || (ionr >= 23 && ionr <= 28)) return io_get_(&PINC, io_info(ionr,0)); else if ((ionr >= 2 && ionr <= 6) || (ionr >= 11 && ionr <= 13)) return io_get_(&PIND, io_info(ionr,0)); else if ((ionr >= 14 && ionr <= 19) || (ionr >= 9 && ionr <= 10)) return io_get_(&PINB, io_info(ionr,0)); return 255; } inline uint8_t io_get_(volatile uint8_t *pin, uint8_t pinnr) { /* checks the status of the given input pin */ if (*pin & (1 << pinnr)) return 0; return 1; } /* ADC */ uint16_t adc(uint8_t ionr) { /* checks the input of the given adc-port (10 bit); * io_nr: pin */ uint8_t admux = io_info(ionr,1); if (admux == 255) return(65535); ADCSRA = (1<>8); UBRRL = (uint8_t) UART_UBRR_CALC(baudrate,F_CPU); // Ggf. TX und RX anschalten UCSRA |= (1<