Wie Enum von Port-Aliase erstellen um sie sequenziell zu durchlaufen

  • 1
  • 2
  • Page 2 of 2
schnutzibaer
 
Avatar
 
Subject:

Re: Wie Enum von Port-Aliase erstellen um sie sequenziell zu durchlaufen

 · 
Posted: 26.08.2013 - 19:15  ·  #9
Hallo, Kostas,

ein anderer wesentlciher Unterschied ist, dass ADC-Pins eine Zahl liefern, die dem außen anliegenden Potential entspricht. Digitale I/Os könen nur Ein oder Aus bzw. Low oder High, allgemein: True oder False. Da ist "Boolean" natürlich naheliegend. Wie gesagt, der Teufel steckt im Detail. Ich hab z.B. versucht rauszukriegen was hinter dem Symbol 'PortA' steckt. Die Ports werden im Proc. ja durch eine feste Memory-Adresse (word) dargestellt, aber weder ein Pointer auf PortA noch PortA als word wurde vom Compiler akzeptiert. Durch die Rumschnüffelei im Internet (Nein, ich bin nicht bei der NSA!!) und in den Handbüchern hab ich die Möglichkeit der Schreibweise "PortB.4" gefunden. War mir als Newbie (ich mach erst 1 Jahr ATMEL und E-Lab) vorher gar nicht geläufig.

Schon getestet ?

Viel Glück !

MfG Claus
Kostas
 
Avatar
 
Subject:

Re: Wie Enum von Port-Aliase erstellen um sie sequenziell zu durchlaufen

 · 
Posted: 26.08.2013 - 22:31  ·  #10
Hallo Claus,

nein habe ich noch nicht ausprobiert. Mir ist aufgefallen dass es so nicht gehen kann.

PortPins[1] := PortA.5; <<< PortPins[1] bekommt ja hier nur den Zustand von PortA.5 und nicht einen Zeiger
oder Referenz auf PortA.5.
PortPins[2] := PortC.0;
PortPins[3] := PortB.4;


TPortEnum = (Rel1, Rel2, Rel3, Rel4); <<< So lässt es sich kompilieren ist aber auch nicht richtig.
Denn Rel1 ist nun definiert kann nicht einem PortPin
zugeordnet werden.

So würde ich mir das vorstellen was leider nicht geht:
Relais1[@PortD,5] : Bit;
Relais2[@PortD,6] : Bit;
Relais3[@PortD,7] : Bit;
Relais4[@PortB,0] : Bit;

TPortEnum = (Relais1, Relais2, Relais3, Relais4);
TPortPinsArray = array[TPortEnum]of boolean;
PortPinsArray : TPortPinsArray;
Somit hätte ich eine Referenz auf die Port.Bits als Array Elemente dessen Wert ich dann
per PortPinsArray[Relais1] := true; setzen könnte.

Aber die Richtung ist gar nicht so falsch.
[Edit] um völlig sicher zu sein habe ich es soeben Live getestet. Ich habe leider Recht, es funktioniert nicht.
[Edit2] Ich werde mal Herrn Hofmann fragen.


Gruß Kostas
schnutzibaer
 
Avatar
 
Subject:

Re: Wie Enum von Port-Aliase erstellen um sie sequenziell zu durchlaufen

 · 
Posted: 27.08.2013 - 00:21  ·  #11
OK schade. Ich dachte, das wärs gewesen.

Ich sitz hier nur in Belgien seit Anfang letzter Woche und habe richtig Druck, Ergebnisse zu liefern. Da bleibt für solche Dinge nicht allzuviel Zeit, nur abends im Hotel.

Keine Angst, wir kriegen das noch hin !!

MfG Claus
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: Wie Enum von Port-Aliase erstellen um sie sequenziell zu durchlaufen

 · 
Posted: 27.08.2013 - 01:14  ·  #12
Eventuel so:

Code


Type
  TPortEnum = (Relais1, Relais2, Relais3, Relais4);

Var
 PortRelais1[@PortD.5] : Bit;
 PortRelais2[@PortD.6] : Bit;
 PortRelais3[@PortD.7] : Bit;
 PortRelais4[@PortB.0] : Bit;
 I : byte;

Procedure SetRelPin( Relais : TPortEnum; State : boolean);
begin
  case Byte(relais) of
    Relais1:  PortRelais1:= State;
            |
    Relais2:  PortRelais2:= State;
            |
    Relais3:  PortRelais3:= State;
            |
    Relais4:  PortRelais4:= State;
            |
  endcase;
end;

{Main}
begin
  Loop
  for i:= 0 to 3 do
    SetRelPin(TPortEnum(I),True);
    mDelay(100);
    SetRelPin(TPortEnum(I),false);
    mDelay(100);
  endfor;
 endloop;

end;



Kostas
 
Avatar
 
Subject:

Re: Wie Enum von Port-Aliase erstellen um sie sequenziell zu durchlaufen

 · 
Posted: 27.08.2013 - 09:10  ·  #13
Hallo miparo,

ja genau so habe ich es aktuell laufen. Mir ging es wirklich darum ob es eine Möglichkeit gibt die PortAliase
in ein Set oder Array zu fassen. Die Möglichkeit mit dem Case habe ich auch in meiner zweiten Post
erwähnt. Wie es aussieht geht es wohl nicht. Das ist völlig in Ordnung. Ich dachte nur was ich nicht erkenne
soll nicht bedeuten dass es nicht geht. :-)

Gruß Kostas
Kostas
 
Avatar
 
Subject:

Re: Wie Enum von Port-Aliase erstellen um sie sequenziell zu durchlaufen

 · 
Posted: 27.08.2013 - 14:47  ·  #14
Ich habe soeben von Herrn Hofmann bestätigt bekommen das es nicht geht.
Von meiner Sicht ist das auch völlig in Ordnung. Die richtige Variante ist also so wie
vom miparo in seinem letzten Post vorgeschlagen.

Gruß Kostas
Merlin
Administrator
Avatar
Gender:
Age: 24
Posts: 1408
Registered: 03 / 2005
Subject:

Re: Wie Enum von Port-Aliase erstellen um sie sequenziell zu durchlaufen

 · 
Posted: 27.08.2013 - 17:54  ·  #15
Hi Kostas.

What you want to do is possible, but not obvious (if I understand your needs correctly - sorry but my German is not good).

Essentially it involves creating a User Driver and mapping each port pin to a pseudo user address. Then each port pin can be treated in the same way that memory mapped IO is.

I have tested this in the simulator and it works.

Code
program MMPP;

{$NOSHADOW}
{ $WG}                     {global Warnings off}

Device = mega128, VCC=5;
{ $BOOTRST $0F000}         {Reset Jump to $0F000}

Define_Fuses
//  Override_Fuses;
  NoteBook   = A;
  COMport    = USB;
  LockBits0 = [];
  FuseBits0  = [];
  FuseBits1  = [SPIEN, JTAGEN, OCDEN];
  FuseBits2  = [];

Import SysTick, UserPort;

From System Import ;


Define
  ProcClock      = 16000000;       {Hertz}
  SysTick        = 10;             {msec}
  StackSize      = $0064, iData;
  FrameSize      = $0064, iData;
  UserPort       = 5;


Implementation

{$IDATA}

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

type


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

{--------------------------------------------------------------}
{ Var Declarations }
{$UDATA}
var
  PortPins : array[0..4] of boolean;


{$IDATA}


{--------------------------------------------------------------}
{ functions }
UserDevice UsrDevIni;
begin
end;

UserDevice UsrDevInp( adr: word ): byte;
begin
  case adr of
    0:
      DDRD.1 := 0;
      return( PinD.1);  |
    1:
      DDRA.2 := 0;
      return( PinA.2);  |
    2:
      DDRC.3 := 0;
      return( PinC.3);  |
    3:
      DDRA.1 := 0;
      return( PinA.1);  |
    4:
      DDRC.2 := 0;
      return( PinC.2);  |
  endcase;
end;

UserDevice UsrDevOut( adr : word; Outp: byte );
begin
  case adr of
    0:
      DDRD.1 := 1;
      PortD.1 := (OutP <> 0); |
    1:
      DDRA.2 := 1;
      PortA.2 := (OutP <> 0); |
    2:
      DDRC.3 := 1;
      PortC.3 := (OutP <> 0); |
    3:
      DDRA.1 := 1;
      PortA.1 := (OutP <> 0); |
    4:
      DDRC.2:= 1;
      PortC.2 := (OutP <> 0); |
  endcase;
end;




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

begin

  PortPins[1] := TRUE;
  
  EnableInts;
  loop


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

Re: Wie Enum von Port-Aliase erstellen um sie sequenziell zu durchlaufen

 · 
Posted: 27.08.2013 - 18:14  ·  #16
Hello Kostas,

Merlin's and Miparo's ways to do it is ok.

As I told you, any bit definition like var bbb...: bit; or PortX.y results in a 24 bit value
consisting of a 16bit address to byte or port and an 8bit bitnumber. This is 24bits long.
This construct doesn't fit into any other var, record, array etc. It also can not be
passed to a function because its constant nature.

rolf
  • 1
  • 2
  • Page 2 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   134   148 · Page-Gen-Time: 0.054815s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI