Das Programm ist eigentlich das I2CSlave Programm für die Basis nur das ich im Hauptteil ein paar Sachen zusätzlich eingebaut hab.
Deshalb poste ich mal nur diesen Hauptteil, da der rest unverändert ist.
im TaskCommander hab ich noch einen neuen case eingebaut, der die variable remote_control setztCode:int16_t main(void) { initRobotBase(); setLEDs(0b111111); mSleep(500); setLEDs(0b000000); I2CTWI_initSlave(RP6BASE_I2C_SLAVE_ADR); ACS_setStateChangedHandler(acsStateChanged); BUMPERS_setStateChangedHandler(bumpersStateChanged); IRCOMM_setRC5DataReadyHandler(receiveRC5Data); MOTIONCONTROL_setStateChangedHandler(motionControlStateChanged); powerON(); startStopwatch1(); disableACS(); setACSPwrOff(); status.byte = 0; interrupt_status.byte = 0; drive_status.byte = 0; status.watchDogTimer = false; status.wdtRequestEnable = false; startStopwatch3(); startStopwatch4(); uint8_t led_change=0; PORTA &= ~ADC0; while(true) { task_commandProcessor(); task_update(); task_updateRegisters(); task_RP6System(); task_MasterTimeout(); if ( (remote_control == false) ) { /* writeString_P("Links: "); writeInteger(readADC(ADC_LS_L)-5, 10); writeString_P(" - "); writeString_P("Rechts: "); writeInteger(readADC(ADC_LS_R), 10); writeString_P("\n\r"); */ PORTA |= ADC0; changeDirection(FWD); if (readADC(ADC_LS_L)-5 > readADC(ADC_LS_R)) /* Abfrage der Widerstandswerte der LDR groesserer Widerstand auf einer Seite bedeutet auf dieser Seite ist der dunkle Strich Ist der Widerstand links groesser als rechts dann setze LED-register auf 4 (00000100) und steuere Motoren rechts schneller als links */ { setLEDs(0b000100); //moveAtSpeed(90,30); } /* Ist der Widerstand rechts groesser als links dann setze LED-register auf 32 (00100000) und steuere Motoren links schneller als rechts */ else { setLEDs(0b100000); //moveAtSpeed(30,90); } //warte 200 ms bis zum nächsten Durchlauf mSleep(200); } else { PORTA &= ~ADC0; switch (led_change) { case 0: setLEDs(0b000000); break; case 2000: setLEDs(0b001001); break; case 400: setLEDs(0b010010); break; case 600: setLEDs(0b100100); break; case 799: led_change=0; break; } led_change++; } } return 0; }
An der Base selber habe ich ein paar Änderungen vorgenommen, ADC0 ist nun als Ausgang geschaltet und steuert ein FET an. Über das FET schalte ich eine LED Beleuchtung die etwa 170 mA Strom zieht. Und die zwei Photozellen hab ich aus der Platine ausgelötet und über jeweils 2 Kabel wo anders befestigt.Code:case CMD_REMOTE: remote_control_temp=param1; if ( (remote_control_temp == remote_control) ) { } else { remote_control=remote_control_temp; writeString_P("remote geaendert (BASE) \n\r"); } break;
Was ich grad festgestellt habe, sobald die Beleuchtung an ist spielen die 2 Photozellen verrückt. Egal wie ich die dann beleuchte. Hängen ADC0 und die eventuell irgendwie zusammen?
In der definition von PORTA hab ich lediglich ADC0 auf Ausgang gestellt.
EDIT: Hab mal weiter rumprobiert. Mir scheint das es da irgendein Problem mit der rechten Seite gibt. Sobald ich irgendeine der Photozellen dort anschließe geht der RP6 in diese Störung.Code:// PORTA #define UBAT (1 << PINA7) // ADC7 (Input) #define MCURRENT_L (1 << PINA6) // ADC6 (Input) #define MCURRENT_R (1 << PINA5) // ADC5 (Input) #define E_INT1 (1 << PINA4) // INT1 (input per default... can be output) #define LS_L (1 << PINA3) // ADC3 (Input) #define LS_R (1 << PINA2) // ADC2 (Input) #define ADC1 (1 << PINA1) // ADC1 (Input) #define ADC0 (1 << PINA0) // ADC0 (Input) // Initial value of port and direction registers. #define INIT_DDRA 0b00000001 #define INIT_PRTA 0b00000000
Mal weiterschaun was das sein könnte.







Zitieren

Lesezeichen