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=0×00;

/* inizializzazione porta input */

DDRA=0×00;

PORTA=0×00;

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

This entry was posted in Tech Corner and tagged , , , , . Bookmark the permalink.

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

*


− 5 = 2

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>