PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem: Programm hängt & Error 0x20[gelöst]



copcom-weber
19.01.2010, 16:32
Hallo

ich habe folgenden kleinen Test-Code geschrieben weil ich mich gerade mit der M32 platform und dem I2C Bus angefangen habe mich damit auseinander zusetzen.

aber das Program bleibt an der stelle nach der 2ten LED auf dem M32Modul und direkt vor der3ten auf der Base. und ich weiß nicht woran das liegt.

Ausserdem kommt direkt am Anfang die Meldung Error: 0x20.
warum?

Bitte um Hilfe



#include "RP6ControlLib.h"
#include "RP6I2CmasterTWI.h"
#include "RP6Control_I2CMasterLib.h"

void I2C_requestedDataReady(uint8_t dataRequestID)
{
checkRP6Status(dataRequestID);
}

void I2C_transmissionError(uint8_t errorState)
{
writeString_P("\nI2C ERROR - TWI STATE: 0x");
writeInteger(errorState, HEX);
writeChar('\n');
}


uint8_t transmit[10];

#define CMD_MOVE_AT_SPEED 5


void drive(uint8_t spdl, uint8_t spdr)
{
transmit[0] = 0;
transmit[1] = CMD_MOVE_AT_SPEED;
transmit[2] = spdl;
transmit[3] = spdr;
I2CTWI_transmitBytes(I2C_RP6_BASE_ADR, transmit, 4);
}

void batpower(void)
{
uint8_t bat[2];
I2CTWI_transmitByte(I2C_RP6_BASE_ADR, 21);
I2CTWI_readBytes(I2C_RP6_BASE_ADR,bat,2);
setCursorPosLCD(1,13);
writeIntegerLengthLCD(bat[0] + (bat[1]<<8),DEC,3);
}

int main(void)
{
initRP6Control();
initLCD();
int x,y,z;
I2CTWI_initMaster(100);
I2CTWI_setRequestedDataReadyHandler(I2C_requestedD ataReady);
I2CTWI_setTransmissionErrorHandler(I2C_transmissio nError);
ACS_setStateChangedHandler(acsStateChanged);
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_ACS_POWER, ACS_PWR_MED);
while(true)
{
task_I2CTWI();
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, 3, 0b100000);
setLEDs(0b1000);
mSleep(50);
uint8_t lightsens[4];
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, 3, 0b010000);
mSleep(50);
I2CTWI_transmitByte(I2C_RP6_BASE_ADR, 13);
I2CTWI_readBytes(I2C_RP6_BASE_ADR,lightsens,4);
setLEDs(0b0100);
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, 3, 0b001000);
mSleep(50);
x=lightsens[0] + (lightsens[1]<<8);
y=lightsens[2] + (lightsens[3]<<8);
setCursorPosLCD(0,2);
writeIntegerLengthLCD(x,DEC,3);
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, 3, 0b000100);
mSleep(50);
setCursorPosLCD(1,2);
writeIntegerLengthLCD(y,DEC,3);
if(y>x)
{
z=y;
}
else
{
z=x;
}
setLEDs(0b0010);
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, 3, 0b000010);
mSleep(50);
showScreenLCD("X:","Y: Bat:");
batpower();
if(z>400)
{
drive(75,75);
}
else
{
drive(0,0);
}
setLEDs(0b0001);
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, 3, 0b000001);
mSleep(50);
}
return 0;
}

Dirk
19.01.2010, 21:18
Hallo copcom-weber,

ich habe mir dein Pprogramm nicht genauer angesehen, weil es in der Form nur mühsam lesbar ist.

Wenn du vor dem Einfügen von Code oben auf "Code" klickst und nach dem Einfügen wieder auf "Code", dann klappt das auch mit eingerücktem Code.

Gruß Dirk

suicide
20.01.2010, 08:12
Hallo,

versuch mal nach dem mSleep() nach dem I2CTWI_setTransmissionErrorHandler(I2C_transmissio nError);
Mein RP6 braucht an der Stelle immer eine kleine Pause. Ich warte da irgendwas zwischen 200 und 500ms.

Grüße,
Jan

copcom-weber
20.01.2010, 08:28
Danke werde es mal später versuchen.
und was ist das wohl mit dem Error?
der tritt auf befor er auf irgend etwas reagiert.

suicide
20.01.2010, 09:10
Irgendwas mit nem Timeout wenn ich mich recht erinnere. Habs mir so erklärt das die I2C Initialisierung etwas mehr Zeit benötigt. Das Baseboard muss ja auch erstmal so weit sein das es auf die I2C-Anfragen reagieren kann.

copcom-weber
20.01.2010, 10:50
Ok das mit der Error Meldung hat sich mit dem mSleep erledigt.
aber das Progi hängt sich immer auf. Immer an der gleichen stelle.
aber es dauert unterschiedlich lange mal ein Zyklus mal 1 min.

copcom-weber
20.01.2010, 10:53
hier so siehts jetzt aus.
jetzt hängt er immer nach der 3ten LED.
kann ja nur noch was mit dem drive sein, oder?



#include "RP6ControlLib.h"
#include "RP6I2CmasterTWI.h"
#include "RP6Control_I2CMasterLib.h"

void I2C_requestedDataReady(uint8_t dataRequestID)
{
checkRP6Status(dataRequestID);
}

void I2C_transmissionError(uint8_t errorState)
{
writeString_P("\nI2C ERROR - TWI STATE: 0x");
writeInteger(errorState, HEX);
writeChar('\n');
}


uint8_t transmit[10];

#define CMD_MOVE_AT_SPEED 5

void drive(uint8_t spdl, uint8_t spdr)
{
transmit[0] = 0;
transmit[1] = CMD_MOVE_AT_SPEED;
transmit[2] = spdl;
transmit[3] = spdr;
I2CTWI_transmitBytes(I2C_RP6_BASE_ADR, transmit, 4);
mSleep(10);
}

void batpower(void)
{
uint8_t bat[2];
I2CTWI_transmitByte(I2C_RP6_BASE_ADR, 21);
I2CTWI_readBytes(I2C_RP6_BASE_ADR,bat,2);
setCursorPosLCD(1,13);
writeIntegerLengthLCD(bat[0] + (bat[1]<<8),DEC,3);
}

int main(void)
{
initRP6Control();
initLCD();
uint8_t lightsens[4];
int x,y,z;
I2CTWI_initMaster(150);
I2CTWI_setRequestedDataReadyHandler(I2C_requestedD ataReady);
mSleep(500);
I2CTWI_setTransmissionErrorHandler(I2C_transmissio nError);
mSleep(500);
while(true)
{
task_I2CTWI();
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, 3, 0b100000);
setLEDs(0b1000);
mSleep(50);
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, 3, 0b010000);
mSleep(50);
I2CTWI_transmitByte(I2C_RP6_BASE_ADR, 13);
I2CTWI_readBytes(I2C_RP6_BASE_ADR,lightsens,4);
setLEDs(0b0100);
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, 3, 0b001000);
mSleep(50);
x=lightsens[0] + (lightsens[1]<<8);
y=lightsens[2] + (lightsens[3]<<8);
setCursorPosLCD(0,2);
writeIntegerLengthLCD(x,DEC,3);
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, 3, 0b000100);
mSleep(50);
setCursorPosLCD(1,2);
writeIntegerLengthLCD(y,DEC,3);
if(y>x)
{
z=y;
}
else
{
z=x;
}
setLEDs(0b0010);
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, 3, 0b000010);
mSleep(50);
showScreenLCD("X:","Y: Bat:");
batpower();
if(z>400)
{
drive(75,75);
}
else
{
drive(0,0);
}
setLEDs(0b0001);
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, 3, 0b000001);
mSleep(50);
}
return 0;
}

suicide
20.01.2010, 11:21
Vielleicht Akkus leer?

copcom-weber
20.01.2010, 12:50
nein
lasse mir ja nebenbei die spannung auf dem LCD anzeigen.
die schwankt auch wenn ich etwas lasst an einem antrieb aufbringe. momentan 7.75V

kanns vllt an der Base liegen dort benutzte ich übrigens das standart Slave progi?

SlyD
20.01.2010, 18:42
Hab keine Zeit mir das genauer anzuschauen aber bei der Fehlersuche ist es immer hilfreich einfach Textausgaben einzubauen - also in dem Bereich wo Du den Fehler vermutest einfach nach jeder Zeile writeString_P("1 \n"); (und 2, 3, 4 usw. ) hinschreiben und die Ausgaben beobachten dann siehst Du genauer wo das Program hängen bleibt.
Variablenwerte mit writeInteger ausgeben hilft auch manchmal.

MfG,
SlyD

copcom-weber
21.01.2010, 09:34
Danke es war ein problem das ich in der funktion batpower jedesmal ein array deklariert habe das hat es irgendwie gestört aber danke für die tipps!