Forum: Mikrocontroller und Digitale Elektronik PIC/MPLAB Watch-Werte stimmen nicht


von Pascal L. (pascal_l)


Lesenswert?

Hallo zusammen.
Ich habe das Problem, dass bei mir im Watch-Window werte von Variablen > 
8bit oft nicht stimmen.
Beispiel:
1
calcDiff(0,0);
2
3
s16 calcDiff(s16 sPos, s16 sNeg)
4
{
5
    // Local helpers
6
    s16 sSDiff = 0;
7
    
8
    // Calculate differece
9
    sDiff = sNeg - sPos;
10
    
11
    // ...
12
    
13
    // Return
14
    return sDiff;
15
}

Hier werden die variablen  wie folgt im Watch angezeigt
sDiff 0xA700
sNeg  0x0000
sPos  0x0000

Es scheint, als würde der Bereich auf den die Watchvariable zeigt nicht 
stimmen... sobald ich eine dummy variable vorher einfüge stimmt die 
Watch anzeige...
1
s16 calcDiff(s16 sPos, s16 sNeg)
2
{
3
    // Local helpers
4
    s8  byDummy = 0;
5
    s16 sSDiff = 0;
6
    
7
    // Calculate differece
8
    sDiff = sNeg - sPos;
9
    
10
    // ...
11
    
12
    // Return
13
    return sDiff;
14
}

Hat jemand eine Idee, was genau das Problem ist und wie dieses 
nachhaltig und sauber gelöst werden kann?
Vielen Dank

von Fasti (Gast)


Lesenswert?

Hallo,

Hast du Compileroptimierungen aktiviert? Wenn ja kannst du die Angaben 
im Watch Window in den meisten Fällen vergessen.

Grüße

Fasti

von Pascal L. (pascal_l)


Lesenswert?

Hallo Fasti
Die Optimierungen hatte ich schon auf "Disable".
Bei einigen Versuchen mit den Optimierungen und der erwähnten 
Dummy-Variable habe ich aber festgestellt, dass das Problem bei der 
MPLAB IDE liegt. Diese schafft es nicht, die Adressen der Variablen für 
das Watch-Window zu berechnen...
Das Watch-Window hatte folgenden Wert:

Adress    Symbol    Dec
306       sDiff     14592
301       sSeg      11802
303       sPos      26

(Der Aufruf der Funktion erfolgte mit entsprechenden Werten aud dem 
Programm-Ablauf und nicht wie im Beispiel mit (0,0))
Da ich vermutete , dass die Adressen nicht stimmen, habe ich diese 
manuell gesetzt:

Adress    Symbol    Dec
306       sDiff     14592
301       sSeg      11802
303       sPos      26
305       305       123
300       300       6825
302       302       6702

6825 - 6702 = 123!!!!!

Dank der Dummyvariable konnte MPLAB die Adressen richtig berechnen...
Ohne kann er es nicht richtig...
(Sieht nach einem alignement problem aus...)

Weis jemand, wie dies umgangen werden kann?
Das wäre ja so nicht wirklich brauchbar...

von Fasti (Gast)


Lesenswert?

Abgesehn davon, dass bei MPLAB generell Bugpflege betrieben wird, meine 
ich mich zu erinnern, dass es im Watch window auch Probleme gibt, wenn 
der Compiler Variablen in ein Register und nicht ins RAM legt. Nachdem 
die Register schnell wieder überschrieben werden, da sie ja mehrfach 
genutzt werden stimmt natürlich der angezeigte Wert dann nicht. Check 
das mal.

Grüße

Fasti

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.