falls es jemand interressiert... (oder auch nicht^^)
ich hab das Problem größtenteils gelöst. Ich glaube mein Programm für den Asuro war einfach zu groß (>7,0kB). Deshalb hab ich das ganze etwas anderst aufgezogen:
Code:
#include "asuro.h"
#include "i2c.h"
#define pcf8591_address 0x90
int main(void)
{
unsigned char ret[6];
int i;
Init();
EncoderInit();
InitI2C();
MotorDir(FWD, FWD);
while(1)
{
StartI2C(pcf8591_address + WRITE);
WriteI2C(0x4);
StopI2C();
Sleep(40);
StartI2C(pcf8591_address + READ);
ReadI2C(ACK);
ret[0] = ReadI2C(ACK);
ret[1] = ReadI2C(ACK);
ret[2] = ReadI2C(ACK);
ret[3] = ReadI2C(ACK);
i = 0;
SerWrite(ret, 4);
SerRead(ret, 1, 0);
switch(ret[0])
{
case '1': MotorSpeed(150, 0);
while(!(ret[0] < 60 && ret[1] < 60))
{
ret[0] = ReadI2C(ACK);
ret[1] = ReadI2C(ACK);
ReadI2C(ACK);
ReadI2C(ACK);
}
MotorSpeed(0, 0);
break;
case '3': MotorSpeed(0, 150);
while(!(ret[0] < 60 && ret[1] < 60))
{
ret[0] = ReadI2C(ACK);
ret[1] = ReadI2C(ACK);
ReadI2C(ACK);
ReadI2C(ACK);
}
MotorSpeed(0, 0);
break;
}
EncoderSet(0, 0);
while(i == 0)
{
ret[0] = ReadI2C(ACK);
ret[1] = ReadI2C(ACK);
ret[2] = ReadI2C(ACK);
ret[3] = ReadI2C(ACK);
if(ret[0] > ret[1]) {
MotorSpeed(100, 140); //120, 155
}
else if(ret[0] < ret[1]) {
MotorSpeed(140, 100); //155, 120
}
else
MotorSpeed(100, 100); //120, 120
if(encoder[0] > 900 || (ret[0] > 190 && ret[1] > 190))
{
MotorSpeed( 0, 0);
PrintInt((int)encoder[0]);
SerWrite(" ", 1);
i = 1;
}
}
StopI2C();
}
StopI2C();
}
Allerdings hab ich immer noch das Problem das die Abstandswerte vom Asuro nicht zu stimmen scheinen
Lesezeichen