Razer
01.09.2006, 16:02
Hallo an alle
Ich hab da ein Problem. Also als Aufgabe habe ich ein PPM Signal zu
erstellen.
Für alle die das PPM Protokoll nicht kennen, hier ein Link wie das
Protokoll: http://www.aerodesign.de/peter/2000/PCM/frame_ppm.gif
Es gibt Pulse von 1 - 2ms, dann imer eine Pause von 0,3ms. Nach 8
Pulsen kommt ein längerer Startpuls. Die 1,024ms Bandbreite hab ich in
8 Bit geteilt. Damit hab 8 Bit Genauigkeit am Ausgangssignal. Die
Zeitwerte für die Potis sample ich met den Adc Kanälen. Da ich den MEga
168 im DIP Gehäuse benutze (Ich weiß der ist ein bisschen oversized,
aber ich hab grad keinen anderen rumliegen...) hab ich nur 6 ADC Kanäle
zu Verfügung. Den restlichen 2 Kanälen gebe ich einen Fixwert, da ich
sie eh nicht nutze....
So jetzt zum eigentlichen Problem:
Der ADC läuft jetzt im Free Running Modus. Und sobald eine Messung
fertig ist, wird in der ISR der Wert gesichert und auf den nächste
Kanal geschaltet.
Die ISR macht mir immer noch zu schaffen. Derzeit dauert die ISR im
Worst Case 84 Takte. (Minimal 54 Takte) Je nach dem was gerade in der
ISR zu machen ist.
ISR(TIMER0_COMPA_vect) //4µsec
{
if(--time == 0 && GLOB_STAT == 0x00)
{
time = NACHLADEWERT;
GLOB_STAT = 0x02;
}
else
{
if(time == 0)
{
PWM_PORT ^= (1 << PWM_PIN); //Wenn Zeit abgelaufen toggle PWM Pin
if(GLOB_STAT == 0x02) //Wenn gerade eine High Phase (keine Pause) war Pause aktiv
{
time = PAUSE;
GLOB_STAT = 0x01;
}
else //Sonst ird das aktuelle Servo in das time Register geladen
{
if(++servozaehler < 8) //Wenn das 8. Servo erreicht ist, wieder auf 0 stellen
time = servo[servozaehler];
else
{
servozaehler = 0;
time = longpulse;
}
GLOB_STAT = 0x00;
}
}
}
}
Wie kann ich das besser lösen??
Ich hoffe es kann mir helfen
Gruß Robert
Ich hab da ein Problem. Also als Aufgabe habe ich ein PPM Signal zu
erstellen.
Für alle die das PPM Protokoll nicht kennen, hier ein Link wie das
Protokoll: http://www.aerodesign.de/peter/2000/PCM/frame_ppm.gif
Es gibt Pulse von 1 - 2ms, dann imer eine Pause von 0,3ms. Nach 8
Pulsen kommt ein längerer Startpuls. Die 1,024ms Bandbreite hab ich in
8 Bit geteilt. Damit hab 8 Bit Genauigkeit am Ausgangssignal. Die
Zeitwerte für die Potis sample ich met den Adc Kanälen. Da ich den MEga
168 im DIP Gehäuse benutze (Ich weiß der ist ein bisschen oversized,
aber ich hab grad keinen anderen rumliegen...) hab ich nur 6 ADC Kanäle
zu Verfügung. Den restlichen 2 Kanälen gebe ich einen Fixwert, da ich
sie eh nicht nutze....
So jetzt zum eigentlichen Problem:
Der ADC läuft jetzt im Free Running Modus. Und sobald eine Messung
fertig ist, wird in der ISR der Wert gesichert und auf den nächste
Kanal geschaltet.
Die ISR macht mir immer noch zu schaffen. Derzeit dauert die ISR im
Worst Case 84 Takte. (Minimal 54 Takte) Je nach dem was gerade in der
ISR zu machen ist.
ISR(TIMER0_COMPA_vect) //4µsec
{
if(--time == 0 && GLOB_STAT == 0x00)
{
time = NACHLADEWERT;
GLOB_STAT = 0x02;
}
else
{
if(time == 0)
{
PWM_PORT ^= (1 << PWM_PIN); //Wenn Zeit abgelaufen toggle PWM Pin
if(GLOB_STAT == 0x02) //Wenn gerade eine High Phase (keine Pause) war Pause aktiv
{
time = PAUSE;
GLOB_STAT = 0x01;
}
else //Sonst ird das aktuelle Servo in das time Register geladen
{
if(++servozaehler < 8) //Wenn das 8. Servo erreicht ist, wieder auf 0 stellen
time = servo[servozaehler];
else
{
servozaehler = 0;
time = longpulse;
}
GLOB_STAT = 0x00;
}
}
}
}
Wie kann ich das besser lösen??
Ich hoffe es kann mir helfen
Gruß Robert