Forum: Compiler & IDEs AVR Studio Bug, falsches Register wird geladen
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
Schon eine etwas aktuellere Version vom Studio ausprobiert? Immerhin ist
das Teil mittlerweile bei 4.13 SP2 angelangt.
> 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.
@ 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
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
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.
|