Bettyhacks.com

German - BettyHacks.com => Software => Thema gestartet von: adri am 29. Jul 2008, 22:15

Titel: Problem - Aber wo?
Beitrag von: adri am 29. Jul 2008, 22:15
Hi,

ich hab mal wieder nen neues Problem:
In diesen Funktionen stürzt mein Programm leider immer nach so 1 sec ab.

int fu_light = 0;
int fu_Motor = 0;
int fu_richtung = 0;
unsigned int tcb;
void tx_timer_fu(void){
tx_fu(fu_light, fu_Motor, fu_richtung);
}
void tx_fu(int licht, int Motor, int richtung){
int mb0;
int mb1;
int mb2;
int mb3;
mb0 = Motor%2;
mb1 = (Motor>>1)%2;
mb2 = (Motor>>2)%2;
mb3 = (Motor>>3)%2;
test_cmd.data[0] = 0;  
test_cmd.data[1] = 0x12;
test_cmd.data[2] = 0x30;
test_cmd.data[3] = 0;
test_cmd.data[4] = 0;  

test_cmd.data[5] = mb3*17;
test_cmd.data[6] = mb2*17;
test_cmd.data[7] = mb1*17;
test_cmd.data[8] = mb0*17;

test_cmd.data[9] = 0;

test_cmd.data[10] = 0;
test_cmd.data[11] = 0;
test_cmd.data[12] = 0;

test_cmd.data[13] = 0;
test_cmd.data[14] = 0;
test_cmd.data[15] = 0;
test_cmd.data[16] = 0;

test_cmd.data[17] = licht * 17;
test_cmd.data[18] = 0;
test_cmd.data[19] = licht * 17;

test_cmd.data[20] = 0;
test_cmd.data[21] = 0;

test_cmd.hi_border = 1;
test_cmd.lo_border = 4;
test_cmd.tval = 94;
test_cmd.len = 22;
test_cmd.pulselen[0] = 25;
test_cmd.pulselen[1] = 50;
test_cmd.pulselen[2] = 118;
test_cmd.pulselen[3] = 77;
test_cmd.pulselen[4] = 4045;
RAW_Send(0);
RAW_Stop();
}
void fu_strg(void){

setSpeed(SPEED_60);
fu_Motor = 0;
fu_light = 0;
tcb = addTimerCB(tx_timer_fu, 500);
startCB(tcb);



while (!KEY_Exit){
if (KEY_Up){
if (fu_Motor < 15)
fu_Motor++;
}
if (KEY_Down){
if (fu_Motor > 0)
fu_Motor--;
}
if (KEY_A){
fu_light = 1 - fu_light;
}
waitKeyUp();
}
removeTimerCB(tcb);
setSpeed(SPEED_30);
}

Das Ganze steuert dann einen kleinen IR-Hubschrauber  ;D
Woran könnte das liegen?

Gruß adri
Titel: Re: Problem - Aber wo?
Beitrag von: Telekatz am 30. Jul 2008, 12:42
Hallo adri,

dein Programm bleibt im Timer0 Interrupt hängen.

Die Funktions-Callbacks werden im Timer0 Interrupt eingehängt und die IR Übertragung läuft im Timer1 Interrupt ab. Beide Interrupts sind gleich priorisiert und können sich nicht gegeneinander unterbrechen.

Wenn also in der Funktion tx_fu() (die im Timer0 Interrupt abläuft) die RAW Übertragung gestartet wird bleibt der Ablauf in der Funktion RAW_Stop() hängen, die darauf wartet, dass die IR Übertragung abgeschlossen wird. Da der Timer1 Interrupt dadurch nicht ausgeführt wird die IR Übertragung nie abgeschlossen.

Es würde funktionieren, wenn der Timer1 Interrupt als FIQ ausgeführt wird. Allerdings stürzt dann Boop nach einiger Zeit auch ab. Und da ich kein JTAG Interface zum Debuggen habe, hab ich diese Änderung mal auf unbestimmte Zeit verschoben (würde nämlich auch ein Problem mit dem xbox FB code lösen).

Gruß
Telekatz

Titel: Re: Problem - Aber wo?
Beitrag von: adri am 10. Aug 2008, 17:46
hey,

Danke...dann muss ich mir da was anderes einfallen lassen :-D

Gruß Adri
Titel: Re: Problem - Aber wo?
Beitrag von: Telekatz am 11. Aug 2008, 23:26
Hab es jetzt geschafft, den Timer1 Interrupt absturzfrei als FIQ laufen zu lassen. Dein Programm müsste jetzt also auch so funktionieren.

Gruß
Telekatz