#include #include #include char duty, count2, direction=0, temp, ach0, alarm_trigger=0; unsigned int alarm_count=0; ISR(TIMER0_COMPB_vect){ OCR0B=duty; } //interrupt for ADC ISR(ADC_vect) { ADMUX = 0x21; ach0=ADCH; ADCSRA |= (1 << ADSC); // enable next conversion } int main(void) { DDRB=0x02; //Output compare OC1A 8 bit non inverted PWM ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Set ADC prescaler to 128 - 125KHz sample rate @ 16MHz ADMUX |= (1 << MUX0); // set adc to adc1 (PB2) ADMUX |= (1 << ADLAR); // Left adjust ADC result to allow easy 8 bit reading // No MUX values needed to be changed to use ADC0 ADCSRA |= (1 << ADEN); // Enable ADC ADCSRA |= (1 << ADIE); // Enable ADC Interrupt sei(); // Enable Global Interrupts ADCSRA |= (1 << ADSC); // Start A2D Conversions TCCR0A=0x21; //start timer with 256 prescaler TCCR0B=0x0B; OCR0A=150; duty=50; //Output compare OC1A 8 bit non inverted PWM //TCCR1A=0xA1; //start timer with 256 prescaler //TCCR1B=0x03; //enable output compare interrupt for OCR1A TIMSK=0x08; for (;;) { if ((PINB & 0x10) == 0){ if (duty>=17){ duty=17;} else{duty++;} } else if ((PINB & 0x08) == 0){ if (duty<=4){ duty=4;} else{duty--;} } else if (alarm_trigger==1) { duty=4; alarm_count++; if (alarm_count>=30000){ alarm_trigger=0; alarm_count=0; } } else{ duty=0; } if (ach0>=25){ alarm_trigger=1; } } return 1; }