Vous êtes sur la page 1sur 5

D ELPHI

cours

POUR ÉLECTRONICIENS
Partie 8 : le DelphiStamp
Detlef Overbeek, Anton Vogelaar et Siegfried Zuhr

Les vacances d’été passées, il est


plus que temps de se remettre au
travail. Ceci vaut également pour
ceux qui suivent le cours Delphi.
Nous allons, ce mois-ci, nous
intéresser au DelphiStamp, un
contrôleur matériel universel embarquant
son BIOS. Ce contrôleur, doté bien
évidemment d’un certain nombre d’interfaces
matériel, est autonome mais peut aussi être piloté depuis un PC. Personne ne vous interdit
non plus de définir votre propre interface.

Le DelphiStamp est un minuscule contrôleur-gigogne uni- une partie du serveur M485. Il est possible, par le biais
versel et rapide doté d’une mémoire de bonne taille et de ce serveur, d’accéder à la RAM, la Flash, l’EEPROM,
de fonctions d’entrées et de sorties. Le BIOS embarqué aux registres et registres d’E/S, un moyen très puissant
permet une exécution autonome sur le DelphiStamp de pour le débogage de programmes. Le serveur sert égale-
progiciels développés en Delphi. Mais il est également ment à la communication avec une interface utilisateur
possible d’utiliser une application PC écrite en Delphi en graphique (GUI = Graphic User Interface) externe.
tant qu’organe de commande pour une application exé- Les pilotes résidents servent au support des LED et cava-
cutée par le DelphiStamp. liers embarqués, de l’affichage à 16 caractères, d’un
moteur pas à pas bipolaire, d’un bouton-poussoir, de
Le ATMega128 mis à contribution est un processeur RISC 7 LED montées en forme de dé et d’un potentiomètre,
travaillant à une fréquence d’horloge de 14,745 6 MHz. mais ils servent également au serveur d’interface. Ce der-
La plupart des instructions sont exécutées en une unique nier veille à ce que l’état du matériel connecté cor-
impulsion d’horloge de quelque 68 ns. Le code de pro- responde au contenu d’un enregistrement de données
gramme se trouve dans la mémoire Flash. Comme les (data record) en RAM. Ce processus de répète 20 fois
instructions, exception faite des instructions JMP, LDS et par seconde. On dispose d’une DLL permettant de com-
STS, ont une taille de 2 octets, ce ne sont pas moins de muniquer avec cet enregistrement depuis une application
quelque 60 000 lignes de programme en assembleur Delphi (M485.dll). C’est ainsi que le DelphiStamp peut
que l’on peut mettre dans la mémoire Flash. Les derniers faire office d’interface.
8 Koctets sont protégés et contiennent le BIOS.
Le BIOS comporte 4 modules : le chargeur (loader), le
serveur M485, les pilotes résidents et le serveur d’inter- Configurations matérielles
face (cf. figure 1). Le chargeur permet de stocker du Nous avons, de manière à permettre de se faire rapide-
code objet dans la mémoire Flash en passant par l’inter- ment la main sur le DelphiStamp, imaginé différentes
face RS-232. La communication entre le DelphiStamp et configurations matérielles standard au niveau des possi-
le PC se fait selon le protocole M485. Le chargeur est bilités d’E/S (cf. figure 2). On pourra, si tant est que le

70 elektor - 10/2005
matériel externe est branché en respect de ce schéma,
mettre à contribution le serveur d’interface, les pilotes
standard et un programme de test des Entrées/Sorties.
On pourra, par exemple, brancher un moteur pas à pas
bipolaire à pas de 1,8 ° en mode demi-pas (soit
400 pas/tour). Il est également possible de « lire » un
potentiomètre (tension comprise entre 0 et 1,56 V) et de
piloter 7 LED. La ligne RS485 permet de réaliser un
réseau d’une longueur maximale de 1 000 mètres
auquel on pourra connecter un maximum de 128 appa-
reils. Un affichage alphanumérique permet de visualiser
un maximum de 16 caractères.
Figure 1. Structuration des différentes unités fonctionnelles
au coeur du DelphiStamp.
DelphiStamp en contrôleur
En mode contrôleur il n’y a pas, en utilisation normale,
de liaison avec un PC. Ce n’est pas une mauvaise idée, rents algorithmes de pilotage sont écrits sous forme d’uni-
si l’on veut être assuré que le contrôleur fonctionne cor- tés distinctes. Dès que la simulation travaille correcte-
rectement, de développer et de simuler sur PC le progi- ment, le compilateur croisé PasAvr convertit les unités de
ciel du contrôleur. Une forme Delphi dotée de compo- pilotage en un fichier .hex binaire qui comporte le code
sants visuels se substituera au matériel externe. Les diffé- objet pour le DelphiStamp. Le programme Mon485

Caractéristiques
 ATMega128 : 128 Koctets de Flash – 4 Koctets de RAM – 4 Koctets d’EEPROM – 4 temporisateurs ( timers) – CAN
(Convertisseur A/N) 10 bits avec 15 kéch/s – Comparateur analogique – Mode de sommeil – 2 UARTS pour RS-232
et RS-485 – I2C – 25 entrées/sorties numériques – Interface JTAG et ISP
 Tension d’alimentation 6 à 9 V CC (régulée sur la carte, ne convient pas à des charges externes)
 Consommation de courant : 10 µA en mode de sommeil
 Specs des E/S numériques : 30 mA de source @ chute de 1 V, 40 mA de drain @ chute de 1 V
 On trouvera la fiche de caractéristique à l’adresse : www.atmel.com/dyn/resources/prod_documents/doc2467.pdf.
 Pour une description exhaustive de chacune des instructions :
http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf

+5V

LCD
D5 D1
VDD
VSS

R/W
VO
RS

D0
D1
D2
D3
D4
D5
D6
D7
E

GND
RX
TX

1 2 3 4 5 6 7 8 9 10 11 12 13 14
JP1
+5V
1 32 D6 D4 D2
TX VDD
R1 2 31 R1
RX PB0 390 Ω
47 Ω

3 30 R2
PE7 PB1 390 Ω
4 29 R3
PE6 PB2 390 Ω
5 28 R4
PE5 PB3 390 Ω
P1 6 DELPHI 27 R5
PE4 PB4 390 Ω
100k 7 STAMP 26 R6 D7 D3
PE3 PB5 390 Ω
R2 8 25 R7
PE2 PB6 390 Ω
47 Ω

9 24
PF0
10 23
+5V PF1
11 22
PD0
12 21
+VDD PF3
1A R1 13 20
PA0
47 Ω

14 19 JP2
M PA1
15 18 S1
C1 1B P1 PA2 845A 845A
16 17
C1 GND 845B 845B
+5V 1000µ 40V 2A 2B
10k 10n
1 6 7 16 11
R1
Q1A
Q1B

Q2A
Q2B

VBB
34k

10 14
VCC EN2
2
8 PH1
REF 3
EN1
9 15
RC PH2

SEN1 GND GND SEN2


5 4 13 12
AA3966SA
R2 R3 R4 R5
C2
0Ω68

0Ω68
56k
11k

680p 3W 3W

040240 - 8 - 13

Figure 2. Les différentes options d’E/S du DelphiStamp. Avec les pilotes standard, l’interfaçage de ce matériel ne pose pas de problème.

10/2005 - elektor 71
Compilation croisée et transfert
Demo.prj est le « containeur » de fichiers pour le reste
des fichiers du projet de démonstration du contrôleur du
DelphiStamp (cf. figure 4).
UMain.pas comporte le code « power-on » et tous les
vecteurs d’interruption. Cette unité est identique pour
quasiment toutes les applications Delphi et est fournie
sous forme de modèle (template) avec le set.
Au niveau des fonctionnalités, Drivers.pas est similaire à
UDrivers.pas, que nous utilisons avec le programme de
simulation. L’implémentation est différente vu qu’il s’agit
cette fois de piloter du vrai matériel. On pourra, pour le
matériel standard, utiliser les pilotes résidents présents
dans le BIOS.
UControl.pas intègre les fonctionnalités du contrôleur et
est une copie de UControl.pas du simulateur.
PasAvr est le compilateur croisé fourni avec le set.
PasAvr.exe convertit le projet Demo.prj en un fichier,
Demo.hex. Le programme ne connaît pas de limitation de
Figure 3. PDemo.prj est le containeur comportant tous les fichiers durée d’utilisation ni de taille du fichier .hex produit.
faisant partie du projet de simulation Delphi. PasAvr possède son propre IDE et simulateur pour l’écri-
ture de programmes en Pascal et assembleur hors du
cadre de Delphi.
Demo.hex contient le code objet de format Inter hex pro-
fourni avec l’ensemble du DelphiStamp écrit ce fichier duit et destiné au contrôleur ATMega128.
.hex dans le mémoire Flash du DelphiStamp, le pro- Le programme moniteur Mon485 accompagnant le set
gramme étant ensuite lancé. Le contrôleur travaille en permet de communiquer avec le loader sur le DelphiS-
autonome et la liaison vers le PC est coupée. tamp. Cet outil se charge de faire en sorte que le code
objet fourni soit programmé dans la mémoire Flash. Le
programme sera lancé soit par le biais de Mon485 soit
Simulation par une réinitialisation du DelphiStamp.
PDemo.prj est le « containeur » dans lequel se trouvent
tous les fichiers faisant partie du projet de simulation (cf.
figure 3). Le DelphiStamp en interface
Commençons par décrire le projet à réaliser. Pour piloter
DMain.pas est un module de données (datamodule) ne un moteur pas à pas il doit y avoir, sur le PC, une forme
pouvant de ce fait pas comporter de composants visuels faisant office de console de commande. Le moteur est
tels que le TTimer. Ce module simule le vecteur d’alimen- relié au DelphiStamp au travers d’un circuit de com-
tation (Power On) et les autres interruptions par le biais mande (driver). La forme comporte un potentiomètre à
d’événements Delphi. glissière permettant de piloter la position de 0 à 360 °,
FGUI.pas est du type TForm. Il peut comporter des com- organe épaulé par 3 boutons numériques permettant un
posants visuels. Ces composants visuels se substituent le positionnement rapide à 0, 180 et 360 °. Nous avons en
matériel externe au contrôleur tels qu’interrupteurs, LED, outre connecté au DelphiStamp un affichage LCD permet-
LCD, moteur etc. tant une lecture de l’angle paramétré.
UDrivers.pas comporte les pilotes permettant la com- Le programme de pilotage tournant sur le PC est écrit en
mande de FGUI.pas. Delphi. On a, sur le DelphiStamp, exécution d’un serveur
UControl.pas intègre l’algorithme de commande et est d’interface chargé d’assurer une synchronisation entre le
compatible avec le compilateur croisé PasAvr. matériel connecté au système et les paramètres écrits par

Figure 4. Demo.prj est le fichier-containeur pour le reste des fichiers du projet de démonstration du contrôleur.

72 elektor - 10/2005
le programme tournant sur le PC vers le DelphiStamp.
Il est important, dans le cas de programmes com-
plexes, si l’on veut réduire au maximum le risque d’er-
reur, de découper ceux-ci en blocs logiques. Delphi
propose à cet effet les pièces suivantes : unit, library,
form et datamodule.
Le projet Delphi PInf1.dpr est subdivisé en 5 parties
(cf. figure 5).
– Le datamodule DMain.pas est, outre une unit, un
containeur pour des composants non visuels tels que tem-
porisateurs. Ce datamodule met à disposition un power-
on event et un temporisateur de manière à pouvoir four-
nir de nouvelles informations au DelphiStamp toutes les
200 ms.
– La forme UGUI.pas est une unit pouvant intégrer des
composants visuels. Cette forme comporte un potentiomè-
tre à glissière TTrackBar et 3 TButton. Ces boutons sont
combinés au potentiomètre à glissière en vue d’obtenir Figure 5. Le projet Delphi PInf1.dpr se subdivise en 5 parties.
un positionnement rapide à 0, 180 et 360 °.
– L’unit UControl.pas contient la fonctionnalité de l’appli-
cation. La procédure ControlInit initialise l’ensemble du
matériel lors de l’application de la tension d’alimentation Version en Delphi
(power-on). La procédure ControlExe rafraîchit le serveur Comme d’habitude nous démarrons au coeur de l’IDE
d’interface du DelphiStamp toutes les 200 ms. La commu- Delphi, un nouveau projet par:
nication avec le DelphiStamp et le GUI se fait par le biais Fichier->Nouveau->Application
des pilotes de l’unité UDrivers.pas. et on l’enregistre sur le disque dur par :
– L’unit UDrivers.pas comporte les procédures de com- Fichier->Tout enregistrer-> <Directory\DS Inf1>
mande de base pour la GUI et le DelphiStamp. Comme UGUI.pas et PInf1.dpr
cette unité est rarement modifiée, elle est réutilisable à Mettre sur la forme :
loisir. Le CD-ROM accompagnant le set comporte une Standard | Label
unité standard pour la communication avec tous les maté- Win32 | TrackBar
riels standards. Standard | Button (en 3 exemplaires)
– M485.DLL est une library unit réutilisable pour différen- La forme a alors l’aspect qu’illustre la figure 6.
tes applications. Cette bibliothèque également fournie
comporte le logiciel pour la communication avec le Del- À l’aide de l’Inspecteur d’objets on modifie les propriétés
phiStamp et utilise un port RS-232 paramétrable. selon les informations du tableau 1. La forme aura alors

Tableau 1. Propriétés de la forme pour l’interface vers le potentiomètre.


Objet Propriété Valeur Remarque
Name FGUI Utiliser des dénominations signifiant
Form1
Caption Demo #1
Name LbPos
Caption 0.0
Label1 Font.Size 18 La taille passe à 18 pixels
Font.Style.fsBold True Gras
Figure 6. Nous allons placer un Label, une TrackBar
et 3 Button sur la forme. Font.Color clRed Rouge
Name TbrPos
Trackbar1 Max 400 1 tour 400 pas
Frequency 10 Subdivision d’échelle par 10 pas
Name Btn0
Button1
Caption 0
Name Btn180
Button2 Caption 180
Tag 200 180 degrés = 200 pas
Name Btn360
Button3 Caption 360
Figure 7. En s’aidant de l’Inspecteur d’objets nous modifions les
propriétés selon les indications du tableau 1. Tag 400 360 degrés = 400 pas

10/2005 - elektor 73
l’aspect que montre la figure 7. InfDta.MotorSts)
End;
L’événement OnClick de Btn0 doit être implémenté. L’évé-
nement OnClick de Btn180 et de Btn360 est le même L’affichage LCD à 16 caractères est constitué de 2 lignes
que celui du Btn0. Dans l’Inspecteur d’objets de Btn180 de 8 caractères accolées. Ces 2 lignes de 8 caractères
et de Btn360 on peut spécifier Btn0Click dans la liste doivent être envoyées indépendamment vers l’interface
déroulante de l’événement OnClick. serveur. L’envoi de ces lignes se fait uniquement en cas
Dans l’événement OnClick le potentiomètre à glissière est de modification. Cf. SLcd <-> LcdStr1 dans le code ci-
mis à la valeur du Tag qui est 0, 200 ou 400. dessous.

Procedure TFGUI.Btn0Click (Sender : TObject); Begin


(* User setting to 0, 180 or 360 degrees *) SLcd := LeftStr (S, 8); // Left half of
Begin S
TbrPos.Position := (Sender As If SLcd <> LcdStr1 Then // If left sec-
TComponent).Tag; tion changed
RefreshLabel Begin
End; LcdStr1 := SLcd;
LcdStr1 [0] := Char (Byte (LcdStr1 [0])
Nous utilisons la fonction Format pour que l’étiquette Or $80); // Set write request
(label) Composant affiche l’angle paramétré pour le DS485_Wr (9, Word (@PInfDta.LcdStr1),
moteur. La chaîne de format %.1f indique que le résultat InfDta.LcdStr1 [0]);
présente un nombre fixe de décimales, une en l’occur- LcdS1 := SLcd;
rence. La valeur à afficher se trouve entre parenthèses End;
carrées ([ ]). Le facteur *360/400 convertit les pas du SLcd := RightStr (S, 8); // Right half of
moteur en degrés. S
If SLcd <> LcdStr2 Then // If right sec-
Procedure TFGUI.RefreshLabel; tion changed
(* Update position label conform trackbar Begin
position *) LcdStr2 := SLcd;
Begin LcdStr2 [0] := Char (Byte (LcdStr2 [0])
LbPos.Caption := Format (‘%.1f’, Or $80); // Set write request
[TbrPos.Position * 360 / 400]) DS485_Wr (9, Word (@PInfDta.LcdStr2),
End; InfDta.LcdStr2);
LcdS2 := SLcd
Le DataModule UMain implémente l’événement power-on End;
dès la création de DMain. L’événement OnTimer doit End
appeler la procédure ControlExe toutes les 200 ms. Pour
cette raison, la propriété d’Interval du Timer1 est paramé- L’unit UControl intègre la fonctionnalité du programme.
trée à 200. Après compilation de ce programme le DelphiStamp est
L’unit UDrivers assure la communication de base entre réinitialisé par le biais des interrupteurs présents sur la
l’interface utilisateur et le matériel. La fonction GetSet- carte et le serveur d’interface activé.
point visualise la position du potentiomètre à glissière sur Une fois le programme démarré, le moteur pas à pas se
le UGUI exprimée en pas de moteur. laisse piloter.

Function GetSetpoint : Integer;


(* Provide sliderposition from UGUI *) Une autre application
Begin Lors de développement d’un prototype à base de contrô-
Result := FGUI.TbrPos.Position; leur, la réalisation de la console prend toujours du temps,
End; surtout l’aspect mécanique, la mise en place des instru-
ments, des ampoules, etc. Il existe, à ce stade, une alter-
La procédure IoInit assure la liaison avec le DelphiStamp. native intéressante, créer une GUI sous Delphi. Souvent il
Il est des circonstances dans lesquelles cela se traduit par est possible d’utiliser la même GUI que celle utilisée avec
un crash, en l’absence du port COM ou si ce dernier est le simulateur présenté précédemment.
occupé par un autre programme. La construction Try ... Par un lancement, dans le progiciel et selon la technique
Except intercepte cette exception, envoie un message décrite plus haut dans « DelphiStamp en contrôleur », du
d’erreur et interrompt le programme. serveur M485, il devient possible d’examiner tous les
emplacements de mémoire et d’y écrire par le biais du
Procedure IoInit; port RS-232 et de la bibliothèque M485.dll. Ces
(* Energize stepper motor and clear LCD *) moyens permettent, à peu de frais, d’implémenter une
Begin télécommande.
Try DS485_Open (ComPort); // Open a
connection with the DelphiStamp La liaison entre le PC avec application console et le
Except contrôleur peut alors se faire sans fil par utilisation de
ShowMessage (‘Error. Unable to connect l’interface RS-232 et de modules radio.
to DelphiStamp’);
Application.Terminate Pour de plus amples informations vous pourrez faire un
End; tour aux adresses www.vogelaar-electronics.com et
InfDta.MotorSts := $81; // Energize www.learningdelphi.info. Tous les codes sources sont
motor téléchargeables depuis notre site : www.elektor.fr.
DS485_Wr (1, Word (@PInfDta.MotorSts), (040240-8)

74 elektor - 10/2005