Hi,
das sprudelt mal wieder vor informationen...
also, welchen übersetzungsfehler zeigt er an, und dann muss man überlegen, was der heisst, dann kann man oft sogar als programmieranfänger erkennen, was man falsch gemacht hat...
MfG Pr0gm4n
dein vorschlag is ja nicht schlecht.... nur kommt halt in übersetzungsfehler wenn ich des auf die art
if(rc5data.key_code == RC5_KEY_SERVO_LEFT)
{
...
}
mache. hast vielleicht noch ne andere idee wie man des machen könnte?
Hi,
das sprudelt mal wieder vor informationen...
also, welchen übersetzungsfehler zeigt er an, und dann muss man überlegen, was der heisst, dann kann man oft sogar als programmieranfänger erkennen, was man falsch gemacht hat...
MfG Pr0gm4n
Hi,
das sprudelt mal wieder vor informationen...
also, welchen übersetzungsfehler zeigt er an, und dann muss man überlegen, was der heisst, dann kann man oft sogar als programmieranfänger erkennen, was man falsch gemacht hat...
MfG Pr0gm4n
ne, das hab ich jetzt nicht gewusst^^ wie wärs wenn du anstatt deinen achso tollen kommentaren mal was zum thema schreibst? für des is der thread ja da....
dass der übersetzungsfehler an der zeile
if(rc5data.key_code == RC5_KEY_SERVO_LEFT)
liegt weiß ich ja, vor ich diese zeile geändert hab war er ja noch nicht da......
p.s. denk mal drüber nach
Also erstmal an dich proevofreak:
-verwende bitte die Zitat-tags oder halt auf auswahl quoten, das iss so unübersichtlich
-dann an dein PS: ich muss da nix nachdenken, das war schon fürs thema
-du hast den Fehler noch immer nicht gepostet und wie ich
also, welchen übersetzungsfehler zeigt er an, und dann muss man überlegen, was der heisst
da geschrieben habe könnte da auch drin stehen, was an der zeile falsch ist...
bevor du also weiter meckerst lies bitte nächstes mal erstmal alles in ruhe zweimal durch und beleidige mich nicht als schon fast nen Troll
was ich dir vorher geschrieben habe
kannst du bitte wenigstens alles lesen?
Zitat:
int key=getRC5Data(); //oder wie das auch immer heisst
das heißt, dass ich nicht weis, wie die Funktion heißt...
und nachgucken kannst du im Selftest-Programm und in der Anleitung, hab ich
Zitat:
von einer Funktion, die die RC5-Daten ausliest, guck doch mal anleitung
da geschrieben, also lasse bitte solche unsinnigen posts...
hast du wohl immernoch nicht gemacht, du fragst die ganze zeit nach problemen, die eh in der anleitung stehen
da du selbst noch nicht geschaut hast mache ich es dir sogar noch einfacher:
du gehst in der RP6-Anleitung auf ende S.95 bzw. anfang S.96, das liest du dir durch und guckst dir dazu noch das Beispiel 8 TV Remote an und dann kannst du dein Programm abändern...
du weist dann auch, warum da ein Compilerfehler war...
ach ja, nur zu deiner Info, hättest du einfach gleich den Compilerfehler gepostet hätten wir dir das gleich sagen können also nur um dir deutlich zu machen, dass deine Aussage
wie wärs wenn du anstatt deinen achso tollen kommentaren mal was zum thema schreibst?
nicht für mich, sondern sogar eher für dich gilt...
Sei lieber nicht so unfreundlich zu Leuten, die so nett sind und dir bei deinen Problemen helfen wollen
MfG Pr0gm4n
ich hab jetzt mittlerweile alle rc5 adressbits anstatt dem rc5data.key_code durchprobiert. aber die fehlermeldung kommt nach wie vor....Code:// RP6 steuert ein Servo an der SL1-LED mit Sleep() #include "RP6RobotBaseLib.h" // Denn vollen Funktionsumfang der Lib bezahlen #define RC_PROMO8 #ifdef RC_PROMO8 #define RC5_KEY_SERVO_RIGHT 46 #define RC5_KEY_SERVO_LEFT 60 #endif void receiveRC5Data(RC5data_t rc5data) { writeString_P("Toggle Bit:"); writeChar(rc5data.toggle_bit + '0'); writeString_P(" | Device Address:"); writeInteger(rc5data.device, DEC); writeString_P(" | Key Code:"); writeInteger(rc5data.key_code, DEC); writeChar('\n');} void servoTaskRight() { if (rc5data.key_code == RC5_KEY_SERVO_RIGHT) {setLEDs(1); sleep(10); setLEDs(0); sleep(200-10);} } void servoTaskLeft() { if (rc5data.key_code == RC5_KEY_SERVO_LEFT) {setLEDs(1); sleep(20); setLEDs(0); sleep(200-20);} } int main(void) { initRobotBase(); IRCOMM_setRC5DataReadyHandler(receiveRC5Data); powerON(); setLEDs(0); while(true) { task_RP6System(); servoTaskRight(); servoTaskLeft(); } return 0; } fehlermeldung: Compiling: Servoansteuerung.c avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=Servoansteuerung.lst -I../../RP6Lib -I../../RP6Lib/RP6base -I../../RP6Lib/RP6common -std=gnu99 -MD -MP -MF .dep/Servoansteuerung.o.d Servoansteuerung.c -o Servoansteuerung.o Servoansteuerung.c:27: warning: function declaration isn't a prototype Servoansteuerung.c: In function 'servoTaskRight': Servoansteuerung.c:27: error: 'rc5data' undeclared (first use in this function) Servoansteuerung.c:27: error: (Each undeclared identifier is reported only once Servoansteuerung.c:27: error: for each function it appears in.) Servoansteuerung.c: At top level: Servoansteuerung.c:35: warning: function declaration isn't a prototype Servoansteuerung.c: In function 'servoTaskLeft': Servoansteuerung.c:35: error: 'rc5data' undeclared (first use in this function) Servoansteuerung.c:58:2: warning: no newline at end of file make: *** [Servoansteuerung.o] Error 1 > Process Exit Code: 2 > Time Taken: 00:00
gruß
Hallo proevofreak,
ich habe 'mal ein bißchen umgeschrieben, damit das Programm kompiliert werden kann. Die Funktion des Programms selbst habe ich aber NICHT getestet:
Vielleicht kannst du ja damit weiter machen ...Code:// RP6 steuert ein Servo an der SL1-LED mit Sleep() #include "RP6RobotBaseLib.h" // Denn vollen Funktionsumfang der Lib bezahlen #define RC_PROMO8 #ifdef RC_PROMO8 #define RC5_KEY_SERVO_RIGHT 46 #define RC5_KEY_SERVO_LEFT 60 #endif void receiveRC5Data(RC5data_t rc5data) { writeString_P("Toggle Bit:"); writeChar(rc5data.toggle_bit + '0'); writeString_P(" | Device Address:"); writeInteger(rc5data.device, DEC); writeString_P(" | Key Code:"); writeInteger(rc5data.key_code, DEC); writeChar('\n'); if (rc5data.key_code == RC5_KEY_SERVO_RIGHT) {setLEDs(1); sleep(10); setLEDs(0); sleep(200-10);} if (rc5data.key_code == RC5_KEY_SERVO_LEFT) {setLEDs(1); sleep(20); setLEDs(0); sleep(200-20);} } int main(void) { initRobotBase(); IRCOMM_setRC5DataReadyHandler(receiveRC5Data); powerON(); setLEDs(0); while(true) { task_RP6System(); } return 0; }
Gruß Dirk
Hi,
also so lobe ich es mir schon mehr...
der compiler sagt, dass die variable rc5data nicht deklariert ist und das stimmt, ist aber auch anders zu verstehen...
versuche doch mal den code so zu kompilieren:
denn wenn du dir das nochmal genau überlegst:Code:// RP6 steuert ein Servo an der SL1-LED mit Sleep() #include "RP6RobotBaseLib.h" // Denn vollen Funktionsumfang der Lib bezahlen #define RC_PROMO8 #ifdef RC_PROMO8 #define RC5_KEY_SERVO_RIGHT 46 #define RC5_KEY_SERVO_LEFT 60 #endif void receiveRC5Data(RC5data_t rc5data) { writeString_P("Toggle Bit:"); writeChar(rc5data.toggle_bit + '0'); writeString_P(" | Device Address:"); writeInteger(rc5data.device, DEC); writeString_P(" | Key Code:"); writeInteger(rc5data.key_code, DEC); writeChar('\n'); servoTaskRight(); servoTaskLeft();} void servoTaskRight(RC5data_t rc5data) { if (rc5data.key_code == RC5_KEY_SERVO_RIGHT) {setLEDs(1); sleep(10); setLEDs(0); sleep(200-10);} } void servoTaskLeft(RC5data_t rc5data) { if (rc5data.key_code == RC5_KEY_SERVO_LEFT) {setLEDs(1); sleep(20); setLEDs(0); sleep(200-20);} } int main(void) { initRobotBase(); IRCOMM_setRC5DataReadyHandler(receiveRC5Data); powerON(); setLEDs(0); while(true) { task_RP6System(); } return 0; }
der Eventhandler ruft die Funktion receiveRC5Data auf, dann gibt das Programm zwar im Terminal alles zum RC5-Code aus, der empfangen wurde, aber die Servos werden ja nicht gestellt. wenn du jetzt aber deine Funktionen in der Hauptschleife aufrufst stehen die Variablen, die du auslesen willst nichtmehr zur Verfügung, da es lokale Variablen sind.
du musst also aus der Funktion raus deine Servos bewegen bzw. so wie ich oben dann über Parameter die Variablen in die Servofunktionen bringen
dein Compiler gibt dir doch
für jede Servofunktion aus, das heisst, er weiss nicht, wo er das rc5data bitte hernehmen soll, also geben wir es ihm einfach über Parameter, soweit verstanden?'rc5data' undeclared (first use in this function)
Wenn dich die Ausgaben im Terminal stören kannst du die Funktion receiveRC5Data auch bis auf die Aufrufe der Servofunktionen mit Parametern leeren, bzw. einfach die Inhalte der beiden Servofunktionen in die receiveRC5Data kopieren, z.B. so:
verstanden?Code:void receiveRC5Data(RC5data_t rc5data) { if (rc5data.key_code == RC5_KEY_SERVO_RIGHT) {setLEDs(1); sleep(10); setLEDs(0); sleep(200-10);} if (rc5data.key_code == RC5_KEY_SERVO_LEFT) {setLEDs(1); sleep(20); setLEDs(0); sleep(200-20);} }
so kannst du die 3 Funktionen in eine zusammenfassen, und natürlich auch in der gleichen Funktion noch Ausgaben im Terminal machen, wie das mit Device Adresse oder Togglebit etc...
MfG Pr0gm4n
EDIT: Ich war wohl zu lange am schreiben, um es ja richtig gut zu erklären, da war DIRK mit der gleichen Lösung wohl schneller
kann mir vielleicht noch jemand sagen warum der servo im folgenden programm flüssiger dreht, als in dem von dirk? liegt das an der ansteuerung mit der fernbedienung?
grußCode:// RP6 steuert ein Servo an der SL1-LED mit Sleep() #include "RP6RobotBaseLib.h" // Denn vollen Funktionsumfang der Lib bezahlen // wir mit den störenden Interrupts uint8_t stellzeit, servopos=10; int main(void) { initRobotBase(); setLEDs(0); startStopwatch1(); while(true) { while(getStopwatch1()<2000) { setLEDs(1); sleep(10); setLEDs(0); sleep(200-10);} while(getStopwatch1()>2000) {setLEDs(1); sleep(20); setLEDs(0); sleep(200-20); } } return(0); }
so, jetzt hab ich das programm von dirk oben mal versucht so umzuprogrammieren, dass ich den servo auf der experimentierplatine am xbus an der sda leitung anschließen kann. leider reagiert der servo jetzt nicht mehr auf die signale meiner fernbedienung.
hier mein abgeändertes programm:
Code:// RP6 steuert ein Servo an der SL1-LED mit Sleep() #include "RP6RobotBaseLib.h" // Denn vollen Funktionsumfang der Lib bezahlen #define SERVO_OUT SDA #define RC_PROMO8 #ifdef RC_PROMO8 #define RC5_KEY_SERVO_RIGHT 46 #define RC5_KEY_SERVO_LEFT 60 #endif void receiveRC5Data(RC5data_t rc5data) { writeString_P("Toggle Bit:"); writeChar(rc5data.toggle_bit + '0'); writeString_P(" | Device Address:"); writeInteger(rc5data.device, DEC); writeString_P(" | Key Code:"); writeInteger(rc5data.key_code, DEC); writeChar('\n'); if (rc5data.key_code == RC5_KEY_SERVO_RIGHT) {cli(); PORTC |= SERVO_OUT; //SDA high sleep(10); PORTC &= ~SERVO_OUT; sleep(200-10); sei();} if (rc5data.key_code == RC5_KEY_SERVO_LEFT) {cli(); PORTC |= SERVO_OUT; sleep(20); PORTC &= ~SERVO_OUT; sleep(200-20); sei();} } void initSERVO(void) { DDRC |= SERVO_OUT; PORTC &= ~SERVO_OUT; } int main(void) { initRobotBase(); IRCOMM_setRC5DataReadyHandler(receiveRC5Data); powerON(); initSERVO(); while(true) { task_RP6System(); } return 0; }
Lesezeichen