Ich finde die Idee auch klasse. Deshalb hier mein Programm:
Code:
#include "asuro.h"
#define NORMAL GREEN
#define PLAY YELLOW
#define REC RED
#define MAXSTORE 30
char dataStore[MAXSTORE]={ '9' };
unsigned int timeStore[MAXSTORE];
int main(void) {
char f=40, s=30, mode=NORMAL, idx=0, data;
unsigned int time=0;
long t0;
Init();
EncoderInit();
EncoderStart();
while(1) {
t0=Gettime();
StatusLED(mode);
SerRead(&data, 1, time);
switch(mode) {
case PLAY:
if(data=='T') {
data=dataStore[idx];
idx++;
time=timeStore[idx];
} else {
mode=NORMAL;
}
break;
case REC:
timeStore[idx]=Gettime()-t0;
dataStore[idx]=data;
idx=(idx+1)%MAXSTORE;
}
switch(data) {
case '9': mode=(mode==NORMAL) ? REC : NORMAL; time=0; idx=0; break;
case '0': mode=PLAY; time=1; idx=0; break;
case '1': Move( 0, f, 0); break;
case '3': Move(-s, s, 0); break;
case '5': Move(-f, 0, 0); break;
case '2': Move( f, f, 0); break;
case '6': Move(-f, -f, 0); break;
case 'o': Move( f, 0, 0); break;
case 'p': Move( s, -s, 0); break;
case 'u': Move( 0, -f, 0); break;
default: Move( 0, 0, 0);
}
}
}
1) Ich habe das Glück eine lernende Fernbedienung zu besitzen, die in der Lage ist RS232 Signale zu lernen. (Sollte aber auch mit ReadRC5() gehen.)
2) SerRead(.., timeout) ist bei mir so umgebaut, dass timeout in ms angeben wird. Kompatible zu Gettime().
3) Der Clou: Move(..) nutzt die Encoder-Odometrie und ist interrupt getrieben ( = läuft im Hintergrund ). Dadurch ist das Ganze sehr wiederholgenau.
Lesezeichen