APPLICATIONSDIVERS ★ LES CHRONOMETRES DU CPC ★

Chronobasic|CPC Revue)Applications Divers

Le BASIC du CPC dispose de cinq chronomètres différents et de nombreuses fonctions et commandes pour les utiliser. A l'aide de quelques exemples courts, utiles ou parfois seulement spectaculaires, nous allons montrer leurs avantages mais aussi quelques pièges sournois dont ne parle pas le manuel.

LA BASE DE TEMPS

Tout micro-ordinateur a besoin d'une « fréquence horloge » très rapide pour le micro-processeur. Ici c'est un oscillateur à quartz qui fournit du 4 mégahertz ( = 4 millions d'impulsions par secondes). Electroniquement il est très facile de diviser une fréquence en d'autres moins "rapides", et le micro en a besoin pour fonctionner. Un des avantages de notre BASIC est de pouvoir utiliser deux d'entre elles : du 300 Hertz (300 impulsions/secondes) et du 50 Hertz (50 par secondes).

Tous les « phénomènes périodiques » tels que le clignotement d'une couleur, la cadence de répétition d'une touche, etc. sont régis au départ par cette fréquence de base de 4 Mégahertz. Comme elle est produite par un quartz elle est super fidèle.

La fonction TIME compte en trois centièmes de seconde (300 Hz), tandis que EVERY, AFTER, SPEED INK et SPEED KEY comptent en cinquantième de secondes (50Hz).

LA FONCTION TIME

C'est à la fois la plus simple et la plus utile. C'est un totaliseur (ou compteur) d'impulsions reçues en 300 Hz depuis la mise sous tension du CPC ; donc à cet instant TIME = 0. Faites PRINT TIME. Vous verrez alors à l'écran un nombre assez important. Faites à présent PRINT TIME/300/60 vous saurez alors depuis combien de minutes votre micro est allumé. On ne peut pas commander la remise à zéro de ce compteur. Ainsi TIME = 0 provoque un "Syntax error" ; on peut seulement interroger TIME, soit au clavier, soit dans un programme. Il n'y à que deux cas où TIME se met à zéro : mise sous tension et la réinitialisation du micro (par CTRL + SHIFT + ESC ou par CALL 0).

La valeur de TIME est un nombre « réel » (sur 5 octets) donc pouvant devenir très grand. Un calcul rapide indique une durée maximum (avant "over flow") de plusieurs siècles... (Si vous ne me croyez pas installez-vous confortablement et essayez...).

Très important : le comptage dans TIME est suspendu pendant que le micro lit ou enregistre sur cassette ou disquette. Vous avez sans doute remarqué que pendant ces instants le clavier est inerte, il ne mémorise même pas les touches enfoncées.

LES COMMANDES EVERY ET AFTER

Si TIME est une "fonction" BASIC (= qui renseigne), il s'agit là de "commandes". L'unité est le cinquantième de seconde (= 0.02 s). EVERY veut dire « chaque ». Lorsque l'on écrit EVERY 500,2 GOSUB 2000 cela signifie :

On met le chrono numéro 2 à 500. Aussitôt il va DECOMPTER de 500 à 0 (donc en 10 s). Arrivé à 0 il y a GOSUB 2000, il se recharge à 500 et ainsi de suite. Il y a donc un GOSUB 2000 toutes les dix secondes.

AFTER veut dire « après ». Ainsi AFTER 500,3 GOSUB 3000 signifie : On met le chrono n° 3 à 500, il décompte lui aussi, et dix secondes plus tard s'effectuera ce GOSUB 3000. Mais une seule fois I Donc la grande différence entre EVERY et AFTER c'est que seul EVERY est répétitif. Après EVERY ou AFTER il ya un GOSUB obligatoire, vous ne pouvez pas le remplacer par un GOTO. Nous avons parlé de "numéros de chro-nos" : il y en a quatre possibles 0, 1, 2 et 3. Autrement dit on peut programmer quatre actions en même temps (EVERY et AFTER). En cas de conflits entre elles (rare) la priorité va en croissant (le n° 3 est le plus prioritaire). Super important I Si on arrête le déroulement du programme par un BREAK, un END ou un INPUT, les chronos amorcés continuent leurs comptes à rebours, mais parvenus à zéro ils ne pourront effectuer leur GOSUB. Logique non ? C'est le grand piège classique. Cet exemple sera plus parlant

10 AFTER 200,3 GOSUB 1000
20 WHILE N =0;WEND
30 PRINT "FIN" 40 END
1000 N = 888:PRINT N
1010 RETURN

La ligne 20 n'arrête pas le programme, il tourne sur lui-même. Au bout de 4 secondes le GOSUB 1000 a lieu, le WEND se "débloque" et "FIN" est affiché. Pas de problème. A présent modifions la ligne 20

20 INPUT A$:PRINT A$ et RUN.

Restons longtemps (plus de 4 s) sur le ? de l'INPUT puis pressons XXX et ENTER. A l'écran on a 888,XXX et FIN. Que s'est-il passé ?

Au bout de 4 secondes le chrono 3 a voulu aller en 1000 mais l'arrêt du programme par INPUT l'en a empêché. C'est une action en attente dans le "buf-fer" du micro. L'INPUT enfin débloqué il rattrappe son retard (va en 1000 et affiche 888) puis effectue la suite (affiche XXX et FIN).

Expérience suivante : RUN puis tout de suite après (moins de 4 secondes) on tape P et ENTER. On a à l'écran P et FIN. Pas de 888. Pourquoi ? Parce que lorsque AFTER a terminé son décompte le programme avait déjà rencontré le END de la ligne 40, alors adieu le GOSUB 1000 ! Oublié à jamais... Dernière expérience : en ligne 20 remettons le WHILE N = 0:END. Tout de suite après RUN pressons la touche ESC (une fois), et attendons plus de 4 secondes. Puis pressons la barre d'espacement : instantanément apparaît 888 et FIN, car le GOSUB 1000 était prêt depuis longtemps, il n'attendait que le déblocage. Pardonnez-moi d'avoir lourdement insisté sur cela, mais il n'est pas évident de savoir que le chrono continue alors que le programme lui est bloqué I Si vous avez déjà eu des avatars avec AFTER et EVERY n'en cherchez plus la cause... Revenons à des choses plus simples avec des applications pratiques de la fonction TIME:

CHRONOMETRAGE DE LIGNES BASIC

Il vous arrive parfois de constater qu'un passage de votre programme est lent ; vous voulez essayer d'autres façons de faire plus rapides, mais comment chronométrer chacune d'elles ? En mémorisant TIME avant et après et en faisant la différence. Comme le montre le programme Chronobasic. Après l'avoir essayé ajoutez la ligne

115 IF N = 8 THEN A = 15 puis RUN 100

On voit l'effet ralentisseur d'un IF, car le temps passe de 11 à 30,7 s I (sur 464). Remplaçons N = 8 par N>8 : même temps

Remplaçons N>8 par N8. Voilà qui est bon à savoir... Donc un IF s'effectue en 2 ms (=(30,7-11 )/10000).

MONTRE BASIC

Le programme Heure contient une routine en 41000 permettant de savoir l'heure à tout moment. Par exemple pour 

enregistrer l'heure de la saisie de telle fiche ou de la sauvegarde de tel fichier : il suffirait de programmer GOSUB 41000:PRINT # 9,HEURES Les lignes 10 à 60 servent à la démonstration. Après usage faites DELETE -60 puis SAVE"HEURE",A sur votre disquette ou "cassette d'utilitaire. Vous pourrez dès lors intégrer ce module dans vos programmes par MERGE"HEURE".

Quelques explications ;

  • il faut d'abord faire la mise à l'heure (41500). MAH ! est le nombre de secondes calculé après zéro heure. On mémorise TIME en TIMO ! Ce point d'exclamation confirme qu'il s'agit de nombres "réels" (5 octets) ; c'est une précaution pour le cas où l'on aurait déjà programmé un DEFINT A-Z ou DEFINT I-N ;
  • ligne 41010 : HR ! est le nombre de secondes écoulées depuis zéro heure ;
  • lignes 41020 à 41040 : on décompose HR ! en heures (HH), minutes (MM) et secondes (SS) ;
  • ligne 41050 au-delà de 24 heures HH repart à zéro (ou au-delà de 48 heures...) ;
  • ligne 41060 grâce à DEC$ (spécialité AMSTRAD) la variable HEURE$ est formatée sur huit caractères, avec des : comme séparateurs. A noter le bug de DEC$ dans le 464 où il faut une parenthèse en plus ! C'est pour cela que le manuel du 464 ne parle pas de DEC$... Mais il existe bien.

Nota. Si vous faites fonctionner ce programme pendant plusieurs heures vous observerez peut-être un retard ou une avance de quelques secondes. C'est que votre quartz ne fait pas tout-à-fait 4 mégahertz... (quelle importance ?). Vous pouvez arrêter le programme par la touche ESC (2 fois) et le reprendre par GOTO 30, l'heure restera exacte. En revanche si vous en profitez pour faire des SAVE (ou des CAT sur disquette), il est normal que vous observiez un retard après la reprise par GOTO 30. On a déjà dit pourquoi...

UN CONTROLEUR DE RYTHME CARDIAQUE

Principe : vous pressez une touche du clavier au rythme de votre pouls, et l'écran affiche le nombre de pulsations/minute. Pour « sentir » votre pouls deux endroits faciles : au poignet dans le prolongement du pouce (plaquez votre poignet contre votre oreille). Sur le cou, à la verticale de l'oreille. Vous devez d'abtird choisir le nombre de pulsations pour la mesure, 3 ou 4 suffisent, 2 n'est pas très précis. On mesure le temps en secondes entre ces N pulsations et on divise par N-1, puis on multiplie par 60 pour obtenir les pulsations par minute. Tout simple. Quelques détails concernant le programme CPcardio :

  • évitez d'utiliser la barre d'espacement, c'est mécaniquement la moins sensible ;
  • la touche R permet de changer le nombre de pulsations par mesure ;
  • à la fin de chaque mesure le rafraîchissement de la valeur affichée est signalé par un léger bruit (ligne 2010). Si ce bruit vous agace coupez le son ;
  • dans le titre on remarque un cœur rouge, CHR$(228), qui clignote lentement grâce au SPEED INK de la ligne 4010. Il est remis à sa valeur habituelle (ainsi que INK 2) en ligne 4090. Donc quand vous quitterez le programme par un BREAK évitez d'être sur la page d'écran titre ;
  • si ce programme ne fonctionne pas, de deux choses l'une : ou bien vous vous êtes encore trompé en recopiant le listing, ou bien vous êtes déjà mort... A vous de vérifier ces deux cas.

PROGRAMMATION AVEC EVERY ET AFTER

La durée maxi (en 1/50 s) est un nombre entier, donc obligatoirement inférieur à 32 767, soit 10 minutes et 55 secondes. Si cela vous paraît trop court pour certaines applications rien ne vous empêche de programmer plusieurs AFTER en cascade.

Avant de présenter notre programme de démonstration il nous faut parier de trois commandes annexes : REMAIN, Dl et El. REMAIN (= le reste en anglais) suivi du numéro de chrono entre parenthèses a un effet destructeur : il indique le nombre d'impulsions qui lui restait à recevoir pour être à zéro, mais le simple fait de le demander arrête le chrono et le met à zéro. Exemple, on est dans un AFTER 1000,2. Si on demande PRINT REMAIN (2) ou M = REMAIN(2):PRINT M on peut obtenir 284; mais si vous le demandez une seconde fois vous aurez zéro ! Car ce chrono a été de ce fait arrêté et mis à zéro. On se sert le plus souvent de REMAIN pour mettre fin à des EVERY. Dl (= "Disable Interrupt") arrête momentanément les quatre chronos ; j'ai bien dit tous. Ils gardent leurs valeurs, ils ne demandent qu'à repartir, et pour cela c'est la commande El (= "Enable Interrupt"). Les décomptes reprennent là où Dl les avait figés.

Notre programme de démonstration combine des AFTER et EVERY. Il n'a rien d'utilitaire mais a pour but de vous montrer quelques effets spectaculaires. Pour sa compréhension nous l'avons truffé de REM ; inutile de les retaper... On explique :

  • lignes 30 à 100 un EVERY nous affiche chaque seconde les valeurs intermédiaires d'une boucle FOR NEXT. Cet EVERY est mis hors course en ligne 80. La ligne 100 provoque une pause de 4 secondes. C'est plus élégant et plus précis que l'habituel FOR I = 1 TO 4000: NEXT
  • ligne 200 à 240 : on amorce un pétard à retardement par un AFTER, puis on lance ce qui serait un fastidieux affichage des nombres N de 1 à 10 000. Heureusement cinq secondes plus tard c'est interrompu par l'AFTER, qui met N à 10000 pour en terminer avec cetti boucle ;
  • lignes 300 à 370 : trois EVERY von nous servir à mener trois actions simul tanées : trois traits vont sembler se tra cer en même temps. Illusion d'optique car ils "avancent" à tour de rôle d'ur petit bout à la fois. L'œil a alors l'impres sion que ces trois tracés sont simultanés On dit que l'ordinateur travaille er « temps partagé ».

Nos trois EVERY ont des "périodes" différentes. Ainsi les traits jaune, ciel ei rouge avancent à des vitesses différen tes. C'est le bleu ciel le plus rapide, aussi la ligne 360 attend qu'il soit arrivé er bout d'écran à droite (640 points graphiques). Ceci atteint la ligne 370 tue nos EVERY. Le tracé a pris environ 13 s (sur 464).

Oui mais au départ, ligne 320, on avait programmé un AFTER de 20 secondes qui provoquera un CLS. Donc 20-1 3 = 7 secondes après la fin du tracé. Or pour concrétiser cette attente il ne faut pas que le programme s'arrête. Alors on le fait tourner en rond sur la ligne 390 qui attend un "flag" FAFT non nul ; et c'est le GOSUB 3000 de notre AFTER 20 secondes qui va mettre FAFT à 1, d'où passage à la ligne 400, CLS et END. Pour terminer, une petite bidouille qui va illustrer les « rattrapages de retards » par les EVERY :

Relancez le programme par RUN 300. Dès que le tracé a commencé pressez (une seule fois) la touche ESC. Comptez mentalement jusqu'à cinq, environ, et pressez une touche. Regardez comme les tracés rattrapent leurs retards puis reprennent leur lente progression ! Les chronos ont continué de tourner , de mémoriser les GOSUB à faire. C'était dans le buffer. Or vous remarquerez que ces trois tracés rapides ne sont plus simultanés mais d'abord le trait du bas, puis celui du milieu, puis celui du haut; Pourquoi ? Mais les priorités de numéros de chronos ! On a de haut en bas les numéros 0, 1 et 2.

SPEED KEY ET SPEED INK

Il est rare que l'on modifie la valeur par défaut de SPEED KEY, et on se lasse vite des clignotements à vitesse variable de SPEED INK, même en "dissymétrique" (plus de temps sur une couleur que sur l'autre). En fait ce ne sont rien d'autre que des routines intégrées à base de EVERY.

CONCLUSION

Nous espérons vous avoir montré la puissance des chronomètres du BASIC des CPC, mais surtout comment les comprendre afin de les maîtriser et ce pour agrémenter vos programmes avec des effets qui sortiront un peu de l'ordinaire. J'ai été long, aussi vais-je tout de suite m'infliger un REMAIN.

CPC n°22

★ EDITEUR: CPC Revue
★ ANNÉE: 1986
★ CONFIG: 64K + AMSDOS
★ LANGAGE:
★ LICENCE: LISTING
★ AUTEUR: Michel ARCHAMBAULT

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» Chronobasic    FRENCH    LISTINGDATE: 2015-01-16
DL: 27 fois
TYPE: PDF
SIZE: 2184Ko
NOTE: Scan by hERMOL ; 2 pages/PDFlib v1.6

Je participe au site:
» Newfile(s) upload/Envoye de fichier(s)
★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding Src's » Graphic - Wandering Through Space
» Coding Src's » Jouez avec les allumettes
» Coding Src's » Reaction Timer (Computing With the Amstrad)
» Coding Src's » Le Hamac
» Coding Src's » Curve
» Coding Src's » Graphic - RasterBlaster Demo

QUE DIT LA LOI FRANÇAISE:

L'alinéa 8 de l'article L122-5 du Code de la propriété intellectuelle explique que « Lorsque l'œuvre a été divulguée, l'auteur ne peut interdire la reproduction d'une œuvre et sa représentation effectuées à des fins de conservation ou destinées à préserver les conditions de sa consultation à des fins de recherche ou détudes privées par des particuliers, dans les locaux de l'établissement et sur des terminaux dédiés par des bibliothèques accessibles au public, par des musées ou par des services d'archives, sous réserve que ceux-ci ne recherchent aucun avantage économique ou commercial ». Pas de problème donc pour nous!

CPCrulez[Content Management System] v8.7-desktop/cache
Page créée en 096 millisecondes et consultée 684 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.