Nochmals Hallo
Das geht selbstverständlich auch ohne ISR. Aber dann ist es blockierend und wirft das gesammte Tasksystem des RP6 über den Haufen.
Oben im Edit habe ich eine Variante mit orginaler RP6-Lib und Timer1-ISR zur Impulsmessung angehängt. Die gemessenen Werte werden ans Terminal gesendet und sollten ungefähr zwischen 14 und 38 liegen. Wenn das so funktioniert (ich habe die Messung mit Brücken an den Pins simuliert) hast du schon eine brauchbare Basis für eine RC-Fernsteuerung. Was noch fehlt ist die Umrechnug der gemessenen Werte in passende Motorbefehle.
Hier noch eine Variante ohne ISR, ohne RC-Empfänger kann ich aber zu den gemessenen Werten nichts sagen. Möglicherweise tritt ein Überlauf der Variable auf, dann müßte man nach dem Hochzählen noch eine kurze Verzögerung (eine for-Schleife) einfügen:
Code:
// Blockierende Impulsmessung an SCL (PC0) 23.3.2010 mic
#include "RP6RobotBaseLib.h"
uint16_t temp;
int main(void)
{
initRobotBase();
setLEDs(1); // und los!
while(1)
{
temp=0;
while(PINC & 1); // Warten bis kein Impuls ansteht
while(!(PINC & 1)); // Warten auf Start des zu messenden Impulses
while(PINC & 1) temp++; // solange der Impuls ansteht Zähler hochzählen
writeInteger(temp, 10);
writeString_P("\n");
mSleep(300);
}
return 0;
}
Gruß
mic
[Edit]
Wertebereich der blockierenden Messung ist ca. 500 bis 3000:
Code:
// RP6 misst blockierend seine eigenen Servoimpulse an SCL ;) 23.3.2010 mic
#include "RP6RobotBaseLib.h"
volatile uint8_t servo; // Servopositionen und Impulszähler
uint16_t temp;
int main(void)
{
initRobotBase();
servo=26; // Servomitte?
TIMSK |= (1 << TOIE1); // Die Timer1 Overflow-ISR zur Servoansteuerung
DDRA |= (E_INT1); // Servopins auf Ausgang setzen
DDRC |= (SCL | SDA);
setLEDs(1); // und los!
startStopwatch1();
startStopwatch2();
while(1)
{
if(getStopwatch1()>300) // alle 0,3 Sekunden Impuls messen
{
setStopwatch1(0);
temp=0;
while(PINC & 1); // Warten bis kein Impuls ansteht
while(!(PINC & 1)); // Warten auf Start des zu messenden Impulses
while(PINC & 1) temp++; // solange der Impuls ansteht Zähler hochzählen
writeInteger(temp, 10);
writeString_P("\n");
}
if(getStopwatch2()>1500) // alle 1,5 Sekunden eine neue Servoosition
{
setStopwatch2(0);
switch(servo)
{
case 26: servo=45; break;
case 45: servo=25; break;
case 25: servo=10; break;
case 10: servo=26; break;
}
}
}
return 0;
}
ISR (TIMER1_OVF_vect)
{
static uint16_t servocount=1;
if(servocount > servo) PORTC &= ~SCL; else PORTC |= SCL; // PC0 XBUS 10
if(servocount < 400) servocount++; else servocount=1;
}
Lesezeichen