Nochmal hallo
Nun habe ich die Funktion getestet, wie erwartet funktioniert das wunderbar:
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--; }
}
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:
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
Im Anhang nochmals meine minimale Lib auf Basis der RP6-Lib.
Gruß
mic
Lesezeichen