Knipser-14
20.06.2009, 11:44
Hallo,
ich habe bereits ein Programm geschrieben mit dem ich einen Servo einwandfrei ansteuern kann.
Nun habe ich versucht es so zu verändern das ich 3 Servos gleichzeitig ansteuern kann.
Eigentlich soll das Programm folgendes tun:
1. Signalpin von Servo1 auf High
2. Warten bis dessen Stellzeit rum
3. Signalpin Servo 1 auf Low
4. Signalpin 2 auf High
...
nach dem 3. Servo soll er nochmal so lange warten, das 20ms für Servo1 voll sind. Und dann wieder mit Servo 1 anfangen.
Aber iwie reagieren die Servos garnicht (außer beim einschalten des Stroms).
Entdeckt iwer den Denkfehler in meinem Programm? Und wie gesagt die Zeiten müssten stimmen.
Danke, Knipser.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
#include <math.h>
#define F_CPU 16000000UL
#define BAUD 9600UL
#define UBRR_BAUD ((F_CPU/(16UL*BAUD))-1)
#define SERVO_DDR1 DDRA
#define SERVO_PORT1 PORTA
#define SERVO_PORTPIN1 PA0
#define SERVO_DDR2 DDRA
#define SERVO_PORT2 PORTA
#define SERVO_PORTPIN2 PA1
#define SERVO_DDR3 DDRA
#define SERVO_PORT3 PORTA
#define SERVO_PORTPIN3 PA2
#define LED_DDR DDRD
#define LED_PORT PORTD
#define LED_PORTPIN PD7
volatile uint16_t z,q,p;
volatile uint8_t t;
volatile uint16_t servo1,servo2,servo3;
TIMER0_interrupt_init(void){
z = 0;
TCNT0 = 0;
OCR0 = 9;
TCCR0 = 0x0a;
TIMSK |= (1<<OCIE0); //Interrupt aller 1/200ms ->200 je ms
sei();
}
ISR(TIMER0_COMP_vect){
z++;
}
int main(void)
{
// USART initialisieren
uart_init();
TIMER0_interrupt_init();
t = 1;
servo1 = 255;
servo2 = 255;
servo3 = 355;
LED_DDR |= (1<<LED_PORTPIN);
LED_PORT &= ~(1<<LED_PORTPIN);
SERVO_DDR1 |= (1<<SERVO_PORTPIN1);
SERVO_DDR2 |= (1<<SERVO_PORTPIN2);
SERVO_DDR3 |= (1<<SERVO_PORTPIN3);
SERVO_PORT1 |= (1<<SERVO_PORTPIN1);
sei();
while (1){
if (t==1 && z==servo1){
t=2;
z=0;
SERVO_PORT1 &= ~(1<<SERVO_PORTPIN1);
SERVO_PORT2 |= (1<<SERVO_PORTPIN2);
LED_PORT |=(1<<LED_PORTPIN);
}
if (t==2 && z==servo2){
t=3;
z=0;
SERVO_PORT2 &= ~(1<<SERVO_PORTPIN2);
SERVO_PORT3 |= (1<<SERVO_PORTPIN3);
}
if (t==3 && z==servo3){
t=4;
z=0;
SERVO_PORT3 &= ~(1<<SERVO_PORTPIN3);
q = (4000-servo2-servo3);
}
if (t==4 && z==q){
z = 0;
t = 1;
SERVO_PORT1 |= (1<<SERVO_PORTPIN1);
}
if (z==4000){
z = 0;
t = 1;
SERVO_PORT1 |= (1<<SERVO_PORTPIN1);
}
return 0;
}
}
ich habe bereits ein Programm geschrieben mit dem ich einen Servo einwandfrei ansteuern kann.
Nun habe ich versucht es so zu verändern das ich 3 Servos gleichzeitig ansteuern kann.
Eigentlich soll das Programm folgendes tun:
1. Signalpin von Servo1 auf High
2. Warten bis dessen Stellzeit rum
3. Signalpin Servo 1 auf Low
4. Signalpin 2 auf High
...
nach dem 3. Servo soll er nochmal so lange warten, das 20ms für Servo1 voll sind. Und dann wieder mit Servo 1 anfangen.
Aber iwie reagieren die Servos garnicht (außer beim einschalten des Stroms).
Entdeckt iwer den Denkfehler in meinem Programm? Und wie gesagt die Zeiten müssten stimmen.
Danke, Knipser.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
#include <math.h>
#define F_CPU 16000000UL
#define BAUD 9600UL
#define UBRR_BAUD ((F_CPU/(16UL*BAUD))-1)
#define SERVO_DDR1 DDRA
#define SERVO_PORT1 PORTA
#define SERVO_PORTPIN1 PA0
#define SERVO_DDR2 DDRA
#define SERVO_PORT2 PORTA
#define SERVO_PORTPIN2 PA1
#define SERVO_DDR3 DDRA
#define SERVO_PORT3 PORTA
#define SERVO_PORTPIN3 PA2
#define LED_DDR DDRD
#define LED_PORT PORTD
#define LED_PORTPIN PD7
volatile uint16_t z,q,p;
volatile uint8_t t;
volatile uint16_t servo1,servo2,servo3;
TIMER0_interrupt_init(void){
z = 0;
TCNT0 = 0;
OCR0 = 9;
TCCR0 = 0x0a;
TIMSK |= (1<<OCIE0); //Interrupt aller 1/200ms ->200 je ms
sei();
}
ISR(TIMER0_COMP_vect){
z++;
}
int main(void)
{
// USART initialisieren
uart_init();
TIMER0_interrupt_init();
t = 1;
servo1 = 255;
servo2 = 255;
servo3 = 355;
LED_DDR |= (1<<LED_PORTPIN);
LED_PORT &= ~(1<<LED_PORTPIN);
SERVO_DDR1 |= (1<<SERVO_PORTPIN1);
SERVO_DDR2 |= (1<<SERVO_PORTPIN2);
SERVO_DDR3 |= (1<<SERVO_PORTPIN3);
SERVO_PORT1 |= (1<<SERVO_PORTPIN1);
sei();
while (1){
if (t==1 && z==servo1){
t=2;
z=0;
SERVO_PORT1 &= ~(1<<SERVO_PORTPIN1);
SERVO_PORT2 |= (1<<SERVO_PORTPIN2);
LED_PORT |=(1<<LED_PORTPIN);
}
if (t==2 && z==servo2){
t=3;
z=0;
SERVO_PORT2 &= ~(1<<SERVO_PORTPIN2);
SERVO_PORT3 |= (1<<SERVO_PORTPIN3);
}
if (t==3 && z==servo3){
t=4;
z=0;
SERVO_PORT3 &= ~(1<<SERVO_PORTPIN3);
q = (4000-servo2-servo3);
}
if (t==4 && z==q){
z = 0;
t = 1;
SERVO_PORT1 |= (1<<SERVO_PORTPIN1);
}
if (z==4000){
z = 0;
t = 1;
SERVO_PORT1 |= (1<<SERVO_PORTPIN1);
}
return 0;
}
}