// Steuerung zweier Servos über einen ATmega162 und dessen Timer1
// Setzen der Portpins durch das Overflow-Interrupt
// Rücksetzen der Portpins durch die Output-Compare-Interrupts.
// Servo1 an PORTE 0, Servo 2 an PORTE 1
// 15.Oktober 2005
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#define Startwert 0x0E66 // Timer-Ticks für 1ms bei 3,686MHz
#define Endwert 0x1CCC // Timer-Ticks für 2ms bei 3,686MHz
#define Mittelwert 0x1599 // Timer-Ticks für 1,5ms bei 3,686MHz
volatile unsigned int Servo1, Servo2; // Reload-Werte
volatile unsigned int inkrement1, inkrement2; // Änderungswerte
volatile unsigned char umsch1, umsch2; // Richtungsangabe
volatile unsigned char dec,dec0; // Refresh
volatile unsigned char Buffer[BufferMax];
volatile unsigned char Buffercount, send;
SIGNAL(SIG_OVERFLOW1)
{
PORTE = 0x06; // beide Servos "einschalten"
dec--;
if (dec == 0)
{
dec = dec0;
if (umsch1 == 0)
{
Servo1 += inkrement1;
}
else
{
Servo1 -= inkrement1;
}
if ((Servo1 < Startwert) || (Servo1 >= Endwert))umsch1 = ~umsch1;
if (umsch2 == 0)
{
Servo2 += inkrement2;
}
else
{
Servo2 -= inkrement2;
}
if ((Servo2 < Startwert) || (Servo2 > Endwert)) umsch2 = ~umsch2;
OCR1A = Servo1;
OCR1B = Servo2;
}
}
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
PORTE &= ~0x02; // Servo 1 ausschalten
}
SIGNAL(SIG_OUTPUT_COMPARE1B)
{
PORTE &= ~0x04; // Servo 2 ausschalten
}
int main(void)
{
DDRE = 0x06; // zwei Pins als Ausgang
PORTE = 0x01; // low am Ausgang. Pull-Up einschalten
Servo1 = Mittelwert;
Servo2 = Startwert;
OCR1A = Servo1;
OCR1B = Servo2;
inkrement1 = 0x25;
inkrement2 = 0x12;
dec0 = 1;
dec = dec0;
umsch1 = 0;
umsch2 = 0;
TIMSK = ((1<<TOIE1) | (1<<OCIE1A) | (1<<OCIE1B) | (1<<TICIE1));
sei();
TCCR1B = (1<<CS10);
for(;;)
}
ganz einfach ist es nicht. Aber du willst ja noch was lernen...