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

Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

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

 · 
Posted: 09.12.2014 - 12:35  ·  #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.

Attachments
LAC
Filename: lac.png
Filesize: 78.18 KB
Title: LAC
Download counter: 71
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

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

 · 
Posted: 09.12.2014 - 13:52  ·  #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
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

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

 · 
Posted: 09.12.2014 - 14:55  ·  #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
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

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

 · 
Posted: 09.12.2014 - 15:05  ·  #4
Gut. Danke Rolf.
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 16 · Cache Hits: 15   82   97 · Page-Gen-Time: 0.029976s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI