Forum: Mikrocontroller und Digitale Elektronik Seltsames Verhalten des INT1 beim Atmega48


von S. W. (Gast)


Lesenswert?

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.

von Marvin (Gast)


Lesenswert?

printf ist es bei der Option %d reichlich egal, ob die Variable signed 
oder unsigned definiert wurde...

Ich würde bei diesem Problem eher einen Seiteneffekt vermuten. Der 
Zugriff auf 16-Bit ist nicht atomar, wenn also ein Zugriff des 
Hauptprogramms durch einen Interrupt unterbrochen wird, krachts.

von S. W. (Gast)


Lesenswert?

Marvin wrote:
> printf ist es bei der Option %d reichlich egal, ob die Variable signed
> oder unsigned definiert wurde...
>
> Ich würde bei diesem Problem eher einen Seiteneffekt vermuten. Der
> Zugriff auf 16-Bit ist nicht atomar, wenn also ein Zugriff des
> Hauptprogramms durch einen Interrupt unterbrochen wird, krachts.

Während der Auswertung werden weitere Interrupts verhindert. Diese 
beiden Zeilen wurden aus obiger if-Anweisung der Übersicht wegen 
entfernt. Ich werde aber mal ein Kontrollflag in die ISR setzen, um das 
mal zu kontrollieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.