Nochmal hallo
Nun habe ich die Funktion getestet, wie erwartet funktioniert das wunderbar:
Das Progamm steuert per ISR ein Servo an Pin ADC0 an. Gleichzeitig werden im Hauptprogramm am selben Pin die Impulslängen gemessen und angezeigt. (Ein auf Ausgang geschalteter Pin kann auch eingelesen werden: IR-Kommunikation mit dem RP6) Mit Prescaler /8 und OCR0=13 ist der Wert für Servomitte ungefähr 100 (Basis des Programms ist der Testcode meines aktuellen "Projekts"). Die Ausgabe am Terminal sieht so aus:Code:// RC-Signal messen und auswerten 2.5.2008 mic #include "rblib.h" #include "rblib.c" uint8_t servopos; volatile uint16_t p=0; void pause(uint16_t p_dauer) { p=p_dauer; while(p); } uint16_t get_RC(uint8_t kanal) { uint16_t count=0; if(kanal==1) // Erster RC-Kanal { while(PINA & 1); // warten bis Ende des aktuellen Impuls while(!(PINA & 1)); // warten auf Ende Pause while(PINA & 1) count++; // Impulslänge messen } return(count); // Zählwert übergeben } int main(void) { rblib_init(); DDRA |= 1; servopos=0; 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 = 13; sei(); servopos=40; while(1) { writeInteger(servopos, 10); writeString(" - "); writeInteger(get_RC(1), 10); writeString("\n\r"); servopos+=10; if(servopos>170) { servopos=40; writeString("\n\r"); pause(50); } pause(10); } return 0; } ISR(TIMER0_COMP_vect) { static uint16_t count=1; if(count>servopos) PORTA&=~1; else PORTA|=1; if(count<2000)count++; else { count=1; if(p) p--; } }
Im Anhang nochmals meine minimale Lib auf Basis der RP6-Lib.Code:Terminal cleared! [RP6BOOT] [READY] 40 - 368 50 - 460 60 - 552 70 - 644 80 - 736 90 - 828 100 - 920 110 - 1012 120 - 1104 130 - 1196 140 - 1288 150 - 1380 160 - 1472 170 - 1564 40 - 368 50 - 460 60 - 552
Gruß
mic







Zitieren

Lesezeichen