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);
}
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...
Lesezeichen