User Tools

Site Tools


start:eti:carte:sources:usmall2

uSmall_2.pas

UNIT Usmall_2;
 {-----------------------------------------------------------------------------
  NOM DE L'UNITE : USMALL_2.PAS
  BUT            : Test du composant PIT8254
  AUTEUR         : Michael Amarantidis / Stéphane Claus
  DATE           : Février / Mars 1997
 
  MODIFIE LE     :
  RAISON         :
 
  REMARQUES      : - Cette unité est une version (très) light du programme
                     ETIPCBUS.
                   - Aucun control n'est effectué, et il peut y avoir des
                     plantée lors de l'utilisation.
                   - Une fois le générateur lancé, il n'est plus possible de
                     l'arrêter !
 -----------------------------------------------------------------------------}
 
 
{=============================================================================}
INTERFACE   {============================================== I N T E R F A C E }
{=============================================================================}
 
 
USES
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, DigDisp, StdCtrls, Buttons, Spin, ExtCtrls,
  UAlnEdit, Vcl8254, Prevchek;
 
 
TYPE
  TfrmMain = CLASS(TForm)
    PIT8254: TPIT8254;
    bitbtnFermer: TBitBtn;
    grpbxGenerateur: TGroupBox;
    grpbxFacteurDivision: TGroupBox;
    lblFact1: TLabel;
    lblFact10: TLabel;
    lblFact100: TLabel;
    lblFact1000: TLabel;
    lblFact10000: TLabel;
    spnbtnFacteur1: TSpinButton;
    spnbtnFacteur10: TSpinButton;
    spnbtnFacteur100: TSpinButton;
    spnbtnFacteur1000: TSpinButton;
    spnbtnFacteur10000: TSpinButton;
    aedtFacteur: TAlignEdit;
    rgrpCompteur: TRadioGroup;
    grpbxFrequence: TGroupBox;
    lblFreqReelle: TLabel;
    lblFreqDesiree: TLabel;
    lblHz1: TLabel;
    lblHz2: TLabel;
    spnbtnChangeFreq: TSpinButton;
    aedtFreqVoulue: TAlignEdit;
    aedtFreqReelle: TAlignEdit;
    grpbxQuartz: TGroupBox;
    lblQuartz: TLabel;
    OneInstance1: TOneInstance;
    pnlInfos: TPanel;
    lblNomProjet: TLabel;
    lblNomProjet2: TLabel;
    lblAuteurs: TLabel;
    PROCEDURE FormActivate(Sender: TObject);
    PROCEDURE spnbtnFacteurDownClick(Sender: TObject);
    PROCEDURE rgrpCompteurClick(Sender: TObject);
    PROCEDURE spnbtnFacteurUpClick(Sender: TObject);
    PROCEDURE aedtFreqVoulueChange(Sender: TObject);
    PROCEDURE aedtFacteurChange(Sender: TObject);
  PRIVATE
    { Private-déclarations }
  PUBLIC
    { Public-déclarations }
  END; {CLASS}
 
 
VAR
  frmMain: TfrmMain;
 
 
{=============================================================================}
IMPLEMENTATION   {================================= I M P L E M E N A T I O N }
{=============================================================================}
 
 
{$R *.DFM}
 
 
VAR
  NoCompteurChoisi : SHORTINT;               { Choix d'un des trois compteurs }
 
 
PROCEDURE TfrmMain.FormActivate(Sender: TObject);
{ BUT: Rafrâichit les infos lors de l'affichage de la fiche }
VAR
  Facteur : WORD;
BEGIN
  CASE rgrpCompteur.ItemIndex OF
    0 : BEGIN
          PIT8254.ModeCompteur0 := mcGenerateur;
          Facteur := PIT8254.Compteur0;
        END; {BRANCH OF CASE}
    1 : BEGIN
          PIT8254.ModeCompteur1 := mcGenerateur;
          Facteur := PIT8254.Compteur1;
        END; {BRANCH OF CASE}
    2 : BEGIN
          PIT8254.ModeCompteur2 := mcGenerateur;
          Facteur := PIT8254.Compteur2;
        END; {BRANCH OF CASE}
  END; {CASE OF}
  aedtFacteur.Text := '';
  aedtFreqReelle.Text := '';
  { Quartz }
  lblQuartz.Caption := FloatToStr(PIT8254.Quartz) + '[Hz]';
END; {PROCEDURE FormActivate}
 
 
PROCEDURE TfrmMain.spnbtnFacteurDownClick(Sender: TObject);
{ BUT: Diminue le facteur de division => Augmente la fréquence }
VAR
  Facteur : LONGINT;
BEGIN
  CASE NoCompteurChoisi OF
    0 : Facteur := PIT8254.Compteur0;
    1 : Facteur := PIT8254.Compteur1;
    2 : Facteur := PIT8254.Compteur2;
  END; {CASE OF}
  Dec(Facteur, Abs((Sender AS TSpinButton).Tag));
  IF Facteur < 2 THEN Facteur := 2;
  CASE NoCompteurChoisi OF
    0 : PIT8254.Compteur0 := Facteur;
    1 : PIT8254.Compteur1 := Facteur;
    2 : PIT8254.Compteur2 := Facteur;
  END; {CASE OF}
  aedtFacteur.Text := IntToStr(Facteur);
  aedtFreqReelle.Text := FloatToStr(PIT8254.Quartz / Facteur);
  IF (Sender AS TSpinButton).Tag < 0 THEN BEGIN
    aedtFreqVoulue.Text := FloatToStr(PIT8254.Quartz / Facteur);
  END; {IF}
END; {PROCEDURE spnbtnFacteurDownClick}
 
 
PROCEDURE TfrmMain.spnbtnFacteurUpClick(Sender: TObject);
{ BUT: Diminue le facteur de division => Augmente la fréquence }
VAR
  Facteur : LONGINT;
BEGIN
  CASE NoCompteurChoisi OF
    0 : Facteur := PIT8254.Compteur0;
    1 : Facteur := PIT8254.Compteur1;
    2 : Facteur := PIT8254.Compteur2;
  END; {CASE OF}
  Inc(Facteur, Abs((Sender AS TSpinButton).Tag));
  IF Facteur > 65535 THEN Facteur := 65535;
  CASE NoCompteurChoisi OF
    0 : PIT8254.Compteur0 := Facteur;
    1 : PIT8254.Compteur1 := Facteur;
    2 : PIT8254.Compteur2 := Facteur;
  END; {CASE OF}
  aedtFacteur.Text := IntToStr(Facteur);
  aedtFreqReelle.Text := FloatToStr(PIT8254.Quartz / Facteur);
  IF (Sender AS TSpinButton).Tag < 0 THEN BEGIN
    aedtFreqVoulue.Text := FloatToStr(PIT8254.Quartz / Facteur);
  END; {IF}
END; {PROCEDURE spnbtnFacteurUpClick}
 
 
PROCEDURE TfrmMain.rgrpCompteurClick(Sender: TObject);
{ BUT: Sélectionne un des compteurs pour le générateur }
VAR
  Facteur : WORD;
BEGIN
  NoCompteurChoisi := rgrpCompteur.ItemIndex;
  CASE NoCompteurChoisi OF
    0 : BEGIN
          PIT8254.ModeCompteur0 := mcGenerateur;
          Facteur := PIT8254.Compteur0;
        END; {BRANCH OF CASE}
    1 : BEGIN
          PIT8254.ModeCompteur1 := mcGenerateur;
          Facteur := PIT8254.Compteur1;
        END; {BRANCH OF CASE}
    2 : BEGIN
          PIT8254.ModeCompteur2 := mcGenerateur;
          Facteur := PIT8254.Compteur2;
        END; {BRANCH OF CASE}
  END; {CASE OF}
  { Affiche les infos }
  aedtFacteur.Text := IntToStr(Facteur);
  aedtFreqReelle.Text := FloatToStr(PIT8254.Quartz / Facteur);
  { Active les autres contrôles }
  grpbxFacteurDivision.Enabled := TRUE;
  grpbxFrequence.Enabled := TRUE;
END; {PROCEDURE rgrpCompteurClick}
 
 
PROCEDURE TfrmMain.aedtFreqVoulueChange(Sender: TObject);
{ BUT: Change de fréquence, en prenant celle que l'utilisateur désire }
VAR
  Frequence  : EXTENDED;
  FacteurSup : LONGINT;
  FacteurInf : LONGINT;
  Facteur    : LONGINT;
  FreqSup    : REAL;
  FreqInf    : REAL;
BEGIN
  TRY
    {-- Lit la fréquence saisie }
    Frequence := StrToFloat(aedtFreqVoulue.Text);
    {-- Hors limite ? }
    IF Frequence > (PIT8254.Quartz / 2) THEN BEGIN
      Frequence := PIT8254.Quartz / 2;
    END; {IF}
    IF Frequence < (PIT8254.Quartz / 65535) THEN BEGIN
      Frequence := PIT8254.Quartz / 65535;
    END; {IF}
    {-- Cherche le facteur de division le plus proche }
    FacteurSup   := Round(PIT8254.Quartz / Frequence);
    FacteurInf   := Trunc(Int(PIT8254.Quartz / Frequence));
    {-- Calcule les fréquence avec les facteurs trouvés précédemment }
    FreqSup := PIT8254.Quartz / FacteurInf;
    FreqInf := PIT8254.Quartz / FacteurSup;
    {-- Recherche le facteur de division qui nous permet d'être le plus proche
        de la fréquence voulue }
    IF ((Frequence = FreqSup) OR
       ((FreqSup - Frequence) < (Frequence - FreqInf))) THEN BEGIN
      Facteur := FacteurInf;
    END {IF}
    ELSE IF ((Frequence = FreqInf) OR
            ((FreqSup - Frequence) > (Frequence - FreqInf))) THEN BEGIN
      Facteur := FacteurSup;
    END; {ELSE IF}
    {-- Est-ce que les facteurs trouvés sont acceptables ?}
    IF Facteur < 2 THEN Facteur := 2;
    IF Facteur > 65535 THEN Facteur := 65535;
    {-- Change la fréquence et affiche }
    CASE NoCompteurChoisi OF
      0 : PIT8254.Compteur0 := Facteur;
      1 : PIT8254.Compteur1 := Facteur;
      2 : PIT8254.Compteur2 := Facteur;
    END; {CASE OF}
    {-- Affiche les infos }
    aedtFacteur.Text := IntToStr(Facteur);
    aedtFreqReelle.Text := FloatToStr(PIT8254.Quartz / Facteur);
    {-- Couleur standard }
    aedtFreqVoulue.Color := clWindow;
  EXCEPT
    {-- Valeur incorrecte }
    aedtFreqVoulue.Color := clRed;                          { On voit rouge ! }
  END; {TRY}
END; {PROCEDURE aedtFreqVoulueChange}
 
 
PROCEDURE TfrmMain.aedtFacteurChange(Sender: TObject);
{ BUT: Change de facteur de division en saisissant simplement le facteur }
VAR
  Facteur : LONGINT;
BEGIN
  TRY
    { It's Red }
    aedtFacteur.Color := clRed;
    Facteur := StrToInt(aedtFacteur.Text);
    IF ((Facteur >= 2) AND (Facteur <= 65535)) THEN BEGIN
      aedtFreqReelle.Text := FloatToStr(PIT8254.Quartz / Facteur);
      CASE NoCompteurChoisi OF
        0 : PIT8254.Compteur0 := Facteur;
        1 : PIT8254.Compteur1 := Facteur;
        2 : PIT8254.Compteur2 := Facteur;
      END; {CASE OF}
      aedtFacteur.Color := clWindow;
    END; {IF}
  EXCEPT
    { It's Red }
    aedtFacteur.Color := clRed;
  END; {TRY}
END; {PROCEDURE aedtFacteurChange}
 
 
INITIALIZATION
  NoCompteurChoisi := -1;
END. {UNIT Usmall_2}
This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
start/eti/carte/sources/usmall2.txt · Last modified: 2016/07/24 03:57 by admin