Hallo
Interruptlösungen sind schwierig weil die RP6-Lib schon alle Interrupts belegt. Ich hatte mir mal einen Ansatz (für 8 Servos an den LEDs und SCL/SDA) mit der ADC-ISR zusammengebastelt. Mit Servo_On() wird der ADC in den Dauerbetrieb (freeruning) mit ISR geschaltet (der ADC_Task könnte dabei übrigends weiterverwendet werden), mit Servo_Off() schaltet man die Servoansteuerung wieder aus und den ADC auf Lib-Einstellungen. Leider ist die Auflösung der Servoschritte nicht sehr groß, aber dafür funktioniert es mit der Lib zusammen:
(Für eine bessere Auflösung könnte man den ADC-Prescaller noch verkleinern)Code:// Domino Day für den RP6 mit neuem Greifarm und ADC-ISR 19.1.2008 mic #include "RP6RobotBaseLib.h" uint16_t s1, s2, s3, s4 ,s5, s6; void servo_ON(void) { cli(); // Freeruning, 5V-Ref, ISR enable, prescale /32 ((8MHZ/32)/12,5 sind ca. 20kHz bzw. 0,05us) // AVCC with external capacitor at AREF pin, Ergebniss linksbündig, Kanal ADC7 (UBAT) ADMUX = (0<<REFS1) | (1<<REFS0) | (1<<ADLAR) | 7; // setzte free running triggern SFIOR = (0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); // Interrupt ein, Wandler einschalten, prescaller /32 ADCSRA = (1<<ADIE) | (1<<ADEN) | (1<<ADPS2) | (0<<ADPS1) | (1<<ADPS0); // Autotriggern bedeutet jetzt free running aktivieren, altes Flag löschen ADCSRA |= (1<<ADATE) | (1<<ADIF); // Initialisierung starten ADCSRA |= (1<<ADSC); // und noch die wohl eher unnötige Initiallesung while (!(ADCSRA & (1<<ADIF))); ADCSRA |= (1<<ADIF); 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; sei(); } void servo_OFF(void) { cli(); // Initialize ADC: (Defaultsetup der RP6-Library) ADMUX = 0; //external reference ADCSRA = (0<<ADIE) | (0<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADIF); SFIOR = 0; sei(); setLEDs(0); // LEDs restaurieren } int main(void) { initRobotBase(); s1=25; s2=25; s3=25; s4=25; s5=25; s6=25; servo_ON(); setLEDs(63); mSleep(2000); setLEDs(0); while(1) { mSleep(1000); s1=40; mSleep(1000); s1=25; mSleep(1000); s2=35; mSleep(1000); s2=15; } return 0; } ISR(ADC_vect) { static uint16_t count=0; (count>s1)?(PORTC&=~SL1):(PORTC|=SL1); (count>s2)?(PORTC&=~SL2):(PORTC|=SL2); (count>s3)?(PORTC&=~SL3):(PORTC|=SL3); (count>s4)?(PORTB&=~SL4):(PORTB|=SL4); (count>s5)?(PORTB&=~SL5):(PORTB|=SL5); (count>s6)?(PORTB&=~SL6):(PORTB|=SL6); (count>s1)?(PORTC&=~1):(PORTC|=1); // SCL (count>s2)?(PORTC&=~2):(PORTC|=2); // SDA (count<500)?count++:(count=0); }
Gruß
mic







Zitieren

Lesezeichen