studiere gründlich das datenblatt, das ist eigentlich sehr aufschlussreich aber hart im lesen
versuch mal mittels datenblatt folgendes zu verarbeiten
Code:
SIGNAL (SIG_OVERFLOW2)
{
if ((TCCR2 & (BV(COM21) | BV(COM20))) != 0) TCCR2 &= ~(BV(COM21) | BV(COM20));
else if (Count%32 == 0) TCCR2 |= BV(COM21) | BV(COM20);
if ((PIND & BV(PD6)) && !(PIND & BV(PD7))) OCR2 = -55-16;
else if ((PIND & BV(PD7)) && !(PIND & BV(PD6))) OCR2 = -55+16;
else {
diff = ADCL + (ADCH << 8);
diff = (diff/32)-16;
OCR2 = -47+(diff);
}
}
SIGNAL (SIG_OUTPUT_COMPARE2)
{
// TCCR2 &= ~(BV(COM21) | BV(COM20));
}
int main(void)
{
Count = 0;
diff = 0;
dir = 4;
cli();
ADCL = 0;
ADCH = 0;
DDRB = BV(PB4) | BV(PB5) | BV(PB3);
PORTB = BV(PB4);
TCNT2 = 0;
OCR2 = -55;
TCCR2 = BV(WGM21) |
BV(WGM20) |
BV(COM21) |
BV(COM20) |
BV(CS22) |
BV(CS21);
TIMSK = BV(TOIE2);// | BV(OCIE2);
sei();
PORTB = BV(PB5);
ADCSRA = BV(ADFR) | BV(ADPS2) | BV(ADPS1);
ADMUX = BV(REFS0);
ADCSRA |= BV(ADEN);
ADCSRA |= BV(ADSC);
while (1){
}
}
Atmega8 mit 8Mhz intern getaktet, das oszi hat ne saubere 1ms +-0.5ms flanke angezeigt und der servo reagiert auch wie erwartet
Link zu Youtube-Video
Lesezeichen