// Macro che puntano ai registri dell'ADC
#define ADMUX (*((volatile uint8_t *)0x7C))
#define ADCSRA (*((volatile uint8_t *)0x7A))
#define ADC (*((volatile uint16_t *)0x78))
// Variabili utili per il Potenziometro
uint16_t currentPotentiometerValue = 0;
uint16_t previousPotentiometerValue = 0;
float Tb = 16;
void setup()
{
Serial.begin(9600);
// Init. dell'ADC per le Letture del Potenziometro
init_Adc();
}
// Inizializzazione dell'ADC
void init_Adc()
{
// Abilita l'ADC e imposta il prescaler a 128 (16 MHz / 128 = 125 KHz)
ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
// Seleziona il canale ADC (nel mio caso il pin A0)
ADMUX = (ADMUX & 0xF8) | (0x00);
}
// Conversione e Lettura del valore contenuto in ADC
uint16_t readPotentiometer()
{
// Avvia la conversione
ADCSRA |= (1 << ADSC);
// Attende che la conversione sia completata (ADSC diventa 0)
while (ADCSRA & (1 << ADSC));
// Legge il valore dal registro ADC
return ADC; // accedo al valore nei registri ADCL e ADCH come se fosse un singolo valore di 16 bit.
}
// Metodo che ad ogni loop controlla se il Potenziometro è cambiato,
// ed in caso positivo aggiorna il valore di Tb.
void checkPotentiometerMove()
{
currentPotentiometerValue = readPotentiometer();
if(currentPotentiometerValue != previousPotentiometerValue) {
Tb = ((float)currentPotentiometerValue / 1023.0) * (26.0 - 16.0) + 16.0;
previousPotentiometerValue = currentPotentiometerValue;
Serial.println("Tb Changed !");
}
}
void loop() {
checkPotentiometerMove();
delay(2000);
}