img_0179

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!).

Questa voce è stata pubblicata in Tech Corner e contrassegnata con , , , , . Contrassegna il permalink.