Dans le cadre du projet pomme-I j'ai créer un terminal ASCII avec une carte NUCLEO-8S207K8. Ce terminal texte peut affiché 64 caractères par ligne et 25 lignes par écran. La sortie est un signal compositive selon le standard Nord-Américain NTSC.
lundi 10 juillet 2023
dimanche 18 juin 2023
projet pomme I
Après avoir adapter le moniteur Wozmon du Apple I sur le STM8 j'ai poursuivie sur ma lancée et créer le nouveau projet pomme I. Je veux créer un petit ordinateur 8 bits avec la carte NUCLEO-8S207K8. Cet ordinateur aura en mémoire flash le moniteur du Apple I ainsi que le BASIC du Apple I. En plus bien que ce n'était pas nécessaire j'ai ajouter un noyau système. D'ailleurs l'écriture de celui-ci m'a posé un problème auquel j'ai trouvé la solution suivante.
Pas d'interruption
Le noyau système utilise l'instruction machine TRAP du STM8 pour affectuer les appels syscall, hors cette interruption a la priorité la plus élevée. Donc quand l'ordinateur est en train d'exécuter un syscall les interruptions pour la minuterie des millisecondes et celle sur réception d'un charactère du UART de peuvent pas être déclenchées. Hors ces interruptions sont nécessaires à l'exécution de certaines fonctions du noyau. Comment résoudre ce problème?
La solution
Voici la solution que j'ai trouvé:
TrapHandler::
ldw x,(8,sp) ; get trap return address
_strxz trap_ret
ldw x,#syscall_handler
ldw (8,sp),x
iret
.macro _syscode n, t
cp a,#n
jrne t
.endm
;---------------------------------
; must be handled outside
; of TrapHandler to enable
; interrupts
;---------------------------------
syscall_handler:
_syscode SYS_RST, 0$
_swreset
0$:
_syscode SYS_TICKS,1$
_ldxz ticks
jp syscall_exit
1$:
_syscode PUTC, 2$
ld a,xl
call uart_putc
jp syscall_exit
2$:
_syscode GETC,3$
call uart_getc
jp syscall_exit
3$:
_syscode QCHAR,4$
call qgetc
jra syscall_exit
4$:
_syscode CLS,5$
call clr_screen
jra syscall_exit
5$:
_syscode DELBK,6$
call bksp
jra syscall_exit
6$:
_syscode GETLN , 7$
call readln
jra syscall_exit
7$:
_syscode PRT_STR , 8$
call puts
jra syscall_exit
8$:
_syscode PRT_INT , 9$
call print_int
jra syscall_exit
9$:
_syscode SET_TIMER , 10$
bres sys_flags,#FSYS_TIMER
_strxz timer
jra syscall_exit
10$:
_syscode CHK_TIMOUT, 11$
clr a
btjf sys_flags,#FSYS_TIMER,syscall_exit
cpl a
jra syscall_exit
11$:
_syscode START_TONE , 12$
call tone
jra syscall_exit
12$:
_syscode GET_RND , 13$
call prng
jra syscall_exit
13$:
_syscode SEED_PRNG , 14$
call set_seed
jra syscall_exit
14$:
; bad codes ignored
syscall_exit:
jp [trap_ret]
Normalement à l'exécution de l'instruction IRET le programme devrait continuer à l'adresse qui suis l'instruction TRAP. Lorsqu'une interruption est déclenchée tous les registres du STM8 sont sauvegardés sur la pile, incluant l'adresse de retour qui est située à la position (8,sp) sur la pile. Donc le gestionnaire d'interruption logicielle va chercher cette addresse et la sauvegarde dans la variable système trap_ret. Ensuite il remplace sur la pile l'adresse original par l'adresse de la sous-routine qui gère les appels syscall et puis il quitte avec l'instruction IRET. Puisque l'adresse de retour a étée modifiée le programme continue non pas à l'endroit où il aurait du mais au début de la routine syscall_handler.
Notez que la sous-routine syscall_handler se termine par un jp [trap_ret]. trap_ret est une variable pointeur et cette instruction fait un saut à l'adresse contenue dans la variable pointeur qui se trouve être l'adresse où normalement le programme aurait du continuer à la sortie de TrapHandler. Et voilà le problème est résolu.
jeudi 8 juin 2023
Wozmon sur STM8
Après avoir regardé la vidéo de Ben Eater Running Apple 1 software on a breadboard computer (Wozmon) je me suis intéressé à l'histoire du Apple I et j'ai fait des recherches à ce sujet. J'ai trouvé le manuel d'opération du Apple I en format pdf. Dans ce manuel on retrouve le code du moniteur du Apple I
Un peu d'histoire
En 1975 Steve Jobs invite l'ingénieur Steve Wozniak à fonder une compagnie pour vendre l'ordinateur conçu par ce dernier. C'est Steve Jobs qui a eu l'idée d'appeller cette compagnie Apple . Ce nom réfère à la légendre (vrai ou fausse?) selon laquelle Isaac Newton aurait eu l'inspiration de la théorie de la gravitation lorsqu'assie au pied d'un pommier il aurait reçu une pomme sur la tête. C'est pour ça qu'on retrouve cette image sur la page couverture du manuel d'opération du Apple I.
Si le Apple II est célèbre il n'en va pas de même pour le Apple I. Il ne s'en est vendu qu'environ 200. Mais cette rareté même fait que les collectionneurs se les arrachent à prix d'or. Selon mes recherches en 2018 quelqu'un offrait un Apple I aux enchères pour un prix de départ de 1.5 millions US$.Les raisons pour lesquelles le Apple I ne s'est pas très bien vendu sont d'abord qu'il ne s'agissait pas d'un produit grand public. Seul la carte mère était vendue.
By Achim Baqué - <a rel="nofollow" class="external free" href="https://www.apple1registry.com/en/press.html">https://www.apple1registry.com/en/press.html</a>, CC BY-SA 4.0, Link
L'acheteur devait fabriquer le bloc d'alimentation lui-même ou bien trouver quelqu'un pour le faire. De même pour le boitier. Il devait aussi trouver un clavier, et un moniteur. À ses début Apple Computer n'avait pas de réseau de distribution. C'est Steve Jobs qui faisait le démarchage pour convraincre les boutiquiers d'informatique (secteur naissant) de vendre le Apple I. Certains de ces détaillants complétaient l'offre d'Apple en vendant le Apple I dans un boitier en bois avec l'alimentation et le clavier inclus. Il y avait donc de la variété dans l'apparence.
L'autre raison est qu'Apple a mis en marché le Apple II très tôt après le Apple I et s'est désintéressé du premier laissant les acheteurs se débrouiller avec le Apple I.
Qu'est-ce que Wozmon
L'ingénieur qui a conçu les Apple I et Apple II c'est Steve Wozniak. Steve Jobs s'était un homme d'affaires pas un ingénieur. Pour en revenir au Apple I, la mémoire était coûteuse à cette époque donc pour couper dans les coûts Wozniak a fait 2 choses Il a utilisé dans le Apple I de la RAM dynamique plutôt que statique comme on retrouvait à l'époque dans la plupart des petits ordinateurs 8 bits. Ce qui lui a permit de fournir la carte mère avec 4K octets de RAM et il y avait de la place sur la carte pour en ajouter 4K de plus. Pour la mémoire ROM le Apple I ne disposait que de 256 Octets. Quoi installer comme programme dans un espace aussi réduit? À cette époque on installait un petit programme appellé un moniteur. Ce programme faisait peu de choses.
- Examiner le contenu de la mémoire
- Modifier le contenu de la mémoire
- Lancer un programme écris en langage machine
- NMI, adresse 0xFFFA..0xFFFB, c'est l'adresse de la routine d'interruption non masquable.
- RESET, adresse 0xFFFC..0xFFFD, est chargée dans le compteur ordinal au démarrage.
- IRQ, adresse 0xFFFE..0xFFFF, c'est l'adresse de la routine d'interruption.
STM8 Wozmon
Après avoir trouver le manuel d'opération du Apple I je me suis mis à étudier le code du Wozmon qui s'y trouve et me suis demandé combien d'octets ce programme occuperait sur STM8. La question est pertinante puisque l'architecture du STM8 est une extension de celle du cpu 6502, mais le jeu d'instructions est complètement différent. J'ai d'abord écris une première version en travaillant dans mon style de programmation habituel pour voir qu'elle taille ça aurait. J'ai bâptisé ce programme stm8_picmon.asm et le binaire a une taille de 357 octets.
Dans un deuxième essaie j'ai collé au modèle du moniteur de Wozniak autant que possible, compte de tenu des différences entre les architectures matérielle et du jeu d'instructions plus étendu qu'offre le STM8. J'ai bâptisé ce programme stm8_wozmon.asm. Le binaire de ce programme a une taille de 260 octets soit 12 octets de plus que celui de Wozniak. Il serait probablement possible de supprimer quelques octets supplémentaire en faisant quelques compromis mais je n'ai pas cherché à le faire.
Le code source du programme est sur https://github.com/Picatout/stm8_wozmon
Vidéo de démonstration
samedi 13 mai 2023
détecteur de métal le plus simple
Hier j'ai regardé sur Youtube un vidéo présentant le détecteur de métal le plus simple que j'ai vue. Il n'utilise qu'un seul transistor. J'ai reconstitué la schématique du circuit à partir de l'image du circuit et des sous-titres.
Principe de fonctionnement
Il s'agit d'un oscillateur Hartley, la rétro action se fait de l'émetteur vers la base. RV1 doit-être ajusté de sorte que le gain soit insuffisant pour déclencher l'oscillation. Cependant lorsqu'un objet métallique est approché des bobines le couplage entre celles-ci augmente ce qui permet à l'oscillation de démarrer. À ce moment le buzzer entre en action car il y a suffisamment de courant qui passe dans le collecteur pour l'activer. Même si ce courant est hachuré à la fréquence de l'oscillateur ce n'est pas perceptible au niveau auditif.
Notes personnelles
- Le choix du transistor est inutilement puissant pour ce circuit. Un transistor 2N2222 ferait tout aussi bien l'affaire mais il faudrait augmenter la valeur de R1 car le gain d'un 2N2222 est plus élevé. Pour que ce circuit fonctionne correctement le courant injecté dans la base à travers RV1 et R1 doit-être juste à la limite inférieur pour permettre l'oscillation du circuit.
- Avec les changements de température il est à prévoir que le gain du transistor change donc RV1 doit-être ajustable de l'extérieur du boitier. À ce sujet il serait préférable d'utiliser un potientiomètre plutôt qu'un trimmer.
- Étant donné que l'ajustement du gain est critique il est préférable que le potentiomètre soit multi-tours plutôt que simple tour. Une autre solution est d'utiliser 2 potientiomètres en série. Le premier de 100K et l'autre de 1K pour l'ajustement fin.
- Dans le vidéo l'auteur utilise une pile de 9 volts. Je l'ai remplacé par 4 piles AA. Donc une alimentation de 6 volts au lieu de 9 volts. Je n'ai pas fait le montage mais je suis confiant que ça fonctionnerait quand même en ajustant RV1 à une valeur de plus basse résistance. L'avantage est la durée de vie des piles.
- Pour la résistance R2 j'ai mis une résistance de 1K au lieu de 470 ohm comme dans le vidéo, question d'économiser les piles, sans diminution d'intensité lumineuse notable.
détecteur à 3 transistors
Voici un autre détecteur de métal fonctionnant sur le même principe. Celui-ci est de Fabricio Henrique. J'ai fait quelques changements.
- J'ai remplacé les transistors BC547 par des 2N3904
- Il place la commutateur d'alimentation sur le fil négatif de la batterie, alors que je le place sur le fil positif.
SCR et TRIAC
Dans cet article j'explique ce que sont les SCR et les TRIAC ainsi que leur utilisation.
SCR
SCR est l'acronyme anglphone pour Silicon Control Rectifier et le symbole électronique est celui-ci:
Comme on le voit il s'agit d'une diode dont la conduction est contrôlée par une 3ième électrode Gate(2). Normalement la diode ne conduit pas du tout et ce dans aucune direction. Cependant si l'anode est positive par rapport à la cathode et qu'on applique une impulsion positive sur la Gate(2). La diode entre en conduction dans le sens normal pour une diode et continue à conduire même après la fin de l'impulsion. Mais si la tension sur l'anode devient nulle par rapport à la cathode la diode cesse de conduire même si par après le voltage redevient positif. Il faudra envoyer une autre impulsion sur la Gate(2) pour qu'elle recommence à conduire.
Utilisation du SCR
Voici un exemple d'utilisation, la charge peut-être un élément chauffant dont on veut contrôler la température. Je ne montre pas ici le circuit de contrôle qui envoie les impulsions sur la Gate.
À la sortie du pont redresseur on a une onde sinusoïdale redressée donc l'alternance normalement négative se retrouve dans le positif. On voit que les impulsions sont envoyées avec un certain délais après le début de chaque alternance et donc la charge ne reçoit que la partie après le début de l'impulsion lorsque le SCR entre en conduction. On peut retarder les impulsions autant que l'on veut et ainsi on contrôle la quantité d'énergie transmise à la charge. On appelle ça un contrôle de phase.
Vérifier un SCR avec un multimètre
Aujourd'hui Adrian se demandait comment vérifier un SCR. Voici comment faire avec un multimètre.
- En placant le multimètre sur continuité diode. Entre la Gate(2) et la cathode(3) ça doit conduire lorsque le fil rouge est sur la Gate(2) et le noir sur la cathode(3). Ça ne doit pas conduire si on inverse les fils.
- Entre l'anode(1) et la cathode(3) ça ne doit conduire dans aucun sens.
- Si à travers une résistance on applique un voltage positif entre la Gate(2) et la cathode(3) alors ça devrait conduire entre l'anode(1) et la cathode(3) seulement si l'anode(1) est positive par rapport à la cathode(3)
Rôle du SCR dans l'alimentation du Apple II
Dans le circuit d'alimentation de l'ordinateur Apple II, le SCR servait de protection contre les surtensions pour protéger l'électronique de la carte mère. Ici je n'explique que le circuit de protection d'après la schématique dessinée par Mark Cummings.
Le circuit de protection avec SCR1 se trouve au centre en bas du dessin. Comme il s'agit d'une alimentation à modulation d'impulsions le circuit est divisé en 2 parties isolées électriquement l'une de l'autre PRIMARY et SECONDARY. Le lien entre les 2 parties n'est fait qu'à travers les transformateurs T1 pour le passage de la puissance et T2 pour les impulsions de contrôle. La voltage à la sortie est proprotionnel à la largeur des impulsions qui sont envoyées à travers T2.
Sans plus de détails sur le fonctionnement de l'alimentation revenons au circuit de protection. L'anode de SCR1 est connectée à la sortie 5 volts qui alimente la carte mère à travers la diode D23. On voit aussi que la diode zener D24 est aussi connectée à la sortie +5V ainsi qu'à la gate du SCR. Cette zener a un voltage de conduction de 5.6 volts. donc si le voltage de sortie atteint 5.6 volt la zener entre en conduction et déclenche SCR1 le faisant entré en conduction. L'anode de SCR1 est connectée à travers R15 et D6 au point 4 du transformateur T2 court-circuitant ainsi les impulsions envoyées par le transistor Q6 à ce transformateur. Puisque le primaire ne reçoit plus les impulsions de contrôle les voltages au secondaire tombent à zéro.
TRIAC
Le problème avec les SCR est qu'il faut redresser le AC afin de contrôler les 2 alternances, positive et négative d'une alimentation AC. Imaginez maintenant qu'on utilise 2 SCR et qu'on les connecte ensemble comme suit:
Alors on n'a plus besoin de pont redresseur. Pendant l'alternance positive l'impulsion fait conduire le TRIAC dans un sens et pendant la négative dans l'autre sens.
Inutile de se compliquer les choses car les manufacturiers de semi-conducteurs ont déjà penser à ça et vendent un composant appeller un TRIAC exactement dans ce but. Si vous ouvrez un thermostat électronique pour les plaintes chauffantes fonctionnant sur le secteur, vous allez en trouver un à l'intérieur. Le symbole du TRIAC est le suivant:
Pour vérifier un TRIAC avec un mulitimiètre en mode conduction diode, si on place le fil rouge sur la Gate ça doit conduire entre la Gate et A1 ainsi que A2 mais si c'est le fil noir qui est sur la Gate ni l'un ni l'autre ne doit conduire. Entre A1 et A2 ça ne doit pas conduire non plus.
lundi 8 mai 2023
STM8 Tiny BASIC V5.0R1 disponible
La version V5.0R1 de STM8 Tiny BASIC est maintenant disponible. Elle implique des changements au jeu de commandes, des optimisations de code et des corrections de bogues.
samedi 29 avril 2023
reverse engineering crusader mini
Je magasinais sur Amazon lorsque m'est apparût la présentation d'un récepteur radio AM/FM/WB de poche. Le crusader mini. Il le vende maintenant 20$CAN alors qu'il y a à peine quelque semaines lorsque je l'ai commandé il était affiché à 17$CAN. L'inflation galopante. Si j'ai acheté ce petit récepteur c'est par curiosité, un affichage analogique à l'aire du tout numérique! Je me suis dit: ce récepteur n'est certainement pas analogique, je veux voir ce qu'il a dans le ventre.
Quelques bonnes et moins bonnes surprises
La première surprise sur réception fut la qualité de l'emballage. Beau design, une jaquette noire avec la photo de la radio. Glissée à l'intérieur de cette jaquette une boite orange à penture, qui s'ouvre comme un livre. À l'intérieur la radio est bien encadrée par les replis du carton qui épousent parfaitement sa forme la protégeant ainsi des chocs lors du tansport. Je suis étonné de retrouver un tel emballage pour un appareil de si petit prix. La boite inclue une dragone et 2 piles.
Je test la réception, je capte parfaitement le transmetteur météo du gouvernement Canadien situé à plus de 100Km. La bande FM offre aussi une bonne sensibilité. Pour la bande AM j'ai du attendre la tombé de la nuit car il n'y a pas de station AM à des centaines de kilomètres à la ronde. Pas déçu de la sensibilité l'a non plus. Et l'audio est de bonne qualité.
Puisque je l'ai acheté pour voir ce qu'il a dans le ventre, je l'ai donc ouvert. Comme je m'y attendais il s'agit d'un circuit 100% numérique. Seulement 2 circuits intégrés et 6 transistors. Presque que tous les composants sont de type montage en surface.
Sur l'autre face du circuit imprimé il n'y a que 7 composants:
- Le potentiomètre de 100Kohm pour la sélection des postes.
- Le potentiomètre de 50Kohm pour le volume.
- Le commutateur de mise sous tension et sélection de la bande WB/FM/AM.
- Un condensateur électrolytique de 100µF, pour le filtrage de l'alimentation.
- Le cristal Y1 de 32768 Hertz utilisé par AKC-6952, récepteur radio DSP.
- La DEL rouge indicateur d'alimentation
- La prise d'écouteur 3,5mm
Les fils du compartiment piles étaient tellement fragiles que le fil rouge a coupé presque immédiatement au niveau du PCB. j'ai remplacé les 2 fils par des plus robustes.
Lorsque j'ai souvelé le circuit imprimé pour voir le dessous, deuxième surprise. La méthode utilisée pour l'affichage analogique je ne l'avais jamais vue. Une chenille à crémaillère en plastique glissant dans une rainure est entrainée par un par la roulette de sélection des stations qui possède sur sa face extérieure un engrenage comme on le voit sur les 2 photos suivantes. Je trouve l'idée originale mais pour la durabilité je ne suis pas convaincu.
reverse engineering
Lorsque j'ai regardé ce circuit imprimé avec tous les composants en surface sur la face supérieure du PCB ainsi que le tracé du circuit sur la même face je me suis dit que ce serait facile de dessiner le circuit dans KiCAD. Avec un circuit de cette complexité il est impossible de tracer le circuit au complet sur une seule face sans faire des coupures de tracé. J'ai donc compté 12 résistances de 0 ohm qui ne servent que de pont là où les traces de cuivre devait-être coupées.
La première étape a été d'identifier les circuits intégrés et les 6 transistors:
En conclusion
Comme j'ai l'habitude de le dire, il ne faut pas se fier aux apparences. Ce radio multibandes AM/FM/SW1/SW2 Grunding YB-P2000 à l'air tout numérique avec son affichage LCD et son pavé de touches. Il n'y à même pas de roulette pour la sélection des postes. La sélection se fait avec les boutons H et M à droite de l'affichage. Ce récepteur date de la fin des années 90.
Il s'agit pourtant d'un récepteur super-hétérodyne. La seule différence avec les récepteurs superhétérodynes des années 70 ou 80 est que le condensateur variable a été remplacé par des diodes varicap et les circuits sont intégrés et montés en surface. Aucun traitement numérique du signal dans ce récepteur.
J'ai enlevé le circuit imprimé du MCU de contrôle et on aperçois sur cette photo the usual suspects, si je peux dire, qu'on retrouvait sur les circuits des années 70. Transformateurs IF, condensateurs ajustable,inductances.Sur l'autre face du circuit imprimé on aperçoit les composants montés en surfaces.
Voici la schématique de la partie radio-fréquence.
La sélection des bandes est entièrement mécanique. IC1 est un front end pour la bande FM et IC2 sert d'amplificateur IF et démodulateur pour le FM ainsi que de front end, ampli IF et démodulateur pour les bandes AM/SW1/SW2.Dans ce récepteur le microcontrolleur ne sert qu'à afficher l'information, mémorisation des stations, alarmes et à contrôler le voltage qui est appliqué sur les diodes varicap. Ce voltage détermine la capacitance des diodes et donc la fréquence d'accord des circuits. Il y a 2 varicaps pour la bande FM et 2 autres pour les bandes AM/SW1/SW2.
Il serait impossible de fabriquer de nos jour un récepteur multibandes de ce type à faible coup, ce récepteur m'avait d'ailleurs coûté bien plus cher que le crusader mini. Je dirais même qu'il serait probablement impossible de les fabriquer car il n'y a plus de fabriquants pour ces anciens composants.
Franchement il n'y a rien à regretter de ce cette vieille technologie analogique. C'est vraiment étonnant ce qu'un simple petit circuit intégré peut accomplir en utilisant le traitement numérique du signal (DSP).
jeudi 27 avril 2023
STM8 Tiny BASIC V4.0
Je viens de livrer la dernière version de STM8 Tiny BASIC. Il s'agit d'une révision majeure incompatible avec les versions antérieures.
- La machine virtuelle a subie des transformations majeures pour la rendre plus performante.
- la fonction BIT() a été retirée car la même chose peut-être accomplit avec la function LSHIFT().
- Les commandes BRES, BSET et BTOGL ont une sémantique différente incompatible avec les versions antérieures.
- La commande RANDOMIZE a étée ajoutée.
Après avoir exécuter avec succès tous les programmes qui se trouvent dans le dossier BASIC, je considère qu'il n'y a pas de bogues majeurs donc j'ai publié cette version comme un release.
Réflexion
Je songe à renommer le projet, quelque chose comme mcu BASIC ou encore spider BASIC. J'ai même créé une mascotte mais je ne suis pas encore décidé.
Les araignées ont 8 pattes, les STM8 ont 8 bits et les plus petits sont au format SOIC-8. Juste une idée comme ça, sans doute influencé par les araignés que je rencontre occasionnellement dans la salle de bain. Voici ma source d'inspiration prise en flagrant délit d'invasion domiciliaire:
samedi 22 avril 2023
STM8 Tiny BASIC V3.2R1
J'ai continué mon travail sur STM8 Tiny BASIC pour l'améliorer. Cette révision consiste simplement en la continuation de la modification de la machine virtuelle pour améliorer sa performance. Ce changement de modèle d'exécution a entraîné son lot de bogues régressifs. J'ai corrigés tous ceux qui se sont manifestés lors de mes tests. Maintenant tous les programmes dans le répertoire BASIC fonctionnent correctement. Suivre le lien suivant pour télécharger la dernière révision.
dépôt du projet.
Démonstration conversion de la lecture ADC en voltage
Le programme suivant démontre comment faire une lecture analogique et la convertir en voltage. Bien que Tiny BASIC ne supporte que les entiers il est tout fait possible de convertir la lecture en voltage avec 3 décimales fractionnaires. Le voltage de référence est de 3,3 volts et puisque qu'il s'agit d'un convertisseur à 10 bits la lecture maximale est de 1023.
1 ADC.TO.DEC
2 ' CONVERT ADC READING TO 3 DIGITS DECIMAL
10 CONST VREF=33,ADC.RES=10240
14 ADCON 1
20 DO
30 LET V=ADCREAD(0)
40 ? char(27);"c";V,; :GOSUB CONVERT
50 PAUSE 50:GET K : UNTIL K
60 ADCON 0
90 END
99 ' D digit to print {0..9}
100 PRT.DIGIT
110 ? D;CHAR(8);
120 RETURN
199 FRAC.DIGIT' get next digit from remainder R
200 LET R=R*10, D=R/ADC.RES,R=R%ADC.RES
210 RETURN
299 CONVERT ' ADC READ VALUE V
300 LET D=V*VREF/ADC.RES, R=V*VREF%ADC.RES
310 GOSUB PRT.DIGIT:?".";
320 GOSUB FRAC.DIGIT: GOSUB PRT.DIGIT
330 GOSUB FRAC.DIGIT: GOSUB PRT.DIGIT
340 GOSUB FRAC.DIGIT: GOSUB PRT.DIGIT
350 ?
360 RETURN
mercredi 19 avril 2023
vérificateur de continuité
Projet éducatif sans microcontrolleur
Vérificateur de continuité
Voici un petit projet simple à réaliser pour un débutant en électronique. Il ne requiert que 2 transistors d'usage général facilement disponible ainsi que quelques composants passifs.
Matériel requis
- 1 petite plaquette de bakélite pour le montage.
- 1 transistor NPN 2N3904
- 1 transistor PNP 2N3906
- 1 transistor céramique de 10nF
- 1 résistance 1/4 watt 100 ohm
- 1 résistance 1/4 watt 1Kohm
- 2 résistances 1/4 watt 10Kohm
- 1 résistance 1/4 watt 18Kohm
- 1 résistance 1/4 watt 51Kohm
- 1 DEL rouge 3mm ou 5mm, pas bleu ou blanche, voir texte.
- 1 petit haut-parleur 8 ohm
- 1 petit commutateur simple pôle
- 1 pile 9 volt
- 1 porte pile
- 1 petit-boitier
montage sur plaquette sans soudure
Je n'ai pas fait de montage permanent mais voici le schéma de montage sur une plaquette sans soudure.
Principe de fonctionnement
Le circuit est basé sur 2 transistors bijonction, Q1 de type NPN et Q2 de type PNP. Les transistors NPN fonctionnent avec le collecteur positif par rapport à l'émetteur alors que les PNP fonctionnent avec le collecteur négatif par rapport à l'émetteur. C'est pour ça que Q1 est monté avec l'émetteur à V- de l'alimentation alors que Q2 est monté avec l'émetteur au V+ de l'alimentation.
Ce type de circuit porte plusieurs noms, bascule astable, oscillateur RC ou multivibrateur. Il existe plusieurs façons de réaliser ce type de circuit, Il aurait pu être réalisé avec 2 transistors NPN. Je préfère ce modèle qui ne requiert qu'un seul condensateur.
L'image suivante représente une capture des signaux au points TP1 en jaune et TP2 en bleu.
Commençons du côté gauche du schéma électronique. On a la pile BT1 évidemment avec le commutateur de mise sous tension SW1. Les étiquettes probe+ et probe- indique les points de branchement des fils qui servent à sonder le circuit ou composant à vérifier. La résistance R1 en série avec la diode électroluminescente, i.e. DEL rouge D1 donne une indication visuelle de la continuité du circuit sous vérification. En effet lorsqu'on touche ensemble probe+ et probe- la D1 s'allume et une tonalité se fait entendre si la résistance entre probe+ et probe- n'est pas trop élevée, je vais revenir sur ce point.
Cependant D1 ne sert pas seulement d'indicateur visuel, elle sert aussi comme voltage de référence pour le circuit de polarisation de la base de Q1. En effet la tension aux bornes de cette DEL demeure constante à environ 2 volts même si la pile faiblie. Les valeurs de R2 et R3 forment le diviseur de tension qui polarise la base de Q1. Si la DEL rouge est remplacée par une DEL bleu ou blanche le circuit ne fonctionnera pas car ces diodes fonctionnent à une tension supérieure à 3 volts, alors Q1 et Q2 entreront en saturation et le multivibrateur ne fonctionnera pas.
Avec les valeurs utilisées pour R2 et R3 lorsqu'on mets en contact les 2 fils de sonde, le voltage à la base de Q1 est juste suffisant pour que le transistor commence à conduire.
- Au point A sur les courbes, lorsque Q1 commence à conduire, il injecte du courant dans la base de Q2 via son collecteur. Donc Q2 commence à conduire lui aussi. Le voltage aux bornes de R6 commence donc à monté. À travers R5 et C1 cette élévation de tension est transférée à la base de Q1. En conséquence Q1 conduit encore plus et Q2 de même. Cette boucle de renforcement s'appelle une rétro-action positive, On voit que ce phénomène est très rapide puisque le voltage au point TP1 monte à la verticale sur le tracé jaune au point A.
- Dans la partie B de la courbe jaune les 2 transistors sont en saturation, c'est à dire qu'ils conduisent le maximum de courant qu'ils peuvent. Pendant cette phase C1 continue à se charger et maintient ainsi les 2 transistors en saturation par le courant qui passe à travers lui. Cette rétro-action va cessée lorsque le condensateur aura atteint sa pleine charge et qu'il ne pourra plus contribuer au courant dans la base de Q1.
- Au point C, au moment où C1 ne passe plus aucun courant dans la base de Q1, la conduction de ce dernier diminue ainsi que celle de Q2 et la tension sur R6 commence à diminuer. Cette fois c'est la baisse de tension qui est transmise à la base de Q1. par le même phénomène de rétro-action positive la conduction des 2 transistors va diminuer rapidement jusqu'à couper complètement. Encore une fois le phénomène est très rapide donc la tension tombe à la verticale en C. À ce moment puisque C1 a accumulée une charge électrique pendant la phase précédente, le voltage aux bornes de C1 est positif au point TP1 par rapport à l'autre côté du condensateur. Puisque cette extrémitée est maintenant au niveau de tension 0 volt, ça implique que l'autre extrémitée est à une tension négative à par rapport à V- de la pile. C'est bien ce qu'on observe sur la courbe bleu en point C
- durant la phase D le condensateur commence à se décharger à travers R2,R5,R6 et le haut-parleur LS1. Jusqu'au point ou le voltage à ses bornes va s'inverser pour devenir légèrement positif, à environ +0,6 volt en TP2 Q1 va recommencer à conduire. Alors le cycle recommence.
Comme on le voit sur la courbe jaune, la durée de la partie B est plus courte que la partie D. C'est du au fait que les constantes de temps sont différentes pour ces 2 phases.
En effet lorsqu'on applique une tension aux bornes d'un circuit formé par une résistance en série avec un condensateur le condensateur se charge à une vitesse qui dépend du produit R*C. Ce produit s'appelle constante de temps.
Cette constante de temps détermine combien de temps il faut au condensateur pour se charger ou décharger.
En phase B on a Tb=R5*C1
En phase D on a Td=(R2+R5+R6+LS1)*C1. La valeur de la constante de temps est donc plus grande.
La période de la fréquence audio est la somme des périodes B+D.
Autre source d'alimentation
Supposons que voulez alimenter ce circuit à 3 volts plutôt qu'à 9 volts. Il suffit alors de remplacer la résistance R1 par une valeur de 120 ohm alors le voltage sur l'anode de la DEL va demeuré à 2 volts et les résistances R2, R3 n'auront pas besoin d'être modifiées. Le résultat sera une fréquence audio différente et un volume sonore plus faible. Je l'ai vérifié et ça fonctionne.
Pour ceux qui aiment le 555
Voici une autre version réalisée avec une minuterie TLC555CP. La particularité de ce circuit est qu'il accepte de fortes résistances en produisant une fréquence de plus en plus basse à mesure que la résistance entre les sondes augmente. Par exemple si on pince entre les doigts de chaque main les sondes ça produit une série de clics.
Voici une variante utilisant encore le TLC555CP. Cette version ne produit qu'une seule tonalité et l'alarme ne déclenche que pour les faibles résistances. Elle utilise la broche ~reset qui est maintenue à 0 volt à travers R4. Lorsque l'anode de D1 est mise à +9V le voltage sur la broche ~reset monte à environ 7 volt ce qui est suffisant pour activer la minuterie. D1 doit-être une DEL rouge.
Conclusion
Cet appareil simple et économique à fabriquer est utile pour vérifier s'il y a une coupure dans un circuit mais aussi pour vérifier des diodes et même des transistors à jonctions.
mardi 18 avril 2023
STM8 Tiny BASIC V3.2R0
J'ai repris le travail sur mon projet STM8_Tiny BASIC. J'en suis rendu maintenant à la version 3.2R0. Cette version consiste pour l'essentiel à un travail d'optimisation de la machine virtuelle qui exécute le bytecode, pour la rendre plus rapide. J'ai obtenu une amélioration intéressante comme le montre les résultats suivants.
Programme de test
10 ' for next speed test
12 LET T = TICKS
14 FOR I = 1 TO 10000
16 NEXT I
18 ? TICKS - T ; " MSEC"
20 ' DO UNTIL TEST
22 LET I = 1 , T = TICKS
24 DO LET I = I + 1 : UNTIL I > 10000
26 ? TICKS - T ; " MSEC"
28 ' GOTO LOOP
30 LET I = 1 , T = TICKS
32 LET I = I + 1 : IF I <= 10000 GOTO 32
34 ? TICKS - T ; " MSEC"
program address: $91, program size: 241 bytes in RAM memory
Résultats de la version antérieure V3.1R13
>RUN
115 MSEC
771 MSEC
846 MSEC
Résultats obtenus avec cette version V3.2R0
>run
84 MSEC
451 MSEC
513 MSEC
Autre test
Un autre bon test est l'exécution du programme pwm-soft.bas. En mesurant la fréquence PWM avec un oscilloscope j'Obtient 95 Hertz pour la version antérieure et 144 Hertz pour cette version. Cet un bon test car la vitesse PWM est directement lié à la vitesse d'exécution de la boucle LOOP. Donc en général la machine virtuelle exécute le code 144/95=1.5 fois plus rapidement.
mercredi 5 avril 2023
détecteur de clou
Mes expérimentations avec les pointeurs de métal ont abouties à ce détecteur de clou qui permet de détecter des clous ou vis masqués dans une planche ou un mur. Ce détecteur contrairement au premier prototype est programmé entièrement en assembleur sur un MCU STM8S103F3M.
Finalement pour l'inductance j'ai utilisée une ferrite semi-cylindrique pour le bobinage de l'inductance. Deux rangs de fil 30 AWG sur cette ferrite donne une inductance de 644µH. La ferrite provient d'une coquille de ferrite conçue pour les cables d'alimentation.
démonstration
source du projet: https://github.com/Picatout/metal-pointer/tree/main/bare-metal
lundi 3 avril 2023
À l'antipode
De nos jours, à l'aire du numérique, tous les récepteurs radio (ou presque) sont entièrement basés sur la technologie numérique. Autrefois, à l'aire de l'analogique, la sélection des postes de radio se faisait par un circuit accordé à fréquence ajustable. En fait les récepteurs superhétérodyne utilisaient 2 circuits accordés variables, un pour l'oscillateur local et l'autre pour la sélection de la station. Les 2 circuits devaient être adjusés en accord car dans le superhétérodyne la fréquence intermédiaire est obtenu par produit de la fréquence de l'oscillateur local avec la fréquence du signal reçu pour obtenir une fréquence intermédiaire fixe. Donc la différence entre les deux fréquences doit-être constante quel que soit la station sélectionnée.
,Dans tous les récepteurs radios de ma jeunesse cet accord se faisait avec un condensateur variable à 2 sections d'axe commun. Donc en tournant le bouton de sélection des stations les plaques mobiles des deux sections tournaient ensemble assurant la synchronisation entre l'oscillateur local et la fréquence de réception.
Pour voir un condensateur variable en action allez à 3:30 minutes.
En Australie il faisait autrement
Cependant il semble qu'à l'antipode, c'est à dire en Australie, il faisait autrement. Au lieu d'utiliser un condensateur variable ils utilsaient des inductances variables. En effet la fréquence d'un circuit accordée dépend du produit de la capacitance par l'inductance. la formule:
Fa=1/2π√(LC)
Donc pour varier la fréquence de l'accord on a le choix, modifier la valeur de L ou celle de C.
Alors que dans l'hémisphère nord on utilisait un condensateur variable il semble qu'à l'antipode ils utilisaient des inductances variables mécaniquement reliées ensemble comme on le voit dans la photo suivante d'un récepteur Astor datant de 1955.
Ce récepteur utilise des inductances à coeur de ferrite. En retirant ou enfoncant les ferrites la valeur des inductances varie ce qui permet la sélection des stations. j'ai annoté la photo extraite d'un vidéo Youtube. Si vous voulez voir le fonctionnement de ce circuit d'accord en action vous pouvez visionnez la vidéo en avançant le curseur à 5:30 minutes.
mardi 7 mars 2023
localisateur de métal
Ce metal-pointer est basée sur un carte d'expérimentation NUCLEO-S207K8 avec STM8_TBI installé en firmware.
Il s'agit d'un localisateur de métal de proximité (pin point detector). La différence entre ce localisateur et un détecteur est que le premier sert à localiser avec précision un petit objet métallique. La sensibilité est plus faible mais l'erreur sur la position de l'objet est aussi beaucoup plus faible. Habituellement les chercheurs de trésor utilise un détecteur de métal pour localiser un objet dans un rayon d'environ 30 cm et ensuite ils utilisent le localisateur (pin point detector) pour préciser la position à l'intérieur de cette zone d'un petit objet comme une pièce de monnaie.
Ce détecteur peut aussi être utile pour localiser des clous ou des vis dans une planche avant d'utiliser une scie lorsqu'on recycle des planches.
Schématique
prototype
Bien que pour ce prototype j'ai utilisé une inductance de petite taille dans le produit final une bobine d'environ 5 à 8 cm de diamètre sera préférable.
Principe de fonctionnement
Les composants C6-L1 forment un circuit résonnant série. dont la fréquence de raisonnance est
Fr=1/(2*π*√(C6*L1))
Pour les valeurs utilisées ça donne:
Fr=1/(2*π*√(10E-9*10E-3))=50329 Hertz.
Le générateur PWM du stm8 Tiny BASIC est utilisé pour générer une onde rectangulaire correspondant à cette fréquence. Puisqu'à la fréquence de résonnance l'impédance d'un circuit résonnant série est minimale le voltage à la jonction de R3-C6 est minimal.
Cependant si un objet métallique est à proximité de l'inductance la valeur de celle-ci est modifiée et en conséquence la fréquence de raisonnance est aussi modifiée et ne correspond plus à celle générée par le PWM. L'impédance du circuit C6-L1 augmente ansi que le voltage à la jonction R3-C6. Ce voltage est redressé par la diode D3 et charge C4 à la tension de crête. Cette tension est mesurée sur l'entrée analogique A3. Lorsqu'un variation rapide de cette tension est détectée une alarme est sonnée et la LED verte D2 s'allume pour 10 msec.
mise à jour 2023-03-08
J'ai modifié le programme et le circuit. J'ai fait une erreur au niveau de l'alimentation. J'avais branché l'alimementation de la pile sur CN4:4 (5V) alors qu'elle doit-être branchée sur CN4:1 (Vin).
Vidéo de démonstration
Alimenté à 6 volt le circuit tire entre 40 et 50 mA. La plus grosse part de ce courant est draînée par le programmeur ST-LINK qui n'est pas désactivé.