www.mikrocontroller.net

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


Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gemeinde,

folgener Codeausschnitt.
uint32_t pwm_mask_init[20] PROGMEM = {0x80,     0x40,     0x20,     0x10,   0x08,   0x04,   0x02,   0x01,
                                      0x8000,   0x4000,   0x2000,   0x1000, 0x0800, 0x0400, 0x0200, 0x0100,
                                      0x800000, 0x400000, 0x200000, 0x100000};
volatile uint8_t pwm_sync;              // Update jetzt möglich

// PWM Update, berechnet aus den PWM Einstellungen
// die neuen Werte für die Interruptroutine

void pwm_update(void) {
    uint8_t i, j, k, min, index;
    uint32_t tmp, tmp1;

    uint8_t pwm_setting_tmp[20]={0};     // Einstellungen der PWM Werte, sortiert
    uint16_t pwm_timing_tmp[21]={0};     // Zeitdifferenzen der PWM Werte
    uint32_t pwm_mask_tmp[21]={0};        // Bitmaske für PWM Bits, welche gelöscht werden sollen

    // copy pwm settings
    // fill in masks
    // generate pulse mask for PWM start
    tmp=0;
    for(i=0; i<20; i++) {
        pwm_setting_tmp[i]= pwm_setting[i];
        tmp1=pgm_read_dword(&pwm_mask_init[i]);
        if (pwm_setting_tmp[i]!=0) tmp = tmp | tmp1;
        pwm_mask_tmp[i] = ~tmp1;
    }
    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
72:             pwm_setting_tmp[i]= pwm_setting[i];
+000000AE:   918D        LD      R24,X+           Load indirect and postincrement
+000000AF:   01F5        MOVW    R30,R10          Copy register pair
+000000B0:   9381        ST      Z+,R24           Store indirect and postincrement
+000000B1:   015F        MOVW    R10,R30          Copy register pair
73:               tmp1=pgm_read_dword(&pwm_mask_init[i]);
+000000B2:   01FB        MOVW    R30,R22          Copy register pair
+000000B3:   5AEC        SUBI    R30,0xAC         Subtract immediate
+000000B4:   4FFF        SBCI    R31,0xFF         Subtract immediate with carry+000000B5
:   9125        LPM     R18,Z+           Load program memory and postincrement+000000B6
:   9135        LPM     R19,Z+           Load program memory and postincrement+000000B7
:   9145        LPM     R20,Z+           Load program memory and postincrement+000000B8
:   9154        LPM     R21,Z            Load program memory
74:               if (pwm_setting_tmp[i]!=0) tmp = tmp | tmp1
;+000000B9:   2388        TST     R24              Test for Zero or Minus
+000000BA:   F021        BREQ    PC+0x05          Branch if equal
+000000BB:   2AE2        OR      R14,R18          Logical OR+000000BC
:   2AF3        OR      R15,R19          Logical OR+000000BD
:   2B04        OR      R16,R20          Logical OR+000000BE
:   2B15        OR      R17,R21          Logical OR
75:               pwm_mask_tmp[i] = ~tmp1;+000000BF
:   9520        COM     R18              One's complement+000000C0
:   9530        COM     R19              One's complement+000000C1
:   9540        COM     R20              One's complement+000000C2
:   9550        COM     R21              One's complement+000000C3
:   01F4        MOVW    R30,R8           Copy register pair+000000C4
:   9321        ST      Z+,R18           Store indirect and postincrement+000000C5
:   9331        ST      Z+,R19           Store indirect and postincrement+000000C6
:   9341        ST      Z+,R20           Store indirect and postincrement+000000C7
:   9351        ST      Z+,R21           Store indirect and postincrement+000000C8
:   014F        MOVW    R8,R30           Copy register pair
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

Autor: Andreas K. (a-k)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

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

MFG
Falk

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.