Hier das Bisherige Programm:
allerdings haut das mit dem fahren noch nicht richtig hin... wenn die fernbedienung ein ist bekomm ich unendlich errors ausgegeben (0x20) was ja soviel ich weiß heist das die Base nicht antwortetCode:#include "RP6ControlLib.h" #include "RP6I2CmasterTWI.h" #include "RP6Control_I2CMasterLib.h" void I2C_requestedDataReady(uint8_t dataRequestID) { checkRP6Status(dataRequestID); } void I2C_transmissionError(uint8_t errorState) { writeString_P("\nI2C ERROR - TWI STATE: 0x"); writeInteger(errorState, HEX); writeChar('\n'); } volatile uint16_t speed=0; volatile uint16_t dir=0; volatile uint16_t speedcount=0; volatile uint16_t dircount=0; ISR(TIMER1_COMPA_vect) { if (PINA & ADC5) { speedcount++; } else { if (speedcount > 0) { speed=speedcount; } speedcount=0; } if (PINA & ADC3) { dircount++; } else { if (dircount > 0) { dir=dircount; } dircount=0; } } void initRC(void) { TCCR1A = (0 << WGM11) | (0 << WGM10) | (0 << COM1A0) | (0 << COM1A1); // CTC-Mode4, ohne OCR-Pin TCCR1B = (0 << WGM13) | (1 << WGM12) | (0 << CS12) | (1 << CS11) | (0 << CS10); // CTC und prescaler /8 TIMSK |= (1 << OCIE1A); // Interrupt ein OCR1A = 20; // 100kHz? DDRA &= ~ADC5; PORTA &= ~ADC5; DDRA &= ~ADC3; PORTA &= ~ADC3; } int main(void) { initRP6Control(); initLCD(); initRC(); mSleep(500); I2CTWI_initMaster(100); I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady); I2CTWI_setTransmissionErrorHandler(I2C_transmissionError); uint16_t speed1, dir1; while(1) { cli(); // Interrupts verbieten speed1=speed; dir1=dir; sei(); // Interrupts wieder zulassen rc_pwr=0; rc_dir=0; if (dir1<130) { rc_dir=150-dir1; changeDirection(LEFT); writeInteger(dir1, DEC); writeString("\t\t");} if (dir1>180) { rc_dir=dir1-110; changeDirection(RIGHT); writeInteger(dir1, DEC); writeString("\t\t");} if (speed1<150) { rc_pwr=150-speed1; changeDirection(FWD); writeInteger(speed1, DEC); writeString("\n");} if (speed1>160) { rc_pwr=speed1-110; changeDirection(BWD); writeInteger(speed1, DEC); writeString("\n");} rc_pwr*=3; if (rc_pwr) { if (dir1<150) moveAtSpeed(rc_pwr-rc_dir,rc_pwr+rc_dir); else if (dir1>160) moveAtSpeed(rc_pwr+rc_dir,rc_pwr-rc_dir); else moveAtSpeed(rc_pwr,rc_pwr); } else { moveAtSpeed(rc_dir*3, rc_dir*3); } task_checkINT0(); task_I2CTWI(); } return 0; }
wenn die fernbedienung aus ist bekomm ich Nullen (logisch, da der empfänger keinen impuls sendet) und nach einer zeit reseted die M32, und der RP6 fängt an zu fahren....
oder der ganze rp6 hängt sich auf, so dass ich nicht mal mehr das programm beenden kann
hab ich einen fehler im prog oda so ?? ich kann mir das nämlich nicht erklären
[EDIT] GROSSES PROBLEM !!!!
irgendwas stimmt mit meinem RP6 nicht, der rp6 loader kann nicht verbinden (ziel reagiert nicht) und danach wird auf dem lcd nur noch die 1 zeile angezeigt, und nach 2 oder 3 maligem ein und ausschalten zeigt es garnichts mehr an (leuchtet nur noch blau) und die roten status leds der base blinken, und das verheist soviel ich weis nichts gutes
ich lade mal die akkus auf (vll liegt es an denen, denn das lcd ist, sofern es etwas anzeigt, sehr schwach) danach sehen wir mal weiter
[EDIT2]
aus welchem grund auch immer geht mein rp6 auch wieder aber ich bekomm unendlich errors raus (zwischendrin auch eine weile lang servowerte) aber nach ein paar sek kommen nur noch errors und dann hängt sich der rp6 auf ... wisst ihr wo der hacken steckt ?
Geändert von I&#9829;ROBOTIC (13.04.2011 um 13:03 Uhr)
> und die roten status leds der base blinken
Alle?
Dann sind wahrscheinlich die Akkus zu schwach / leer.
ja blinken alle, hab ich mir schon gedacht werd sie über nacht mal aufladen
also, nachdem ich die Batterien aufgeladen hab, hab ich das Programm nochmal getestet, und es lief (bis auf das Problem, dass ich die Encoder wieder mal einstellen muss) einwandfrei ! (sofern man das bei dermasen verstellten encodern sagen konnte) da ich zu faul war, den ganzen RP6 zu zerlegen, nur um die dinger einzustellen, hab ich mir gedacht, füge ich der RP6Control_I2CMasterLib.c die funktion setMotorPower hinzu. (die ist ja auf der base im slaveprogramm verfügbar, man kann sie nur nicht durch das M32 aufrufen. ich hab also in der der RP6Control_I2CMasterLib.c das hier hinzugefügt:
In der RP6Control_I2CMasterLib.h das hier:Code:void setMotorPower(uint8_t PWR_left, uint8_t PWR_right) { I2CTWI_transmit4Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_MOTOR_PWR, PWR_left, PWR_right ); while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI(); }
und im slaveprog für die base hab ich natürlich in die task_commandProcessor() das hinzugefügt:Code:#define CMD_SET_MOTOR_PWR 13
und natürlich auch die definition von CMD_SET_MOTOR_PWRCode:case CMD_SET_MOTOR_PWR: setMotorPower(param1,param2); break;
aber wenn ich mein Programm nun starte, bekomme ich nur Errors raus
hat jemand ne idee was ich falsch gemacht, bzw. vergessen haben könnte ??
@I&.......,
beim Original Slave-Programm für die Base (RP6Base_I2CSlave.c) ist bei mir keine Funktion "setMotorPower" enthalten.
Wie sieht die bei dir denn aus?
Gruß
Dirk
bei mir war sie auch nicht enthalten aber in dern RP6BaseLib gibt es sie und die wird ja im base slave prog verwendet.. naja mir ist jetzt aufgefallen dass ich das slave prog zwar geändert aber nicht neu compiliert hab !!(ich vergess oft die hälfte) das wollte ich jetzt machen, bekomme allerdings den fehler, dass IRCOMM nicht definiert wurde... was eig iwie nicht sein kann denn das habe ich nicht nachgetragen, das stand schon so drinnen....
ach ja IRCOMM wird hier verwendet:
weiß jemand wie man dieses problem lösen kann ?? denn dan glaube und hoffe ich, dürfte das programm laufenCode:void task_MasterTimeout(void) { if(status.watchDogTimer) { if( getStopwatch2() > 3000) // 3 seconds timeout for the master to react on { // our interrupt events - if he does not react, we // stop all operations! cli(); // clear global interrupt bit! PORTD &= ~IRCOMM; setACSPwrOff(); OCR1AL = 0; OCR1BL = 0; TCCR1A = 0; powerOFF(); writeString_P("\n\n##### EMERGENCY SHUTDOWN #####\n"); writeString_P("##### ALL OPERATIONS STOPPED TO PREVENT ANY DAMAGE! #####\n\n"); writeString_P("The Master Controller did not respond to the interrupt requests\n"); writeString_P("within the defined timeout! Maybe he's locked up!\n"); writeString_P("\nThe Robot needs to be resetted now.\n\n"); while(true) // Rest In Peace { setLEDs(0b100010); uint8_t dly; for(dly = 10; dly; dly--) delayCycles(32768); setLEDs(0b010100); for(dly = 10; dly; dly--) delayCycles(32768); } } else if(getStopwatch3() > 250) { status.wdtRequest = true; signalInterrupt(); setStopwatch3(0); } } }
EDIT:
könnte man die rot markierte zeile vll durch dies hier ersetzen:
PORTD &= ~(1<<PIND7)
so wirdn nämlich in der BaseLib der IRCOMM port abgeschaltet
Geändert von I&#9829;ROBOTIC (16.04.2011 um 19:10 Uhr)
Lesezeichen