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







Zitieren

Lesezeichen