Guten Morgen zusammen.
Ich hab ein Problem mit einer Periodenauswertung über einen TimerA
Hier mal der Code:
1 | #include <msp430G2153.h>
|
2 |
|
3 | #define Sleep 15000
|
4 |
|
5 | volatile unsigned int stop, start;
|
6 | volatile unsigned int Periode;
|
7 | volatile unsigned int SignalChange=0;
|
8 | volatile int bla=0;
|
9 |
|
10 |
|
11 | //----ISR for Signalchange----
|
12 | #pragma vector=PORT1_VECTOR
|
13 | __interrupt void Port_1(void)
|
14 | {
|
15 | stop=TAR; //Aktuellen Timerwert in stop schreiben
|
16 | SignalChange++; //Flankenwechsel
|
17 |
|
18 | if(TACTL & TAIFG)
|
19 | bla=1;
|
20 | else
|
21 | bla=0;
|
22 |
|
23 | //Periode Calculation
|
24 | if(!(TACTL & TAIFG)){
|
25 | Periode=stop-start; //Periode ausrechnen
|
26 | }
|
27 | else{
|
28 | if(TACTL & TAIFG){
|
29 | if(stop<start)
|
30 | Periode=(65535-(start-stop));
|
31 | if(stop>start)
|
32 | Periode=15001;
|
33 | }
|
34 | } //naechste Messung vorbereiten
|
35 | if(SignalChange<15 && Periode>=Sleep)
|
36 | _NOP();
|
37 | start=stop;
|
38 | }
|
Also:
Er soll sich in "stop" den Wert aus TAR laden.
bla ist nur eine Hilfsvariable.
Wenn kein Überlauf stattgefunden hat, soll er ganz normal ausrechnen,
ansonsten die anderen beiden Berechnungen durchführen.
der nächste Schritt war nur zur Überprüfung eines Fehlers.
Es können ja 3 Zustände bei der Berechnung auftreten:
1. Der Timer läuft ganz normal hoch und währenddessen soll die Zeit
gemessen werden: zB stop=60000 und start war 10000 Differenz: 50000
2. Der Timer hatte einen Überlauf und stop ist größer als start, also:
stop=60000 und start war 10000, Differenz: 115535
3. Der Timer hatte einen Überlauf und stop ist kleiner als start, also:
stop=10000 und start war 60000, Differenz: 15535
Normalerweise kann während der 15 Signalwechsel die Zeit nie größer sein
als ca. 10000. Trotzdem springt er manchmal in die Berechnung rein, wo
stop>start ist UND ein Überlauf stattgefunden haben soll.
1 | if(stop>start)
|
2 | Periode=15001;
|
Wenn ich aber die Hilfsvariable "bla" angucke, steht dort eine 0, welche
ja normalerweise auf 1 sein müsste.
Also es wird quasi eine große Periodendauer gemessen, die eigentlich
nicht sein darf.
Da der MSP430G2153 nur 16Bit hat, habe ich für Fall 2 einfach einen
festen Wert genommen.