- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Problem: Programm hängt & Error 0x20[gelöst]

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.01.2010
    Ort
    Bielefeld
    Beiträge
    101

    Problem: Programm hängt & Error 0x20[gelöst]

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

    Code:
    #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_requestedDataReady);
    	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
    	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;
    }

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    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

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    14.12.2009
    Ort
    Steinfurt
    Beiträge
    46
    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

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.01.2010
    Ort
    Bielefeld
    Beiträge
    101
    Danke werde es mal später versuchen.
    und was ist das wohl mit dem Error?
    der tritt auf befor er auf irgend etwas reagiert.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    14.12.2009
    Ort
    Steinfurt
    Beiträge
    46
    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.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.01.2010
    Ort
    Bielefeld
    Beiträge
    101
    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.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.01.2010
    Ort
    Bielefeld
    Beiträge
    101
    hier so siehts jetzt aus.
    jetzt hängt er immer nach der 3ten LED.
    kann ja nur noch was mit dem drive sein, oder?

    Code:
    #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_requestedDataReady);
    	mSleep(500);
    	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
    	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;
    }

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    14.12.2009
    Ort
    Steinfurt
    Beiträge
    46
    Vielleicht Akkus leer?

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.01.2010
    Ort
    Bielefeld
    Beiträge
    101
    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?

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad