#include <avr/io.h>
#include <avr/interrupt.h>
#define SENSORS 2 // three thermistors measuring temperature (0-2)
#define MUX_OFFSET 0x40 // MUX value for REFS0 to be enabled for AREV <---> VCC tie
SIGNAL(SIG_ADC);
int main (void);
unsigned int adc_data; //variable for ADC results
unsigned int illuminate; //led display pattern
SIGNAL(SIG_ADC) //ADC ISR
{
adc_data = ADCW; //read all 10 bits into variable
/* ADC data from thermistors translated into five different hex values.
Hex values are stored for display to appropriate output LED port.
Shows driver grease temperature by illuminating LEDs.
The more LEDs that are on, the hotter the fuel is. */
if ( adc_data <= 432 )
illuminate = 0x00; // less than 65F - all lights off
else if ( adc_data > 432 && adc_data <= 530)
illuminate = 0x01; // 65F - 85F bin: 0001 dec: 1 hex: 0x01
else if (adc_data > 530 && adc_data <= 770 )
illuminate = 0x03; // 85F - 105F bin: 0011 dec: 3 hex: 0x03
else if (adc_data > 770 && adc_data <= 827)
illuminate = 0x07; // 105F - 125F bin: 0111 dec: 7 hex: 0x07
else if (adc_data > 827 && adc_data <= 1023)
illuminate = 0x0F; // 135F+ bin: 1111 dec: 0 hex: 0x0F
else
illuminate = 0x00; //error all lights off
if ( ADMUX == (MUX_OFFSET) )
PORTA = illuminate; //store sensor-1 results
else if ( ADMUX == (MUX_OFFSET + 1) )
PORTC = illuminate; //store sensor-2 results
else if ( ADMUX == (MUX_OFFSET + 2) )
PORTD = illuminate; //store sensor-3 results
else {
PORTA = 0x0A; //MUX Error: 0101 (led pattern)
PORTC = 0x0A; //MUX Error: 0101 (led pattern)
PORTD = 0x0A; //MUX Error: 0101 (led pattern)
}
// rotate through sensors
if ( ADMUX < ( SENSORS + MUX_OFFSET ) )
ADMUX += 1; //change mux to next sensor
else
ADMUX = MUX_OFFSET; //reset mux to first sensor
ADCSRA = ADCSRA | MUX_OFFSET; //start the next conversion
}
int main(void)
{
DDRA=0x0F; //LED output (first four pins)
DDRC=0x0F; //LED output (first four pins)
DDRD=0x0F; //LED output (first four pins)
ADCSRA=0xCE; //ADC on, /64, interrupt enable, and started
ADMUX=MUX_OFFSET; //REFS0 (bit 6) on for AREV <--> AVCC
PORTA = 0x0F; //power on: 1111 (led pattern)
PORTC = 0x0F; //power on: 1111 (led pattern)
PORTD = 0x0F; //power on: 1111 (led pattern)
sei(); //global interrupt enable bit
while(1) {
}
}