- 12V Akku mit 280 Ah bauen         
Seite 1 von 5 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 50

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

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

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

    Anzeige

    E-Bike
    Hallo!
    Ich habe hier ein Problem mit meinen Programmen.

    Im ersten wollte ich den Robby (nur mit Base) mit der TV Remote steuern, aber auch die Bumper einsetzen (er sollte dann ein wenig rückwärts fahren und dann kann ich erst wieder die Steuerung übernehmen).
    Leider tut sich nix, wenn ich auf die Bumper drücke. Gar nix!


    Beim zweiten Programm wollte ich ebenfalls die Robby-Base mit TV Remote steuern, aber auch die sämtlichen Sensorwerte etc. auf den I2C legen, um später auch den M32 miteinzubeziehen.
    Doch es kommen ziemlich viele Meldungen mit "undefined reference to ...", was meistens (ich glaube sogar immer) "read"-Befehle anspricht.

    Mein eigentliches Vorhaben:
    Ich wollte eigentlich nie den M32 als Master, sondern als separaten Prozessor. Ich hatte mir das so vorgestellt, dass die Base die Sensoren übernimmt (kommt noch ein bisschen was hinzu ...) und der Master später eigene Aufgaben übernimmt, aber unter gewissen Umständen auch Befehle an die Base schicken kann bzw von ihr Befehle auslesen kann.
    Außerdem sollte der Robot laufend von der TV Remote gesteuert werden können, aber auch auf gewissen RC5-Befehlen in eigene Programmroutinen fahren (z.B. Lichtverfolgung, ...) und erst bei Drücken eines bestimmten Knopfes auf der TV Remote aus dieser Routine wieder in die TV-Remote-Routine zurückgehen, also wieder von mir gesteuert werden können.

    Davon bin ich aber scheinbar noch weit entfernt!
    Mir würde es ja für den Anfang schon reichen, wenn ich meine Sensorwerte und die RC5-Daten auf den I2C legen könnte, damit ich meinen M32 mal was ausführen lassen kann (z.B. Beeper an bei drücken des Knopfes 0 oder so, wär ja schon was)


    Wäre super, wenn sich das mal einer von euch ansehen könnte!
    Wie man so eine Box hier reinstellt, weiß ich leider auch nicht, darum lade ich euch die c-Dateien hoch...

    Danke schon mal!
    Fabian

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

    Typischer Code der Control M32 (Master):
    Code:
    #include "RP6ControlLib.h" 
    #include "RP6I2CmasterTWI.h" 
    
    uint8_t buffer[2];
    
    int main(void) 
    { 
    	initRP6Control(); 
    	initLCD(); 
    
    	I2CTWI_initMaster(100); 
    
    	uint8_t key; 
        
    	while(true) 
    	{ 
    
    		showScreenLCD("Bitte Taster", "druecken"); 
        
    		do 
    		{ 
    			key = getPressedKeyNumber(); 
    		} 
    		while (key == 0); 
        
    		showScreenLCD("Daten werden", "uebertragen"); 
    		mSleep(500); 
    
    		buffer[0] = 0;
    		buffer[1] = key;
    		if (!I2CTWI_isBusy()) {
    			I2CTWI_transmitBytes(10, buffer, 2);
    		}
    
    		showScreenLCD("...erfolgreich", ""); 
    		mSleep(500); 
    	} 
       
    	return 0; 
    }
    Passender Code für den Slave (Base):
    Code:
    #include"RP6RobotBaseLib.h" 
    #include "RP6I2CslaveTWI.h" 
      
    int main(void) 
    { 
    
    	initRobotBase(); 
    
    	powerON(); 
    
    	setACSPwrOff(); 
        
    	uint8_t i; 
    
    	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:
    					setLEDs(0b000001); 
    					mSleep(500); 
    					setLEDs(0b000000); 
    //					task_motionControl(); 
    //              	move(30,FWD,DIST_MM(50),false); 
    				break; 
    				case 2:
    					setLEDs(0b000011); 
    					mSleep(500); 
    					setLEDs(0b000000); 
    //					task_motionControl(); 
    //              	move(30,BWD,DIST_MM(50),false); 
    				break; 
    				case 3:
    					setLEDs(0b000111); 
    					mSleep(500); 
    					setLEDs(0b000000); 
    //					task_motionControl(); 
    //              	rotate(30,LEFT,20,false); 
    				break; 
    				case 4:
    					setLEDs(0b001111); 
    					mSleep(500); 
    					setLEDs(0b000000); 
    //					task_motionControl(); 
    //              	rotate(30,RIGHT,20,false); 
    				break; 
    				default:
    					setLEDs(0b111111); 
    					mSleep(500); 
    					setLEDs(0b000000); 
    			} 
    		}
    	} 
    
    	return 0;
    }
    Wenn das bei dir klappt, kannst du dich an neue Aufgaben machen.
    Genau so kann die M32 Messwerte von der Base abrufen.

    Gruß Dirk

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Hmmm...
    Ja, das ist wohl richtig!
    Werds morgen mal ausprobieren!
    Danke für den Code

    ->Jetzt kommt seit Neuestem auch noch, dass er powerON(); nicht mehr kennen will!
    Ich habe gerade keinen Peil mehr.
    Werds mal doch langsamer angehen!

    Aber hat vielleicht doch noch jemand eine Idee zu einem meiner beiden Programme?

    Danke!
    Fabian

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Fresh!
    Sehr Fresh!
    Endlich mal etwas, das funktioniert!
    Danke Dir, Dirk!
    Aber nochmal schnell ne Frage dazu:
    Am Anfang includest du ja stets SalveLib bzw. MasterLib.
    So wie ich das beim Lesen des Manuals gesehen habe, setzten wir damit so etwas wie einen festen Status für den Microcontroller fest, setzen ihn also in den "Slave-Modus" bzw. "Master-Modus"!?!??
    Ist das so, oder enthält die jeweilige Lib eben nur gewisse Routinen (wie das Schreiben/Lesen der Register), die gebraucht werden?

    Und wenn es doch so ist, kann ich dann Daten auf den I2C legen, ohne dass ich den Microcontroller in den Slave-Modus setzen muss???

    Und noch etwas ganz anderes, viel anfängerisches: Wenn ich ein Programm nun selbst tippe, bzw. mir eines wie das von dir hier kopiere...
    Wie bekomme ich dann ein Makefile? Bisher habe ich mir damit geholfen, dass ich einfach die Bsp-Programme "überschrieben" habe, mir also deren Makefiles geklaut habe (höchstens Target verändert).
    Aber das ist ja wohl nicht so ganz in Ordnung!?

    Danke schon mal Dirk!
    Natürlich auch an alle anderen, die mir was erklären wollen
    Fabian

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @Fabian:
    ... setzen ihn also in den "Slave-Modus" bzw. "Master-Modus"!?!??
    Genau. Jeder Teilnahmer auf dem I2C-Bus kann nur Master oder Slave sein. Das wird beim RP6 bestimmt durch die Master- oder Slave-Lib, die eingebunden wird.
    ... kann ich dann Daten auf den I2C legen, ohne dass ich den Microcontroller in den Slave-Modus setzen muss???
    Master und Slave können Daten senden und empfangen. Dabei hat aber der Master "die Hosen an": Der Slave quatscht nicht einfach los, sondern der Master fordert die Daten vom Slave an, der die dann sendet. Der Master empfängt dann die Daten.
    Wenn der Slave nicht gerade angeforderte Daten sendet, dann hat er nur eine Aufgabe: Die Ohren an den Bus legen und nur dann reagieren, wenn irgend etwas an SEINE Adresse (in meinem Beispiel: 10, oder an alle Teilnehmer) gesendet wird. Ansonsten hat er die Klappe zu halten.

    Makefile:
    Das mit dem Klauen von anderen Beispielen ist eine gute Idee. Außer dem TARGET = must du noch in diesem Bereich:

    SRC += $(RP6_LIB_PATH)/RP6base/RP6RobotBaseLib.c
    SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c
    #SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CslaveTWI.c
    #SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c

    ... was anpassen:
    Hier kommen alle Libs rein, die du für dein Programm brauchst (einbinden willst). Zeilen mit dem "#" am Anfang sind im makefile Kommentare, werden also NICHT ausgeführt. Wenn du also die Slave-Lib in dein Programm einbinden willst, mach einfach das "#" am Anfang der vorletzten Zeile weg.

    Gruß Dirk

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Ah!
    Danke, jetzt ist schon einiges klarer.

    Danke Dir derweil, werd mal versuchen das so umzusetzen.
    Macht es Sinn, sich dann auch noch die CC-Pro Mega128 zu holen (Weihnachten steht ja vor der Tür), oder wird das dann vielleicht doch zu viel für meine Akkus und vor allem für mich Anfänger?

    Schlimmstenfalls muss ich also meine Sachen umschreiben von Base auf M32. Woran ich zwar schon mal gescheitert bin, aber das wird schon, hoffe ich

    Hat hier jemand das TV-Remote-Beispiel zufällig schon mal modifiziert für die M32?
    Würde derjenige mich daran teilhaben lassen?
    Das wär super.

    Gruß,
    Fabian

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    Ich verstehe eigentlich gar das Problem nicht. In das Bespiel werden doch RC5 und analoge Eingangen von Slave an Master geschickt. Dat hat der Master zugriff auf fast alle Functionen von Slave (Fahrbefehle, aber auch ADC Eingangen, RC5 , Bumper, LEDs steuern. Was wollst du eigentlich erreichen ?

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Ja, das ist schon richtig.
    Aber ich wollte einfach, dass Base und M32 jeweils eigenständig arbeiten und nur miteinander kommunizieren, also ohne Master-Slave. Was mir nicht so ganz gefällt ist, dass die ganze Rechenarbeit der Base nur dafür genutzt wird, dass man auf Befehle wartet.
    Außerdem hab ich den RP6 erst 2 Wochen. Und meine Programmierkentnisse belaufen sich bisher auch NUR auf das durchlesen der Beispielprogramme... daher tu ich mich noch etwas hart...

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    Auch das ist perfect machbar mit das heutige konzept : Der slave hat eine directe digital output nach den master. So besteht die moglichkeit das der Slave ein Signal gibt an der Master : hola, neue Info wartet auf Abfrage von Master (die sogenannte Interrupt nach den Master). Dan reagiert den Master und hohlt sich ueber I2C die wichtige Register (beispiel ACS, Bumper, RC5...).
    Also ist es moglich um beide Programme (Master und SLave) zu erweitern und trotzdem doch eine Schnittstelle in zwei Richtungen zu haben.

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Ah, ok! Klingt einleuchtend.
    Das werd ich jetzt eben mal versuchen, wenn ich Zeit habe.
    Sollte ja machbar sein...

    Gruß,
    Fabian

Seite 1 von 5 123 ... LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests