Hallo Leute,
irgendwie stehe ich auf der Leitung und kann den Code nicht ganz kapieren . Und zwar ist das die Servosteuerung von der Seite: http://www.schoeppl.info/de/elektron...rvotester.aspx
Und zwar muss ja für ein Servo nach 20ms ein Signal folgen das zwischen 1ms und 2ms liegt.
Wie wird hier im Quellcode sichergestellt das SIGNAL (SIG_OVERFLOW1) nach 20ms erst aufgerufen wird?
Irgendwie verstehe ich nicht wie das timming gesetzt ist.
[/url]Code:#define F_CPU 8000000 #include <avr/io.h> #include <avr/interrupt.h> void initadc(void); void inittimer1(void); unsigned char volatile liADC = 0; unsigned char volatile liPause = 0; unsigned int volatile liPreload = 0; int main() { initadc(); inittimer1(); sei(); DDRB = 255; while (1==1) { // Timer Preload berechnen, bei 8 Mhz entspricht 8000 ca. 1ms, +max 1ms des ADC - Da Servosignal zw. 1 und 2ms spezifiziert ist liPreload = 65536 - 8000 - ((8000 / 256) * liADC); // Entspricht 1 ms } } SIGNAL (SIG_OVERFLOW1) { // 1 Volldurchlauf dauert ca. 8ms, 2 x 8 = 16 ms Pause, dann port einschalten, dauer einstellen, dann port abschalten liPause++; if (liPause==2) { PORTB=255; TCNT1=liPreload; } if (liPause==3) { PORTB=0; liPause=0; } } SIGNAL (SIG_ADC) { liADC = ADCH; } void initadc(void) { //interne Referenzspannung und AD-Wandlerkanal 0, ADLAR setzen, 8 Bit des High Registers reichen ADMUX = (1<<REFS1) | (1<<REFS0) | (1<<ADLAR); // AD Wandler einschalten, Freerunning einschalten, Conversion starten, Interrupt einschalten, Prescaler auf 64 ADCSRA = (1<<ADEN)|(1<<ADFR)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1); } void inittimer1(void) { TCCR1B = (1<<CS10); // Direkter Takt, kein Prescaling TIMSK |= (1<<TOIE1); // Overflowinterrupt aktivieren }







Zitieren

Lesezeichen