Hallo
Wie oben schon geschrieben kenne ich mich mit den Kompilereinstellungen und den Makefiles überhaupt nicht aus (das erledigt mein KamAVR für mich).
Ich würde deshalb einfach mal folgendes versuchen:
http://tinyurl.com/ybmfk8j
Gruß
mic
Ja,
jetzt lässt es sich fast kompilimieren aber jetzt habe ich die fehlermeldung
und wie bekomme ich das problem gelöst?Code:> "make.exe" all -------- begin -------- avr-gcc (WinAVR 20081124rc3) 4.3.2 Copyright (C) 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. make.exe: *** No rule to make target `program_01.elf', needed by `elf'. Stop. > Process Exit Code: 2 > Time Taken: 00:00
grüße
Matze
Hallo
Wie oben schon geschrieben kenne ich mich mit den Kompilereinstellungen und den Makefiles überhaupt nicht aus (das erledigt mein KamAVR für mich).
Ich würde deshalb einfach mal folgendes versuchen:
http://tinyurl.com/ybmfk8j
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hi,
Was bewirkt eigentlich das test_program von radbruch?
Ich habe keinen Empfänger angeschlossen und das Program aus Neugierde ausprobiert.
Das Resultat:
Die rechte Kette des RP6´dreht sich stetig vorwärts.
Warum?
Danke für jegliche Aufklärung der Frage!
Nichts existiert durch sich allein!
Bild hier
Hallo
Auch hier geht es um das RC-Programm aus dem Dominoday-Thread. Ohne angeschlossenen RC-Empfänger macht der RP6 was er will, weil ich die Initialisierung der Inputwerte vergessen habe:
uint8_t rc_input_pwr, rc_input_dir;
Da mein Empfänger mit diesem Programm Werte zwischen 110 und 150 liefert, ist die Nullstellung (Mitte) bei ca. 130. Deshalb sollte die Initalisierung besser so aussehen:
uint8_t rc_input_pwr=130, rc_input_dir=130;
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Ok,
Das heißt dann also, dass RP6 die zugehörige Bedingung (um sich nach links drehen zu dürfen) als erfüllst ansieht und sich somit nch links dreht.![]()
Nun zu einem anderem Problem: Das Kompilieren!!!
Ich habe zwar deine rblib.c ins Makefile einetragen (unter SRC (sieh Code)).
Außerdem habe ich den Pfad von der rblib statt der RP6RobotBaseLib verwendet(siehe Code).
Trotzdem erscheint folgende Fehlermeldung:
make: *** No rule to make target `RC_RP6.elf', needed by `elf'. Stop.
> Process Exit Code: 2
> Time Taken: 00:00
Warum?
Ich habe den Ordner wie die Datei benannt und eine Make all und eine Make Clean Datei zusammen mit dem Makefile und deinem ungeänderten C-Code in den Ordner gepackt.
Wäre wirklich nett, wenn mir jemand weiterhelfen kann. Danke!!Code:TARGET = RC_RP6 ############################################################################### ############################################################################### # Specify relative path to RP6 library files here. # This is "../../RP6lib" or "../RP6lib" usually. RP6_LIB_PATH=F:/RP6/RP6lib/rblib RP6_LIB_PATH_OTHERS=F:/RP6/RP6lib/RP6base F:/RP6/RP6lib/RP6common ############################################################################### #------------------------------------------------ # Main Source file is _automatically_ added here: SRC = $(TARGET).c # DO NOT EDIT THIS! ############################################################################### # If there is more than one source file, append them here separated by spaces. # Usually you have to add the Library files here! (ONLY add c files "*.c" here, # NO header files "*.h"!) # Don't forget to add relative paths! 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 SRC += $(RP6_LIB_PATH)/rblib.c
Nichts existiert durch sich allein!
Bild hier
Hallo
Da die beiden Variablen nicht initialisert waren, kann man nichts über deren Inhalt sagen. Aber wie du richtig erkannt hast scheint dein RP6 die "gefundenen" Werte als Befehl zum Drehen zu erkennen.
Mit den Makefiles kenne ich mich (immer noch) nicht aus. Aber es funktioniert sicher nicht, wenn du auch die orginale Lib zusammen mit der rblib einbindest. Deshalb müssen die ersten zwei Zeilen auch auskommentiert werden:
Wenn rblib.c so eingebunden wird, muss man das include im Programm entfernen:#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
SRC += $(RP6_LIB_PATH)/rblib.c
#include "rblib.h"
//#include "rblib.c"
Aber das ändert vermutlich nichts an deiner "No Rules to make..."-Fehlermeldung. Soweit ich weiß bedeutet das, dass der Quellcode des Programms nicht gefunden wird. Ursachen sind z.B. falsche Pfade, Leer- oder Sonderzeichen in den Pfad- oder Dateinamen, falsche Dateinamen, bei Linux vermutlich auch falsche Groß-/kleinschreibung...
Gruß
mic
[Edit]
Die rblib-Geschichte ist ja eigentlich auch eine "Jugendsünde" von mir. Inzwischen kann ich eine Variante der Servoansteuerung anbieten die sich mit der RP6-Library verträgt:
https://www.roboternetz.de/phpBB2/vi...=483757#483757
Allerdings ist dabei die Auflösung der Servoschritte nicht so hoch, deshalb muss man die Umrechnung der gemessenen RC-Signale in Motorparameter anpassen:
(Nicht getestet, weil mein RC-Empfänger zur Zeit eingemottet ist)Code:// RC-Signale an SCL und SDA messen 23.3.2010 mic // Timersetup der Lib: Mode 10, Phase Correct // Mit ICR1 als Top ergibt bei ICR1=210 ca. 8MHz/420=19047,6Hz ;) // Drehbereich meiner RS-2-Servos ist von ca. 14 bis ca. 38 // Aus: https://www.roboternetz.de/phpBB2/vi...=492812#492812 #include "RP6RobotBaseLib.h" volatile uint8_t rc_input_pwr=26, rc_input_dir=26; int main(void) { initRobotBase(); TIMSK |= (1 << TOIE1); // Die Timer1 Overflow-ISR zur Servoansteuerung setLEDs(1); // und los! writeString_P("\n\nRC-Empfänger an SCL und SDA auswerten.\n"); writeString_P("mic 23.3.2010\n\n"); while(1) { writeString_P("SCL (PC0): "); writeInteger(rc_input_dir, 10); writeString_P("\nSDA (PC1): "); writeInteger(rc_input_pwr, 10); writeString_P("\n\n"); mSleep(300); } return 0; } ISR (TIMER1_OVF_vect) // RC-Signale an SCL und SDA messen { static uint16_t rc_temp_pwr=0; static uint16_t rc_temp_dir=0; if (PINC & 1) rc_temp_dir++; else if (rc_temp_dir) { rc_input_dir=rc_temp_dir-1; rc_temp_dir=0; } if (PINC & 2) rc_temp_pwr++; else if (rc_temp_pwr) { rc_input_pwr=rc_temp_pwr-1; rc_temp_pwr=0; } }
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Danke für deine Antwort!
Das Problem lässt sich leider nicht aus dem weg schaffen. Könntest du bitte mal den Ordner oder ein Zip File zum Download stellen wo deine ganzen Daten zum kompilieren dieses einzigen Programmes drauf sind? Das wäre echt super, weil ich wirklich keine Ahnung habe wie ich das Problem lösen soll. Alle anderen Programme zu kompilieren klappt ja aber ich vermute, dass ist wegen dieser anderen LIB.
Vilen Dank!!!!!!
Nichts existiert durch sich allein!
Bild hier
Hast du vielleicht einen Vorschlag, wie man mit der standart RP6lib ein Programm zum fernsteuern des RP6´schreiben könnte? Es soll nur 2 Kanäle auswerten können und mit jedem Kanal einen Motor ansteuern.
Braucht man dafür überhaupt eine ISR?
Nichts existiert durch sich allein!
Bild hier
Nochmals Hallo
Das geht selbstverständlich auch ohne ISR. Aber dann ist es blockierend und wirft das gesammte Tasksystem des RP6 über den Haufen.
Oben im Edit habe ich eine Variante mit orginaler RP6-Lib und Timer1-ISR zur Impulsmessung angehängt. Die gemessenen Werte werden ans Terminal gesendet und sollten ungefähr zwischen 14 und 38 liegen. Wenn das so funktioniert (ich habe die Messung mit Brücken an den Pins simuliert) hast du schon eine brauchbare Basis für eine RC-Fernsteuerung. Was noch fehlt ist die Umrechnug der gemessenen Werte in passende Motorbefehle.
Hier noch eine Variante ohne ISR, ohne RC-Empfänger kann ich aber zu den gemessenen Werten nichts sagen. Möglicherweise tritt ein Überlauf der Variable auf, dann müßte man nach dem Hochzählen noch eine kurze Verzögerung (eine for-Schleife) einfügen:
GrußCode:// Blockierende Impulsmessung an SCL (PC0) 23.3.2010 mic #include "RP6RobotBaseLib.h" uint16_t temp; int main(void) { initRobotBase(); setLEDs(1); // und los! while(1) { temp=0; while(PINC & 1); // Warten bis kein Impuls ansteht while(!(PINC & 1)); // Warten auf Start des zu messenden Impulses while(PINC & 1) temp++; // solange der Impuls ansteht Zähler hochzählen writeInteger(temp, 10); writeString_P("\n"); mSleep(300); } return 0; }
mic
[Edit]
Wertebereich der blockierenden Messung ist ca. 500 bis 3000:
Code:// RP6 misst blockierend seine eigenen Servoimpulse an SCL ;) 23.3.2010 mic #include "RP6RobotBaseLib.h" volatile uint8_t servo; // Servopositionen und Impulszähler uint16_t temp; int main(void) { initRobotBase(); servo=26; // Servomitte? TIMSK |= (1 << TOIE1); // Die Timer1 Overflow-ISR zur Servoansteuerung DDRA |= (E_INT1); // Servopins auf Ausgang setzen DDRC |= (SCL | SDA); setLEDs(1); // und los! startStopwatch1(); startStopwatch2(); while(1) { if(getStopwatch1()>300) // alle 0,3 Sekunden Impuls messen { setStopwatch1(0); temp=0; while(PINC & 1); // Warten bis kein Impuls ansteht while(!(PINC & 1)); // Warten auf Start des zu messenden Impulses while(PINC & 1) temp++; // solange der Impuls ansteht Zähler hochzählen writeInteger(temp, 10); writeString_P("\n"); } if(getStopwatch2()>1500) // alle 1,5 Sekunden eine neue Servoosition { setStopwatch2(0); switch(servo) { case 26: servo=45; break; case 45: servo=25; break; case 25: servo=10; break; case 10: servo=26; break; } } } return 0; } ISR (TIMER1_OVF_vect) { static uint16_t servocount=1; if(servocount > servo) PORTC &= ~SCL; else PORTC |= SCL; // PC0 XBUS 10 if(servocount < 400) servocount++; else servocount=1; }
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hi,
Ich habe drei Fragen:
1.
Warum schreibst du in den WriteInteger Befehl noch eine "10" nach dem Komma? (Ich beziehe mich auf folgendes Programm)
Und 2.Code:// RC-Signale an SCL und SDA messen 23.3.2010 mic // Timersetup der Lib: Mode 10, Phase Correct // Mit ICR1 als Top ergibt bei ICR1=210 ca. 8MHz/420=19047,6Hz ;) // Drehbereich meiner RS-2-Servos ist von ca. 14 bis ca. 38 // Aus: https://www.roboternetz.de/phpBB2/ze...=492812#492812 #include "RP6RobotBaseLib.h" volatile uint8_t rc_input_pwr=26, rc_input_dir=26; int main(void) { initRobotBase(); TIMSK |= (1 << TOIE1); // Die Timer1 Overflow-ISR zur Servoansteuerung setLEDs(1); // und los! writeString_P("\n\nRC-Empfänger an SCL und SDA auswerten.\n"); writeString_P("mic 23.3.2010\n\n"); while(1) { writeString_P("SCL (PC0): "); writeInteger(rc_input_dir, 10); writeString_P("\nSDA (PC1): "); writeInteger(rc_input_pwr, 10); writeString_P("\n\n"); mSleep(300); } return 0; } ISR (TIMER1_OVF_vect) // RC-Signale an SCL und SDA messen { static uint16_t rc_temp_pwr=0; static uint16_t rc_temp_dir=0; if (PINC & 1) rc_temp_dir++; else if (rc_temp_dir) { rc_input_dir=rc_temp_dir-1; rc_temp_dir=0; } if (PINC & 2) rc_temp_pwr++; else if (rc_temp_pwr) { rc_input_pwr=rc_temp_pwr-1; rc_temp_pwr=0; } }
Würde dieser Code vom Prinzip her funktionieren oder fehlt noch was, außer den Werten die ich noch nicht kenne?
und 3.Code:#include "RP6RobotBaseLib.h" volatile uint8_t rc_input_pwrr=26, rc_input_pwrl=26; int main(void) { initRobotBase(); TIMSK |= (1 << TOIE1); // Die Timer1 Overflow-ISR zur Servoansteuerung while(1) { // if (rc_input_pwrl<x && rc_input_pwrl>y) {changeDirection(BWD); moveAtSpeed(60,0)} // if (rc_input_pwrl<x && rc_input_pwrl>y) {changeDirection(FWD); moveAtSpeed(60,0)} // if (rc_input_pwrr<x && rc_input_pwrr>y) {changeDirection(BWD); moveAtSpeed(0,60)} // if (rc_input_pwrr<x && rc_input_pwrr>y) {changeDirection(FWD); moveAtSpeed(0,60)} // task_motionControl(); } return 0; } ISR (TIMER1_OVF_vect) // RC-Signale an SCL und SDA messen { static uint16_t rc_temp_pwrl=0; static uint16_t rc_temp_pwrr=0; if (PINC & 1) rc_temp_pwrl++; else if (rc_temp_pwrl) { rc_input_pwrl=rc_temp_pwrl-1; rc_temp_pwrl=0; } if (PINC & 2) rc_temp_pwrr++; else if (rc_temp_pwrr) { rc_input_pwrr=rc_temp_pwrr-1; rc_temp_pwrr=0; } }
Hat jetzt zwar nicht sehr viel mit dem Thema zu tun aber ist ja schnell beantwortet. Kann man das RP6 C-Control PRO M128
Erweiterungsmodul so wie man es bei Conrad bekommt direkt benutzen ohne diesen extra Baustein (C-CONTROL PRO UNIT MEGA 12?? Mit benutzen meine ich Programmieren und in Verbindung mit dem RP6 laufen lassen.???
)
Danke!
Nichts existiert durch sich allein!
Bild hier
Lesezeichen