/* servo_02.c ATmega88 @ 8MHz */ #include <avr/io.h> #include <util/delay.h> int main(void) { DDRB |= (1<<PB1); // OC1A = output DDRC = 0xFC; // PC0 und PC1 = input PORTC = 0x03; // PC0 und PC1 Pullup ICR1 = 19999; // Top Value = 19999 (20ms) PWM-Frequenz = 50Hz OCR1A = 1500; // Compare Match bei 1,5ms (Servoposition Mitte) // Clear OC1A on Compare Match, Mode 14, Fast PWM, ICR1 = TOP, Prescaler = 1 TCCR1A = (1 << COM1A1) + (1 << WGM11); TCCR1B = (1 << WGM13) + (1 << WGM12) + (1 << CS10); while(1) { if (!(PINC & (1<<PINC0))) // Impulszeit verlängern (Servo dreht nach rechts) { if (OCR1A <= 2000) // Max. Servowinkel { OCR1A = OCR1A + 10; // OCR um 10 erhöhen _delay_ms(20); // 20ms warten } } if (!(PINC & (1<<PINC1))) // Impulszeit verkürzen (Servo dreht nach links) { if (OCR1A >= 1000) // Min. Servowinkel { OCR1A = OCR1A - 10; // OCR um 10 vermindern _delay_ms(20); // 20ms warten } } } }