// PWM Update, berechnet aus den PWM Einstellungen
7
// die neuen Werte für die Interruptroutine
8
9
voidpwm_update(void){
10
uint8_ti,j,k,min,index;
11
uint32_ttmp,tmp1;
12
13
uint8_tpwm_setting_tmp[20]={0};// Einstellungen der PWM Werte, sortiert
14
uint16_tpwm_timing_tmp[21]={0};// Zeitdifferenzen der PWM Werte
15
uint32_tpwm_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
> 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