- 3D-Druck Einstieg und Tipps         
Seite 4 von 5 ErsteErste ... 2345 LetzteLetzte
Ergebnis 31 bis 40 von 50

Thema: Programme, die nicht funktionieren (wollen) ?!?!?!?!

  1. #31
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Anzeige

    LiFePo4 Akku selber bauen - Video
    In meinem Programm gibt es folgenden Code, um RC5 Daten von der Base auf der M32 zu empfangen (ist hier das Bsp 07):
    Code:
    // Check if there was a RC5 Reception:
    		if(interrupt_status.RC5reception)
    		{
    			uint8_t readBuf[2];
    			writeString_P("Received RC5 Transmission: ");
    			I2CTWI_transmitByte(I2C_RP6_BASE_ADR,I2C_REG_RC5_ADR);
    			I2CTWI_readBytes(I2C_RP6_BASE_ADR, readBuf, 2);
    			writeString_P("ADR:");writeInteger(readBuf[0],DEC);
    			writeString_P(" | DATA:");writeInteger(readBuf[1],DEC);
    			writeString_P("\n");		
    		}
    Was müsste ich denn hier eingeben, damit ich hier auf verschiedene Remote-Tasten z.B. I/Os schalten kann, oder LEDs etc?
    Bei meinen Versuchen tat sich nix.

    Und noch etwas zu Base-Programm:

    Code:
    void bumpersStateChanged(void)
    {
    	interrupt_status.bumperLeft = bumper_left;
    	if(bumper_right)
    		interrupt_status.bumperRight = true;
    	else
    		interrupt_status.bumperRight = false;
    	signalInterrupt();
    }
    Hier würde ich gerne der Base beibringen, dass sie beim Auslösen der Bumper anhalten soll, dann ein Stück zurückfahren und erst dann wieder auf RC5 reagieren soll.
    Wie stell ich denn sowas an?
    Ich hab versucht, mir das vom Move-Bsp-Programm abzugucken, hat aber nicht geklappt...

    Kann mir da jemand helfen?

    Danke Euch
    \/
    Fabian

  2. #32
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    hab jetzt folgendes gemacht:

    Code:
    /**
     * Bumpers Event Handler
     */ 
    void bumpersStateChanged(void)
    {
    	interrupt_status.bumperLeft = bumper_left;
    	if(bumper_right)
    		interrupt_status.bumperRight = true;
    	else
    		interrupt_status.bumperRight = false;
    	signalInterrupt();
    	move(60, BWD, DIST_MM(300), true);
    	rotate(50, RIGHT, 90, false);
    }
    Problem:
    Wenn ich den Blocking-Parameter der Rotate-Fkt. auf "false" setze, dann beendet er das Programm nach Abfahren der Strecke und Rotieren und will einen Reset.
    Wenn ich den Parameter auf "true" setze, macht er das Gleiche, nur dass er dreimal rotiert... ???
    Außerdem arbeitet er auch sonst nix mehr ab (sendet nichts mehr ans Terminal, und legt nichts auf den I2C für die M32).



    Was stimmt da nicht?

    Was aber funktioniert hat, war statt anderen Befehlen einfach ein
    stop();
    mSleep(2000);
    Dann geht soweit alles und Schlimmeres wird verhindert
    Auch wenn es einen Moment dauert, bis er anhält...

    Dann zum M32:
    Ich möchte ein paar LEDs schalten auf RC5-Code 13 (ein) und 34 (aus).

    Hab das so versucht:
    Code:
    // ------------------------------------
    		// Check if there was a RC5 Reception:
    		if(interrupt_status.RC5reception)
    		{
    			uint8_t readBuf[2];
    			writeString_P("Received RC5 Transmission: ");
    			I2CTWI_transmitByte(I2C_RP6_BASE_ADR,I2C_REG_RC5_ADR);
    			I2CTWI_readBytes(I2C_RP6_BASE_ADR, readBuf, 2);
    			writeString_P("ADR:");writeInteger(readBuf[0],DEC);
    			writeString_P(" | DATA:");writeInteger(readBuf[1],DEC);
    			writeString_P("\n");
    			if(I2C_REG_RC5_DATA == 13)
    				{
    				DDRC |= IO_PC7;		//PC7 ist nun auf OUT
    				PORTC |= IO_PC7;	//PC7 ist nun High
    				}
    			else if(I2C_REG_RC5_DATA == 34)
    				{
    				DDRC |= IO_PC7;		//PC7 ist nun auf OUT
    				PORTC &= ~IO_PC7;	//PC7 ist nun Low
    				}
    		}
    Aber es passiert leider nichts.

    Danke schon mal,
    Fabian

  3. #33
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Aha, das erste Problem ist soweit beseitigt, ich weiß nur nicht, ob das zufriedenstellend beseitigt ist:
    Problem war der Interrupt für den Master und der Master-Timeout. Da mein Master ja nicht auf Interrupts reagieren kann, hat der Base das gefehlt und es kam zum Shut-Down.
    Hab also den Master-Timeout komplett rausgenommen!?

    Aber das zweite Problem steht nach wie vor an!
    Bräuchte da mal ne Zeile Beispielcode...

    Danke!

  4. #34
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180

    stehe schon wieder vor einem rätsel...

    Zitat Zitat von Dirk
    @Fabian:

    Vielleicht machst du es dir für den Anfang zu schwierig.

    Fang doch mit einer einfachen Aufgabe an:
    Die Control M32 (Master) fordert auf Tastendruck bestimmte Aktionen von der Base (Slave) über I2C an.


    Gruß Dirk
    wenn ich folgenden code in die slavedatei einfüge

    Code:
                       DDRC |= SL1;
                      PORTC &= ~SL1;
    ......
               for(c=0; c<50; c++)  //50 = 50 Impulse senden, das dauert ca. 1 Sekunde
                   {
                      PORTC |= SL1;      // Impulsstart servo I
                      sleep(5);         // 1 = 0.1ms warten = Servoposition 1
                      PORTC &= ~SL1;    // Impulsende
                      sleep(150);         //50ms warten
                   }
    .........

    immer entsprechend case1 = SL1, case2 = SL2, case3 = SL4 und case4 = SL5, funktioniert es was die LEDs betrifft, aber der angeschlossener servo nur bei SL1 und SL2, nicht aber bei SL4 und SL5...

    Code:
    #include"RP6RobotBaseLib.h"
    #include "RP6I2CslaveTWI.h"
    
    int main(void)
    {
    
       initRobotBase();
    
       powerON();
    
       setACSPwrOff();
    
       uint8_t i;
       uint8_t c; // allgemeine 8-Bit-Variable (ein Char)
       I2CTWI_initSlave(10);
    
       while (true)
       {
    
          if(I2CTWI_writeRegisters[0] && !I2CTWI_writeBusy)
          {
             // Register speichern:
             i = I2CTWI_writeRegisters[0];
             I2CTWI_writeRegisters[0] = 0;
    
             switch (i)
             {
                case 1:
                	   DDRC |= SL1;
                	   PORTC &= ~SL1;
                   setLEDs(0b000001);
                   mSleep(500);
                   setLEDs(0b000000);
    //               task_motionControl();
    //                 move(30,FWD,DIST_MM(50),false);
    
                	for(c=0; c<50; c++)  //50 = 50 Impulse senden, das dauert ca. 1 Sekunde
                	{
                	   PORTC |= SL1;      // Impulsstart servo I
                	   sleep(5);         // 1 = 0.1ms warten = Servoposition 1
                	   PORTC &= ~SL1;    // Impulsende
                	   sleep(150);         //50ms warten
                	}
    
                break;
                case 2:
                	   DDRC |= SL2;
                	   PORTC &= ~SL2;
                   setLEDs(0b000011);
                   mSleep(500);
                   setLEDs(0b000000);
    //               task_motionControl();
    //                 move(30,BWD,DIST_MM(50),false);
    
                   for(c=0; c<50; c++)
                   {
                      PORTC |= SL2;
                      sleep(5);
                      PORTC &= ~SL2;
                      sleep(150);
                   }
    
                break;
                case 3:
                	   DDRC |= SL4;
                	   PORTC &= ~SL4;
                   setLEDs(0b000111);
                   mSleep(500);
                   setLEDs(0b000000);
    //               task_motionControl();
    //                 rotate(30,LEFT,20,false);
    
                   for(c=0; c<50; c++)
                   {
                      PORTC |= SL4;
                      sleep(5);
                      PORTC &= ~SL4;
                      sleep(150);
                   }
    
                break;
                case 4:
                	   DDRC |= SL5;
                	   PORTC &= ~SL5;
                   setLEDs(0b001111);
                   mSleep(500);
                   setLEDs(0b000000);
    //               task_motionControl();
    //                 rotate(30,RIGHT,20,false);
    
                   for(c=0; c<50; c++)
                   {
                      PORTC |= SL5;
                      sleep(5);
                      PORTC &= ~SL5;
                      sleep(150);
                   }
    
                break;
                default:
                   setLEDs(0b111111);
                   mSleep(500);
                   setLEDs(0b000000);
             }
          }
       }
    
       return 0;
    }
    ich komme einfach nicht dahinter warum???
    gruß inka

  5. #35
    Benutzer Stammmitglied
    Registriert seit
    14.11.2010
    Ort
    Kempten
    Alter
    40
    Beiträge
    52
    Hallo

    SL4 und SL5 sind am Port B zu finden, nicht am Port C

  6. #36
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.05.2009
    Ort
    Berlin
    Beiträge
    450
    Hi fabqu,
    Wenn der Code von der Fernbedienung am RP6 ankommt wüsste ich nicht warum es nicht funktionieren sollte. Ich schalte z.B Scheinwerfer und Kamera so ein. Hast Du Deine LED richtig rum. Der Pin ist Plus.
    Trainmen

  7. #37
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Hi trainman,
    Mein Problem war die Bezeichnung der RC5 Signale, also der genaue Code, den ich verwenden muss. Ich könnt in der Lib evtl nachsehen, wenn mein pc nicht letze Woche gecrasht ware! Fabian

  8. #38
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Was mache ich denn scho wieder falsch???

    Da mir mein PC abgeka**t ist, musste ich meine Ganzen Daten auf einen alten PC laden.
    Hab also an und für sich NICHTS verändert, trotzdem kann ich jetzt nichts mehr kompilieren!!!
    Folgende Fehlermeldung kommt:
    Code:
    Compiling: RP6Base_TV_REMOTE_mitSlave.c
    avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2   -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=RP6Base_TV_REMOTE_mitSlave.lst -I../../RP6Lib -I../../RP6Lib/RP6base -I../../RP6Lib/RP6common -std=gnu99 -MD -MP -MF .dep/RP6Base_TV_REMOTE_mitSlave.o.d RP6Base_TV_REMOTE_mitSlave.c -o RP6Base_TV_REMOTE_mitSlave.o
    ../../RP6Lib/RP6base/RP6RobotBaseLib.h:180: warning: inline function 'isMovementComplete' declared but never defined
    ../../RP6Lib/RP6base/RP6RobotBaseLib.h:67: warning: inline function 'setLEDs' declared but never defined
    ../../RP6Lib/RP6base/RP6RobotBaseLib.h:180: warning: inline function 'isMovementComplete' declared but never defined
    ../../RP6Lib/RP6base/RP6RobotBaseLib.h:67: warning: inline function 'setLEDs' declared but never defined
    
    Linking: RP6Base_TV_REMOTE_mitSlave.elf
    avr-gcc -mmcu=atmega32 -I. -gdwarf-2   -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=RP6Base_TV_REMOTE_mitSlave.o -I../../RP6Lib -I../../RP6Lib/RP6base -I../../RP6Lib/RP6common -std=gnu99 -MD -MP -MF .dep/RP6Base_TV_REMOTE_mitSlave.elf.d RP6Base_TV_REMOTE_mitSlave.o ../../RP6Lib/RP6base/RP6RobotBaseLib.o ../../RP6Lib/RP6common/RP6uart.o ../../RP6Lib/RP6common/RP6I2CslaveTWI.o --output RP6Base_TV_REMOTE_mitSlave.elf -Wl,-Map=RP6Base_TV_REMOTE_mitSlave.map,--cref    -lm
    RP6Base_TV_REMOTE_mitSlave.o: In function `deccelerate':
    C:\Dokumente und Einstellungen\user3\Desktop\RP6\RP6-Library\RP6Examples\MeineProgramme\TV_REMOTE_mitSlave/RP6Base_TV_REMOTE_mitSlave.c:696: undefined reference to `setLEDs'
    RP6Base_TV_REMOTE_mitSlave.o: In function `task_commandProcessor':
    C:\Dokumente und Einstellungen\user3\Desktop\RP6\RP6-Library\RP6Examples\MeineProgramme\TV_REMOTE_mitSlave/RP6Base_TV_REMOTE_mitSlave.c:351: undefined reference to `setLEDs'
    RP6Base_TV_REMOTE_mitSlave.o: In function `main':
    C:\Dokumente und Einstellungen\user3\Desktop\RP6\RP6-Library\RP6Examples\MeineProgramme\TV_REMOTE_mitSlave/RP6Base_TV_REMOTE_mitSlave.c:726: undefined reference to `setLEDs'
    C:\Dokumente und Einstellungen\user3\Desktop\RP6\RP6-Library\RP6Examples\MeineProgramme\TV_REMOTE_mitSlave/RP6Base_TV_REMOTE_mitSlave.c:728: undefined reference to `setLEDs'
    RP6Base_TV_REMOTE_mitSlave.o: In function `motionControlStateChanged':
    C:\Dokumente und Einstellungen\user3\Desktop\RP6\RP6-Library\RP6Examples\MeineProgramme\TV_REMOTE_mitSlave/RP6Base_TV_REMOTE_mitSlave.c:141: undefined reference to `isMovementComplete'
    make: *** [RP6Base_TV_REMOTE_mitSlave.elf] Error 1
    
    > Process Exit Code: 2
    > Time Taken: 00:24
    Kann mir jemand helfen?
    Vor dem Kopieren des gesamten Ordners ging noch alles.

    Gruß,
    Fabian

  9. #39
    Benutzer Stammmitglied
    Registriert seit
    14.11.2010
    Ort
    Kempten
    Alter
    40
    Beiträge
    52
    C:\Dokumente und Einstellungen\user3\Desktop..........
    An dem wird es wahrscheinlich liegen

  10. #40
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Und wie kann ich das beheben?
    Bzw wo muss ich das umändern?
    Im Makefile?
    Fabian

Seite 4 von 5 ErsteErste ... 2345 LetzteLetzte

Berechtigungen

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

12V Akku bauen