Hallo,
ich versuche einen 2-Axen Beschleunigungssensor mit dem AT48 auszulesen.
Der Sensor gibt den Wert als PWM aus. X-Achse ist am INT0, y-Achse am
INT1. INT0 funktioniert super, INT1 macht dagegen Probleme:
Gekürzte Version:
1 | if (PW_Y_SUM_CNT >= 4)
|
2 | {
|
3 | PWM_Y_SENSOR = PWM_Y_SUM/4;
|
4 | PW_Y_SUM_CNT = 0;
|
5 | PWM_Y_SUM = 0;
|
6 | OLD_TIMER_VALUE = 0;
|
7 | ACT_TIMER_VALUE = 0;
|
8 | printf("|PWM_Y_SENSOR:%d|PWM_Y_SUM:%d\n\r",PWM_Y_SENSOR,PWM_Y_SUM);
|
9 | }
|
printf dient der Debugausgabbe.
Obwohl in der Anweisung PWM_Y_SUM = 0; steht, werden seltsame Werte
ausgegeben. Alle variablen sind als unsigned int bzw. long deklariert:
1 | PWM_Y_SENSOR:15404 PWM_Y_SUM:0
|
2 | PWM_Y_SENSOR:199 PWM_Y_SUM:0
|
3 | PWM_Y_SENSOR:970 PWM_Y_SUM:0
|
4 | PWM_Y_SENSOR:200 PWM_Y_SUM:0
|
5 | PWM_Y_SENSOR:2821 PWM_Y_SUM:0
|
6 | PWM_Y_SENSOR:199 PWM_Y_SUM:18100
|
7 | PWM_Y_SENSOR:4674 PWM_Y_SUM:0
|
8 | PWM_Y_SENSOR:5745 PWM_Y_SUM:0
|
9 | PWM_Y_SENSOR:6720 PWM_Y_SUM:0
|
10 | PWM_Y_SENSOR:198 PWM_Y_SUM:0
|
und
1 | PWM_Y_SENSOR:199 PWM_Y_SUM:0
|
2 | PWM_Y_SENSOR:4538 PWM_Y_SUM:0
|
3 | PWM_Y_SENSOR:199 PWM_Y_SUM:0
|
4 | PWM_Y_SENSOR:200 PWM_Y_SUM:0
|
5 | PWM_Y_SENSOR:7364 PWM_Y_SUM:0
|
6 | PWM_Y_SENSOR:200 PWM_Y_SUM:-29260
|
7 | PWM_Y_SENSOR:9218 PWM_Y_SUM:0
|
8 | PWM_Y_SENSOR:200 PWM_Y_SUM:0
|
9 | PWM_Y_SENSOR:11263 PWM_Y_SUM:0
|
10 | PWM_Y_SENSOR:199 PWM_Y_SUM:0
|
11 | PWM_Y_SENSOR:13212 PWM_Y_SUM:0
|
Der korrekte ausgelesene Wert sollte um die 200 sein. Die
Interruptroutinen sind für beide exakt gleich. Ich vermute, dass es eine
Eigenart des INT1 gibt. Seltsam ist vor allem, dass obwohl PWM_Y_SUM als
unsigned deklariert wurde, ein negativer Wert erzeugt wird.
Es ist immer nur ein Interrupt freigeschalten, also alternierend INT0
und INT1. Es kommt also nicht vor, dass innerhalb eines Interrupts ein
zweiter aufgerufen wird. Ich habe auch INT1 alleine laufen lassen, bekam
jedoch das gleiche Ergebnis.