/*
  VochtMeter

  Pros 2008
*/


#define F_CPU 9600000UL


#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/sleep.h>
#include <compat/deprecated.h>
#include <util/delay.h>

#define delay(x) _delay_loop_1(x)

void delay_ms(unsigned int ms)
{
    for (; ms > 0ms--) {
        _delay_ms(0.998);
    }
}


void delay_us(unsigned int us)
{
    for (; us > 0us--) {
        _delay_us(0.95);
    }
}


void init(void)
{
    CLKPR = (1 << CLKPCE);
    CLKPR = 0;                                                  // Set max. system-clk

    ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);  // Initialiseer ADC
    ADMUX = 3;                                                  // Ref = 5V
    sbi(ADCSRAADSC);                                          // start dummy conversion

    TCCR0A = _BV(COM0A1) | _BV(WGM00);                          // Counter0 in Phase Correct PWM, OC0A = uitgang
    TCCR0B = _BV(CS00);                                         // Geen prescaler
    OCR0A = 50;
    DDRB = _BV(PB0) | _BV(PB2);

    delay_ms(100);
}


unsigned int convertanalog(unsigned char channel)
{
    unsigned int cntadc;

    ADMUX = (channel & 0x07);                                   // ADC-kanaal instellen
    delay_ms(5);                                                // en even wachten
    sbi(ADCSRAADSC);                                          // start 1e conversie
    while (bit_is_set(ADCSRAADSC)) {                          // Effe wachten
    }                                                           // Hier doen we niets mee...
    adc = 0;
    for (cnt = 0cnt < 8cnt++) {                             // We nemen nu 8 samples
        delay_us(1000);                                         // met een tussenpoos van 1mS
        sbi(ADCSRAADSC);
        while (bit_is_set(ADCSRAADSC)) {
        }
        adc += ADC;
    }

    return (adc);                                               // 0 ... 8184
}


int main(void)
{
    unsigned int spanning;

    init();

    while (1) {
        DDRB = _BV(PB0) | _BV(PB3);                             // PB3 = uitgang
        PORTB = _BV(PB3);                                       // Hoog maken
        delay_ms(50);
        spanning = convertanalog(2);                            // PB4 = ADC2! = ADC-ingang
        DDRB = _BV(PB0) | _BV(PB4);                             // PB4 = uitgang
        PORTB = _BV(PB4);                                       // Hoog maken
        delay_ms(50);
        spanning += convertanalog(3);                           // PB3 = ADC3 = ADC-ingang
        //spanning /= 64;
        spanning /= 30;
        if (spanning == 0) {
            OCR0A = 1;
        } else if (spanning > 254) {
            OCR0A = 254;
        } else {
            OCR0A = (unsigned charspanning;
        }
    }
}