Hallo,
danke für die Antwort. An dem WAITMS(10) liegt es leider nicht. Auch wenn ich das WAITMS weglasse und einmalig beide Servos in feste Positionen bringen möchte funktioniert dies nicht.
Ich habe das Programm nochmals etwas modifiziert und diesmal FastPWM genutzt. An dem Problem hat sich jedoch nichts verändert. Es läuft immer nur ein Servo. Der andere muss kommentiert bleiben.
Code:
#ifndef F_CPU
#define F_CPU 16000000
#endif
#include <avr/io.h>
#include <util/delay.h>
// Werte für OCR1A/OCR1B
#define U_LIMIT 4000 // oberes Limit
#define L_LIMIT 2000 // unteres Limit
// Obergrenze Zähler
#define TOP 40000
// Makro für Normierung auf Werte zwischen 0 und 255
#define SPEED(x) (L_LIMIT + ((( U_LIMIT - L_LIMIT ) / 255.0 )*x))
#define WAITMS(x) _delay_loop_2(((F_CPU * 0.001) / 4)*x)
void init(void)
{
ICR1 = TOP; // ICR1 as TOP
DDRD |= (1 << PIND4); // Port PD4 (OC1B) als Ausgang
DDRD |= (1 << PIND5); // Port PD5 (OC1A) als Ausgang
// Aktiviere OCR1A und OCR1B und setze Waveform Generation Mode 14
TCCR1A = 0x00 | (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11); // OCR1A und OCR1B an
TCCR1B = 0x00 | (1 << CS11) | (1 << WGM12) | (1 << WGM13); // Prescaler 8, 16 Bit Fast PWM, TOP ist ICR1
// Servos in Mittelstellung
OCR1A = SPEED(127);
//OCR1B = SPEED(127); // <- Problem
}
int main(void)
{
unsigned char c;
init();
while(1) // Hauptschleife
{
for(c=0;c<=255;c++) // Servos von Minimalstellung zu Maximalstellung fahren
{
// setze Servopositionen
OCR1A = SPEED(c);
//OCR1B = SPEED(c); // <- Problem
// Zeit schinden
WAITMS(10);
}
}
}
MfG
Nico
Lesezeichen