So, hier mal für Marcel und wer noch so reinschauen mag.
Es ist schon einige Zeit her, dass ich da dran war. ich hoffe, es funzt noch.
Grüße
So, hier mal für Marcel und wer noch so reinschauen mag.
Es ist schon einige Zeit her, dass ich da dran war. ich hoffe, es funzt noch.
Grüße
So, hier mal das für die M32.
Ist schon ne Weile her, daher weiß ich gar nicht mehr, obs funktioniert hat und wenn ja, wie gut...
Grüße
hi Fabqu,
hier fehlten auch damals wohl schon die links zu dem codehast du den noch? Wäre schon interessant da reinzuschauen...
gruß inka
Hi!
Die habe ich irgendwann wieder gelöscht, leider hab ich nix mehr davon...
ist irgendwo im Chaos meiner Festplatte untergegangen.
In meinem Programm gibt es folgenden Code, um RC5 Daten von der Base auf der M32 zu empfangen (ist hier das Bsp 07):
Was müsste ich denn hier eingeben, damit ich hier auf verschiedene Remote-Tasten z.B. I/Os schalten kann, oder LEDs etc?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"); }
Bei meinen Versuchen tat sich nix.
Und noch etwas zu Base-Programm:
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.Code:void bumpersStateChanged(void) { interrupt_status.bumperLeft = bumper_left; if(bumper_right) interrupt_status.bumperRight = true; else interrupt_status.bumperRight = false; signalInterrupt(); }
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
hab jetzt folgendes gemacht:
Problem: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); }
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:
Aber es passiert leider nichts.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 } }
Danke schon mal,
Fabian
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!
wenn ich folgenden code in die slavedatei einfügeZitat von Dirk
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...
ich komme einfach nicht dahinter warum???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; }
gruß inka
Hallo
SL4 und SL5 sind am Port B zu finden, nicht am Port C![]()
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
Lesezeichen