Acht Servos an den LEDs und ADC0/1:
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 :(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; }
Ach, fast vergessen: delay() ist 'ne Zählschleife, die Servos brauchen ja auch etwas Zeit um die Positionen anzufahren:
GrußCode:void delay(uint8_t d) { uint16_t d1, dummy; for (d1=d*255; d1>0; d1--) dummy^=d1; }
mic







Zitieren

Lesezeichen