Finalmente un po’ di tempo libero..Eravamo rimasti alla gestione dell’ADC interno all’ATMEGA16..ecco il codice:
#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/sleep.h>
ISR(ADC_vect) {
char s = SREG;
volatile uint8_t adcval;
adcval= ADCH; //con left align attivo
PORTB=adcval;
ADCSRA |= (1<<ADSC);
SREG = s;
sei();
}
void init(void) {
/* inizializzazione registo controllo ADC */
ADCSRA |= (1<<ADEN);
ADCSRA |= (0<<ADATE);
ADCSRA |= (1<<ADIE);
ADMUX =0b01100000; //attivo ADLAR e configuro tensione di riferimento a AVCC
/* inizializzazione porte output*/
DDRB=0xFF;
PORTB=0x00;
/* inizializzazione porta input */
DDRA=0x00;
PORTA=0x00;
ADCSRA |= (1<<ADSC);
}
int main(void) {
init();
for(;;)
sleep_mode();
return 0;
}
Per ora la gestione dell’ADC è gestita attraverso un interrupt hardware, ADC_vect, lanciato al termine della conversione e la parte main invece è una semplice routine di attesa (passiva).
Attnzione alla funzione “sei()”, in fondo a init e alla procedura ISR, perchè abilita gli interrupt!!
(naturalmente nella prima versione l’avevo dimenticata..e non funzionava nulla!).