Acht Servos an den LEDs und ADC0/1:
Code:
// Vierbeiniger RP6 (erste Tests des neuen Beines) 24.2.2008 mic
#include "rblib.h"
#include "rblib.c"
#define vli_on (PORTC|=SL1)
#define vli_off (PORTC&=~SL1)
#define vri_on (PORTA |= 1)
#define vri_off (PORTA &= ~1)
#define hli_on (PORTC|=SL2)
#define hli_off (PORTC&=~SL2)
#define hri_on (PORTC|=SL3)
#define hri_off (PORTC&=~SL3)
#define vla_on (PORTB|=SL4)
#define vla_off (PORTB&=~SL4)
#define vra_on (PORTA |= 2)
#define vra_off (PORTA &= ~2)
#define hla_on (PORTB|=SL5)
#define hla_off (PORTB&=~SL5)
#define hra_on (PORTB|=SL6)
#define hra_off (PORTB&=~SL6)
uint8_t vli, vri, hli, hri, vla, vra, hla, hra; // Positionen der Servos
uint8_t i;
int main(void)
{
rblib_init();
cli();
TCCR0 = (0 << WGM00) | (1 << WGM01); // CTC-Mode
TCCR0 |= (0 << COM00) | (0 << COM01); // ohne OCR-Pin
TCCR0 |= (0 << CS02) | (1 << CS01) | (0 << CS00); // prescaler /8
TIMSK = (1 << OCIE0); // Interrupt ein
OCR0 = 9; // 100kHz?
DDRC |= 0x70; // LED1-3 auf Ausgang und low
PORTC &= ~0x70;
DDRB |= 0x83; // LED4-6 auf Ausgang und low
PORTB &= ~0x83;
//DDRC |= 0x3; // SCL und SDA auf Ausgang und low
//PORTC &= ~0x3;
DDRA |= 3; // ADC0 und ADC1 auf Ausgang und low
PORTA &= ~3;
vli=vla=vri=vra=hli=hla=hri=hra=100;
sei();
delay(150);
vri=120;delay(20);
vli=80;delay(20);
hri=120;delay(20);
hli=80;delay(20);
vri=80;delay(20);
vli=120;delay(20);
hri=80;delay(20);
hli=120;delay(20);
while(1){
vla=90; vra=110; hla=110; hra=90; delay(5);
vla=70; vra=130; hla=140; hra=60; delay(20);
//for(i=0; i<40; i++) { vli=120-i; vri=80+i; hli=120-i; hri=80+i; delay(5); }
vli=80; vri=120; hli=80; hri=120; delay(30);
vla=90; vra=110; hla=110; hra=90; delay(10);
vla=vra=hla=hra=100; delay(5);
vri=80;delay(5);
vli=120;delay(5);
hri=80;delay(5);
hli=120;delay(5);
}
return 0;
}
ISR (TIMER0_COMP_vect)
{
static uint16_t count=1; // Servoansteuerung
(count>vli)?vli_off:vli_on;
(count>vla)?vla_off:vla_on;
(count>vri)?vri_off:vri_on;
(count>vra)?vra_off:vra_on;
(count>hli)?hli_off:hli_on;
(count>hla)?hla_off:hla_on;
(count>hri)?hri_off:hri_on;
(count>hra)?hra_off:hra_on;
if(count<2000) count++; else count=0;
}
Die Libs dienen nur zum debuggen, mit io.h und interrupt.h sollte es auch funktionieren. Mit der RP6-Lib ist kein Timer mehr frei :(
Ach, fast vergessen: delay() ist 'ne Zählschleife, die Servos brauchen ja auch etwas Zeit um die Positionen anzufahren:
Code:
void delay(uint8_t d)
{
uint16_t d1, dummy;
for (d1=d*255; d1>0; d1--) dummy^=d1;
}
Gruß
mic
Lesezeichen