Allego un esempio di programma in ST che effettua la gestione che necessiti, ho realizzato due diverse versioni, una che gestisce la rampa con un array ad indice ed un’altra che gestisce la rampa con i puntatori.
Ecco la soluzione ad indice (Tempo di esecuzione 507 uSec).
FOR IDx:=0 TO 500 BY 1 DO
(* Se valore minore del preset incremento valore. *)
(* Se valore maggiore del preset decremento valore. *)
IF (Value[IDx] <> Preset[IDx]) THEN
IF Value[IDx] < Preset[IDx] THEN
Value[IDx]:=Value[IDx]+1;
ELSE
Value[IDx]:=Value[IDx]-1;
END_IF;
END_IF;
END_FOR;
Ecco la soluzione a pointer (Tempo di esecuzione 681 uSec).
ValuePtr:=ADR(Value); (* Value pointer *)
PresetPtr:=ADR(Preset); (* Preset pointer *)
FOR IDx:=0 TO 500 BY 1 DO
(* Se valore minore del preset incremento valore. *)
(* Se valore maggiore del preset decremento valore. *)
IF (@ValuePtr <> @PresetPtr) THEN
IF (@ValuePtr < @PresetPtr) THEN
@ValuePtr:=@ValuePtr+1;
ELSE
@ValuePtr:=@ValuePtr-1;
END_IF;
END_IF;
ValuePtr:=ValuePtr+2; (* Value pointer *)
PresetPtr:=PresetPtr+2; (* Preset pointer *)
END_FOR;
Per avere l’incremento ogni 5 mSec occorre settare il tempo di esecuzione della task fast a 5 mSec usando la funzione SysSetTaskLpTime. Per verificare il tempo di esecuzione occorre mettere nella finestra di watch la variabile SysTFastExTmMax.
Attenzione! Se il tempo di esecuzione della task fast supera il tempo definito il programma và in errore e l’esecuzione si arresta. Allego programma per download.