Estoy usando el pin ADC0 (PA0) de un Attiny84 para leer valores analógicos de un circuito de audio. Esta parte está funcionando bien. Ya que necesito conectar el Attiny84 a 8 LED, me gustaría usar el pin ADC0 como salida también.
Aquí está el esquema:
Pero esto no funciona. Los LEDs no se encienden. (Se activan según los valores de ADC0 leídos).
¿Tiene esto algo que ver con habilitar los pull-ups?
¿O no es posible cambiar ADC0 entre entrada y salida?
Aquí está el código:
// set pin as input
DDRA &= ~(1 << PA0);
// unset DIDR0
DIDR0 &= (1 << ADC0D);
// enable ADC
ADCSRA |= (1 << ADEN);
// start conversion
ADCSRA |= (1 << ADSC);
// loop till done
while(ADCSRA & (1 << ADSC));
// use h/l regs
unsigned char adcl = ADCL;
unsigned char adch = ADCH;
int result = (adch << 8) | adcl;
// set DIDR0
DIDR0 |= ~(1 << ADC0D);
// set pin as output
DDRA |= (1 << PA0);
// switch LED on
PORTA |= (1 << PA0);
// switch other LEDs on which have been set as output
//...
PORTA |= (1 << PA1);
El código anterior se llama desde el controlador de interrupción por desbordamiento del temporizador de 8 bits. El temporizador se configura desde main () de la siguiente manera:
// set 8-bit timer
cli();
// set prescaler to 256
TCCR0B |= (1 << CS02);
// set overflow interrupt enable
TIMSK0 |= (1 << TOIE0);
sei();