diff --git a/main.c b/main.c index 1687e72..762ed78 100644 --- a/main.c +++ b/main.c @@ -16,18 +16,26 @@ int main(){ void prepare(){ serial_init(9600); - digital_pin_mode(5, OUTPUT); - digital_pin_mode(11, OUTPUT); + /*pin_mode(11, OUTPUT); + pin_mode(10, INPUT); + pin_mode(8, INPUT);*/ + pin_mode(A4, INPUT); } void loop(){ - digital_write(5, HIGH); - digital_write(11, HIGH); + /*if(digital_read(10) && digital_read(8)){ + digital_write(11, HIGH); + } + else{ + digital_write(11, LOW); + }*/ - _delay_ms(1000); - - digital_write(5, LOW); - digital_write(11, LOW); - - _delay_ms(1000); + if(analog_read(A4) > 0){ + serial_write("ok", 3); + } + else{ + serial_write("nope", 5); + } + + _delay_ms(25); } diff --git a/pins.c b/pins.c index 30d88f6..39f1a4b 100644 --- a/pins.c +++ b/pins.c @@ -6,27 +6,52 @@ const unsigned char HIGH = 0x01; const unsigned char INPUT = 0x00; const unsigned char OUTPUT = 0x01; -void digital_pin_mode(unsigned char pin, unsigned char mode){ - if(pin > 13){ +// analog pins (digital range from 0 to 13) +const unsigned char A0 = 0x0e; +const unsigned char A1 = 0x0f; +const unsigned char A2 = 0x10; +const unsigned char A3 = 0x11; +const unsigned char A4 = 0x12; +const unsigned char A5 = 0x13; +const unsigned char A6 = 0x14; +const unsigned char A7 = 0x15; + +unsigned char map_analog_pin(unsigned char); + +void pin_mode(unsigned char pin, unsigned char mode){ + if(pin > A7){ return; } if(pin < 8){ + // digital pin 0-7 if(mode == INPUT){ - DDRD &= ~_BV(DDD0+pin); + DDRD &= ~_BV(pin); } else{ - DDRD |= _BV(DDD0+pin); + DDRD |= _BV(pin); } } - else{ + else if(pin < 14){ + // digital pin 8-13 pin -= 8; if(mode == INPUT){ - DDRB &= ~_BV(DDB0+pin); + DDRB &= ~_BV(pin); } else{ - DDRB |= _BV(DDB0+pin); + DDRB |= _BV(pin); + } + } + else{ + // analog pin 0-7 + pin -= 14; + + if(mode == INPUT){ + DDRC &= ~_BV(pin); + } + else{ + DDRC |= _BV(pin); } } } @@ -40,12 +65,12 @@ int digital_read(unsigned char pin){ if(pin < 8){ // pin 0-7 - return PIND&_BV(DDD0+pin); + return PIND&_BV(pin) ? 1 : 0; } // pin 8-13 pin -= 8; - return PINB&_BV(DDB0+pin); + return PINB&_BV(pin) ? 1 : 0; } void digital_write(unsigned char pin, unsigned char value){ @@ -57,63 +82,64 @@ void digital_write(unsigned char pin, unsigned char value){ if(pin < 8){ // pin 0-7 -// DDRD |= _BV(DDD0+pin); - if(value == HIGH){ - PORTD |= _BV(DDD0+pin); + PORTD |= _BV(pin); } else{ - PORTD &= ~_BV(DDD0+pin); + PORTD &= ~_BV(pin); } } else{ // pin 8-13 pin -= 8; -// DDRB |= _BV(DDB0+pin); if(value == HIGH){ - PORTB |= _BV(DDB0+pin); + PORTB |= _BV(pin); } else{ - PORTB &= ~_BV(DDB0+pin); + PORTB &= ~_BV(pin); } } } -void analog_pin_mode(unsigned char pin, unsigned char mode){ - if(pin > 7){ - return; - } - - if(mode == INPUT){ - DDRC &= ~_BV(DDC0+pin); - } - else{ - DDRC |= _BV(DDC0+pin); - } -} - int analog_read(unsigned char pin){ + pin = map_analog_pin(pin); + if(pin > 7){ return 0; } - return PINC&_BV(DDC0+pin); + // TODO use ADC + + ADMUX = 0xf0|pin; + ADCSRA |= _BV(pin); + while(ADCSRA&_BV(pin)); + + return ADC; } -void analog_write(unsigned char pin, unsigned char value){ +void analog_write(unsigned char pin, int value){ + pin = map_analog_pin(pin); + if(pin > 7){ return; } // TODO turn off pwm - DDRC |= _BV(DDC0+pin); - if(value == HIGH){ - PORTC |= _BV(DDC0+pin); + PORTC |= _BV(pin); } else{ - PORTC &= ~_BV(DDC0+pin); + PORTC &= ~_BV(pin); } } + +// maps A0-A7 to 0-7 +unsigned char map_analog_pin(unsigned char pin){ + if(pin > 7){ + return pin-A0; + } + + return pin; +} diff --git a/pins.h b/pins.h index 7e2d347..849fe71 100644 --- a/pins.h +++ b/pins.h @@ -6,13 +6,19 @@ extern const unsigned char HIGH; extern const unsigned char INPUT; extern const unsigned char OUTPUT; -// rename underscore, unify digital and analog -void digital_pin_mode(unsigned char, unsigned char); +extern const unsigned char A0; +extern const unsigned char A1; +extern const unsigned char A2; +extern const unsigned char A3; +extern const unsigned char A4; +extern const unsigned char A5; +extern const unsigned char A6; +extern const unsigned char A7; + +void pin_mode(unsigned char, unsigned char); int digital_read(unsigned char); void digital_write(unsigned char, unsigned char); - -void analog_pin_mode(unsigned char, unsigned char); int analog_read(unsigned char); -void analog_write(unsigned char, unsigned char); +void analog_write(unsigned char, int); #endif