PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RC-Signal einlesen verändern und wieder ausgeben.



DanielSan
20.03.2013, 16:37
Hi,

ich habe einen Nano V3.0 (bzw. er ist noch unterwegs). Also mache ich mir schonmal gedanken, wie meine Software aussehen könnte.

Ich möchte 2 RC-Empfänger Kanäle einlesen. Das habe ich mit Int0 und Int1 gelöst. Ich denke das klappt auch soweit. (Code ist ungetestet)

int pin = 13;

long starttime_1;
long starttime_2;
long duration_1;
long duration_2;

long interval = 1000;
long previousMicros = 0;

void setup()
{
pinMode(pin, OUTPUT);

//Interrupts für steigende Flanke konfigurieren
attachInterrupt(0, ch1_r, RISING);
attachInterrupt(1, ch2_r, RISING);

//Serial starten
Serial.begin(9600);

}

void loop()
{
unsigned long currentMicros = micros();

if(currentMicros - previousMicros > interval) {
previousMicros = currentMicros;

//Zeit und Kanal auf RS232 ausgeben
Serial.print('CH1: ' + duration_1 + '\n');
Serial.print('CH2: ' + duration_2 + '\n');
}
}

void ch1_r()
{
detachInterrupt(0);

starttime_1 = micros();

attachInterrupt(0, ch1_f, FALLING);

}

void ch1_f()
{
detachInterrupt(0);

duration_1 = micros() - starttime_1;

attachInterrupt(0, ch1_r, RISING);
}

void ch2_r()
{
detachInterrupt(1);

starttime_2 = micros();

attachInterrupt(1, ch2_f, FALLING);
}

void ch2_f()
{
detachInterrupt(1);

duration_2 = micros() - starttime_2;

attachInterrupt(1, ch2_r, RISING);
}


Jetzt möchte ich noch einen Sensorwert vom AD-Port einlesen etwas dran rumrechnen und dann ggf. Das RC-Signal verändern und wieder ausgeben. Später kommt wahrscheinlich noch ein I2C Sensor dazu. Wie man ein Servo prinzipiell steuert ist mir klar.

Meine Frage ist, wie gebe ich das Servosignal möglichst sinnvoll im Bezug auf Rechenleistung aus?
Wie macht die Mitgelieferte Servo Lib das? Blockiert die solang den Prozessor, bis sie fertig ist? So wie bspw. Delay().

Ich würde das eigentlich mit einem Timer lösen. Aber wie macht man das beim Arduino? Ich habe schon Timer libs gefunden, aber die sagen mir nicht so recht zu. Ich möchte das lieber selbst in der Hand haben.

Danke
Gruß Daniel

DanielSan
21.03.2013, 11:58
So ich bin jetzt deutlich schlauer als gestern. Die Servofunktion aus der Lib ist nicht das was ich will.

Ich werde also eine eigene Funktion mit Timer1 schreiben. Das ist auch soweit alles klar, mit den Registern etc. Wenns funktioniert poste ich das natürlich noch. Aber meinen untested Code dazu will ich erstmal nicht veröffentlichen.

Meine Frage ist jetzt eigentlich ehr eine Atmelfrage als eine Arduinofrage.
Wenn ich INT0 UND INT1 für externe interrupts verwende, schliesst das die Nutzung von Timer1 aus? Oder haben die externen Interrupts erstmal nichts mit den Timern zutun?

Danke
Gruß Daniel