Word aus Record im EEPROM als VAR in Procedure übergeben?

  • 1
  • 2
  • 3
  • Page 1 of 3
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Word aus Record im EEPROM als VAR in Procedure übergeben?

 · 
Posted: 11.05.2018 - 20:55  ·  #1
Hallo,

kann es sein, das ich ein WORD aus einer Struktur nicht als VAR-Parameter an eine Procedure übergeben kann?

Ich habe eine Struktur/Record:
Code


TPVSConfig1 = record
    Kennung: WORD; (* 0 Kennung für USB Transfer *)
    CMD: WORD; (* 2 Cmd Befehl *)
    WM000C_GesZeitFTTT: WORD; (* 4 Gesamte Überbrückungszeit *)
    ...
    ...
    ...
  end;


In meiner Globalen VAR-Unit:
Code
//------------------------------------------------------------
// Ab hier die EEPROM VARs Parameter
{$EEPROM}
//Structconst
 Cfg1   :   TPVSConfig1;
 Cfg2   :   TPVSConfig2;
 Cfg3   :   TPVSConfig3;
 Cfg4   :   TPVSConfig4;


Wenn ich nun meine DisplayEingabe aufrufe:
Code
     elsif DispTast.ok AND (bSelZeile=1) then DispGetNo( Cfg1.WM000C_GesZeitFTTT, 0, 65535 );


Die Eingabe-Funktion:
Code
procedure DispGetNo( var wWord : word; const wmin, wmax : word );
var
 bSpalte : byte;
begin

repeat
  DispStartNeueSeite;
       DispKopf('Zahlenwert eingeben:', 0  );
       gDrawString(  0,10,1,1,TxtRot0, '<OK> '+CHAR_UE+'bernahme / ');
       gDrawString(  100,10,1,1,TxtRot0, '<ESC> Abbruch. ');
       gDrawString(  0,18,1,1,TxtRot0, 'min: '+IntToStr( wmin )+'  max: '+IntToStr( wmax ));
       
       gDrawRect(155,26,250,51,$FF);
       gDrawString(  160,30,2,2,TxtRot0, IntToStr( wWord:5:'0' )+'/s');  // über den Procedure Parameter ist er imm "0"

       gDrawString(  0,30,2,2,TxtRot0, IntToStr( Cfg1.WM000C_GesZeitFTTT:5:'0' )+'/s'); // wenn ich direkt darauf zugreife wird der Wert angezeigt

   DispHeadRefresh;

   // Tasten auswerten
    CheckDispTast( true ); // Warte auf Taste und sleep Process
....
 // Beendigung Schleife?
 until  DispTast.ok or DispTast.esc ;

end DispGetNo;


Wenn ich über die Procedure-Parameter (var) auf die EEPROM-Speicherstellen zugreifen möchte, erhalte ich immer '0'.
Oder habe ich hier nur einen Denkfehler in der Verarbeitung der EEPROM-Speicherstellen?

Geht das evtl. nur über die EEPROM-PTR Funktionen?
Code
Function EEPromPtr (p:pointer): pointer;
Ptr1 := @EEPromByte;
bb := EEPromPtr (Ptr1)^;


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

Re: Word aus Record im EEPROM als VAR in Procedure übergeben?

 · 
Posted: 12.05.2018 - 11:39  ·  #2
Hallo Thorsten,
das funktioniert so nicht. Spätestens bei der Übergabe einer
EEprom Adresse an eine Prozedur/Funktion geht die Info verloren
dass hier das EEprom gemeint ist.
Mit einem Eprom Pointer kann das meistens behoben werden. Aber
mit einem VAR gibt es noch weitere Probleme. Wieso hier eigentlich
das VAR wWord ???? Bringt garnix. Ein word hat 2 bytes und ein Var
word ist eigentlich ein Pointer und hat auch 2 bytes.

rolf
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Re: Word aus Record im EEPROM als VAR in Procedure übergeben?

 · 
Posted: 14.05.2018 - 08:13  ·  #3
Quote by rh

Hallo Thorsten,
das funktioniert so nicht. Spätestens bei der Übergabe einer
EEprom Adresse an eine Prozedur/Funktion geht die Info verloren
dass hier das EEprom gemeint ist.
Mit einem Eprom Pointer kann das meistens behoben werden. Aber
mit einem VAR gibt es noch weitere Probleme. Wieso hier eigentlich
das VAR wWord ???? Bringt garnix. Ein word hat 2 bytes und ein Var
word ist eigentlich ein Pointer und hat auch 2 bytes.

rolf


Habe ich da was falsch verstanden? Ich dachte nur bei VAR kann ich in der Procedure den Übergabeparamter auch verändern? Da er als Pointer verwendet wird?

Ich hab es jetzt so gelöst:
Code
procedure DispGetNo( wWordP : pointer to word; const wmin, wmax : word );
var
 bSpalte  : byte;
 wWork    : word;
begin
 bSpalte:=0;

 wWork:= word( EEPromPtr( wWordP )^ ); // Ziehe Word aus EEPROM
...


Und nach einer Änderung übergebe ich das dann so:
Code
elsif DispTast.ok    then EEPromPtr( wWordP )^:=wWork;


Aufgerufen wird es jetzt so:
Code
elsif DispTast.ok AND (bSelZeile=1) then DispGetNo( @Cfg1.WM000C_GesZeitFTTT, 1, $FFFF );


Thorsten
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Re: Word aus Record im EEPROM als VAR in Procedure übergeben?

 · 
Posted: 10.10.2018 - 13:32  ·  #4
Hallo Leute,

ich hänge wieder mal hier mit dem EEPROM fest. Hat Jemand eine Idee wie ich das lösen kann?

Ich habe eine Struktur um EEPROM liegen:
Code
// ZKS User
//
tZKSUser    = record
                 strCode        : string[6];  // Code für PinCode
                 wFreigabe      : word;     // .0  Leser 1
                                            // .1  Leser 2
                                            // .2  Leser 3
                                            // .3  Leser 4
                 LegicCode      : array[0..9] of byte;  // Nutzendaten RF Karte
                 wFunktionUser  : word;     // .0  User Aktiv
                                            // .1  Kurzzeit
                                            // .2  GMS-Dauer
                                            // .3  PinCode
                                            // .4  RFID
               end;
// ZKS User Array
tZKSUserArray    = Array[1..10] of tZKSUser;

VAR
...
{$EEPROM}
//Structconst
 Cfg1     :   TPVSConfig1;
 Cfg2     :   TPVSConfig2;
 Cfg3     :   TPVSConfig3;
 Cfg4     :   TPVSConfig4;

 IPConfig   [EEpromEnd- (sizeof(tZKSLeserArray)+ sizeof(tZKSUserArray)+ sizeof(tIPConfig)+ 64)] : tIPConfig;
 CfgZKSUser [EEpromEnd- (sizeof(tZKSLeserArray)+ sizeof(tZKSUserArray)+ 64)]                    : tZKSUserArray;
 CfgLeser   [EEpromEnd- (sizeof(tZKSLeserArray)+ 64)]                                           : tZKSLeserArray;

 BSysRun   [EEpromEnd-48] : boolean;  // Zustand Run / Stop
 BSysWDOff [EEpromEnd-47] : boolean;  // Watchdog AUS



Aufrufen tu ich es dann so:
Code
     DispGetPin(@CfgZKSUser[iMenu].strCode, 'ZKS-User'+IntToStr(iMenu)+': PinCode');


Meine Funktion (Ausschnitt):
Code
procedure DispGetPin( sPinP : pointer to string; const sLogStr : string[41]);
var
  sPWStr,
  sGetStr   : string[6];

begin
   sPWStr:= EEPromPtr(sPinP)^;  // Ziehe PinCode in lokalen Speicher

<...Abarbeitung...>

//Übergabe
      EEPromPtr(sPinP)^:= sPWStr; // Ziehe PinCode
... 
end DispGetPin;


Leider wird der String nicht dort abgelegt wo er sollte, die Struktur ist deutlich weiter hinten im EEPROM. Aber leider legt er den eingegeben Pincode direkt am Anfang vom EEPROM an und überschreibt dir dort vorhandenen Parameter?

Also scheint es so, als ob der Pointer hier "0" ist, ist das evtl. ein Fehler von mir wegen dem Array?
Code
@CfgZKSUser[iMenu].strCode


Wo habe ich hier meinen Denkfehler?

Thorsten
You must be logged in or your permissions are to low to see this Attachment(s).
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Re: Word aus Record im EEPROM als VAR in Procedure übergeben?

 · 
Posted: 10.10.2018 - 20:09  ·  #5
Hallo rolf,

ich bin gerade etwas verwundert:
Code
         DebugOut('Test2: '+IntToStr( word(sPinP) ));  // OK
         DebugOut('Test3: '+IntToStr( word(EEPromPtr(sPinP)) ));  // OK


Beim Test 2 erhalte ich 3809 und sobald ich die Kennung EEPromPtr() nutze ist der Wert 0

Hier stimmt doch was nicht!

Thorsten
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: Word aus Record im EEPROM als VAR in Procedure übergeben?

 · 
Posted: 10.10.2018 - 21:41  ·  #6
scheint ein Bug zu sein. Hier mein Testcode dazu

Code

program test;

Device = mega128, VCC=5;

Import Serport;
From System Import;

Define
  ProcClock      = 16000000;       {Hertz}
  StackSize      = 256, iData;
  FrameSize      = 256, iData;
  SerPort        = 19200;

Implementation

{$EEPROM}
structconst
  padding : array[1..64] of byte = (
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  );
  dummy : string[5] = 'Dummy';
  
procedure test(stringPointer : pointer to string);
begin
  EEpromPtr(stringPointer)^ := 'Test';
  loop
  endloop;
end;

begin
  test(@dummy);
end.
You must be logged in or your permissions are to low to see this Attachment(s).
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Re: Word aus Record im EEPROM als VAR in Procedure übergeben?

 · 
Posted: 11.10.2018 - 10:55  ·  #7
Hallo Thomas,

Danke.
Das scheint aber nur beim String das Problem zu sein, bei Word oder Byte funktioniert es bei mir.

Ich habe jetzt erstmal ein Workaround gemacht, vielleicht kann rolf bei Gelegenheit mal schauen.

Code
CfgZKSUser[iMenu].strCode:= DispGetPin(CfgZKSUser[iMenu].strCode, 'ZKS-User'+IntToStr(iMenu)+': PinCode');


und
Code
//-------------------------------------------------------------
// Pincode eingabe über Display mit verdeckten Zahlen '*'
// Übergabe:
// - sPin    : string // aktueller PIN aus dem EEPROM
// - sLogStr : string // Eintrag für Logbuch auf SD-Card, nach Änderung
// Rückgabe:
// - string // Neuer PINCODE
//
function DispGetPin( sPin : string[6]; const sLogStr : string[41]):string[6];
var
...

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

Re: Word aus Record im EEPROM als VAR in Procedure übergeben?

 · 
Posted: 15.10.2018 - 00:57  ·  #8
@Thomas, Thorsten,

das String -> EEprom Problem sollte jetzt beseitigt sein.
Und um das Problem Word -> EEprom werde ich jetzt angehen.

rolf
  • 1
  • 2
  • 3
  • Page 1 of 3
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   141   155 · Page-Gen-Time: 0.029834s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI