lundi 10 juillet 2023

STM8 terminal

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.

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.

CopsonApple1 2k cropped.jpg
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
Le moniteur du Apple I, qui a finit par être affublé du nom de Wozmon contraction de Wozniak et monitor. ne faisait rien de plus que ça. Mais faire entrer ce programme dans moins de 256 octets est déjà difficile. D'abord le cpu 6502 du Apple I utililse 6 octets pour les vecteurs
  • 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.
Donc Wozniak ne disposait que de 250 octets pour installer le moniteur il a réssie à le faire entrer dans 248 octets. Ce n'était pas une mince affaire d'autant plus qu'il ne disposait d'aucun outil de programmation dont nous disposons aujourd'hui. Il a écris le code assembleur sur des feuilles de papiers et générer lui-même le code binaire à partir de ce listing. J'ai connu cette époque sauf que moi je travaillait avec un mcu RCA CDP1802. Il faillait être vraiment passionné pour travailler de cette façon.

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

  1. 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.
  2. 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.
  3. É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.
  4. 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.
  5. 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.
Pour qu'il est y oscillation il faut que la bobine L2 produise un champ magnétique de même polarité que la bobine L1. Si ça n'oscille pas il suffit de retourner une des 2 bobines.

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.

  1. 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.
  2. Entre l'anode(1) et la cathode(3) ça ne doit conduire dans aucun sens.
  3. 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.

cliquez sur l'image pour l'agrandir

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:
  1. Le potentiomètre de 100Kohm pour la sélection des postes.
  2. Le potentiomètre de 50Kohm pour le volume.
  3. Le commutateur de mise sous tension et sélection de la bande WB/FM/AM.
  4. Un condensateur électrolytique de 100µF, pour le filtrage de l'alimentation.
  5. Le cristal Y1 de 32768 Hertz utilisé par AKC-6952, récepteur radio DSP.
  6. La DEL rouge indicateur d'alimentation
  7. 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:

  • AKC6952, est un récepteur complet multibandes allant des LW aux VHF. La sélection utilise un système de diviseur de tension et de potentiomètre.
  • NS8002, est un amplificateur audio simple canal.
  • Q1 RM3401, est un P channel MOSFET, utilisé comme commutateur d'alimentaion.
  • Q2 S9018 est un transistor bijonction NPN, VHF utilisé comme amplificateur pour le signal radio reçu par l'antenne télescopique.
  • Q3,Q4,Q5,Q6 S9014, sont des transistors bijonction NPN utilisé dans ce circuit comme commutateur pour la sélection de la bande de fréquence.

  • 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.
    Pour plus d'information il faut consulter le manuel de référence qui est dans le dossier DOCS.

    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.

    1. 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.
    2. 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.
    3. 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
    4. 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.
    5. 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.


    projet finalisé

    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.

    coquille de ferrite pour cable d'alimentation

    Cette inductance permet d'augmenter la surface de détection par rapport à la tige de ferrite utilisée auparavant.

    ferrite collée dans le fond du boitier avec de l'époxy.

    J'ai découpé 2 fentes dans le fond pour que les extrémités affleurent à l'extérieur du boitier.

    circuit dans la boite

    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.

    condensateur variable pour récepteur superhétérodyne

    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.

    récepteur superhétérodyne avec accord par inductance variable

    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é.