Fixed reading digital pin, started analog pin.

This commit is contained in:
Marvin Blum
2017-03-21 19:59:53 +01:00
parent 3f75505887
commit fbf8bd8a4f
3 changed files with 90 additions and 50 deletions

96
pins.c
View File

@@ -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;
}