Nö, der erste Punkt steht genauso da wie vorher auch!
Damit während des Lesens von t1_x keine ISR ausgeführt wird, in der t1_x geändert wird, müsste so was gemacht werden:
Code:
cli();
result = (((((float)t1_x/(float)t2_x)*1000)-481)*1000)/125;
sei();
bzw.
Code:
{
uint8_t sreg = SREG;
cli();
result = (((((float)t1_x/(float)t2_x)*1000)-481)*1000)/125;
SREG = sreg;
}
Dann wären allerdings während der kompletten float-Berechnung (also sehr lange) die IRQs deaktiviert! Also:
Code:
{
uint8_t sreg = SREG;
cli();
long t1x = t1_x;
long t2x = t2_x;
SREG = sreg;
result = (((((float)t1x/(float)t2x)*1000)-481)*1000)/125;
}
Mit der Berechnung willst du wohl nen Winkel rausbekommen bzw. den arcus-Tangens dessen. Sieht etwas spanisch aus, weil nicht mal sichergestellt ist, daß t2_x != 0 ist!
Die float- in eine fix-Rechnung zu übertragen ist ne reine Effizienzgeschichte, mehr nicht. Da kannst du immer noch ran wenn's denn läuft...
Was MCUCR angeht: Ich weiß nicht was du da machst...ich schätze mal die Flankentriggerung von INTx umstellen. Wenn du das machst kann es AFAIK sein, daß eine IRQ getriggert wird, ohne daß ein INTx-Ereignis vorliegt. Daher nach Änderung der INTx-Flanken bzw. AKtivierung von INTx erst die entsprechenden Flags resetten.
Nochwas: So wie du es jetzt hast können verschachtelte IRQs auftreten. Ich vermute mal, das ist nicht das, was du willst? Wirf das cli und sei aus des ISRs raus.
Lesezeichen