#define F_CPU 1000000UL #include #include #include #include "lcd.h" void init(void) { lcd_init(LCD_DISP_ON); lcd_clrscr(); lcd_gotoxy(0,0); lcd_puts("Servo control"); DDRB |= 0b00000010; ADMUX = (0 << REFS1) | (1 << REFS0) // AVcc as reference voltage | (0 << MUX3) | (0 << MUX2) | (1 << MUX1) | (1 << MUX0); ADCSRA = (1 << ADEN) | (1 << ADSC) // enabling and starting the ADC | (0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // 1 MHz/8 = 125 kHz clock ICR1 = 19999; // TOP value 19999 or 20 ms between pulses OCR1A = 1500; // set to 0.5 ms pulses to start with TCCR1A = (1 << COM1A1) | (0 << COM1A0) // non inverting | (0 << COM1B1) | (0 << COM1B0) // ch B disconnected | (1 << WGM11) | (0 << WGM10); // select mode 14 = 1110 TCCR1B = (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (0 << CS11) | (1 << CS10); // 1:1 prescaler } int main(void) { char buffer[40]; init(); while (1) { ADCSRA |= ( 1 << ADSC); // start conversion while (ADCSRA & (1 << ADSC)) {} // wait until finished OCR1A = 500 + 2*ADC; // scale ADC and set OCR1A sprintf(buffer, "ADC%4u OCR%4u", ADC, OCR1A); lcd_gotoxy(0,1); _delay_ms(50); lcd_puts(buffer); } }