closed

Loginbox

Please enter your username and password into the following fields to log in.


  • Username:
  • Password:
  •  
  • Auto log in on every visit.


  •  

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



pvs-deck offline
Schreiberling
Avatar
Gender: male
Location: GERMANY 
Age: 47
Posts: 907
Registered: 02 / 2009
Homepage Private message
Subject: Word aus Record im EEPROM als VAR in Procedure übergeben?  -  Posted: 11.05.2018 - 20:55   -  
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
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
This post has been edited 1-times. Last edit: 11.05.2018 - 20:58 by pvs-deck.
go down go up
rh offline
Administrator
Avatar
Gender: male
Location: GERMANY  Germany
Age:
Posts: 5334
Registered: 03 / 2002
Homepage Private message
Subject: Re: Word aus Record im EEPROM als VAR in Procedure übergeben?  -  Posted: 12.05.2018 - 11:39   -  
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
Cars don't buy cars -- Autos kaufen keine Autos.
Henry Ford
go down go up
pvs-deck offline
Schreiberling
Avatar
Gender: male
Location: GERMANY 
Age: 47
Posts: 907
Registered: 02 / 2009
Homepage Private message
Subject: Re: Word aus Record im EEPROM als VAR in Procedure übergeben?  -  Posted: 14.05.2018 - 08:13   -  
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
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
This post has been edited 1-times. Last edit: 14.05.2018 - 08:15 by pvs-deck.
go down go up
pvs-deck offline
Schreiberling
Avatar
Gender: male
Location: GERMANY 
Age: 47
Posts: 907
Registered: 02 / 2009
Homepage Private message
Subject: Re: Word aus Record im EEPROM als VAR in Procedure übergeben?  -  Posted: 10.10.2018 - 13:32   -  
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).
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
This post has been edited 1-times. Last edit: 10.10.2018 - 13:33 by pvs-deck.
go down go up
pvs-deck offline
Schreiberling
Avatar
Gender: male
Location: GERMANY 
Age: 47
Posts: 907
Registered: 02 / 2009
Homepage Private message
Subject: Re: Word aus Record im EEPROM als VAR in Procedure übergeben?  -  Posted: 10.10.2018 - 20:09   -  
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
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
Thomas.AC offline
Benutzer
Avatar
Gender: n/a
Location: n/a 
Age: 37
Posts: 195
Registered: 07 / 2013
Private message
Subject: Re: Word aus Record im EEPROM als VAR in Procedure übergeben?  -  Posted: 10.10.2018 - 21:41   -  
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).
go down go up
pvs-deck offline
Schreiberling
Avatar
Gender: male
Location: GERMANY 
Age: 47
Posts: 907
Registered: 02 / 2009
Homepage Private message
Subject: Re: Word aus Record im EEPROM als VAR in Procedure übergeben?  -  Posted: 11.10.2018 - 10:55   -  
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
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
rh offline
Administrator
Avatar
Gender: male
Location: GERMANY  Germany
Age:
Posts: 5334
Registered: 03 / 2002
Homepage Private message
Subject: Re: Word aus Record im EEPROM als VAR in Procedure übergeben?  -  Posted: Yesterday at 00:57   -  
@Thomas, Thorsten,

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

rolf
Cars don't buy cars -- Autos kaufen keine Autos.
Henry Ford
go down go up
pvs-deck offline
Schreiberling
Avatar
Gender: male
Location: GERMANY 
Age: 47
Posts: 907
Registered: 02 / 2009
Homepage Private message
Subject: Re: Word aus Record im EEPROM als VAR in Procedure übergeben?  -  Posted: Yesterday at 10:03   -  
Hallo rolf,

bei WORD und BYTE habe ich das Problem nicht.

Mit Deinem letzten Update V5.09.47 stimmt was nicht.

Wenn ich mein aktuelles Projekt damit übersetze läuft gar nichts mehr richtig und ich habe ständig Abstürze.

Nachdem ich die V 5.09.45 wieder installiert habe sieht es wieder normal aus.
Ich glaube da ist was schief gegangen :-)

Thorsten
You must be logged in or your permissions are to low to see this Attachment(s).
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
This post has been edited 5-times. Last edit: Today at 11:01 by pvs-deck.
go down go up
pvs-deck offline
Schreiberling
Avatar
Gender: male
Location: GERMANY 
Age: 47
Posts: 907
Registered: 02 / 2009
Homepage Private message
Subject: Re: Word aus Record im EEPROM als VAR in Procedure übergeben?  -  Posted: Today at 11:02   -  
Hallo rolf,

hast Du das mit Deinem Update .47 gelesen?

Thorsten
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
rh offline
Administrator
Avatar
Gender: male
Location: GERMANY  Germany
Age:
Posts: 5334
Registered: 03 / 2002
Homepage Private message
Subject: Re: Word aus Record im EEPROM als VAR in Procedure übergeben?  -  Posted: Today at 14:30   -  
Hallo Thorsten
ich bin etwas schockiert!
Aber "tut nicht" hilft mir nicht weiter. Wie immer
rolf
Cars don't buy cars -- Autos kaufen keine Autos.
Henry Ford
go down go up
 


Registered users in this topic
Currently no registered users in this section

Delete cookies of this forum  •  FAQ / Help  •  Team page  •  Imprint   |  Local time: 16.10.2018 - 18:54