DDRD und SerPortD0 stören sich

  • 1
  • 2
  • Page 1 of 2
grech
Benutzer
Avatar
Gender:
Location: Saarland
Age: 66
Posts: 15
Registered: 10 / 2015
Subject:

DDRD und SerPortD0 stören sich

 · 
Posted: 04.06.2019 - 14:37  ·  #1
Hallo zusammen,
ich verwende einen XMega und habe so ziemlich alle Ports belegt.
Wenn ich SerPortD0 verwende möchte und Bit4-7 am Port D anders konfigurieren möchte
funktioniert die serielle nicht mehr.
Lass ich die Konfiguration mittels DDRD weg geht die serielle.
Aber das nutzt mir ja nichts. Ich will ja die Bit4-7 als Ausgänge verwenden.
Kann mir jemand erklären was ich anders machen sollte.
Danke

Code

program XMEGA_CP2104;

device = XMega256A3U , VCC = 3.3;
{ $BOOTRST $20000}         {Reset Jump to $20000}

Import SysTick, SerPortD0, BeepPort, SysLEDblink;

//From System Import LongWord, word64;

Define
  // The XMegas don't provide any Oscillator fuses.
  // So the application must setup the desired values
  // possible OSC types: extXTAL, extClock, ext32kHz, int32Khz, int2MHz, int32MHz

  //>> CPU       =32MHz, PeripherX4=32MHz, PeripherX2=32MHz
  OSCtype        = int32MHz,
  PLLmul         = 4,
  prescB         = 1,
  prescC         = 1;
  SysTick        = 10;              // msec} 
  StackSize      = $0032, iData;
  FrameSize      = $0064, iData;

  SerPortD0      = 256000;          // 256 kbit
  TxBufferD0     = 40, iData;
  RXBufferD0     = 40, idata;

  BeepPort       = PortF, 7;
  SysLEDblink    = mSec300;           // 10..1000 msec
  SysLEDBlink0   = PortD, 5, high;    // LEDon = low level

Implementation

{$IDATA}

{--------------------------------------------------------------}
{ Type Declarations }
type

{--------------------------------------------------------------}
{ Const Declarations }
const

{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
var
  ww     : word;
  st     : string[32];

{--------------------------------------------------------------}
{ functions }

{--------------------------------------------------------------}
{ Main Program }
{$IDATA}
begin
  // Port A Input - Schieberegister
  DDRA := %00000000;
  // Port B Output - Schieberegister
  DDRB := %11111111;
  // Port C wird von Schnittstellen verwendet RS485 (serC0) , TFT (TWIC) und SD (SPIC)
  // Initialisierung sollte durch die entspr. Treiber erfolgen
  // Port D, SERD0 als RS232, D4, D5 Ausgänge, D6, D7 USB

  DDRD := %11110111;   // Port D Output  D3 Input , bit 4-7 Output
  // Port E Schnittstellen Midi (serE0)
  DDRF := %11111011;   // Port F Output  F2 = IR-RXD
  mdelay( 100 );

  EnableInts($87);
  BeepOut(2000, 5);
  SysLEDflashAllOn;
  WriteLn(SerOutD0);

  WriteLn(SerOutD0, 'XMega Baud Test');

  loop
    mDelay(500);
    inc(ww);
    st:= 'Loop     : $'+IntToHex(ww);
    WriteLn(SerOutD0, st);
    BeepClick;
    while SerStatD0 do
      SerOutD0(SerInpD0);        // echo
    endwhile;
  endloop;
end XMEGA_CP2104.

berndk
Benutzer
Avatar
Gender: n/a
Location: Leipzig
Posts: 23
Registered: 02 / 2006
Subject:

Re: DDRD und SerPortD0 stören sich

 · 
Posted: 04.06.2019 - 17:05  ·  #2
I would do it like this

DDRD := DDRD or %11110000;

this way you inherit the settings of the lower 4 bits

Bernd
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: DDRD und SerPortD0 stören sich

 · 
Posted: 04.06.2019 - 17:44  ·  #3
Hi,
with XMegas sollte man
OUTCLRp
OUTSETp
OUTTGLp
DIRSETp
DIRCLRp
DIRTGLp
verwenden um einzelne Port Bits zu manipulieren. Genial das ganze.
rolf
Merlin
Administrator
Avatar
Gender:
Age: 24
Posts: 1372
Registered: 03 / 2005
Subject:

Re: DDRD und SerPortD0 stören sich

 · 
Posted: 04.06.2019 - 17:48  ·  #4
I cannot test at moment, but your first problem may be that you are setting the direction of port D after the serial is initialised. In particular you are setting the serial Rx pin as an output and the Tx pin as an input (if I read the manual correctly). Try this for setting DDRD without modifying the serial pins

Code

  DDRD := DDRD or %11110000;


Or you could try

Code

  DDRD :=  %11111011;


but the first is safer.
grech
Benutzer
Avatar
Gender:
Location: Saarland
Age: 66
Posts: 15
Registered: 10 / 2015
Subject:

Re: DDRD und SerPortD0 stören sich

 · 
Posted: 05.06.2019 - 07:50  ·  #5
Danke für die Antworten,
ich habe dann festgestellt, dass ich einen bit-Dreher drin hatte. Sorry.
Hab aber noch nicht getestet ob's gegangen wäre.

Mir gefallen die Methoden die rh genannt hat gut.
Leider vermisse ich eine Doku in der die genauen Auswirkungen der Zuweisungen
etwas umfangreicher beschrieben sind.
d.h.
was macht dirset := %01010101
Setzt es die 1en als Ausgänge und lässt die 0en unberührt?
was macht dirclr := %10101010
Setzt es die 1en als Eingänge und lässt die 0en unberührt?

Ebenso bei OUTSet und OUTClr.
Ist es so gemeint, dass immer nur die bits bei denen eine 1 in der Maske steht
verändert werden?

Gruß Grech
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2080
Registered: 03 / 2003
Subject:

Re: DDRD und SerPortD0 stören sich

 · 
Posted: 09.06.2019 - 07:42  ·  #6
Hallo Grech,

von den Namen abgeleitet würde ich vermuten, daß SET nur setzt (die mit 1), CLR nur löscht (auch die mit 1) und TGL (toggle) nur kippt.

Gruss
Harry
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: DDRD und SerPortD0 stören sich

 · 
Posted: 10.06.2019 - 21:58  ·  #7
Hallo,
beim XMega unterstüzt der AVRco die speziellen Port Register:
Code
  SetBit(PORTD, 5, true);
  SetBit(DDRD, 5, true);
  SetBit(DDRD, 5, false);

das ergibt:
Code
                        .LINE     61
                        LDI       _ACCA, 020h
                        STS       OUTSETD, _ACCA
                        .LINE     62
                        LDI       _ACCA, 020h
                        STS       DIRSETD, _ACCA
                        .LINE     63
                        LDI       _ACCA, 020h
                        STS       DIRCLRD, _ACCA
rolf
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 59
Posts: 956
Registered: 09 / 2007
Subject:

Re: DDRD und SerPortD0 stören sich

 · 
Posted: 10.06.2019 - 22:42  ·  #8
Hi Rolf,
aber das tut der AVRco auch klassisch :

Code

DDRB.5:= True;
DDRB.5:= false;


ergibt
Code

LDI       _ACCA, 020h
STS       DIRSETB, _ACCA

LDI       _ACCA, 020h
STS       DIRCLRB, _ACCA
  • 1
  • 2
  • Page 1 of 2
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: 15 · Cache Hits: 14   138   152 · Page-Gen-Time: 0.025376s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI