/*
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 > 0; ms--) {
_delay_ms(0.998);
}
}
void delay_us(unsigned int us)
{
for (; us > 0; us--) {
_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(ADCSRA, ADSC); // 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 cnt, adc;
ADMUX = (channel & 0x07); // ADC-kanaal instellen
delay_ms(5); // en even wachten
sbi(ADCSRA, ADSC); // start 1e conversie
while (bit_is_set(ADCSRA, ADSC)) { // Effe wachten
} // Hier doen we niets mee...
adc = 0;
for (cnt = 0; cnt < 8; cnt++) { // We nemen nu 8 samples
delay_us(1000); // met een tussenpoos van 1mS
sbi(ADCSRA, ADSC);
while (bit_is_set(ADCSRA, ADSC)) {
}
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 char) spanning;
}
}
}