87 lines
1.9 KiB
C++
Executable File
87 lines
1.9 KiB
C++
Executable File
#include <avr/io.h>
|
|
#include <avr/interrupt.h>
|
|
|
|
//*********************************************//
|
|
//********* Prototypes de fonctions ***********//
|
|
//*********************************************//
|
|
|
|
//Initialise l'ADC et démarre une première conversion
|
|
void initAdc();
|
|
|
|
|
|
//*********************************************//
|
|
//********* Variables globales ***********//
|
|
//*********************************************//
|
|
|
|
//ADC variables
|
|
volatile uint16_t adc = 0;
|
|
|
|
|
|
//*********************************************//
|
|
//********* Programme principal ***********//
|
|
//*********************************************//
|
|
int main(void){
|
|
|
|
initAdc();
|
|
|
|
DDRB |= 1<<DDB0;
|
|
|
|
sei(); //Activer les interruptions
|
|
|
|
while(1){
|
|
|
|
if(adc > 0){
|
|
PORTB |= 1<<PORTB0;
|
|
}
|
|
else{
|
|
PORTB &= ~(1<<PORTB0);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
//*********************************************//
|
|
//********* Interruptions ***********//
|
|
//*********************************************//
|
|
|
|
//Interruption lorsqu'une conversion de l'ADC se termine
|
|
//Conversion en boucle
|
|
ISR(ADC_vect){
|
|
|
|
//Lire le resultat
|
|
adc = ADC;
|
|
|
|
//Démarrer une nouvelle conversion
|
|
ADCSRA |= 1<<ADSC;
|
|
|
|
}
|
|
|
|
//*********************************************//
|
|
//********* Fonctions ***********//
|
|
//*********************************************//
|
|
|
|
//Initialise l'ADC et démarre une première conversion
|
|
void initAdc(){
|
|
|
|
//Activer l'ADC via ADEN dans ADCSRA
|
|
ADCSRA |= 1<ADEN;
|
|
|
|
//Selectionner la référence de voltage via REFSn dans ADMUX
|
|
//Rien à faire car utilisation de AREF, donc REFS0 et RES1 = 0
|
|
|
|
//Sélectionner le premier convertisseur via MUX dans ADMUX
|
|
//Rien à faire car l'on souhaite commencer par ADC0, donc MUX3...0 = 0
|
|
|
|
//Activer l'interruption sur conversion terminée via ADIE dans ADCSRA
|
|
ADCSRA |= 1<<ADIE;
|
|
|
|
//Paramétrer le prescaler de l'ADC à 64 :horloge 8Mhz -> horloge ADC de 125kHz
|
|
ADCSRA |= 1<<ADPS1 | 1<<ADPS2;
|
|
|
|
//Démarrer une première conversion
|
|
ADCSRA |= 1<<ADSC;
|
|
|
|
}
|