derpfälzer
30.03.2012, 16:12
Servus ich habe folgendes Problem ich habe den unten stehenden Code benutzt um meinen Servo zu testen.
Ich gehe davon aus das ich den Timer1 zur ansteuerung benutzen kann oder hab ich das völlig falsch verstanden?
Ich habe alle möglichen Tuts gelesen komme aber selbst nicht drauf....
Nun hab ich den Servo an die richtigen Pins angeschlossen und er ist gelaufen und der Raupenantrieb war aus.
Nichts am Programm verändert und später nochmal probiert.... jetzt laufen die Raupenmotoren aber nicht mehr der Servo?
Klärt mich auf ich steh im Wald...
// Servoansteuerung mit Timer1 31.1.2010 mic
// Einfach und elegant, warum finde ich das erst jetzt? Timer1 (RP6-Motoransteuerung)
// läuft ja sowieso im Hintergrund. Deshalb kann man die "klassische" Servoansteuerung
// in die Overflow-ISR einbauen und mit ca. 19kHz aufrufen lassen. Timersetup der Lib:
// Mode 10, Phase Correct mit ICR1 als Top ergibt bei ICR1=210 ca. 8MHz/420=19047,6Hz ;)
// Drehbereich meiner RS-2-Servos ist von ca. 14 bis ca. 38
#include "RP6RobotBaseLib.h"
volatile uint8_t servo1, servo2, servo3, p; // Servopositionen und Impulszähler
uint8_t c; // ein Char zur freien Verfügung
int main(void)
{
initRobotBase();
servo1=servo2=servo3=26; // Servomitte?
TIMSK |= (1 << TOIE1); // Die Timer1 Overflow-ISR zur Servoansteuerung
DDRA |= (E_INT1); // Servopins auf Ausgang setzen
DDRC |= (SCL);
setLEDs(1); // und los!
startStopwatch1();
startStopwatch2();
startStopwatch3();
while(1)
{
{
servo1=servo2=servo3=26; // mitte
p=50; while(p); // warten bis 50 Impulse gesendet (ca. 1 Sek.)
servo1=servo2=servo3=14; // links
p=50; while(p);
servo1=servo2=servo3=38; // rechts
p=50; while(p);
}
task_RP6System(); // Verträglichkeitstest ;)
}
return 0;
}
ISR (TIMER1_OVF_vect)
{
static uint16_t servocount=1;
if(servocount > servo1) PORTA &= ~E_INT1; else PORTA |= E_INT1; // PA4 XBUS 8
if(servocount > servo2) PORTC &= ~SCL; else PORTC |= SCL; // PC0 XBUS 10
if(servocount > servo3) PORTC &= ~SDA; else PORTC |= SDA; // PC1 XBUS 12
if(servocount < 400) servocount++; else {servocount=1; if(p) p--;} // p = 1/50 Sek
}
gruß derpfälzer
Ich gehe davon aus das ich den Timer1 zur ansteuerung benutzen kann oder hab ich das völlig falsch verstanden?
Ich habe alle möglichen Tuts gelesen komme aber selbst nicht drauf....
Nun hab ich den Servo an die richtigen Pins angeschlossen und er ist gelaufen und der Raupenantrieb war aus.
Nichts am Programm verändert und später nochmal probiert.... jetzt laufen die Raupenmotoren aber nicht mehr der Servo?
Klärt mich auf ich steh im Wald...
// Servoansteuerung mit Timer1 31.1.2010 mic
// Einfach und elegant, warum finde ich das erst jetzt? Timer1 (RP6-Motoransteuerung)
// läuft ja sowieso im Hintergrund. Deshalb kann man die "klassische" Servoansteuerung
// in die Overflow-ISR einbauen und mit ca. 19kHz aufrufen lassen. Timersetup der Lib:
// Mode 10, Phase Correct mit ICR1 als Top ergibt bei ICR1=210 ca. 8MHz/420=19047,6Hz ;)
// Drehbereich meiner RS-2-Servos ist von ca. 14 bis ca. 38
#include "RP6RobotBaseLib.h"
volatile uint8_t servo1, servo2, servo3, p; // Servopositionen und Impulszähler
uint8_t c; // ein Char zur freien Verfügung
int main(void)
{
initRobotBase();
servo1=servo2=servo3=26; // Servomitte?
TIMSK |= (1 << TOIE1); // Die Timer1 Overflow-ISR zur Servoansteuerung
DDRA |= (E_INT1); // Servopins auf Ausgang setzen
DDRC |= (SCL);
setLEDs(1); // und los!
startStopwatch1();
startStopwatch2();
startStopwatch3();
while(1)
{
{
servo1=servo2=servo3=26; // mitte
p=50; while(p); // warten bis 50 Impulse gesendet (ca. 1 Sek.)
servo1=servo2=servo3=14; // links
p=50; while(p);
servo1=servo2=servo3=38; // rechts
p=50; while(p);
}
task_RP6System(); // Verträglichkeitstest ;)
}
return 0;
}
ISR (TIMER1_OVF_vect)
{
static uint16_t servocount=1;
if(servocount > servo1) PORTA &= ~E_INT1; else PORTA |= E_INT1; // PA4 XBUS 8
if(servocount > servo2) PORTC &= ~SCL; else PORTC |= SCL; // PC0 XBUS 10
if(servocount > servo3) PORTC &= ~SDA; else PORTC |= SDA; // PC1 XBUS 12
if(servocount < 400) servocount++; else {servocount=1; if(p) p--;} // p = 1/50 Sek
}
gruß derpfälzer