Hi,
habe seit 2 tagen meinen Asuro fertig und auch schon fleißig programmiert.
Hat bis vor ner Stunde auch alles geklappt.
Habe dann ein Programm drauf gespielt um den Asuro mit der Fernbedienung zu steuern.
Code:/
*******************************************************************************
*
* Description: Asuro lässt sich per IR-Fernbedienung steuern
*
*****************************************************************************/
#include "asuro.h"
#include <stdlib.h>
#define CH_DN 0x21
#define CH_UP 0x20
#define VOL_DN 0x11
#define VOL_UP 0x10
#define FULL_SCRN 0x2E
#define ZERO 0x00
#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();
for (;;) {
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 & 0x3F); // 6 Command-Bits werden verwertet
switch (cmd) {
case CH_DN : IRRwd(); break;
case CH_UP : IRFwd(); break;
case VOL_DN: IRLeft(); break;
case VOL_UP: IRRight(); break;
case ZERO :
case FULL_SCRN : IRStop(); break;
}
Driver();
}
return 0;
}
Hat auch halbwegs gut geklappt.
Tja, und dann... wollte ich wieder ein normales "Fahr den Raum ab" drauf flashen, aber dann kam folgendes
Open COM1 --> OK !
Bulding RAM --> OK !
Connect to ASURO --> OK !
Sending Page 001 of 029 --> v.v.v.v.v.v.v.v.v.v.
TIMEOUT !
Not successful, Flash contents will be invalid!
Was ist passiert??? Auf dem Hyperterminal die IR vom Transceiver gecheckt. Läuft. Nur mit dem flashen geht garnix mehr.
Was kann ich machen ???
HELP plz
grüße mayo