Ich misch mich mal mir meinem eigenen Problem ein!
Ich hab mir hier aus dem Forum einen Beispielcode auf den asuro geflasht, und zwar den aus der Test.zip in diesem Thread:
https://www.roboternetz.de/phpBB2/ze...ag.php?t=13478
Der funktionierte auch wunderbar, aber ich wollte die Tastenbelegung ändern und stoße auf Probleme!
Nachdem ich die alten Codes ersetzt hab mit den Codes für die Tasten die ich verwenden will lief erstmal nichts. Daraufhin hab ich was geändert und es funktioniert, aber die Reaktionszeiten sind ganz fies nach unten gegangen!
Das hier hab ich geändert:
cmd = rxdata; // (rxdata & 0x3F);
Code:
#include "asuro.h"
#include <stdlib.h>
#define IRFWD 0x1794
#define IRRWD 0x1795
#define IRLEFT 0x1796
#define IRRIGHT 0x1797
#define IROK 0x17A5
#define IRSTOP 0x1786
#define OFFSET 100
#define STEP 60
int speedLeft, speedRight;
volatile unsigned int rxdata;
volatile unsigned char rxbits;
SIGNAL (SIG_OVERFLOW0)
{
rxbits++;
rxdata<<=1;
rxdata |= (PIND & (1 << PD0)); // liest Datenbits
TCNT0 = 34; // Timer auf 1778µs
if(rxbits==14)
{
TCCR0 &= ~((1 << CS01) | (1 << CS00)); // stoppt Timer
}
}
void Driver(void)
{
unsigned char leftDir= FWD, rightDir= FWD;
leftDir = rightDir = FWD;
if (speedLeft < 0)
leftDir = RWD;
if (speedRight < 0)
rightDir = RWD;
if (speedLeft > 240)
speedLeft = 240;
if (speedLeft < -240)
speedLeft = -240;
if (speedRight > 240)
speedRight = 240;
if (speedRight < -240)
speedRight = -240;
MotorDir(leftDir, rightDir);
MotorSpeed(abs(speedLeft),abs(speedRight));
}
void IRFwd(void)
{
speedRight += STEP;
speedLeft += STEP;
if (abs(speedLeft) < OFFSET)
{
speedRight += STEP;
speedLeft += STEP;
}
FrontLED(ON);
BackLED(OFF,OFF);
}
void IRRwd(void)
{
speedRight -= STEP;
speedLeft -= STEP;
if (abs(speedLeft) < OFFSET)
{
speedRight -= STEP;
speedLeft -= STEP;
}
FrontLED(OFF);
BackLED(ON,ON);
}
void IRLeft(void)
{
FrontLED(OFF);
BackLED(ON,OFF);
if (speedLeft != 0)
{
speedLeft /= 4;
Driver();
Msleep(80);
speedLeft *= 4;
}
else
{
speedLeft = -150;
speedRight = 150;
Driver();
Msleep(80);
speedLeft = speedRight = 0;
}
}
void IRRight(void)
{
FrontLED(OFF);
BackLED(OFF,ON);
if (speedRight != 0)
{
speedRight /= 4;
Driver();
Msleep(80);
speedRight *= 4;
}
else
{
speedLeft = 150;
speedRight = -150;
Driver();
Msleep(80);
speedLeft = speedRight = 0;
}
}
void IRStop(void)
{
speedRight = speedLeft = 0;
FrontLED(OFF);
BackLED(OFF,OFF);
}
int main(void)
{
static unsigned int cmd;
Init();
while (1)
{
rxbits = 1;
rxdata = 0;
TIMSK |= (1 << TOIE0);
// Interrupt scharf
while (PIND & (1 << PD0))
; // warte auf 1. Flanke
TCNT0 = 90;
// Timer auf 1333µs
TCCR0 = (1 << CS01) | (1 << CS00);
// Start Timer
while (rxbits < 14)
; // warte bis alle Bits empfangen
cmd = rxdata; // (rxdata & 0x3F);
// 6 Command-Bits werden verwertet
switch (cmd)
{
case IRRWD:
IRRwd();
break;
case IRFWD:
IRFwd();
break;
case IRLEFT:
IRLeft();
break;
case IRRIGHT:
IRRight();
break;
case IRSTOP:
case IROK:
IRStop();
break;
}
Driver();
}
return 0;
}
Lesezeichen