Hier das Bisherige Programm:
Code:
#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;
}
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 antwortet
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 ?
Lesezeichen