Hallo
Um nun endlich mal zu einem Erfolg zu kommen:
Code:
#include <avr/io.h> // I/O Port definitions
//#include <avr/interrupt.h> // Interrupt macros (für cli)
#define servo1_port PORTC
#define servo1_ddr DDRC
#define servo1_pin PC0
#define servo2_port PORTC
#define servo2_ddr DDRC
#define servo2_pin PC1
#define servo1_on servo1_port |= 1<<servo1_pin
#define servo2_on servo2_port |= 1<<servo2_pin
#define servo1_off servo1_port &= ~(1<<servo1_pin)
#define servo2_off servo2_port &= ~(1<<servo2_pin)
uint16_t i, stellzeit, dummy;
int main(void)
{
servo1_ddr |= 1<<servo1_pin; // Pins als Ausgang definieren
servo2_ddr |= 1<<servo2_pin;
servo1_off; // und auf low schalten
servo2_off;
//cli(); // keine Störungen erlauben
while(1) // solange Saft im Akku...
{
stellzeit=100; // 100 mal den Impuls senden
while(stellzeit--)
{
servo1_on; // Impuls für erstes Servo erzeugen
for(i=0; i<500; i++) dummy^=i;
servo1_off;
servo2_on; // Impuls für zweites Servo erzeugen
for(i=0; i<500; i++) dummy^=i;
servo2_off;
for(i=0; i<20000; i++) dummy^=i; // Impulspause
}
stellzeit=100;
while(stellzeit--)
{
servo1_on;
for(i=0; i<2500; i++) dummy^=i;
servo1_off;
servo2_on;
for(i=0; i<2500; i++) dummy^=i;
servo2_off;
for(i=0; i<20000; i++) dummy^=i;
}
}
return(0);
}
Ohne Interrupts und ohne asuro-Lib nur mit Zählschleifen sind nun viele mögliche Störquellen ausgeschaltet. Das läuft auf meinem 8Mhz-Mega32, für 16Mhz sollte es ausreichen die Zählerwerte zu verdoppeln.
Gruß
mic
Lesezeichen