![]() |
Hewlett Packard HP 41CX
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|
![]() On redéfinit la touche 23 (SIN) pour qu'elle exécute la fonction MYPRG qui est, dans cet exemple, le nom d'un de mes programmes. |
|
![]() L'heure et la date au format anglais (février, 12), on peut ajouter les secondes, le jour de la semaine, demander le format français (12 février) |
|
![]() |
![]() Les 4 logements vides |
|
![]() Deux logements occupés par des modules, l'un est libre pour l'imprimante et l'autre pour le lecteur de cartes |
Il contient de nombreuses extensions mathématiques facilitant la résolution de problèmes:
|
![]() J'ai écrit un résumé en français du manuel anglais (format ![]() que vous pouvez télécharger. |
Il apporte une mémoire de 238 registres supplémentaires (modèle HP82181A). Ils s'ajoutent aux 124 registres de mémoire étendue
contenue dans la calculatrice. Ces registres ne peuvent pas être adressés directement, et les programmes qui y sont stockés ne peuvent pas être exécutés depuis ce module. Son utilité est d'amener un RamDisk pour le stockage permanent de registres, de programmes, de fichiers texte ou tout autre donnée utile. |
![]() Manque de chance je n'ai qu'un HP82106A incompatible avec la HP41CX, il apporterait 64 registres à une HP41C. |
![]() |
L'imprimante thermique dispose de réglages d'intensité, des boutons PRINT et ADVANCE ainsi que d'un sélecteur de mode (MAN, NORM, TRACE) qui
qui fixe les informations à imprimer.
Elle apporte également de nombreuses fonctions supplémentaires d'impression de registres, de programmes ainsi qu'un programme de tracé de la courbe d'une fonction. Dans ce document ![]() |
![]() PRP: print program, le listing d'un exemple du manuel. L'instruction LIST permet d'imprimer une partie d'un programme. |
![]() PRREGX: imprime les registres selon la valeur de X (ici 10,012 pour imprimer de R10 à R12) |
![]() CAT 1: liste des programmes en mémoire. On dispose aussi d'autres catalogues (liste des alarmes en cours, liste des modules, liste des fonctions...). |
|
Voilà le listing de la redéfinition d'un caractère. Au début, on efface X et Y avec 0 ENTER. Ensuite, on entre la définition binaire de chaque colonne: * * * * * = 1 * * = 2 * * * * = 4 * * = 8 * * * * * = 16 * * = 32 * * * * * = 64Par exemple, pour la colonne centrale: 1+16+64 = 81. On entre les définitions avec BLDSPEC. On place le caractère dans le bufer avec ACSPEC. Puis l'appui sur ADV lance l'impression. On utilise une méthode similaire pour imprimer des bitmaps de 43 colonnes de large (c'est la limite de la mémoire tampon). |
![]() Ne manquez pas la dernière ligne ou apparaît le petit bonhomme nouvellement défini! |
![]() Le lecteur de cartes magnétiques se loge au dessus de la calculatrice. On voit une carte prête pour la lecture. Dans ce document ![]() |
Périphérique de sauvegarde des données. On distingue 4 types de cartes:
|
Il permet rapidement l'entrée de programmes, de valeurs dans les registres de données soit en mode direct soit en cours d'exécution.
En fait, il possède en gros les capacités du lecteur de cartes magnétiques en lecture.
C'est l'outil idéal pour passer vos programmes d'un PC à la HP41 ! |
![]() |
Tout d'abord on édite le programme sous forme de texte avec une instruction par ligne. J'utilise, comme toujours Quick Editor dont les menus sont redéfinissables. Ceci me permet, depuis l'éditeur, de lancer la compilation, de visualiser les codes barres et de lancer l'émulateur pour tester mon programme. | ![]() |
Ensuite, on lance la compilation en utilisant HP41UC.EXE. Dans la première passe il transforme
le texte source en fichier RAW (série d'octets brute). C'est le format utilisé par l'émulateur V41 sous
Windows. Deuxième appel, le fichier RAW est transformé en fichier PS (PostScript) avec les codes barres correspondants. J'ai automatisé la tache avec un fichier BATCH (Cliquer ici pour le visualiser) |
![]() |
Pour finir, on lance GSview (Ghost Script View) pour visualiser le fichier PS. A partir du même programme, on peut imprimer
les codes. Sur mon imprimante laser, la sortie est impeccable et lisible sans problème avec le lecteur de la HP 41.
La lecture se fait très rapidement, entre une et deux secondes par ligne de barres.
L'exemple ci-contre correspond au programme SUITE ci-dessous: ![]() La fameuse suite qui finit toujours sur 1:
|
![]() |
![]() |
Y'a plus qu'à lancer la lecture!! Vous pouvez lire sur l'affichage: W: RDY 03J'ai lu déjà deux lignes et il affiche qu'il est prêt pour la 3è. Le système permet de s'affranchir des aléas du stockage magnétique et de conserver une trace papier des programmes. |
Voici un petit programme que j'utilise pour surveiller le compteur de mes pages WEB. Il donne la moyenne des visites par jour depuis son installation (en décembre 2007) ainsi que la moyenne depuis la dernière sauvegarde (ce qui me permet de voir l'impact d'une publication ou modification récente).
Ce programme utilise:
registre | contenu | registre | contenu |
r00 | compteur actuel | r04 | compteur sauvegardé |
r01 | date actuelle | r05 | date sauvegarde |
r02 | heure actuelle | r06 | heure sauvegarde |
r03 | moyenne visites actuelle | r07 | moyenne sauvegardée |
![]() |
Pour obtenir la moyenne, on calcule la différence de compteur divisée par la différence de temps.
Pour le temps, c'est à la seconde près. Non seulement on a l'écart de jours avec la fonction DDAYS mais
j'ajoute une partie décimale avec la différence des heures.
On l'utilise avec: compteur XEQ WEB STO 0 STO 1 et STO 2 conservent le compteur, la date et l'heure. DDAYS calcule l'écart depuis le 15 décembre 2007. 12 HMS- calcule l'écart des heures car le compteur fut mis en place à midi! On divise par 24 et on ajoute aux jours pour un écart décimal précis à la seconde. On prépare ensuite l'affichage sous la forme "AVRG = xx.xx" (AVRG = average = moyenne), puis on stoppe. Après l'appui sur R/S, on ouvre le fichier "WEBDATA" en plaçant le pointeur au début (0) avec SEEKPTA. La séquence 4.007 GETRX récupère les données dans les registres 4 à 7, et on affiche la précédente moyenne (R07) de la manière "OLD = xx.xx". Un autre appuis sur R/S donne la moyenne depuis cette sauvegarde, donc on recalcule l'écart de temps et de compteur! Cela est affiché sous la forme "LAST = xx.xx". Pour finir, on peut, par un dernier R/S, sauvegarder les nouvelles données à la place des anciennes. Si on ne le fait pas, les anciennes valeurs restent la référence. Pour ce faire, 0 SEEKPT remet le pointeur fichier au début (nom du fichier inutile car il est déjà ouvert) et la séquence 0.003 SAVERX sauvegarde les registres 0 à 3. Avant toute utilisation, il faudrait créer le fichier! Avec la séquence suivante: "WEBDATA" 4 XEQ CRFLD Qui crée le fichier WEBDATA contenant 4 registres. Ensuite, lorsque le programme est chargé, tapez: compteur XEQ WEBINIT pour remplir les registres avec le compteur actuel et les données de temps, voyez qu'on se branche sur la séquence de sauvegarde précédente. Téléchargement: hp41web.zip. Le fichier contient:
|
Il s'agit d'un multimètre (Volts/Ampères/Ohms en continu ou alternatif) qui peut fonctionner seul par l'intermédiaire de son clavier et de son affichage digital... | ![]() |
![]() |
... ou bien télécommandé par l'intermédiaire de son interface HP-IL! Dans ce cas, la HP-41 peut entièrement le piloter et récupérer les mesures effectuées pour un traitement informatique. |
![]() |
Programme de mesure d'une tension: Ce programme me permet de mesurer une tension alternative à intervalles régulier, d'en garder la valeur minimale et maximale ainsi que la moyenne. (Sur 1h30, donc 90 mesures, j'ai obtenu un courant allant à peu près de 232V à 238V). XEQ OBSERVEroutine d'initialisation: REMOTE: place le multimètre en mode esclave. "F1R4Z1T1" OUTA: envoit la chaine de commande pour Voltage alternatif (F1) dans la gamme 300V (R4) avec Autozéro (Z1) et mesures en continu (T1). IND: input data, prend une première mesure et la stocke en R10 (moyenne), R11 (max), R12 (min) et place 1 dans R13 (nombre de mesures effectuées). La suite programme l'alarme périodique: "^^MESURE": la routine à éxécuter. 0.01: toute les minutes. 0: pas de date précisée. TIME 0.01 HMS+: commencer dans une minute! XYZALM: programme l'alarme. MESUREroutine qui s'exécute périodiquement: TONE 9: émet un bip lors de la mesure. 1 ST+ 13: une mesure de plus. IND ST+ 10: prend une mesure et la cumule. Ensuite, on compare à R11, si c'est plus, c'est un nouveau maximum et on affiche "MAX "+valeur. Sinon, on compare à R12, si c'est moins, c'est un nouveau minimum et on affiche "MIN "+valeur. Sinon, on calcule la moyenne (R10/R13) et on affiche "MOY "+valeur. |
Voici l'ensemble avec mon programme qui tourne. On peut imaginer d'améliorer le système:
|
![]() |
![]() |
Programme consommation d'un appareil: Ce programme calcule la consommation d'un appareil en KWH. Voyez le montage ci-contre: le câble de la prise multiple blanche a été en partie détourné pour que le courant traverse le multimètre. Ainsi on peut mesurer l'ampérage de tout ce qui est branché ensuite. Dans mon premier montage, j'ai utilisé un petit ventilateur. |
La routine "CONSO" initialise le programme.
FIX 4 pour un affichage correct des heures. REMOTE pour mettre le multimètre en mode esclave. "F6R2Z1T1" pour un courant alternatif (F6) jusqu'à 3A (R2) avec AutoZero (Z1) et mesures en continu (T1). La routine vous demande ensuite le voltage utilisé (j'ai mis 230), le courant résiduel (en effet, la simple led rouge de la prise multiple consomme déjà 0,0012 A). Pour ceci, c'est à ce moment que je l'allume et j'exécute simplement une lecture du multimètre avec IND pour indiquer la valeur. On vous demande aussi la fréquence de lecture, j'ai mis 0,0030 pour 30 secondes. C'est le moment d'allumer l'appareil! Puis R/S pour lancer le calcul. La routine "AMPERE" est celle qui mesure à la fréquence souhaitée. Un bip est émis, une mesure est prise avec IND et on retire le courant résiduel (R13) avant d'accumuler la valeur dans R10. Cette routine s'exécute en gros en 2 secondes. A tout moment, pour voir la consommation, on peut exécuter la routine "KWH" qui vous affiche le temps passé depuis le début de la mesure: ![]() ainsi que la consommation jusqu'à ce point: ![]() Pour arrêter les mesures, CATALOG 5 vous liste les alarmes programmées, faire R/S sur celle lançant AMPERE, puis Shift C pour l'effacer. |
![]() |
Cette unité est avant tout une coquille permettant d'accueillir vos cartes d'acquisition de données selon vos besoins.
Elle peut en contenir 3 en tout:
|
![]() Le panneau frontal est équipé d'entrées permettant une mesure AC, DC ou Ohms même si l'unité ne contient aucune carte. |
L'intérieur: Outre les entrées frontales et le petit panneau LCD, on y trouve:
|
![]() |
Il faut régler la tension d'alimentation sur 240V pour la France. Cela se fait sans soudure, mais on doit ouvrir l'appareil et déplacer un connecteur. | De même, la fréquence du courant doit être réglée sur 50 Hz. Sur cette image on voit également le connecteur HP-IL ainsi que les 3 panneaux des cartes. L'un est encore libre. |
![]() |
![]() |
La HP-41 peut accéder individuellement à n'importe quelle entrée des 3 cartes et en obtenir une mesure.
Les entrées sont numérotées 0-9 pour la carte #0, 10-19 pour la carte #1 et 20-29 pour la carte #2. Exemple: alpha DCV13 alpha XEQ OUTA -> envoit la commande DCV13 qui va faire une lecture en courant continu sur l'entrée 3 de la carte 1. XEQ IND -> (IND = Input Data), récupère la donnée lue dans le registre X.On peut également faire une lecture de plusieurs entrées en même temps! alpha ACV21-24 alpha XEQ OUTA -> envoit la commande pour une mesure en alternatif des entrées 1 à 4 de la carte 2. XEQ IND -> récupère la valeur lue sur l'entrée 21 XEQ IND -> celle de l'entrée 22 ... etc. |
![]() |
Elle utilise des micro-cassettes: ![]() Chacune peut stocker 128Ko de données. |
![]() |
Remarquez le voyant BUSY pendant l'opération de formatage assez longue |
|
![]() |
![]() |
On place d'abord dans le registre ALPHA le nom du fichier de sauvegarde, je l'ai appelé BACKUP. |
|
![]() |
![]() |
![]() |
![]() |
J'ai eu la chance de récupérer un module CLONIX41 qu'Emmanuel C. a bien voulu me garnir ainsi:
|
![]() |
![]() Ci-dessus, QuickEditor avec le source d'un programme et les 4 menus programmables qui permettent:
|
La préparation d'un programme se fait aisément sur un PC avec le SDK de Warren Furlow. J'utilise toujours QuickEditor dont les menus sont programmables. Le fichier source est édité dans la fenêtre principale et on fait appel à:
![]() |
1: On a besoin de connaître l'adresse du registre 00, elle est stockée dans le registre système "c". On tape [RCL] [.] [C] et on obtient un affichage particulier: | ![]() |
2: On doit décoder ce registre, pour cela on tape [XEQ] DECODE, les 3 chiffres soulignés sont l'adresse de R00, ici 19C: | ![]() |
3: Ensuite, on bascule sous MCED et on utilise la commande SVE (pour save), si on veut sauvegarder mon programme ci-dessus, on complète les adresses ainsi, puis [R/S]: | ![]() |
4: La commande nous demande ensuite l'adresse du premier registre de sauvegarde, on tape alors 19C, puis [R/S]: | ![]() |
![]() |
|
|
![]() |
|
|
|
![]() |
(remarquez le score qui augmente à chaque fois!) Exchange Left : le 1 et le 2 à gauche sont échangés. ![]() Rotate Left : décalage à gauche, le 2 vient en dernière position. ![]() Exchange Ends : le 1 et le 2 aux extrémités sont échangés. ![]() Rotate Right : décalage à droite, le 1 revient en première position. ![]() Exchange Right: le 8 et le 9 à droite sont échangés. ![]() lancez le jeu avec 111182222 XEQ TWIXet tentez d'obtenir 222281111 en 14 coups! ![]() ![]() Le fichier twix.zip contient:
|
; 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ; A= x x N N N N N N N N N D S S ; NNN... les 9 chiffres ; D = caractère de séparation ; SS le nombre de coups ; B utilisé pour sauvegarder A ; C utilisé pour un peu tout. ; aucun autre registre, aucun flag. .JDA .ORG F000 F000 01F XROM 31 F001 001 FCNS 1 F002 00000A DEFR4K [TWIX] ;F00A F004 000 NOP F005 000 NOP .NAME "TWIX" F006 098 #098 ;"X" F007 009 #009 ;"I" F008 017 #017 ;"W" F009 014 #014 ;"T" ; initialisation F00A 0F8 [TWIX] READ 3 ; copie X dans C F00B 11A A=C M ; sa mantisse dans A F00C 39A RSHFA M ; 9 chiffres en position 11 à 4 F00D 006 A=0 S&X ; exposant à zéro: nombre de coups F00E 2A0 SETDEC ; tous les calculs en décimal. ; affichage F00F 130010 [DISP] LDIS&X 10 F011 270 RAMSLCT ; zone RAM fictive F012 1300FD LDIS&X FD F014 3F0 PRPHSLCT ; périphérique Ecran F015 0AE10E C=A ALL ; récupère les 9 chiffres +score F017 21C R= 2 F018 350 LD@R D ; code fictif pour séparateur F019 1BC RCR 11 ; le premier chiffre en position F01A 0A0 SLCTP F01B 35C R= 12 ; pour la boucle F01C 0E0 [L1] SLCTQ F01D 21C R= 2 F01E 010 LD@R 0 F01F 0D0 LD@R 3 ; prépare le code 03N dans C F020 3E8 WRIT 15 ; copie vers l'écran F021 2FC RCR 13 ; chiffre suivant F022 0A0 SLCTP F023 3D4 R=R-1 ; un tour de moins F024 394 ?R= 0 ; jusqu'à zéro F025 3BB JNC [L1] ;-9 F01C F026 130000 LDIS&X 0 ; quitte l'écran F028 3F0 PRPHSLCT F029 3C8 [WAIT] CLRKEY ; attend une touche F02A 3CC ?KEY F02B 3F3 JNC [WAIT] ;-2 F029 F02C 220 C=KEY ; touche en 4-3 F02D 33C RCR 1 ; touche en 3-2 F02E 166 A=A+1 S&X ; augmente le nombre de coups F02F 08E B=A ALL ; sauvegarde A ! F030 0AE A<>C ALL ; la touche en A 3-2 F031 21C R= 2 ; pointe sur XS F032 0D0 LD@R 3 ; met la valeur 3 F033 376 ?A#C XS ; le code touche se termine par 3 ? F034 3A0 ?NCRTN ; si oui, fin du jeu (ligne contenant ENTER et <-) F035 356 ?A#0 XS ; le code se termine par zéro? F036 39F JC [WAIT] ;-13 F029 ; non, donc touche invalide ! F037 0F53C0 ?NCXQ [ACTION] ;F03D ; sous programme traitant les différents cas F039 3C8 [KOFF] CLRKEY ; attend que la touche soit relevée F03A 3CC ?KEY F03B 3F7 JC [KOFF] ;-2 F039 F03C 29B JNC [DISP] ;-45 F00F ; et retour à l'affichage ; ******************************** ; execute l'action selon l'une des ; 5 touches de la première ligne ; ******************************** F03D 38E [ACTION] RSHFA ALL ; le nibble haut de la touche dans XS F03E 15C R= 6 F03F 050 LD@R 1 F040 0D0 LD@R 3 F041 1D0 LD@R 7 F042 210 LD@R 8 F043 310 LD@R C ; les codes des 5 touches du haut F044 376 ?A#C XS ; égal à C (touche C0=LN) F045 0B3 JNC [XRIGHT] ;+22 F05B ; oui! échange des 2 de droite F046 33C RCR 1 F047 376 ?A#C XS ; égal à 8 (touche 80=LOG) F048 113 JNC [RRIGHT] ;+34 F06A ; oui! rotation droite F049 33C RCR 1 F04A 376 ?A#C XS ; égal à 7 (touche 70=SQR) F04B 093 JNC [XENDS] ;+18 F05D ; oui! échange des extrémités F04C 33C RCR 1 F04D 376 ?A#C XS ; égal à 3 (touche 30=1/X) F04E 0BB JNC [RLEFT] ;+23 F065 ; oui! rotation gauche F04F 33C RCR 1 F050 376 ?A#C XS ; égal à 1 (touche 10=S+) F051 360 ?CRTN ; non! mauvaise touche... (impossible normalement) ; ******************************* ; (S+) échange les deux de gauche ; ******************************* F052 0DC R= 10 F053 0EE [XCOMM] C<>B ALL ; récupère A dans C F054 10E A=C ALL ; puis dans A F055 33C RCR 1 F056 102 A=C @R ; ex a11 dans a10 (ou a4 dans a3) F057 37C RCR 12 F058 3DC R=R+1 F059 102 [GETR] A=C @R ; ex a10 dans a11 (ou a3 dans a4) F05A 3E0 RTN ; ******************************* ; (LN) échange les deux de droite ; ******************************* F05B 01C [XRIGHT] R= 3 F05C 3BB JNC [XCOMM] ;-9 F053 ; ********************************* ; (SQR) échange les deux extrémités ; ********************************* F05D 0EE [XENDS] C<>B ALL ; récupère A dans C F05E 10E A=C ALL ; puis dans A F05F 17C RCR 6 F060 19C R= 11 F061 102 A=C @R ; ex a3 dans a11 F062 23C RCR 2 F063 01C [GET3] R= 3 F064 3AB JNC [GETR] ;-11 F059 ; ex a11 dans a4 ; ***************************** ; (1/X) rotation vers la gauche ; ***************************** F065 0EE [RLEFT] C<>B ALL ; récupère A dans C F066 10E A=C ALL ; puis dans A F067 3FA LSHFA M ; décale la mantisse, mais un chiffre perdu! F068 13C RCR 8 ; positionne l'ex premier chiffre en 3 F069 3D3 JNC [GET3] ;-6 F063 ; et va récuperer ce chiffre perdu ; ***************************** ; (LOG) rotation vers la droite ; ***************************** F06A 0EE [RRIGHT] C<>B ALL ; récupère A dans C F06B 10E A=C ALL ; puis dans A F06C 39A RSHFA M ; décale la mantisse, mais un chiffre perdu! F06D 17C RCR 6 ; ex dernier chiffre en 11 F06E 19C R= 11 F06F 353 JNC [GETR] ;-22 F059 ; et va récupérer ce chiffre perdu |
J'en ai fait une version sous Android à l'aide de AppInventor. Télécharger l'application TWIX. |
![]() |
![]() |
Cette interface se loge sur la boucle HP-IL et permet de dialoguer via une connexion série.
Le boîtier dont j'ai fait l'acquisition contient une modification permettant la connexion USB sur un PC avec un simple câble type imprimante. Dans ce cas, c'est le port USB qui alimente l'interface sans chargeur supplémentaire. Sur un PC, on utilisera des programmes du genre de HyperTerminal pour capturer les envois de la calculatrice. ![]() |
![]() |
J'ai écrit en FORTH un petit logiciel qui permet de capturer les envois de la calculatrice:
Par défaut, le logiciel affiche dans sa fenêtre tout ce qui est reçu. Le port série doit être configuré en 9600 bauds, data 8 bits, pas de parité et 1 bit de stop.
|
Voir le listing du programme FORTH | Voir une capture réalisée | Télécharger le programme |