[BUG?] Xmega: excl benutzt assembler befehl LAC auch bei io zugriff

Thomas.AC
Benutzer
Avatar
Geschlecht: keine Angabe
Alter: 44
Beiträge: 308
Dabei seit: 07 / 2013
Betreff:

[BUG?] Xmega: excl benutzt assembler befehl LAC auch bei io zugriff

 · 
Gepostet: 09.12.2014 - 12:35 Uhr  ·  #1
Hallo,

ich wollte port Pins mit excl und incl schalten.

Leider machen die Funktionen beim Xmega nicht das, was man erwartet.
Siehe Bild im Anhang.

Soweit ich recherchiert habe (Suchwörter: avr und Lac) funktioniert die Implementierung
von excl mit dem Assemblerbefehl LAC (load and clear) nur mit dem internen SRAM.

Gruß
Thomas

Code

program test;

{$W+}

{ $DEFINE DEBUG}

Device = xmega128A1U, VCC = 3.3;

Define_Fuses
    Override_Fuses;
    NoteBook   = A;
    COMport    = USB;
    FuseBits5  = [BODLEVEL1, BODLEVEL2, BODACT0]; // BOD=2.8V if USB variant
    ProgFuses = true;
    ProgEEprom = true;


Import ;

Define
    OSCtype = extXTAL=8000000, PLLmul=4, prescA=1, prescB=1, prescC=1, faildet;


    StackSize      = 256, iData;
    FrameSize      = 256, iData;
    
implementation
{$IDATA}
{-------------------------------------------------------------------------------
Main Program
-------------------------------------------------------------------------------}

var mybyte : byte;
   
begin

   loop
     mybyte := $FF;
     excl(mybyte,5); // okay, sram

     PORTF := $FF;
     excl(PORTF,5);  // not okay, io register

     PORTF := $FF;
     PORTF.outclr := 1 shl 5;  // okay, OUTCLRF register
   endloop;
end test.

Der an diesem Beitrag angefügte Anhang ist entweder nur im eingeloggten Zustand sichtbar oder die Berechtigung Deiner Benutzergruppe ist nicht ausreichend.
Thomas.AC
Benutzer
Avatar
Geschlecht: keine Angabe
Alter: 44
Beiträge: 308
Dabei seit: 07 / 2013
Betreff:

Re: [BUG?] Xmega: excl benutzt assembler befehl LAC auch bei io zugriff

 · 
Gepostet: 09.12.2014 - 13:52 Uhr  ·  #2
Wenn man auf Portpins über eine vorher definiete bit variable zugreift, so ist die Implementierung des Compilers okay. Siehe code.

Code

implementation
{$IDATA}
{-------------------------------------------------------------------------------
Main Program
-------------------------------------------------------------------------------}

var Pin5vonPortF[@PORTF,5] : bit;
var myport[@PORTF] : byte;

begin

   loop
     excl(Pin5vonPortF);
     {compiler implementation okay:
                        LDI       _ACCA, 020h
                        STS       OUTCLRF, _ACCA
                        .LINE     39
     }

     excl(myPort,5);
     {compiler implementation differs from above
                        LDI       _ACCBLO, test.MYPORT AND 0FFh
                        LDI       _ACCBHI, test.MYPORT SHRB 8
                        PUSH      _ACCBLO
                        PUSH      _ACCBHI
                        LDI       _ACCA, 020h
                        POP       _ACCCHI
                        POP       _ACCCLO
                        LAC       Z, _ACCA
     }
   endloop;
end test.
rh
Administrator
Avatar
Geschlecht:
Herkunft: Germany
Alter: 25
Homepage: e-lab.de
Beiträge: 5558
Dabei seit: 03 / 2002
Betreff:

Re: [BUG?] Xmega: excl benutzt assembler befehl LAC auch bei io zugriff

 · 
Gepostet: 09.12.2014 - 14:55 Uhr  ·  #3
Hallo Thomas,

das Problem war das Komma in
Code
     excl(PORTF,5);  // not okay, io register

Mit einem "." hätte es funktioniert. Diese Funktion akzeptiert ab jetzt aber beides.

rolf
Thomas.AC
Benutzer
Avatar
Geschlecht: keine Angabe
Alter: 44
Beiträge: 308
Dabei seit: 07 / 2013
Betreff:

Re: [BUG?] Xmega: excl benutzt assembler befehl LAC auch bei io zugriff

 · 
Gepostet: 09.12.2014 - 15:05 Uhr  ·  #4
Gut. Danke Rolf.
Gewählte Zitate für Mehrfachzitierung:   0

Registrierte in diesem Topic

Aktuell kein registrierter in diesem Bereich

Die Statistik zeigt, wer in den letzten 5 Minuten online war. Erneuerung alle 90 Sekunden.
MySQL Queries: 15 · Cache Hits: 14   81   95 · Page-Gen-Time: 0.02702s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI