#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) {
        }
}