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

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

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

 · 
Posted: 22.08.2013 - 17:04  ·  #1
Hallo Zusammen,

ich habe als Beispiel vier Aliase von Ports die ich „shr“ anspringen möchte.
Dafür würde ich gerne eine Array oder Enum anlegen und nach jedem Takt jeweils
um ein Port weiterspringen. Ist er beim letzen angelangt, fängt er bei den ersten wieder an.
Die Port.Pins befinden sich nicht alle im gleichen Port. Die Frage ist nur, wie kann so ein Typ
aussehen der die einzelnen PortAliase beinhaltet. In den Beispielen ist mir das so nicht
aufgefallen. Oder nach was müsste ich bitte suchen?

Code
  LED1[@PortD,5] : Bit;
  LED2[@PortD,6] : Bit;
  LED3[@PortD,7] : Bit;
  LED4[@PortB,0] : Bit;


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

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

 · 
Posted: 22.08.2013 - 20:45  ·  #2
Hi Kostas,

ich hab keine Ahnung ob das geht, aber wieso nimmst du kein Schieberegister und den SPI-Port/Treiber ? Ist wesentlich einfacher.

Gruss
Harry
Kostas
 
Avatar
 
Subject:

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

 · 
Posted: 22.08.2013 - 22:48  ·  #3
Hallo Harry,

mir geht es hierbei um das Prinzip, ob es überhaupt eine Möglichkeit gibt irgendwelche Portpins zusammen zu fassen zu einer Enumeration
die man dann bequem über den Indexer erreichen kann. Es gibt z.B.: ein BitSet damit könnte es möglicherweise gehen.
Und wenn es nicht geht, ist es ebenfalls völlig in Ordnung. Ich kann ja ein Enum anlegen mit Anzahl Portpins die ich ansprechen möchte
und mit einem Case auf den Enum das den Port.Pin ansprechen. Eine Enum auf Portaliase würde mir recht gut gefallen.
Deine zwei Varianten kenn ich leider nicht. Ich fange erst an AVRCo zu erlernen.

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

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

 · 
Posted: 23.08.2013 - 14:04  ·  #4
Hi Kostas,

du könntest dir mal das anschaun.

Ansonsten könntest du deine Variable auf die Ports ummappen. Ob der Syntax so jetzt stimmt, kann ich dir auswendig nicht sagen (hab hier grad keinen Compiler), aber prinzipiell so:
Code

Var
  Arbeit : Byte; // das ist deine Variable zum "shr"n
  OutPD : Byte; // das ist deine Variable für PortD
  OutPB : Byte; // das ist deine Variable für PortB

// Arbeit %xxxx DCBA  ---> PortD %CBAx xxxx und PortB %xxxx xxxD
Procedure Ausgabe;
  Begin
    OutPD:=(Arbeit and $07) shl 5;
    OutPB:=(Arbeit and $08) shr 3;
    PortD:=OutPD;
    PortB:=OutPB;
  End Ausgabe;


Gruss
Harry
schnutzibaer
 
Avatar
 
Subject:

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

 · 
Posted: 24.08.2013 - 23:38  ·  #5
Hallo, Kostas,

ich würde hier mal folgendermaßen rangehen (nur eine Idee):
Definiere Dir einen Record oder ein Array, wo Du in der ersten Spalte die Ports (PortB oder @PortB) einträgst und in der zweiten Spalte die Pin-Nummern. Dann kannst Du das Array abackern und die Pins unabhängig von ihrer Verteilung auf die Ports und ihrer PinNummer checken. Macht sicher ein wenig Mühe, das korrekt zu programmieren, aber da Du ja nur auf's Prinzip aus bist, hast Du offensichtlich Zeit für solche Experimente. Ich hab's auf die Schnelle versucht, zu programmieren, aber es ist mit jetzt echt zu spät.

MfG Claus.
Kostas
 
Avatar
 
Subject:

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

 · 
Posted: 26.08.2013 - 11:52  ·  #6
Hallo Claus,

ja, interessanter Gedanke. Möglicherweise gibt es ja eine Lösung dafür. Wie gesagt, wenn nicht,
ist es völlig in Ordnung.

Ich habe mal versucht dein Vorschlag umzusetzen:

type
TPortPinsRecord = Record
aPort:byte; <<< Port ist vom Typ kein Byte aber was sonst? Der Typ Bit geht auch nicht.
aPin:byte;
end;
TPortPinsArray = Array[0..3] of TPortPinsRecord;

{$IDATA}
{ Var Declarations }
var
PortPinsArray : TPortPinsArray;

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

begin
// nach der Initialisierung die Ports zuweisen
PortPinsArray[0].aPort := @PortD; <<< falscher Typ sagt er.
PortPinsArray[0].aPin := 5;

PortPinsArray[1].aPort := @PortD;
PortPinsArray[1].aPin := 6;

PortPinsArray[2].aPort := @PortD;
PortPinsArray[2].aPin := 7;

PortPinsArray[3].aPort := @PortB;
PortPinsArray[3].aPin := 0;

//das geht so nicht. Gibt es eine Methode dieser ich ein Port z.B.: @PortB und den Pin z.B.: 0
//übergeben kann?
aPortPin := PortPinsArray[3].aPort.PortPinsArray[3].aPin;

// Wie setze ich nun das Bit SetBit(Relais1,false); geht nicht da es ein BitType benötigt
// aus dem ich nicht instanzieren kann.


Gruß Kostas
schnutzibaer
 
Avatar
 
Subject:

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

 · 
Posted: 26.08.2013 - 13:16  ·  #7
Hi, Kostas,

dank einer kleinen Mittagspause hab ich den (wahrscheinlich) richtigen Weg gefunden. Die Lösung steht auf Seite 115 Compiler-Manual:

1. Leg ein eindimensionales Array vom Typ Boolean an mit sovielen Elementen, wie Du PortPins verwalten willst:
PortPins : array[1..3] of boolean; //Array für PortPins
2. Füll das Array nach folgendem Prinzip so, wie Du's gerne hättest:

PortPins[1] := PortA.5;
PortPins[2] := PortC.0;
PortPins[3] := PortB.4;


Du kannst die Pins dann schalten:
PortPins[2] := false; //Pin wird low
oder lesen:
x := PortPins[2];

Lässt sich übersetzen, habe aber zum Testen jetzt keine Zeit. probiers mal aus.
Wenn's funzt, lässt sich das bestimmt noch anderweitig wieder verwenden.

MfG

Claus.
Kostas
 
Avatar
 
Subject:

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

 · 
Posted: 26.08.2013 - 14:06  ·  #8
Hallo Claus,

je Super, genau das habe ich gemeint. Die Variante hatte ich mir schon zig Mal überlegt, aber es nie versucht.
Ich dachte, ein Port.Pin kann doch niemals vom Typ Boolean sein. Was für ein Irrtum natürlich ist es ein Boolean.
In meine Überlegungen habe ich mich mit den ADCs irritieren lassen. Mein Gedankengang war ein ADC-Port
liegt auch nur auf ein Pin. Hab dabei übersehen dass die ADCs ja fest sind und nur durch ihren Index angesprochen werden also GetADC(1); und nicht PortC.1 somit ist alles klar.

Tausend Dank, du hast mir sprichwörtlich die Augen geöffnet!
Dir noch eine schöne Zeit.
Gruß Kostas.


Gruß Kostas
  • 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: 13   134   147 · Page-Gen-Time: 0.040782s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI