Hier einmal mein Versuch... egal wieviel Hertz ich an den Eingang anlege, der Servo läuft immer gaaanz langsam runter in seine Nullstellung... verändern der C-Variable ändert auch nichts...Code:#include <avr/io.h>#include <avr/interrupt.h> volatile uint8_t y, p; unsigned char b, c, a; ISR(TIM0_COMPA_vect) // Servoansteuerung { static uint16_t count=0; if (count>y) PORTB &= ~(1<<PB4); else PORTB |= (1<<PB4); // solange count größer ist als y pb4=1 if (count < 2000) count++; else { count=0; if(p) p--; } //p wird mit 960.0000 /96 = 100khz /2000 =50hz angesteuert (20ms) p wird runtergezählt (p=50 = eine sekunde) } int main(void) { DDRB = (1<<PB4)|(1<<PB1); // Servoausgang TCCR0A = (0 << WGM00) | (1 << WGM01); // CTC-Mode TCCR0A |= (0 << COM0A0) | (0 << COM0A1); // ohne OCR-Pin TCCR0B = (0 << CS02) | (0 << CS01) | (1 << CS00); // kein prescaler! TIMSK0 = (1 << OCIE0A); // Interrupt ein OCR0A = 96; // 100kHz 1200000/12 sei(); y=150; while(1) { p=13; c=0; while(p > 0) { a = PINB; a = a & 0x08; if (a !=0){ c++;} else{ c=c+0;} } if (c > 13) { // 50 impulse pro sekunde angestrebt y--;} else if (c==13) { y=y+0;} else { y++;} } return(0); }
Lesezeichen