PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : frage zur rc5.c



tape
09.06.2008, 22:23
hallo zusammen!
warscheinlich ist es total einfach, aber ich komme partout nicht darauf. in der asuro lib gibt es ja den rc5 test, und in der rc5.c datei kommt:

#define OFFSET 63
#define STEP 10

ich habe den offset wert verändert (anstatt der hexzahl 63 eingefügt) doch ich komme nicht dahinter, für was ich das überhaupt richtig brauche. da ich auch nicht so sehr in c-programmierung bewandert bin kann ich mir das auch nicht herleiten :cry:
danke für antworten!

harry3
10.06.2008, 00:49
Welche Version verwendest du?
Ich hab gerade in meiner asurolib nachgeschaut und dort finde ich keine derartigen Makros!?

Gefühlsmäßig würde ich halt sagen, dass es sich um folgendes handelt, aber ich kann in dem Fall wirklich nur raten weil ich den Sourcecode dazu nicht kenne:
OFFSET: Die Zeit die man nach dem ersten empfangenen Signal warten muss, bis die ersten Nutzdaten kommen.
STEP: Das wird halt die Abtastrate sein, also wie oft der IR Empfänger abgefragt wird.

Wenn du dich ein bisschen einlesen willst zum Thema RC5 Code, dann schau auf folgende Seite:
http://www.sbprojects.com/knowledge/ir/ir.htm

tape
10.06.2008, 08:49
ich verwende die asurolib v280rc1 und im ordner examples kommt der ordner rc5 test. darin befindet sich dann die test.c datei.

#include "asuro.h"
#include "rc5.h"
#include <stdlib.h>

#define DIARWD 0x1008
#define DIAFWD 0x1002
#define DIALEFT 0x1004
#define DIARIGHT 0x1006
#define DIASTOP 0x1029

#define TUNERRWD 0x1021
#define TUNERFWD 0x1020
#define TUNERLEFT 0x1011
#define TUNERRIGHT 0x1010
#define TUNERSTOP 0x1025

#define OFFSET 0x3F
#define STEP 5

int speedLeft,speedRight;

void IRFwd(void)
{
speedRight += STEP;
speedLeft += STEP;
if (speedLeft < 0 && speedLeft >= -OFFSET) speedLeft = 1;
if (speedRight < 0 && speedRight >= -OFFSET) speedRight = 1;
FrontLED(ON);
BackLED(OFF,OFF);
}

void IRRwd(void)
{
speedRight -= STEP;
speedLeft -= STEP;
if (speedRight > 0 && speedRight <= OFFSET) speedRight = -1;
if (speedLeft > 0 && speedLeft <= OFFSET) speedLeft = -1;
FrontLED(OFF);
BackLED(ON,ON);
}

void IRLeft (void)
{
speedLeft -= STEP;
if (speedLeft > 0 && speedLeft <= OFFSET) speedLeft = -1;
speedRight += STEP;
if (speedRight < 0 && speedRight >= -OFFSET) speedRight = 1;
FrontLED(OFF);
BackLED(ON,OFF);
}

void IRRight (void)
{
speedLeft += STEP;
if (speedLeft < 0 && speedLeft >= -OFFSET) speedLeft = 1;
speedRight -= STEP;
if (speedRight > 0 && speedRight <= OFFSET) speedRight = -1;
FrontLED(OFF);
BackLED(OFF,ON);
}


void IRStop(void)
{
speedRight = speedLeft = 0;
FrontLED(OFF);
BackLED(OFF,OFF);
}

int main(void)
{

static unsigned int cmd;
unsigned char leftDir = FWD, rightDir = FWD;
char text[7];

Init();
InitRC5();

SerPrint("RC5 Test\r\n");
while (1)
{
cmd = ReadRC5();
if (cmd)
{
cmd &= RC5_MASK;
itoa(cmd, text, 16);
SerPrint(text);
SerPrint("\r\n");

switch (cmd)
{
case TUNERRWD :
case DIARWD :
SerPrint("rwd\r\n");
IRRwd();
break;
case TUNERFWD :
case DIAFWD :
SerPrint("fwd\r\n");
IRFwd();
break;
case TUNERLEFT :
case DIALEFT:
SerPrint("lft\r\n");
IRLeft();
break;
case TUNERRIGHT :
case DIARIGHT:
SerPrint("rgt\r\n");
IRRight();
break;
case TUNERSTOP :
case DIASTOP :
SerPrint("stp\r\n");
IRStop();
break;
}
}
if (speedLeft > 0 && speedLeft < OFFSET) speedLeft += OFFSET;
if (speedLeft < 0 && speedLeft > -OFFSET) speedLeft -= OFFSET;
if (speedRight > 0 && speedRight < OFFSET) speedRight += OFFSET;
if (speedRight < 0 && speedRight > -OFFSET) speedRight -= OFFSET;

leftDir = rightDir = FWD;
if (speedLeft < 0) leftDir = RWD;
if (speedRight < 0) rightDir = RWD;

if (speedLeft > 255) speedLeft = 255;
if (speedLeft < -255) speedLeft = -255;
if (speedRight > 255) speedRight = 255;
if (speedRight < -255) speedRight = -255;

MotorDir(leftDir,rightDir);
MotorSpeed(abs(speedLeft),abs(speedRight));
Msleep(100);
}
return 0;
}

harry3
10.06.2008, 09:30
Achso, damit werden die Motoren angesteuert(speedLeft und speedRight werden damit beeinflusst!), das hat nix mit dem IR Signal selber zu tun!

tape
10.06.2008, 15:53
das ist mir soweit auch klar, aber warum bruache ich überhaupt dieses offset? was hat das für einen sinn? wenn ich die motorengeschwindigkeit immer mit step erhöhe oder erniedrige, sollte das doch auch funktionieren...

harry3
10.06.2008, 16:43
Soweit ich das jetzt gesehen habe ist der Offset dazu da, dass du den "toten Bereich" überspringst. Die Motoren drehen ja erst ab einer bestimmten PWM Zahl, z.B. 80. Du müsstest dann ja 80/5=16mal drücken bis Asuro beschleunigt. Mittels Offset springst du gleich in die Nähe des brauchbaren Bereiches, der bei jedem Asuro anders ist und erst von dir ermittelt werden muss.

tape
11.06.2008, 01:12
danke für die antwort! das ist mir noch gar nicht aufgefallen, aber du hast recht :) ich probiere ja gerade den code zu verstehen, aber in den letzten zeilen ist mir noch etwas unklar, und zwar das"abs" vor (speedLeft) und (speedRight). was für einen zweck erfüllt das? ich habe es weggelassen, dadurch gab es bei dem wechsel von der vorwärts in die rückwärtsfahrt eine drastische zunahme der motorengeschwindigkeit. nachdem ich es wieder eingefügt habe, war dies nicht mehr der fall. was soll mir das jetzt sagen, außer das ich es brauche?

MotorDir(leftDir,rightDir);
MotorSpeed(abs(speedLeft),abs(speedRight));

harry3
11.06.2008, 01:37
abs gibt den Absolutwert einer Zahl zurück, also auf gut deutsch: ein eventuell vorhandenes Minuszeichen verschwindet.
abs(5)==5
abs(-3)==3

Die Fahrtrichtung wird durch MotorDir bestimmt, daher brauch man in MotorSpeed nur den Absolutwert der Geschw. angeben!