Hi Leutz,
ich steh eigentlich vor dem selben Problem:
Ich benutze den Billig-Servo von Conrad (Basetech ES-05). Sollte ich das mit den Timern richtig verstanden haben, so müsste doch die Interrupt-Routine alle 0.01ms aufgerufen werden. Sprich 20ms = 2000 Aufrufe. Damit wäre ein ontime von 100 = 1ms usw.?Code:#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> unsigned int ontime = 0; unsigned int offtime = 2000; ISR(TIMER0_COMP_vect) { offtime--; if( offtime == 0 ) { offtime = 2000; PORTA &= ~0x80; } if(offtime == ontime ) { PORTA |= 0x80; } } int main(void) { DDRC = 0xFF; PORTC = 0x0F; // alles aus DDRA = 0x80; PORTA = 0x00; // CLK/8 Prescaler CS01 TCCR0 = (1<<CS01); OCR0 = 20; // 16000000/8 = 1999490Hz/20 = 99974,50Hz => 0,01ms TIMSK |= (1<<OCIE0); sei(); int i = 0; ontime = 100; for(i=0;i<25;i++) _delay_ms( 200 ); ontime = 125; for(i=0;i<25;i++) _delay_ms( 200 ); ontime = 150; for(i=0;i<25;i++) _delay_ms( 200 ); ontime = 175; for(i=0;i<25;i++) _delay_ms( 200 ); ontime = 200; for(i=0;i<25;i++) _delay_ms( 200 ); ontime = 0; while(1){ } }
Auch die _delay_ms-Funktion sollte bei 25*200ms = 5000ms = 5 Sekunden warten, was sie auch nicht tut (F_CPU ist über AVR Studio mit 16000000 für ATmega32 gesetzt ).
Inzwischen glaube ich, dieses Mikrocontroller-Zeug ist von bösen Zauberern erfunden worden und nur Magiekundigen zugänglich, die ihre Seele bereits dem Satan verkauft haben und durch Zölibat und Selbstgeisselung die schwarze Kunst der Elektronenbeeinflussung beherrschen.
Grütze
Banzai







Zitieren

Lesezeichen