comp.lang.ada
 help / color / mirror / Atom feed
From: Shark8 <OneWingedShark@gmail.com>
Subject: Re: Cleanest Ada way to do this?
Date: Sun, 22 Jun 2014 15:05:05 -0600
Date: 2014-06-22T15:05:05-06:00	[thread overview]
Message-ID: <6yHpv.55741$G37.7010@fx07.iad> (raw)
In-Reply-To: <7eaee5fc-2045-4bb3-8b16-d757b54760da@googlegroups.com>

On 22-Jun-14 10:51, Mike Silva wrote:
> I'd like some help on the cleanest, or most elegant, way to do this in Ada.
>  I'm writing to an LCD character display, in 4-bit mode, which requires writing
> an 8 bit character or command value as two 4 bit pieces.  The port (a memory
> address) being written to is 32 bits wide.  What I would like to be able to do
> is some form of this (not valid Ada, I know):
>
>   Port32(4..7) := Some_Char(4..7);
>   ..twiddle some other control bits..
>   Port32(4..7) := Some_Char(0..3);
>   ..twiddle some other control bits..
>
> Any thoughts?
>

Depends on the situation, I think; if there's a lot of them [ports] like 
say one for each 'character' you may be better off making a generic 
package to interface with it.

Package Parent is
   Type Segment is range 1..16 with Size => 4;
   Type LCD_Character is private;
   Type LCD_Handle is not null access LCD_Character;
Private
  Type Segment_Array is Array(Segment) of Boolean
     with Size => Segment'Last;
  Type LCD_Character is record
    Segments : Segment_Array;
  end record;
End Parent;

Generic
   Port_Address : in Address;
Package Parent.Port is
   Port : aliased LCD_Character with Volatile, Address => Port_Address;
End Parent.port;

With Parent.Port;
Package Display is
   Number_of_Segments : Constant Positive := 3;
   Type LCD_Array is Array(1..Number_of_Segments) of LCD_Handle;

   Display : constant LCD_Array;
Private
   Package Segment_1 is new Parent.Port( ######## );
   Package Segment_2 is new Parent.Port( ######## );
   Package Segment_3 is new Parent.Port( ######## );

   Display : constant LCD_Array:=
     ( 1 => Segment_1.Port, 2 => Segment_2.Port, 3 => Segment_3.Port );
End Display;

Or if it's a one-off type thing do it more directly:

LCD_Display : LCD_Character with Address => Port_Address;


  parent reply	other threads:[~2014-06-22 21:05 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-22 16:51 Cleanest Ada way to do this? Mike Silva
2014-06-22 19:07 ` Simon Clubley
2014-06-22 21:20   ` Mike Silva
2014-06-22 21:05 ` Shark8 [this message]
2014-06-23  0:17   ` Simon Clubley
2014-06-23  6:46     ` hungupharps
2014-06-23  7:32       ` Georg Bauhaus
2014-06-23 11:48         ` Simon Clubley
2014-06-23 15:40           ` G.B.
2014-06-23  9:02 ` rrr.eee.27
2014-06-23 11:57   ` Simon Clubley
2014-06-23 12:05     ` rrr.eee.27
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox