Forum: Compiler & IDEs AVR Studio Bug, falsches Register wird geladen


von Falk B. (falk)


Lesenswert?

Hallo Gemeinde,

folgener Codeausschnitt.
1
uint32_t pwm_mask_init[20] PROGMEM = {0x80,     0x40,     0x20,     0x10,   0x08,   0x04,   0x02,   0x01,
2
                                      0x8000,   0x4000,   0x2000,   0x1000, 0x0800, 0x0400, 0x0200, 0x0100,
3
                                      0x800000, 0x400000, 0x200000, 0x100000};
4
volatile uint8_t pwm_sync;              // Update jetzt möglich
5
6
// PWM Update, berechnet aus den PWM Einstellungen
7
// die neuen Werte für die Interruptroutine
8
9
void pwm_update(void) {
10
    uint8_t i, j, k, min, index;
11
    uint32_t tmp, tmp1;
12
13
    uint8_t pwm_setting_tmp[20]={0};     // Einstellungen der PWM Werte, sortiert
14
    uint16_t pwm_timing_tmp[21]={0};     // Zeitdifferenzen der PWM Werte
15
    uint32_t pwm_mask_tmp[21]={0};        // Bitmaske für PWM Bits, welche gelöscht werden sollen
16
17
    // copy pwm settings
18
    // fill in masks
19
    // generate pulse mask for PWM start
20
    tmp=0;
21
    for(i=0; i<20; i++) {
22
        pwm_setting_tmp[i]= pwm_setting[i];
23
        tmp1=pgm_read_dword(&pwm_mask_init[i]);
24
        if (pwm_setting_tmp[i]!=0) tmp = tmp | tmp1;
25
        pwm_mask_tmp[i] = ~tmp1;
26
    }
27
    pwm_mask_tmp[20]=tmp;

Am Ende sollte ja eigentlich in tmp 0xFFFFFF stehen, die Werte in 
pwm_setting sind ungleich Null. es steht aber 0xFF drin :-(
Viel Fluchen und Analyse zeigt

Der generierte Code ist OK (Listfile)
Bei der Simulation im AVRStudio 4.12 SP4 mit WINAVR 20060421 taucht der 
Fehler auf. Im Dissassembler steht
1
72:             pwm_setting_tmp[i]= pwm_setting[i];
2
+000000AE:   918D        LD      R24,X+           Load indirect and postincrement
3
+000000AF:   01F5        MOVW    R30,R10          Copy register pair
4
+000000B0:   9381        ST      Z+,R24           Store indirect and postincrement
5
+000000B1:   015F        MOVW    R10,R30          Copy register pair
6
73:               tmp1=pgm_read_dword(&pwm_mask_init[i]);
7
+000000B2:   01FB        MOVW    R30,R22          Copy register pair
8
+000000B3:   5AEC        SUBI    R30,0xAC         Subtract immediate
9
+000000B4:   4FFF        SBCI    R31,0xFF         Subtract immediate with carry+000000B5
10
:   9125        LPM     R18,Z+           Load program memory and postincrement+000000B6
11
:   9135        LPM     R19,Z+           Load program memory and postincrement+000000B7
12
:   9145        LPM     R20,Z+           Load program memory and postincrement+000000B8
13
:   9154        LPM     R21,Z            Load program memory
14
74:               if (pwm_setting_tmp[i]!=0) tmp = tmp | tmp1
15
;+000000B9:   2388        TST     R24              Test for Zero or Minus
16
+000000BA:   F021        BREQ    PC+0x05          Branch if equal
17
+000000BB:   2AE2        OR      R14,R18          Logical OR+000000BC
18
:   2AF3        OR      R15,R19          Logical OR+000000BD
19
:   2B04        OR      R16,R20          Logical OR+000000BE
20
:   2B15        OR      R17,R21          Logical OR
21
75:               pwm_mask_tmp[i] = ~tmp1;+000000BF
22
:   9520        COM     R18              One's complement+000000C0
23
:   9530        COM     R19              One's complement+000000C1
24
:   9540        COM     R20              One's complement+000000C2
25
:   9550        COM     R21              One's complement+000000C3
26
:   01F4        MOVW    R30,R8           Copy register pair+000000C4
27
:   9321        ST      Z+,R18           Store indirect and postincrement+000000C5
28
:   9331        ST      Z+,R19           Store indirect and postincrement+000000C6
29
:   9341        ST      Z+,R20           Store indirect and postincrement+000000C7
30
:   9351        ST      Z+,R21           Store indirect and postincrement+000000C8
31
:   014F        MOVW    R8,R30           Copy register pair
32
71:           for(i=0; i<20; i++) {

Ist identisch mit dem Listfile. ABER in der Simulation wird in der 
ersten Zeile anstatt R24 R26 geladen!!! Damit geht TST R24 schief! 
Scheisse! Aber wieso klappt es die ersten acht Durchläufe? Ich würde 
behaupten, das ist ein Simulatorbug. Oder?

MFG
Falk

von Andreas K. (a-k)


Lesenswert?

Schon eine etwas aktuellere Version vom Studio ausprobiert? Immerhin ist 
das Teil mittlerweile bei 4.13 SP2 angelangt.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> Am Ende sollte ja eigentlich in tmp 0xFFFFFF stehen, die Werte in
> pwm_setting sind ungleich Null. es steht aber 0xFF drin

Kann ich nicht nachvollziehen.

Ich habe mit AVR Studio 4.13 SP2 + WinAVR-20071221 simuliert. Target war 
Atmega32 und pwm_setting[] wurde wie pwm_setting_tmp[] deklariert 
allerdings global und alle 20 Elemente mit 1 initialisiert.

tmp hatte am Schluss den Wert 0x00F0FFFF. pwm_setting war unverändert. 
Deine Deklariation von pwm_setting[] sehe ich nicht, aber da würde ich 
als erstes nachforschen.

von Falk B. (falk)


Lesenswert?

@  Stefan "stefb" B. (stefan) Benutzerseite

>tmp hatte am Schluss den Wert 0x00F0FFFF. pwm_setting war unverändert.
>Deine Deklariation von pwm_setting[] sehe ich nicht, aber da würde ich
>als erstes nachforschen.

Ist auch global.

Ich hab jetzt AVR Studio 4.13 SP2 installiert, der Fehler bleibt :-(
Allerdings wenn ich in den Compileroptionen auf mega32 gehe UND im 
Simulator auf mega16 dann gehts ???? Wenn ich aber auch im Simulator auf 
mega32 einstelle gehts wieder nicht! Komische Welt.

MFg
Falk

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

OK, hab jetzt auch den WINAVR-20071221 installiert. Keine Änderung :-(
Ich seh den Fehler nicht, ist IMO immer noch ein Bug im Simulator. Wenn 
es einer ausprobieren will, Target mega16

MfG
Falk

von Falk B. (falk)


Lesenswert?

OK, falscher Alarm. vorkopfklatsch Meine Testdaten waren Null, weil 
die Testarrays Copy&Paste aus nem alten Projekt waren. Au weia.

MFG
Falk

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.