DeltaEx
28.12.2006, 17:36
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/elektronik/servotester/servotester.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.
#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
}
[/url]
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/elektronik/servotester/servotester.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.
#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
}
[/url]