XMEGA-A3BU Xplained Unterstützung des LCD?

Lschreyer
Schreiberling
Avatar
Gender: n/a
Posts: 527
Registered: 02 / 2007
Subject:

XMEGA-A3BU Xplained Unterstützung des LCD?

 · 
Posted: 25.11.2011 - 09:41  ·  #1
Hallo,

ich wollte mal fragen ob beim neuen
XMEGA-A3BU Xplained Demoboard von Atmel auch das Grafik-LCD unterstützt wird?
Es hat 128x32 Pixels und ist über SPI an ein ST7565R Conroller angebunden, laut Datenblatt.

Der Controller ist ein ATxmega256A3BU, ein AT45DB642D Flash sitzt noch mit drauf.

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

Re: XMEGA-A3BU Xplained Unterstützung des LCD?

 · 
Posted: 25.11.2011 - 21:28  ·  #2
Hallo Louis,

es gibt sogar ein Demo Programm für den ST7565R

rolf
wom
 
Avatar
 
Subject:

Re: XMEGA-A3BU Xplained Unterstützung des LCD?

 · 
Posted: 15.02.2015 - 21:43  ·  #3
Hallo,

das mit dem DEMO für den ST7565R auf dem XMEGA-A3BU Xplained Demoboard haut bei mir nicht hin. Habe aber keine Ahnung wo mein Fehler liegt. :aerger

Code
program xMega;

Device = xmega256A3BU, VCC=3.3;
{ $BOOTRST $20000}         {Reset Jump to $20000}

Import SysTick, SPI_D, LCDGraphic;

From LCDGraphic Import CharSet;     {block CharSet, pixels}
From System Import ;

Define
  // XMega USB must use the internal 32MHz OSC. So the system must use the 2MHz OSC
  // Wegen USB Port
  OSCtype        = int32MHz,
                   PLLmul=4,
                   prescB=1,
                   prescC=1;
  SysTick        = 10,User;             {msec}
  StackSize      = $0080, iData;
  FrameSize      = $0080, iData;

  // use the Column mode controller ST7565R with SPI interface
  SPIorderD      = LSB;
  SPImodeD       = 0;
  SPIprescD      = 1;
  SPI_SSD        = PortD, 0;

  LCDGraphic     = 128, 64, 8;      {x-pix, y-pix, accesswidth}
  LCDgraphMode   = column, iData;   // column mode
  DefCharSet     = 'Graphchars.pchr';  {FileName}
  GViewports     = 1, iData;        {logical ViewPorts, scalings}
  TGraphStr      = 16;              {Graphic Text String Length}

Implementation

{$IDATA}
const
  // definitions for 2 bitmap types
  BmpSize8x8     : byte    = (8*8 div 8) + 2;
  BmpSize16x32   : byte    = (16*32 div 8) + 2;

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

type
  // we need a few array types where we can insert the bitmaps
  tBMP8          = array[1..BmpSize8x8] of byte;
  tArrows        = array[0..3, 1..BmpSize8x8] of byte;
  tChips         = array[0..15, 1..BmpSize16x32] of byte;

{--------------------------------------------------------------}
const
  // constant which hold contain the bitmaps
  Arrows         : tArrows = 'Arr_N.pbmp', 'Arr_W.pbmp', 'Arr_S.pbmp', 'Arr_E.pbmp';
  Folder8        : tBMP8   = 'Folder8.pbmp';

  ChipsV         : tChips  = 'ChipV0.pbmp', 'ChipV1.pbmp', 'ChipV2.pbmp', 'ChipV3.pbmp',
                             'ChipV4.pbmp', 'ChipV5.pbmp', 'ChipV6.pbmp', 'ChipV7.pbmp',
                             'ChipV8.pbmp', 'ChipV9.pbmp', 'ChipV10.pbmp', 'ChipV11.pbmp',
                             'ChipV12.pbmp', 'ChipV13.pbmp', 'ChipV14.pbmp', 'ChipV15.pbmp';

  ChipsH         : tChips  = 'ChipH0.pbmp', 'ChipH1.pbmp', 'ChipH2.pbmp', 'ChipH3.pbmp',
                             'ChipH4.pbmp', 'ChipH5.pbmp', 'ChipH6.pbmp', 'ChipH7.pbmp',
                             'ChipH8.pbmp', 'ChipH9.pbmp', 'ChipH10.pbmp', 'ChipH11.pbmp',
                             'ChipH12.pbmp', 'ChipH13.pbmp', 'ChipH14.pbmp', 'ChipH15.pbmp';


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

{--------------------------------------------------------------}
{ Var Declarations }
Var
  LCDcmd[@PortE, 3] : bit;
  bb, idx, pwm, co  : byte;
  i                 : integer;
  ch                : char;
{$IDATA}


{ functions }
{$D-}
UserDevice GraphIOS(cmd : byte; arg : byte);
begin
  (* Display Refresh with "GraphIOS" *)
  (* cmd = 0   arg = rowaddr    set rowaddr to arg *)
  (* cmd = 1   arg = pixels     write data byte    *)
  if cmd = 0 then
    PortF.3:=True;
    LCDcmd:= 0;
    // set page addr
    SPIoutByteD($B0+arg);
    // set column address
    SPIoutByteD($10);
    SPIoutByteD($00);
  else
    PortF.3:=False;
    // data out
    LCDcmd:= 1;
    SPIoutByteD(arg);
  endif;
end;
{$D+}

procedure InitPorts;
begin
  DDRR    := DDRR Or %00000011;      // Output=1  Input=0
  DDRD    := DDRD Or %00000001;      // Output=1  Input=0
  DDRE    := DDRE Or %00010000;      // Output=1  Input=0
  DDRF    := DDRF Or %00001000;      // Output=1  Input=0
  DDRA    := DDRA Or %00001000;      // Output=1  Input=0
end;

procedure InitGraph;
begin
//  SetSPIorderD(true);
//  SetSPIclkPhaD(0);
//  SetSPIdoubleSpeedD(true);
  // LCD command pin A0  // Graph Init
  // write init values to controller
  LCDcmd:= 0;
  SPIoutByteD($40);                       // display start line = 0
  SPIoutByteD($A1);                       // Display config, ADC reverse,
  SPIoutByteD($C0);                       // Normal COM0..63
  SPIoutByteD($A6);                       // Display normal
  SPIoutByteD($A2);                       // set BIAS 1/9
  SPIoutByteD($2F);                       // Booster and Regulator on
  SPIoutByteD($F8);                       // Booster Ratio 4x
  SPIoutByteD($00);                       // Booster Ratio 4x
  SPIoutByteD($27);                       // Vo voltage regulator
  SPIoutByteD($81);                       // electronic volume mode
  SPIoutByteD($12);                       // electronic volume set
  SPIoutByteD($AC);                       // no indicator
  SPIoutByteD($00);                       // no indicator
  SPIoutByteD($AF);                       // Display on
  gclrscr(0);
  gdisprefresh;
end;

procedure LCDreset;
begin
  PortA.3:=False;
  mDelay(1);
  PortA.3:=True;
  mDelay(100);
  LCDcmd:= 0;
  SPIoutByteD($E2);             // soft reset
  mDelay(10);
  PortR.1:=True;
end;

procedure SetContrast(ctr : byte);
begin
  LCDcmd:= 0;
  SPIoutByteD($81);              // electronic volume mode = contrast cmd
  SPIoutByteD(ctr);              // contrast set 0..63
end;
{--------------------------------------------------------------}
{ Main Program }
{$IDATA}

begin
     InitPorts;
     InitGraph;
     LCDreset;
     EnableInts($87);
     PortE.4:=True;
     SetContrast(30);

  gDrawRect(20, 6, 104, 56, $FF);
  gDrawRect(0, 0, 127, 63, $AA);
  gdisprefresh;
  mdelay(100);
  gSetTextJustify(alHorCenter, alVertBottom);
  gSetTextBkGnd(bkTransp);
  gSetTextMode(wmSetPix);
  gDrawString(35, 53, 1, 1, TxtRot0, 'Test');
  gSetTextMode(wmXorPix);
  gDrawString(60, 28, 2, 2, TxtRot0, 'E-LAB');
  gDrawString(60, 40, 1, 1, TxtRot0, 'Computers');
  gDrawString(125, 31, 2, 2, TxtRot90, 'AVRco');
  gdisprefresh;
  mdelay(10);

     loop
       PortR.0:=False;
       mDelay(5);
       PortR.0:=True;
       mDelay(200);
     endloop;
end xMega.
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Re: XMEGA-A3BU Xplained Unterstützung des LCD?

 · 
Posted: 16.02.2015 - 08:33  ·  #4
Hi Wom,

wie hast du den Progger angeschlossen ? Wenn ich nicht viel darüber nachdenken muß, könnte ich das heut abend mal testen. Das Board hab ich auch noch rumliegen.

Gruss
Harry

PS: Ich glaub da ist ein Fehler: laut Board-Beschreibung liegt LCD-SS auf PortD,0 und nicht auf PortE,3 .... oder was ist das da:
Code
LCDcmd[@PortE, 3] : bit;


.... und was ist das:
Code
PortF.3:=True;
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Re: XMEGA-A3BU Xplained Unterstützung des LCD?

 · 
Posted: 16.02.2015 - 10:09  ·  #5
Ok ich habs kapiert: die Beschreibung des Boards und des Schaltplans wiedersprechen sich etwas.

PortF,3=Display_SS
PortA,3=Display Reset
PortD,0=Display RS
PortD,1=Display SCK
PortD,3=Display MOSI
PortE,4=Display Backlight

Dein LCDcmd müßte also PortD,0 sein.
wom
 
Avatar
 
Subject:

Re: XMEGA-A3BU Xplained Unterstützung des LCD?

 · 
Posted: 16.02.2015 - 21:24  ·  #6
Hallo Harry,

das mit dem Ports ist soweit ok. So ist es auch in dem Demo-Programm.

Code
//! \name LCD controller (NHD-C12832A1Z-FSW-FBW-3V3)
//@{
#define NHD_C12832A1Z_SPI               &USARTD0
#define NHD_C12832A1Z_SPI_SCK           IOPORT_CREATE_PIN(PORTD, 1)
#define NHD_C12832A1Z_SPI_MOSI          IOPORT_CREATE_PIN(PORTD, 3)
#define NHD_C12832A1Z_CSN               IOPORT_CREATE_PIN(PORTF, 3)
//! If this signal is set high display data is sent otherwise commands
#define NHD_C12832A1Z_REGISTER_SELECT   IOPORT_CREATE_PIN(PORTD, 0)
#define NHD_C12832A1Z_RESETN            IOPORT_CREATE_PIN(PORTA, 3)
//! The backlight is active high
#define NHD_C12832A1Z_BACKLIGHT         IOPORT_CREATE_PIN(PORTE, 4)
//@}


schaut man sich aber den Port D an, so ergibt sich ein anders Bild (Degenblatt xmega 256A3BU).

SPI_D :
/SS -> auf PD.4
MOSI -> auf PD.5
MISO -> auf PD.6
SCK -> auf PD.7

also muss man einen SOFT SPI verwende ? Da soll einer durchblicken.

Gruß
WOM

Hab noch einiges versucht, aber mit dem Compiler haut das nicht hin. Unter C scheint das kein Problem darzustellen. Schade. An Sonaten arbeite ich gerne mit dem Compiler, aber mit dem xmega habe ich so meine Problem.
wom
 
Avatar
 
Subject:

Re: XMEGA-A3BU Xplained Unterstützung des LCD?

 · 
Posted: 22.02.2015 - 20:33  ·  #7
Hallo,

so geht's.

Code

program xMega;

Device = xmega256A3BU, VCC=3.3;
{ $BOOTRST $20000}         {Reset Jump to $20000}

Import SysTick, SPIDriver1, LCDGraphic;

From LCDGraphic Import CharSet;     {block CharSet, pixels}

Define
  // XMega USB must use the internal 32MHz OSC. So the system must use the 2MHz OSC
  // Wegen USB Port
  OSCtype        = int32MHz,
                   PLLmul=4,
                   prescB=1,
                   prescC=1;
  SysTick        = 10,User;             {msec}
  StackSize      = $0080, iData;
  FrameSize      = $0080, iData;

  // use the Column mode controller ST7565R with SPI interface

  SPIDriver1  = PortD,1,3,2;  // SCK, MOSI, MISO, SS
  SPIorder1   = MSB;
  SPIcpol1    = 1;
  SPIcpha1    = 1;

  LCDGraphic     = 128, 32, 8;      {x-pix, y-pix, accesswidth}
  LCDgraphMode   = column, iData;   // column mode
  DefCharSet     = 'Graphchars.pchr';  {FileName}
  GViewports     = 1, iData;        {logical ViewPorts, scalings}
  TGraphStr      = 16;              {Graphic Text String Length}

Implementation

{$IDATA}

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

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

{--------------------------------------------------------------}
{ Var Declarations }
Var
   LCDcmd[@PortD, 0] : bit;
   Sec,x          : Byte;
   xMod           : Boolean;

{$IDATA}


{ functions }
{$D-}
UserDevice GraphIOS(cmd : byte; arg : byte);
begin
  (* Display Refresh with "GraphIOS" *)
  (* cmd = 0   arg = rowaddr    set rowaddr to arg *)
  (* cmd = 1   arg = pixels     write data byte    *)
  PortF.3:=False;
  if cmd = 0 then
    LCDcmd:= 0;
    // set page addr
    SPIoutByte1($B0+arg);
    // set column address
    SPIoutByte1($10);
    SPIoutByte1($00);
  else
    // data out
    LCDcmd:= 1;
    SPIoutByte1(arg);
  endif;
end;
{$D+}

{--------------------------------------------------------------}
{--------------------------------------------------------------}
procedure InitPorts;
begin
  DDRR    := DDRR Or %00000011;      // Output=1  Input=0
  DDRD    := DDRD Or %00011011;      // Output=1  Input=0
  DDRE    := DDRE Or %00010000;      // Output=1  Input=0
  DDRF    := DDRF Or %00011000;      // Output=1  Input=0
  DDRA    := DDRA Or %00011000;      // Output=1  Input=0
  PortD.4 :=True;
end;

{--------------------------------------------------------------}
{--------------------------------------------------------------}
procedure InitGraph;
begin
  // LCD command pin A0  // Graph Init
  // write init values to controller
  LCDcmd:= 0;
  SPIoutByte1($40);                       // display start line = 0
  SPIoutByte1($A1);                       // Display config, ADC reverse,
  SPIoutByte1($C0);                       // Normal COM0..63
  SPIoutByte1($A6);                       // Display normal
  SPIoutByte1($A2);                       // set BIAS 1/9
  SPIoutByte1($2F);                       // Booster and Regulator on
  SPIoutByte1($F8);                       // Booster Ratio 4x
  SPIoutByte1($00);                       // Booster Ratio 4x
//  SPIoutByte1($27);                       // Vo voltage regulator
  SPIoutByte1($81);                       // electronic volume mode
  SPIoutByte1($00);                       // electronic volume set
  SPIoutByte1($AC);                       // no indicator
  SPIoutByte1($00);                       // no indicator
  SPIoutByte1($AF);                       // Display on

  gclrscr(0);
  gdisprefresh;
  PortE.4:=True;
end;

{--------------------------------------------------------------}
{--------------------------------------------------------------}
procedure LCDreset;
begin
  PortA.3:=False;
  uDelay(10);
  PortA.3:=True;
  uDelay(10);
  PortR.1:=True;
  PortE.4:=False;
end;

{--------------------------------------------------------------}
{--------------------------------------------------------------}
procedure SetContrast(ctr : byte);
begin
  LCDcmd:= 0;
  SPIoutByte1($81);              // electronic volume mode = contrast cmd
  uDelay(10);
  SPIoutByte1(ctr);              // contrast set 0..63
  uDelay(10);
end;

{--------------------------------------------------------------}
{ Main Program }
{$IDATA}
begin
     EnableInts($87);
     InitPorts;
     xMod:=False;
     LCDreset;
     InitGraph;
     gDrawRect(5, 0, 127, 31, $FF);
     gdisprefresh;
     gSetTextJustify(alHorCenter, alVertBottom);
     gSetTextBkGnd(bkTransp);
     gSetTextMode(wmSetPix);
     gDrawString(63,12, 2, 1, TxtRot180, 'WOM 2015');
     gdisprefresh;
     mdelay(1500);
     gSetTextMode(wmClrPix);
     gDrawString(63,12, 2, 1, TxtRot180, 'WOM 2015');
     gdisprefresh;
     x:=0;
     SetContrast(x);
     loop
         gSetTextBkGnd(bkTransp);
         gSetTextMode(wmSetPix);
         gDrawString(63,12, 2, 1, TxtRot180, ByteToStr(x)+' '+ByteToHex(x));
         gdisprefresh;
         PortR.0:=False;
         mDelay(5);
         PortR.0:=True;
         mdelay(10);
         mdelay(500);
         gSetTextMode(wmClrPix);
         gDrawString(63,12, 2, 1, TxtRot180, ByteToStr(x)+' '+ByteToHex(x));
         gdisprefresh;
         Inc(x);
         If x>127 Then x:=0; EndIf;
     endloop;
end xMega.
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   121   135 · Page-Gen-Time: 0.022103s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI