Problem - Aber wo?

Begonnen von adri, 29. Jul 2008, 22:15

« vorheriges - nächstes »
Nach unten

adri

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

Telekatz

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


adri

hey,

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

Gruß Adri

Telekatz

Hab es jetzt geschafft, den Timer1 Interrupt absturzfrei als FIQ laufen zu lassen. Dein Programm müsste jetzt also auch so funktionieren.

Gruß
Telekatz

Nach oben