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;
}