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.
Code:#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; } }







Zitieren

Lesezeichen