Chenillard 16 voies
Réalisé en 1997, ce chenillard utilise un micro-contrôleur ST6225 aidé d'un driver MM5450
Manuel d'inztruczion: on a 16 boutons: quand on presse brièvement un bouton, on lance ou on arrête l'une des seize animations lumineuses, dont la vitesse est réglable par potentiomètre. Si l'on maintient un bouton pressé plus longtemp, alors on force la voie correspondante successivement à ON, OFF ou AUTO.
Aspect extérieur

Câblage interne

Schéma théorique

Description
Ce "
chenillard " comporte 16 voies indépendantes : il permet de
faire défiler 16 motifs différents, à une vitesse variable. De
plus, chaque sortie peut être forcée à l'allumage ou à
l'extinction, ce qui augmente les possibilités.
Caractéristiques principales :
- Alimentation sur secteur monophasé 240 Veff 50 Hz, par câble
2 + T et socle type filtre limitant la propagation des parasites.
- Interrupteur Marche / Arrêt général bipolaire, avec voyant
de mise en marche.
- 16 boutons poussoirs permettent de lancer un motif, l'arrêter
, et forcer les sorties. Ces boutons comprennent des voyants
lumineux afin de visualiser le motif joué.
- Potentiomètre de réglage de la vitesse de défilement, entre
1 motif complet en environ 0.5s (la plus rapide : les 16 sorties
sont balayées en 0.5s) et 1 motif toutes les 5s environ.
- Protection de la partie commande, et protection individuelle de
chaque sortie, par fusibles.
- Déclenchement des triacs au zéro de tension secteur, limitant
la création de parasites, avec filtres RC sur toutes les sorties
à triacs, et commande via des opto triacs.
Schéma :
La gestion de l'ensemble est confiée à un microcontrôleur ST
6225, dont les ports A et B sont configurés en entrées avec
résistances de rappel, et scrutent en permanence les boutons
poussoirs. Le port C est utilisé de trois façons différentes :
- En entrée analogique (PC7), pour le potentiomètre de
variation de vitesse
- En entrée Tout Ou Rien (PC4), pour la détection du zéro de
tension secteur
- En sortie symétrique (PC5 et PC6), pour le dialogue série
avec le composant MM5450
Ce composant MM5450 est un driver de puissance, bien pratique
pour commander en intensité jusqu'à 34 charges (ici les DELs et
les opto triacs). La valeur de cette intensité est fixée par la
résistance R1.
Chaque triac de sortie est associé à un opto triac, qui permet
de limiter la propagation des dégâts en cas de problème. De
plus, un réseau RC limite la vitesse de variation de la tension
aux bornes du triac, qui peut provoquer des enclenchements
intempestifs (dV/dt).
L'alimentation basse tension est classique, avec transformateur,
redresseur, filtrage, régulation, plus un petit montage annexe
composé de D18 à D20, R34 et R35, qui va permettre au
microcontrôleur de connaître l'instant où la tension secteur
s'annule, afin d'enclencher les triacs à ce moment, et limiter
ainsi la création de parasites.
Le programme source ne peut pas être placé dans l'article : il
fait 24 pages ! Il faut dire qu'il est très largement commenté,
et que tout y est détaillé : calcul des temporisations,
dialogue entre ST6225 et MM5450, chien de garde, gestion des
boutons poussoirs, " zéro cross ", etc. Il est
téléchargeable sur le site de la revue, ainsi que le fichier
binaire associé.
Un mot à propos de la puissance :
- L'appareil est prévu pour des charges résistives, à savoir
de simples ampoules à filament.
- En l'absence de radiateurs sur les triacs, il est conseillé de
ne pas dépasser une puissance de 240 W environ par voie ( soit 1
A en 240 V avec un cos j de 1).
- La puissance totale absorbée ne doit pas dépasser 2400 W :
- Aucun problème en mode automatique, les motifs utilisés
n'allumant jamais toutes les lampes en même temps.
- Par contre, avec des forçages en mode manuel, il faudra être
prudent, et veiller à ne pas dépasser une puissance globale de
2400 W (on peut s'affranchir de cette contrainte en limitant la
puissance par sortie à 150 W).
Réalisation :
- Ce montage travaille sur le secteur, et le plus grand soin
s'impose pour sa réalisation : Fil de câblage souple de 1.5
mm², cosses rapides isolées, fixer les câbles avec des liens
plastiques, vernir le coté cuivre du circuit imprimé, relier le
boîtier métallique à la terre, utiliser des entretoises pour
éloigner le circuit imprimé du boîtier d'au moins 5 mm.
- Les filtres RC des triacs doivent impérativement être
réalisés avec des condensateurs dont la tension de service est
de 400V, et des résistances de ½ W.
- Vous pouvez modifier les motifs, soit en modifiant le fichier
source, et en assemblant à nouveau, soit encore, en réalisant
un " patch " sur le fichier binaire, à l'aide d'un
éditeur binaire : repérer la séquence du motif à modifier, et
la remplacer par la séquence désirée.
Utilisation :
- Utiliser impérativement un câble d'alimentation 2 + terre, et
brancher toujours l'appareil sur une prise munie d'une terre.
- A la mise sous tension, le chenillard est arrêté, et les
sorties sont en mode automatique.
- Si l'on presse sur un bouton poussoir quelconque moins de 0.5 s
environ, alors que tout est arrêté, on lance le motif qui
correspond au bouton pressé (il y a 16 motifs différents,
correspondant aux 16 boutons poussoirs différents).
- Si l'on presse sur un bouton poussoir quelconque moins de 0.5 s
environ, alors qu'un motif est en train de défiler, on arrête
le motif en cours.
- Si l'on presse sur un bouton poussoir quelconque plus de 0.5 s
environ, on force la sortie qui correspond au bouton pressé
(bouton 1 > sortie 1, bouton 2 > sortie 2, etc.) : le
forçage est le suivant : première pression du bouton, forçage
à 1, c'est à dire que la sortie reste toujours enclenchée.
Seconde pression sur le même bouton, forçage à 0, c'est à
dire que la sortie reste toujours arrêtée. Troisième pression
sur le bouton, la sortie retourne en mode automatique, c'est à
dire qu'elle est gérée par le motif.
- La combinaison des motifs et des forçages permet de varier les
animations lumineuses.
Attention :
- Lorsque l'on débranche l'appareil, une tension subsiste
pendant quelques secondes sur les broches mâles de la prise
secteur, liée à la présence du condensateur de filtrage
incorporé dans le filtre secteur : cette tension, non
dangereuse, est cependant fort désagréable : éviter le contact
des broches pendant les quelques secondes qui suivent le
débranchement de l'appareil.
- A l'intérieur du boîtier, plusieurs composants sont reliés
directement au secteur : ne pas introduire d'objet dans le
boîtier par les ouies d'aération, ni renverser de liquide.
- Si l'ouverture du boîtier est nécessaire, par exemple pour
changer un fusible, il est impératif de débrancher au
préalable l'appareil.
Typon (à remettre à l'échelle: extérieur 210 * 158 mm)

Liste des composants
Chenillard 16 voies
Résistances (1/4 W sauf contre indication)
-----------
1 R1 2.2 kohm
16 R2,R4,R6,R8,R10,R12,R14,R16,R18, 100 ohm 1/2W
R20,R22,R24,R26,R28,R30,R32
16 R3,R5,R7,R9,R11,R13,R15,R17,R19, 220 ohm
R21,R23,R25,R27,R29,R31,R33
1 R34 100 kohm
1 R35 10 kohm
Condensateurs
-------------
2 C1,C2 22 pF
2 C3,C4 100 nF 63V
16 C7,C8,C9,C10,C11,C12,C13,C14,C15, C16 100 nF 400 V
C17,C18,C19,C20,C21,C22
1 C5 670 nF 63V
1 C6 1000 microF 16V
Circuits intégrés
-----------------
1 U1 Micro contrôleur ST 6225
1 U2 Régulateur 7805
1 U3 Driver de leds MM5450N
16 U4,U5,U6,U7,U8,U9,U10,U11,U12,U13, Opto triac MOC3023
U14,U15,U16,U17,U18,U19
Diodes
------
16 D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11, Del (intégrées aux BP)
D12,D13,D14,D15,D16
1 D17 Pont 0.2A
3 D18,D19,D20 1N914
Divers
------
16 FU1,FU2,FU3,FU4,FU5,FU6,FU7,FU8, Fusible rapide 2A
FU9,FU10,FU11,FU12,FU13,FU14,FU15,
FU16
1 FU17 Fusible lent 0.1A
16 I1,I2,I3,I4,I5,I6,I7,I8,I9,I10,I11, Bouton poussoir NO
I12,I13,I14,I15,I16,
16 T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11, Triac 4A 600V type ST 435 600D
T12,T13,T14,T15,T16
1 I17 Interrupteur double 250V 10A
1 P1 Potentiomètre 10k linéaire
1 TR1 Transformateur plat 240/6V 10VA
1 X1 Quartz 3.2768MHz
1 Boîtier type rack 19 pouces
1 Socle mâle antiparasite VDE 10A 250V 2 + terre
1 Cordon secteur 10A 250V 2 + terre
16 Socles femelles CEE 10A 2 + terre
16 Prises mâles CEE 2 + terre
Divers: Pieds, entretoises, visserie, borniers de jonction 2 broches
Cosses fast on, gaine thermorétractable, fil souple 1.5 mm².
Schéma d'implantation

Fichier assembleur
;---------------------------------------------------------------------------
; Programme pour chenillard 16 voies
;
; Carte à base de ST6225
;
; dB
;
; 28/02/99
;
; Fonctionnement:
;
; A la mise sous tension, tout est éteint
;
; Si on presse un BP quelconque moins de 0.5 s alors que tout est
; arrêté, on lance le motif correspondant au BP pressé (les leds
; suivent les triacs)
;
; Si on presse un BP quelconque moins de 0.5 s alors qu'un motif
; est exécuté, on arrête le motif.
;
; Si on presse un BP plus de 0.5 s, forçage de la sortie, avec un
; cycle ON/OFF/AUTO/ON/OFF/AUTO/...
;
; Pour diminuer les parasites, le déclenchement des triacs se fait
; peu après le passage à zéro du secteur, lequel est surveillé par
; la broche PC4: après abaissement par un transformateur, on se
; retrouve en tension sinusoïdale de 8.5 V d'amplitude (6 Veff), puis
; redressement en double alternance par deux diodes signal et un pont
; de puissance, ce qui amène donc un seuil d'environ 2 * 0.6 V = 1.2 V.
;
; Le temps pendant lequel la broche PC4 du ST6225 est au niveau logique
; zéro (soit inférieur à 1.6 V pour une alimentation en 5 V) est donc
; à peu près égal à deux fois celui mis par la sinusoïde de 8.5 V
; d'amplitude pour passer de 0 V à (1.6 + 1.2) = 2.8 V.
;
; On a donc: 8 * sin (2 * pi * 50 * t) = 2.8, ce qui donne:
;
; t = (asin (2.8 / 8)) / ( 2 * pi * 50 ), soit 1.1 ms
;
; On double (chûte première sinusoïde, et montée suivante), et
; on trouve donc finalement un temps pour le niveau logique 0
; égal à environ 2 * 1.1 = 2.2 ms
;
; Remarques:
;
; a) Led 1: celle située la plus à gauche quand on regarde la façade
; b) Bouton poussoir 1: idem
; c) Sortie 1: idem
;
; Récapitulation:
;
; ------------ MSB ------------ ------------ LSB ------------
; Motif 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
; Led 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
; MM5450 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
; Triacs 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
; MM5450 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
; BP 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
; Port PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7
; d) Gestion du watchdog qui ne peut être masqué sur les versions
; ST62E25FI-HWD
; e) Utilisation de call subroutines
; f) Travail sans interruptions
;
; Essentiel sur le ST6225, très difficile à retrouver dans un certain
; livre sur les ST62XX particulièrement mal fait, et dont je tairai
; le nom:
;
; Drapeaux C retenue
; Z zéro
;
; Flag Carry du ST6225 (différent pour un ST60):
; - mis à 1 si dépassement capacité lors d'additions ADD ADDI
; - contient le MSB du registre avant un complément COM
; - mis à 1 si A < toto et mis à 0 si A>= toto
; dans CP A, toto et CPI A, toto
; - contient l'ancien MSB du registre après un RLC
; (et le nouveau LSB du registre est l'ancien flag C)
; - contient l'ancien MSB du registre après un SLA
; (et le nouveau LSB du registre est 0)
; - mis à 1 si A < toto et mis à 0 si A>= toto
; dans SUB A, toto et SUBI A, toto
;
; Espace mémoire ST6210/20 Les deux ST6215/25
; Fenêtre ROM 040h à 07Fh
; Registre X 080h
; Registre Y 081h
; Registre V 082h
; Registre W 083h
; Données RAM 084h à 0BFh
; Registre DRA 0C0h
; Registre DRB 0C1h
; Registre DRC 0C2h
; Registre DDRA 0C4h
; Registre DDRB 0C5h
; Registre DDRC 0C6h
; Registre IOR 0C8h
; Registre DRWR 0C9h
; Registre ORA 0CCh
; Registre ORB 0CDh
; Registre ORC 0CEh
; Registre ADR 0D0h
; Registre ADCR 0D1h
; Registre PSC 0D2h
; Registre TCR 0D3h
; Registre TSCR 0D4h
; Registre WDR 0D8h
; Registre 8b A 0FFh
; Programme 880h à F9Fh 080h à F9Fh
; Vecteur CAN FF0h & FF1h
; Vecteur Timer FF2h & FF3h
; Vecteur Pb & Pc FF4h & FF5h
; Vecteur Pa FF6h & FF7h
; Vecteur Nmi FFCh & FFDh
; Vecteur Reset FFEh & FFFh
;
; Configuration des entrées sorties: ports A, B, C
; bit DDR bit OR bit DR Mode
; 0 0 0 Entrée avec rappel, ss interruption (initial)
; 0 0 1 Entrée sans rappel ni interruption
; 0 1 0 Entrée avec rappel et interruption
; 0 1 1 Entrée sans rappel ni interruption (PA0 à 3)
; ou Entrée analogique (autres)
; 1 0 X Sortie drain ouvert 10 mA (PA0 à 3)
; ou Sortie drain ouvert 5 mA (autres)
; X est l'état dans lequel la sortie est placée
; 1 = haut et 0 = bas
; 1 1 X Sortie symétrique
; X est l'état dans lequel la sortie est placée
; 1 = haut et 0 = bas
;
; Attention: ne pas utiliser de set ou reset sur les bits d'un
; registre DRA, DRB ou DRC, car il y a alors lecture, positionnement et
; réécriture: la lecture n'étant pas fiable (certains registres sont
; à écriture seule), en faisant cela on peut modifier la configuration
; du registre.
;
; 1 cycle = 13 périodes de l'oscillateur, soit ici 3.97 µs avec le
; quartz à 3.2768 MHz. Avec en moyenne 4 cycles par instruction,
; on trouve un temps approximatif de 15.9 µs par instruction, et donc
; on pourra exécuter environ (10E-3 - 2.21E-3)/(15.9E-6) = 490
; instructions pendant la fenêtre dans laquelle il n'y a pas de zéro
; secteur, ce qui est très juste.
;
; Convertisseur analogique > numérique:
;
; Registre ADR à lecture seule, pour le résultat
;
; Registre ADCR pour le contrôle
; ADCR b7 b6 b5 b4 b3 b2 b1 b0
; EAI EOC STA PDS - - - -
;
; Bit 0 1
; PDS CAN inactif CAN prêt ou en cours
; STA Doit être mis à 0 Au front montant, déclenche
; avant une acquisition une acquisition
; EOC Mis à 0 quand STA Mis à 1 en fin de conversion
; passe à 1
; EAI Pas d'interruption Interruption ADC générée en
; fin de conversion
; La fréquence du quartz doit être au moins de 1.2 MHz pour pouvoir
; utiliser le CAN.
; Fenêtre ROM: la mémoire ROM n'est accessible que via une fenêtre de
; 64 octets dans l'espace adressable par le micro. L'adresse du premier
; octet de la fenêtre est 0040h, et celle du dernier octet est 007Fh.
; On choisi le segment de ROM visible dans la fenêtre par le chargement
; préalable du registre Data Rom Window Register, l'adresse dans la ROM
; étant définie ainsi sur 12 bits:
;
; Adresse ROM 11 10 09 08 07 06 05 04 03 02 01 00
; DRWR 00 00 D5 D4 D3 D2 D1 D0
; Adresse dans fenêtre 0 1 D5 D4 D3 D2 D1 D0
; î
; Ce 1 est là car la première
; adresse de la fenêtre est 64
;
; Timer: un registre TCR (compteur) et un registre TSCR (contrôle)
;
; registre TSCR:
; b7 b6 b5 b4 b3 b2 b1 b0
; TMZ ETI TOUT DOUT PSI PS2 PS1 PS0
;
; TMZ : Mis à 1 si le registre TCR passe à 0, et déclenche une
; interruption si ETI est à 1
;
; ETI : autorise les interruptions, si mis à 1
; TOUT DOUT TMZ Déterminent la fonction de la broche Timer ainsi:
; 0 0 - Entrée, front montant actif, compteur d'évennements
; 0 1 - Entrée, niveau 1 = comptage horloge interne
; 0 = arrêt comptage
; utilisé pour mesure durées
; 1 - 0 Sortie, niveau = valeur précédente
; 1 0 1 Sortie, niveau = 0 (DOUT) } utilisé pour générer un
; 1 1 1 Sortie, niveau = 1 (DOUT) } niveau en fin comptage
;
; PSI : Si mis à 1, commande la mise à 1 de tous les bits du TCR et du
; prédiviseur PSC, et autorise fonctionnement et accès.
; Si mis à 0, le TCR est gelé et le PSC est forcé à 7Fh
;
; PS2 PS1 PS0 Rapport de division
; 0 0 0 1
; 0 0 1 2
; 0 1 0 4
; 0 1 1 8
; 1 0 0 16
; 1 0 1 32
; 1 1 0 64
; 1 1 1 128
;
; Chien de garde : registre DWDR dont les bits DWDR1 (MSB ! ) à
; DWDR7 (LSB !) sont décrémentés à une fréquence égale à celle du
; quartz, divisée par 3072: en fait, le basculement du bit DWDR2
; provoque un reset, donc la valeur utile du watchdog se charge
; sur DWD2 à DWD7, soit un mot de 6 bits, variant donc de 0 à 63.
; Comme il faut 13 coups d'horloge pour un cycle machine, le registre
; DWDR est donc décrémenté tous les 3072 / 13 = 236 cycles machine
; environ, soit en moyenne toutes les 59 instructions.
; Après un reset, le chien de garde doit être réarmé avant la 28ème
; instruction, et ensuite au moins toutes les 59 instructions environ,
; pour un rechargement avec la valeur 10000000b, et toutes les 3750
; instructions environ, pour un rechargement avec la valeur 11111110b.
; Brochage du MM 5450
;
; Broche Fonction Composant
; 1 Vss
; 2 Q17 NC
; 3 Q16 Led 1 (La plus à gauche)
; 4 Q15 Led 2
; 5 Q14 Led 3
; 6 Q13 Led 4
; 7 Q12 Led 5
; 8 Q11 Led 6
; 9 Q10 Led 7
; 10 Q 9 Led 8
; 11 Q 8 Led 9
; 12 Q 7 Led 10
; 13 Q 6 Led 11
; 14 Q 5 Led 12
; 15 Q 4 Led 13
; 16 Q 3 Led 14
; 17 Q 2 Led 15
; 18 Q 1 Led 16
; 19 Réglage luminosite
; 20 Vdd
; 21 Horloge
; 22 Data
; 23 /Enable
; 24 Q34 Sortie triac 16
; 25 Q33 Sortie triac 15
; 26 Q32 Sortie triac 14
; 27 Q31 Sortie triac 13
; 28 Q30 Sortie triac 12
; 29 Q29 Sortie triac 11
; 30 Q28 Sortie triac 10
; 31 Q27 Sortie triac 9
; 32 Q26 Sortie triac 8
; 33 Q25 Sortie triac 7
; 34 Q24 Sortie triac 6
; 35 Q23 Sortie triac 5
; 36 Q22 Sortie triac 4
; 37 Q21 Sortie triac 3
; 38 Q20 Sortie triac 2
; 39 Q19 Sortie triac 1
; 40 Q18 NC
;
; Dialogue avec le MM 5450
;
; - Validation sur front montant horloge
; - Fréquence maximale horloge: 500 kHz
; - Envoi dans l'ordre de 1, Q1, ..., Q35
; (Q35 inexistante mais doit être gérée pour
; compatibilité avec le MM 5451)
; - Séquence: positionnement data
; attente de 300 ns
; montée de l'horloge
; attente de 300 ns
; descente de l'horloge
; etc ...
; La tempo de 300 ns n'est pas gérée par le timer
; mais se fait si besoin par boucle d'attente, et en
; fait il n'y en a pas besoin ici, car avec une
; horloge à 3.2768 MHz, on a un temps de cycle de
; 1 / (3.2768 E6 / 13) = 3.9 µs, soit un temps
; d'instruction de 15.8 µs environ, largement au
; dessus des 300 ns nécessaires.
;
; Affectation des E/S:
;
; - PA0: entrée bouton poussoir 1 ( 0 si enfoncé)
; - PA1: entrée bouton poussoir 2 ( 0 si enfoncé)
; - PA2: entrée bouton poussoir 3 ( 0 si enfoncé)
; - PA3: entrée bouton poussoir 4 ( 0 si enfoncé)
; - PA4: entrée bouton poussoir 5 ( 0 si enfoncé)
; - PA5: entrée bouton poussoir 6 ( 0 si enfoncé)
; - PA6: entrée bouton poussoir 7 ( 0 si enfoncé)
; - PA7: entrée bouton poussoir 8 ( 0 si enfoncé)
;
; - PB0: entrée bouton poussoir 9 ( 0 si enfoncé)
; - PB1: entrée bouton poussoir 10 ( 0 si enfoncé)
; - PB2: entrée bouton poussoir 11 ( 0 si enfoncé)
; - PB3: entrée bouton poussoir 12 ( 0 si enfoncé)
; - PB4: entrée bouton poussoir 13 ( 0 si enfoncé)
; - PB5: entrée bouton poussoir 14 ( 0 si enfoncé)
; - PB6: entrée bouton poussoir 15 ( 0 si enfoncé)
; - PB7: entrée bouton poussoir 16 ( 0 si enfoncé)
;
; - PC4: entrée détection zéro secteur
; - PC5: horloge MM5450
; - PC6: données MM5450
; - PC7: entrée tension potentiomètre vitesse
; (0 V quand le potentiomètre est tourné à fond
; dans le sens lévogyre, et + 5 V si tourné à
; fond dans le sens dextrogyre (aiguilles d'une
; montre)).
;
; Ne pas oublier:
;
; - effacage aux U.V. 30 minutes
; - d'obstruer la fenêtre du ST6225 après programmation ou
; mieux griller un OTP (composant non effaçable, et donc
; programmable une seule fois), quand tout est OK.
;
; Assemblage du programme:
;
; - Le programme assembleur source est par exemple CHENILLE.ASM
; - Pour un ST6225, l'assembler par AST6 -L CHENILLE
;
; Programmation du ST6:
;
; - copier le programme assemblé (.hex) sur la disquette
; bootable chenille
; - Rebooter le PC sur cette disquette (démarrage sous un
; ancien DOS, le logiciel ne tournant pas sous WIN95)
; - Utiliser la carte branchée sur le port parallèle
; - Alimenter la carte en 12V DC
; - Lancer le programme ST6PGM.BAT
;
;
;---------------------------------------------------------------------------
; Directives d'assemblage
.title "Chenillard" ; titre sur le listing
.vers "st6225"
.input "6215_reg.asm" ; définition noms registres
;---------------------------------------------------------------------------
; Définition des constantes utilisées pour l'assembleur
ktempo .equ 5 ; valeur chargée dans TCR qui donne
; un pulse de 58.59 * 5 = 293 µs
kdureebp .equ 5 ; (5-1) * .293 * 256 = 300 ms tst BP
knonos .equ 254 ; Un gros os pour le chien de garde
; qui va ronger pendant 15000 cycles
; soit environ 3750 instructions
;---------------------------------------------------------------------------
; Définition des emplacements des variables en RAM
brouill .def 0084h ; variable servant de brouillon
dureebp .def 0085h ; tempo décrémentée pression BP
; Flags de forçage ci-dessous: 0 si pas de forçage, 1 si forçage
f0tr0108 .def 0086h ; flags forçage à zéro sorties 1 à 8
f0tr0916 .def 0087h ; flags forçage à zéro sorties 9 à 16
f1tr0108 .def 0088h ; flags forçage à un sorties 1 à 8
f1tr0916 .def 0089h ; flags forçage à un sorties 9 à 16
flags .def 008Ah ; drapeaux
; b0 à 1 si traitement BP en cours
; b1 bit à envoyer au MM5450
; b2
; b3
; b4
; b5
; b6
; b7
imagepa .def 008Bh ; image du port A (BP 1 à 8) COMPLEM
imagepb .def 008Ch ; image du port B (BP 9 à 16) COMPLEM
; Les images des ports sont complémentées car quand un bouton poussoir
; est pressé, cela donne un niveau 0 plus long à gérer qu'un 1
ligne .def 008Dh ; numéro de la ligne du motif: 0 à 15
lignelsb .def 008Eh ; octet faible de la ligne jouée
lignemsb .def 008Fh ; octet fort de la ligne jouée
mempa .def 0090h ; Mémoire de imagepa
mempb .def 0091h ; Mémoire de imagepb
motif .def 0092h ; numéro du motif choisi: 0 à 16
numbit .def 0093h ; numéro du bit envoyé au MM5450
tempobp .def 0094h ; variable décrémentée dans gesttemp
tension .def 0095h ; tension potentiomètre mesurée
;---------------------------------------------------------------------------
; Définition des vecteurs d'interruption CAN, timer, ports, NMI et reset
; Travail sans aucune interruption
.org 0FF0h ; Vecteurs d'interruption CAN
reti
.org 0FF2h ; Vecteur d'interruption du timer
reti
.org 0FF4h ; Vecteur interruption ports B & C
reti
.org 0FF6h ; Vecteur interruption port A
reti
.org 0FFCh ; Vecteur interruption NMI
reti
.org 0FFEh ; Vecteur de reset
jp reset
;---------------------------------------------------------------------------
; Table de données contenant les différents motifs du chenillard
; Il y a 16 motifs utiles différents: Motif01 à Motif16: chacun
; comprend 16 étapes sur 16 bits (2 octets) soit 16 * 16 * 2 = 512
; octets à définir. Un 17ème motif vide, le Motif00, permet une
; extinction totale.
; Les octets sont rangés ainsi:
; adresse octet
; 0C00h fort ligne 1 motif 00
; 0C01h faible ligne 1 motif 00
; 0C02h fort ligne 2 motif 00
; 0C03h faible ligne 2 motif 00
; etc ...
.org 0C00h
Motif00 .byte 00000000b, 00000000b ; Vide: c'est celui qui
.byte 00000000b, 00000000b ; est joué pour l'extinction
.byte 00000000b, 00000000b ; totale
.byte 00000000b, 00000000b
.byte 00000000b, 00000000b
.byte 00000000b, 00000000b
.byte 00000000b, 00000000b
.byte 00000000b, 00000000b
.byte 00000000b, 00000000b
.byte 00000000b, 00000000b
.byte 00000000b, 00000000b
.byte 00000000b, 00000000b
.byte 00000000b, 00000000b
.byte 00000000b, 00000000b
.byte 00000000b, 00000000b
.byte 00000000b, 00000000b
Motif01 .byte 10001000b, 10001000b ; Progression sur 4 sorties
.byte 01000100b, 01000100b ; Ce motif peut être utilisé
.byte 00100010b, 00100010b ; avec 4, 8 ou 16 sorties
.byte 00010001b, 00010001b
.byte 10001000b, 10001000b
.byte 01000100b, 01000100b
.byte 00100010b, 00100010b
.byte 00010001b, 00010001b
.byte 10001000b, 10001000b
.byte 01000100b, 01000100b
.byte 00100010b, 00100010b
.byte 00010001b, 00010001b
.byte 10001000b, 10001000b
.byte 01000100b, 01000100b
.byte 00100010b, 00100010b
.byte 00010001b, 00010001b
Motif02 .byte 10000000b, 00000000b ; Ricochet
.byte 00000000b, 00000001b
.byte 01000000b, 00000000b
.byte 00000000b, 00000010b
.byte 00100000b, 00000000b
.byte 00000000b, 00000100b
.byte 00010000b, 00000000b
.byte 00000000b, 00001000b
.byte 00001000b, 00000000b
.byte 00000000b, 00010000b
.byte 00000100b, 00000000b
.byte 00000000b, 00100000b
.byte 00000010b, 00000000b
.byte 00000000b, 01000000b
.byte 00000001b, 00000000b
.byte 00000000b, 10000000b
Motif03 .byte 10000000b, 00000000b ; Progression d'une lampe
.byte 01000000b, 00000000b ; seule, sur les 16 sorties.
.byte 00100000b, 00000000b ; Gnniiiiiooooouuuuu ....
.byte 00010000b, 00000000b ; (sans doppler ici)
.byte 00001000b, 00000000b
.byte 00000100b, 00000000b
.byte 00000010b, 00000000b
.byte 00000001b, 00000000b
.byte 00000000b, 10000000b
.byte 00000000b, 01000000b
.byte 00000000b, 00100000b
.byte 00000000b, 00010000b
.byte 00000000b, 00001000b
.byte 00000000b, 00000100b
.byte 00000000b, 00000010b
.byte 00000000b, 00000001b
Motif04 .byte 10000000b, 00000001b ; Croisement de lampes se
.byte 01000000b, 00000010b ; promenant en sens inverse
.byte 00100000b, 00000100b
.byte 00010000b, 00001000b
.byte 00001000b, 00010000b
.byte 00000100b, 00100000b
.byte 00000010b, 01000000b
.byte 00000001b, 10000000b
.byte 00000001b, 10000000b
.byte 00000010b, 01000000b
.byte 00000100b, 00100000b
.byte 00001000b, 00010000b
.byte 00010000b, 00001000b
.byte 00100000b, 00000100b
.byte 01000000b, 00000010b
.byte 10000000b, 00000001b
Motif05 .byte 10000000b, 00000001b ; croisement idem ci-dessus
.byte 00100000b, 00000100b ; mais utilisable avec 8 ou
.byte 00000100b, 00100000b ; 16 sorties
.byte 00000001b, 10000000b
.byte 00000001b, 10000000b
.byte 00000100b, 00100000b
.byte 00100000b, 00000100b
.byte 10000000b, 00000001b
.byte 10000000b, 00000001b
.byte 00100000b, 00000100b
.byte 00000100b, 00100000b
.byte 00000001b, 10000000b
.byte 00000001b, 10000000b
.byte 00000100b, 00100000b
.byte 00100000b, 00000100b
.byte 10000000b, 00000001b
Motif06 .byte 00000011b, 11000000b ; tic tac
.byte 00000000b, 00000000b
.byte 11000000b, 00000011b
.byte 00000000b, 00000000b
.byte 00001100b, 00110000b
.byte 00000000b, 00000000b
.byte 00110000b, 00001100b
.byte 00000000b, 00000000b
.byte 00000011b, 11000000b
.byte 00000000b, 00000000b
.byte 00001100b, 00110000b
.byte 00000000b, 00000000b
.byte 00110000b, 00001100b
.byte 00000000b, 00000000b
.byte 11000000b, 00000011b
.byte 00000000b, 00000000b
Motif07 .byte 00000000b, 00000000b ; Replis
.byte 10000000b, 00000001b
.byte 11000000b, 00000011b
.byte 11100000b, 00000111b
.byte 11110000b, 00001111b
.byte 01111000b, 00011110b
.byte 11110000b, 00001111b
.byte 11100000b, 00000111b
.byte 11000000b, 00000011b
.byte 10000000b, 00000001b
.byte 01000000b, 00000010b
.byte 00100000b, 00000100b
.byte 00010000b, 00001000b
.byte 00001000b, 00010000b
.byte 00000100b, 00100000b
.byte 00000011b, 11000000b
Motif08 .byte 10000000b, 00001000b ; Double ondulation
.byte 01000000b, 00000010b ; asymétrique
.byte 00100000b, 00000001b
.byte 00010000b, 00000001b
.byte 00001000b, 00000100b
.byte 00000100b, 00010000b
.byte 00000010b, 01000000b
.byte 00000001b, 10000000b
.byte 00000001b, 10000000b
.byte 00000010b, 01000000b
.byte 00000100b, 00010000b
.byte 00001000b, 00000100b
.byte 00010000b, 00000001b
.byte 00100000b, 00000001b
.byte 01000000b, 00000100b
.byte 10000000b, 00001000b
Motif09 .byte 10000000b, 10000000b ; Double ondulation
.byte 01000000b, 01000000b ; utilisable en 8 ou 16
.byte 00100000b, 00100000b ; voies
.byte 00010000b, 00010000b
.byte 00001000b, 00001000b
.byte 00000100b, 00000100b
.byte 00000010b, 00000010b
.byte 00000001b, 00000001b
.byte 00000001b, 00000001b
.byte 00000010b, 00000010b
.byte 00000100b, 00000100b
.byte 00001000b, 00001000b
.byte 00010000b, 00010000b
.byte 00100000b, 00100000b
.byte 01000000b, 01000000b
.byte 10000000b, 10000000b
Motif10 .byte 00001000b, 00000000b ; Aléatoire
.byte 00000000b, 10000000b
.byte 00000000b, 00000100b
.byte 00100000b, 00000000b
.byte 00000000b, 01000000b
.byte 00010000b, 00000000b
.byte 00000000b, 00001000b
.byte 01000000b, 00000000b
.byte 00000001b, 00000000b
.byte 00000000b, 00100000b
.byte 00000100b, 00000000b
.byte 00000000b, 00000010b
.byte 00000000b, 00000001b
.byte 10000000b, 00000000b
.byte 00000000b, 00010000b
.byte 00000010b, 00000000b
Motif11 .byte 00000000b, 00000000b ; Pétard
.byte 00001000b, 00010000b
.byte 00000000b, 00000000b
.byte 00001000b, 00010000b
.byte 00000000b, 00000000b
.byte 00001000b, 00010000b
.byte 00000000b, 00000000b
.byte 00001000b, 00010000b
.byte 00011100b, 00111000b
.byte 00111100b, 00111100b
.byte 00000000b, 00000000b
.byte 00111100b, 00111100b
.byte 00000000b, 00000000b
.byte 01100110b, 01100110b
.byte 00000000b, 00000000b
.byte 10000000b, 00000001b
Motif12 .byte 10000000b, 00000000b ; Chenille progressant
.byte 11100000b, 00000000b ; avec longueur variable
.byte 11111000b, 00000000b
.byte 00111110b, 00000000b
.byte 00001110b, 00000000b
.byte 00000010b, 00000000b
.byte 00000011b, 00000000b
.byte 00000011b, 10000000b
.byte 00000001b, 10000000b
.byte 00000000b, 10000000b
.byte 00000000b, 11000000b
.byte 00000000b, 01110000b
.byte 00000000b, 01111100b
.byte 00000000b, 00011111b
.byte 00000000b, 00000111b
.byte 00000000b, 00000001b
Motif13 .byte 10000000b, 00000000b ; progression régulière de
.byte 11000000b, 00000000b ; 3 lampes
.byte 11100000b, 00000000b
.byte 01110000b, 00000000b
.byte 00111000b, 00000000b
.byte 00011100b, 00000000b
.byte 00001110b, 00000000b
.byte 00000111b, 00000000b
.byte 00000011b, 10000000b
.byte 00000001b, 11000000b
.byte 00000000b, 11100000b
.byte 00000000b, 01110000b
.byte 00000000b, 00111000b
.byte 00000000b, 00011100b
.byte 00000000b, 00001110b
.byte 00000000b, 00000111b
Motif14 .byte 11110000b, 00000000b ; saccades: groupes de 4
.byte 00000000b, 00000000b ; lampes se baladant
.byte 00000000b, 00001111b
.byte 00000000b, 00000000b
.byte 00001111b, 00000000b
.byte 00000000b, 00000000b
.byte 00000000b, 11110000b
.byte 00000000b, 00000000b
.byte 11110000b, 00000000b
.byte 00000000b, 00000000b
.byte 00000000b, 00001111b
.byte 00000000b, 00000000b
.byte 00001111b, 00000000b
.byte 00000000b, 00000000b
.byte 00000000b, 11110000b
.byte 00000000b, 00000000b
Motif15 .byte 00000001b, 10000000b ; Effilement
.byte 00000001b, 10000000b
.byte 00000011b, 11000000b
.byte 00000111b, 11100000b
.byte 00001111b, 11110000b
.byte 00011110b, 01111000b
.byte 00111000b, 00011100b
.byte 01100000b, 00000110b
.byte 10000000b, 00000001b
.byte 01100000b, 00000110b
.byte 00111000b, 00011100b
.byte 00011110b, 01111000b
.byte 00001111b, 11110000b
.byte 00000111b, 11100000b
.byte 00000011b, 11000000b
.byte 00000001b, 10000000b
Motif16 .byte 00001000b, 00000000b ; ondulation
.byte 00000100b, 00000000b
.byte 00000010b, 00000000b
.byte 00001000b, 00000000b
.byte 00010000b, 00000000b
.byte 00001000b, 00000000b
.byte 00000100b, 00000000b
.byte 00000001b, 00000000b
.byte 00000000b, 01000000b
.byte 00000000b, 00010000b
.byte 00000000b, 10000100b
.byte 00000000b, 01000010b
.byte 00000000b, 00001000b
.byte 00000000b, 01000000b
.byte 00000100b, 00000000b
.byte 00000000b, 00000001b
;---------------------------------------------------------------------------
; Début du programme
; initialisations
.org 0200h
reset ldi wdr, knonos ; On calme le chien de garde
ldi ddra,00000000b ; A0..7 entrée rappel ss interruption
ldi ora, 00000000b ; (boutons poussoirs)
ldi dra, 00000000b
ldi ddrb,00000000b ; B0..7 entrée rappel ss interruption
ldi orb, 00000000b ; (boutons poussoirs)
ldi drb, 00000000b
ldi ddrc,01100000b ; C4 entr 0 cross ni rappel ni inter
ldi orc, 11100000b ; C5 C6 sorties symétriques MM5450
ldi drc, 10010000b ; C7 entrée analogique potar vitesse
ldi tcr, ktempo
ldi tscr, 00011100b ; b7 passe à 1 si TCR passe à 0
; b6 interdit interruptions par b7
; b5 broche timer en entrée (+Vcc)
; b4 TCR valide si b5 à 1 (exact)
; b3 2 1: prédivision par 16
; ici 3.2768/(12*16) => 58.59 µs
ret ; car niveau pile aléatoire à la
ret ; mise sous tension ...
ret
ret
ret
ret
ldi adcr, 00010000b ; Activation du CAN et reset
clr brouill ; variable servant de brouillon
clr dureebp ; tempo incrémentée pression BP
clr f0tr0108 ; flags forçage à zéro sorties 1 à 8
clr f0tr0916 ; flags forçage à zéro sorties 9 à 16
clr f1tr0108 ; flags forçage à un sorties 1 à 8
clr f1tr0916 ; flags forçage à un sorties 9 à 16
clr flags ; drapeaux
; b0 à 1 si traitement BP en cours
; b1 à 1 si un BP enfoncé
; b2
; b3
; b4
; b5
; b6
; b7
clr imagepa ; image du port A (BP 1 à 8) COMPLEM
clr imagepb ; image du port B (BP 9 à 16) COMPLEM
clr ligne ; numéro de la ligne du motif: 0 à 15
clr lignelsb ; octet faible de la ligne jouée
clr lignemsb ; octet fort de la ligne jouée
clr mempa ; Mémoire de imagepa
clr mempb ; Mémoire de imagepb
clr motif ; numéro du motif choisi: 0 à 16
clr numbit ; numéro du bit envoyé au MM5450
clr tempobp ; variable décrémentée dans gesttemp
clr tension ; tension potentiomètre mesurée
;---------------------------------------------------------------------------
; Boucle principale
;
; Le principe retenu est le suivant:
; - on attend patiemment le passage à zéro du secteur, par la
; routine zerosect: c'est pendant cette attente que l'on
; exécute en boucle la routine de gestion du temps gesttemp.
; En fait, selon la vitesse de défilement choisie, on attend
; un nombre de passages au zéro variable entre 1 et 16.
; - Dès qu'on a passé le zéro, on envoie la salve de commande
; au circuit MM5450 par la routine gest5450, qui va d'une
; part allumer les leds, et d'autre part commander (en
; continu) les triacs.
; - Une fois la salve envoyée, on gère les boutons (acne), le
; potentiomètre (potar), le choix et la progression du motif
; (progres): tout ceci se fait sans problèmes pendant les
; 9 ms (environ) qui restent dans une demi sinusoïde.
boucle call acne ; traitement des boutons poussoirs
call potar ; mesure tension potentiomètre
call progres ; choix et progression du motif
call zerosect ; attente passage à zero secteur
call gest5450 ; gestion des leds et triacs
call gesttemp ; gestion du temps qui passe
jp boucle
;---------------------------------------------------------------------------
; Traitement des boutons: routine "fluide", c'est à dire qu'il n'y a
; pas de blocage ou d'attente quelconque en un point.
;
acne ldi wdr, knonos ; On calme le chien de garde
ld a, dra ; On ne travaille pas directement
com a ; sur les ports A et B (BP), mais
ld imagepa, a ; sur des images de ces ports,
; que l'on complémente, car quand
ld a, drb ; un BP est pressé, cela donne un
com a ; niveau 0 sur la broche du port,
ld imagepb, a ; plus long à traiter qu'un niveau 1
jrs 0, flags, acn01 ; si traitement BP en cours, on y va
; sinon on regarde si un BP est
; pressé, c'est à dire ...
ld a, imagepa ; ... si BP 1 à 8 pressé, on traite
jrnz acn00
ld a, imagepb ; ... si BP 9 à 16 pressé, on traite
jrnz acn00
jp acn16 ; ... si aucun BP pressé, on s'en va
acn00 jp acn15 ; renvoi plus loin, où l'on traitera
; l'enclenchement du traitement BP
acn01 ; Traitement des BP en cours: on regarde maintenant si le BP
; a été relâché, c'est à dire ...
ld a, imagepa ; ... si BP 1 à 8 pressé, on passe
jrnz acn02
ld a, imagepb ; ... si BP 9 à 16 pressé, on passe
jrz acn03
acn02 jp acn16 ; si le BP n'est pas relâché, on passe
acn03 ; Le BP a été relâché, donc ...
res 0, flags ; on baisse le drapeau traitement
ld a, dureebp ; Si la pression a duré plus de 0.5s
jrnz acn04
jp acn10 ; alors on va en acn10
; Ici on traite le cas où un BP a été pressé moins de 0.5s
acn04 ld a, motif ; Si la pression a duré moins de 0.5s
jrz acn05 ; et qu'il y avait un motif en cours
clr motif ; alors on arrête le chenillard
jp acn16
acn05 ldi a, 00000001b ; Si la pression a duré moins de 0.5s
acn06 inc motif ; et qu'il n'y avait pas de motif en
cp a, mempa ; cours, alors on calcule le motif
jrnz acn07 ; indiqué par le BP pressé
jp acn16
acn07 sla a ; Le principe est d'incrémenter la
jrnc acn06 ; valeur de motif à chaque fois que
ldi a, 00000001b ; l'on décale d'un cran à gauche le
acn08 inc motif ; masque de test des ports A et B
cp a, mempb ; (BP)
jrnz acn09
jp acn16
acn09 sla a
jrnc acn08
ldi motif, 3 ; XXXXXXXXXXXXXX pour test XXXXXXXXXX
jp acn16 ; Le programme ne devrait en principe
; jamais passer ici.
; Ici on traite le cas où un BP a été pressé plus de 0.5s
acn10 ; on doit retourner les deux octets Mempa et Mempb car le
; BP 1 correspond à PA0 , le BP 8 à PA7, le BP 9 à PB 0, et
; le BP 16 à PB 7.
; Pas très malin tout ça, mais bon, ça ira pour cette fois
ld a, mempa ; le principe est d'analyser
clr mempa ; l'ancien octet mempa bit à bit
sla a ; en le faisant tourner par un sla
jrnc acn10a ; et en examinant le flag de retenue
set 0, mempa
acn10a sla a ; on replace alors successivement
jrnc acn10b ; les bits à un dans le sens inverse
set 1, mempa
acn10b sla a ; b7 devient b0
jrnc acn10c ; b6 devient b1
set 2, mempa ; b5 devient b2
acn10c sla a ; b4 devient b3
jrnc acn10d ; b3 devient b4
set 3, mempa ; b2 devient b5
acn10d sla a ; b1 devient b6
jrnc acn10e ; b0 devient b7
set 4, mempa
acn10e sla a ; manège tou'n
jrnc acn10f
set 5, mempa ; tou'n manège
acn10f sla a
jrnc acn10g
set 6, mempa ; tou'n tou'n
acn10g sla a
jrnc acn10h
set 7, mempa
acn10h ld a, mempb
clr mempb
sla a ; et comme on aime les tours de
jrnc acn10i ; manège, on recommence avec mempb
set 0, mempb
acn10i sla a
jrnc acn10j
set 1, mempb
acn10j sla a
jrnc acn10k
set 2, mempb ; tou'n comme disait l'autre
acn10k sla a
jrnc acn10l
set 3, mempb
acn10l sla a
jrnc acn10m
set 4, mempb
acn10m sla a
jrnc acn10n
set 5, mempb
acn10n sla a
jrnc acn10o ; allez, encore un petit tour
set 6, mempb
acn10o sla a
jrnc acn10p
set 7, mempb
acn10p ld a, mempa ; si le BP enfoncé correspond à
and a, f0tr0108 ; une voie déja forcée à 0, alors
jrz acn11 ; on supprime ce forçage à 0
ld a, mempa ; (cette voie retourne en auto)
com a ; (on traite ici les BP 1 à 8)
and a, f0tr0108
ld f0tr0108, a
jp acn16
acn11 ld a, mempb ; si le BP enfoncé correspond à
and a, f0tr0916 ; une voie déja forcée à 0, alors
jrz acn12 ; on supprime ce forçage à 0
ld a, mempb ; (cette voie retourne en auto)
com a ; (on traite ici les BP 9 à 16)
and a, f0tr0916
ld f0tr0916, a
jp acn16
acn12 ld a, mempa ; si le BP enfoncé correspond à
and a, f1tr0108 ; une voie déja forcée à 1, alors ..
jrz acn13
ld a, mempa
com a ; ... on supprime ce forçage à 1
and a, f1tr0108 ; et ...
ld f1tr0108, a
ld a, f0tr0108
add a, mempa ; ... on force cette voie à 0
ld f0tr0108, a
jp acn16 ; (on a traité ici les BP 1 à 8)
acn13 ld a, mempb ; si le BP enfoncé correspond à
and a, f1tr0916 ; une voie déja forcée à 1, alors ..
jrz acn14
ld a, mempb
com a ; ... on supprime ce forçage à 1
and a, f1tr0916 ; et ...
ld f1tr0916, a
ld a, f0tr0916
add a, mempb ; ... on force cette voie à 0
ld f0tr0916, a
jp acn16 ; (on a traité ici les BP 9 à 16)
acn14 ld a, f1tr0108 ; Il ne reste plus que le cas où
add a, mempa ; le BP enfoncé ne correspond à
ld f1tr0108, a ; aucun forçage: dans ce cas on
ld a, f1tr0916 ; force la voie à 1
add a, mempb
ld f1tr0916, a
jp acn16
acn15 ; Enclenchement du traitement des BP
ld a, imagepa ; On mémorise le BP enfoncé
ld mempa, a
ld a, imagepb
ld mempb, a
set 0, flags ; On lève le drapeau traitement
ldi dureebp, kdureebp ; charge compteur durée pression BP
acn16 ret
;---------------------------------------------------------------------------
; Gestion de la tension du potentiomètre de vitesse: routine avec une
; très légère attente (environ 200 µs), donc "fluide", c'est à dire
; qu'il n'y a quasiment pas de blocage en un point.
potar ldi wdr, knonos ; on calme le chien de garde
set 5, adcr ; on lance la mesure ADC
pot01 jrr 6, adcr, pot01 ; on attend qu'elle soit terminée
res 5, adcr ; CAN prêt pour mesure suivante
ld a, adr
com a ; on complémente, pour que la vitesse
; augmente quand on tourne le potar
; dans le sens des aiguilles d'une
; montre.
rlc a ; on divise cette tension par 8
rlc a ; ce qui donnera 32 valeurs possibles
rlc a ; pour la vitesse de défilement.
rlc a
rlc a
rlc a
andi a, 00011111b
ld tension, a
ret
;---------------------------------------------------------------------------
; Choix et progression du motif: routine "fluide", c'est à dire qu'il
; n'y a pas de blocage ou d'attente quelconque en un point.
; Lecture de la table qui contient les valeurs des motifs, et incrémentation
; du numéro de ligne.
; Parenthèse: la mémoire ROM n'est accessible que via une fenêtre de 64
; octets dans l'espace adressable par le micro.
; Attention !!! L'adresse du premier octet de la fenêtre est 0040h,
; et celle du dernier octet est 007Fh.
;
; On choisi le segment de ROM visible dans la fenêtre par le chargement
; préalable du registre Data Rom Window Register, l'adresse dans la ROM
; étant définie ainsi sur 12 bits:
;
; Adresse ROM 11 10 09 08 07 06 05 04 03 02 01 00
; DRWR 00 00 D5 D4 D3 D2 D1 D0
; Adresse dans fenêtre 0 1 D5 D4 D3 D2 D1 D0
; î
; Ce 1 est là car la première
; adresse de la fenêtre est 64
;
; Ici la table contient des doubles octets, donc l'adresse s'incrémente de
; 2 en 2, et donc on a:
;
;
; Adresse ROM 11 10 09 08 07 06 05 04 03 02 01 00
; DRWR 00 00 D5 D4 D3 D2 D1 D0
;
; Premier ou second octet X = 0 ou 1
; Numéro de ligne L L L L
; Numéro de motif M M M M M
;
; Soit DRWR 0 0 1 1 M M M M
; Adresse fenêtre M L L L L 0 1er octet
; ou M L L L L 1 2nd octet
;
; Motif01 = 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0b
; Soit ^---0----^ ^---C----^ ^----0---^ ^----0---^ = 0C00h
progres ldi wdr, knonos ; On calme le chien de garde
lectable ld a, motif ; A contient le motif
rlc a ; On ne garde que les bits b1 à b4
rlc a ; qui deviennent
rlc a ; les 4 bits de poids faible du
rlc a ; DRWR (Data Rom Window Register)
rlc a
rlc a
rlc a
rlc a
andi a, 00001111b ; auquel on ajoute la valeur 30h,
addi a, 30h ; pour obtenir au minimum l'adresse
ld drwr, a ; 0000 1100 0000 0000b soit 0C00h
; qui est celle de début de table
ld a, motif ; A contient le motif
rlc a ; on fait avancer le LSB vers
rlc a ; la gauche: il passe de b0 à b4
rlc a ; puis on ne garde que ce bit b4
rlc a
andi a, 00010000b
add a, ligne ; on ajoute le numéro de ligne
; (compris entre 0 et 15), qui va
; donc occuper à ce stade les bits
; b0 à b3 du mot
sla a ; on redécale tout à gauche, en
; insérant un 0
addi a, 01000000b ; et enfin on ajoute 40h, car le
; premier octet de la fenêtre est
; à l'adresse 40h, et on a enfin le
; pointeur dans la fenêtre
ld x, a ; Miracle de la
ld a, (x) ; technique, on obtient l'octet fort
ld lignemsb, a ; de la ligne pointée dans la table.
inc x ; A table suite: le plat suivant est
ld a, (x) ; l'octet faible de la ligne.
ld lignelsb, a
ld a, f0tr0916 ; Forçage à 0 éventuel des voies
com a ; 1 à 8
and a, lignelsb
ld lignelsb, a
ld a, f1tr0916 ; Forçage à 1 éventuel des voies
com a ; 1 à 8
ld brouill, a
ld a, lignelsb
com a
and a, brouill
com a
ld lignelsb, a
ld a, f0tr0108 ; Forçage à 0 éventuel des voies
com a ; 9 à 16
and a, lignemsb
ld lignemsb, a
ld a, f1tr0108 ; Forçage à 1 éventuel des voies
com a ; 9 à 16
ld brouill, a
ld a, lignemsb
com a
and a, brouill
com a
ld lignemsb, a
inc ligne ; On en profite pour passer à la
ld a, ligne ; ligne suivante. Si dépassement
cpi a, 16 ; (ligne 16) alors on revient à la
jrnz lec00 ; ligne 0
clr ligne
lec00 ret
;---------------------------------------------------------------------------
; Le déclenchement des triacs se fait par envoi de la salve au MM 5450, peu
; après le passage au zéro de la tension secteur, en laissant passer un
; nombre variable de demi-périodes secteur entre deux salves, afin de faire
; varier la vitesse de défilement: La valeur de la variable attente, qui
; est une copie de la variable tension, laquelle reflète la position du
; potentiomètre de réglage de vitesse (rien à voir avec la tension secteur!),
; est décrémentée à chaque passage à zéro du secteur, soit toutes les 10 ms
; (en effet, la tension secteur est abaissée et redressée en double
; alternance), et on obtient donc une tempo de ligne minimale de 10 * 0 =
; 0 ms, et maximale de 10 * 32 = 320 ms ce qui donne un défilement d'un
; motif complet en 16 * .32 = 5.12 s.
; En fait, la tempo minimale ci-dessus est complètement fausse, car avec un
; quartz à 3.2768 MHz, le micro rame déja pendant environ 20 ms pour faire
; son boulot, le programme n'étant absolument pas optimisé. Pendant ce
; temps, il n'y a pas de risque d'enclenchement intempestif d'un triac, car
; le MM5450 conserve son information sur les sorties, et donc les gachettes
; sont alimentées en permanence: les triacs qui doivent conduire
; s'enclenchent donc naturellement dès la remontée de la tension sinusoïdale.
; Simplement, on ne peut pas atteindre la vitesse maximale de 100 lignes par
; seconde, soit environ 100 / 16= 6 motifs complets par seconde: on a une
; attente minimale de 3 * 10 ms (traitement micro d'un peu plus de 20 ms, et
; attente de la période suivante), soit une vitesse maximale d'environ 33
; lignes par seconde, soit 2 motifs entiers, ce qui est en pratique assez.
; Noter que l'on ne fait pas de test directement sur le port C, car cela
; entraine des changements de configuration (en effet, le test consiste en
; une lecture/écriture, et la valeur lue n'est pas forcément la bonne pour
; configurer le port.
; Noter que pendant que l'on attend l'évolution de la tension secteur, ce
; qui est long à l'échelle du microcontrôleur, on va régulièrement voir la
; routine de gestion du temps, afin de gérer correctement les boutons
; poussoirs.
zerosect call gesttemp
ld a, drc ; on attend le passage au zéro
jrs 4, a, zerosect ; du secteur
zer00 call gesttemp
ld a, drc
jrr 4, a, zer00 ; on attend qu'il remonte
zer01 ld a, tension ; il s'agit ici de la tension aux
jrz zer02 ; bornes du potentiomètre, qui va
dec a ; gérer la vitesse du chenillard
ld tension, a ; on attendra donc en fait un
jp zerosect ; nombre variable de passages à
; zéro du secteur, selon la
; valeur de tension
zer02 ret ; Par ici la sortie !!
;---------------------------------------------------------------------------
; Discussion endiablée avec le MM 5450N: routine "fluide", c'est à
; dire qu'il n'y a pas de blocage ou d'attente quelconque en un point.
;
; Dialogue sur la liaison série du MM5450: cette routine envoie en
; une fois une trame pour le MM5450, c'est à dire une ligne complète
; de motif, tant sur les leds que sur les triacs.
;
; Une trame est composée de 36 bits numérotés de 1 à 36 ci-dessous
;
; bit 1 2 3 ... 17 18 19 20 ... 34 35 36
; val 1 Q1 Q2 ... Q16 Q17 Q18 Q19 ... Q33 Q34 0
; led16 led15 ... led1 NC NC triac1 ... triac15 triac16
; Remarque: la sortie Q35 n'existe pas sur le MM5450, mais doit être
; pilotée quand même (ici envoi 0), pour compatibilité avec le MM5451
gest5450 ldi wdr, knonos ; On calme le chien de garde
clr numbit
ges00 inc numbit
ges01 ld a, numbit ; Si c'est le premier bit qu'il faut
cpi a, 1 ; envoyer au MM 5450, alors ne
jrnz ges02 ; cherchez plus, c'est un 1.
set 1, flags ; Data MM 5450 = 1
call tictac
jp ges00
ges02 ld a, numbit ; si c'est le bit 18, il faut envoyer
cpi a, 18 ; un 0 (par exemple), car il
jrnz ges03 ; correspond à la sortie Q17 qui n'
res 1, flags ; est pas reliée.
call tictac
jp ges00
ges03 ld a, numbit ; si c'est le bit 19, il faut envoyer
cpi a, 19 ; aussi un 0 (par exemple), car il
jrnz ges035 ; correspond à la sortie Q18 qui n'
res 1, flags ; est pas reliée.
call tictac
jp ges00
ges035 ld a, numbit ; si c'est le bit 36, il faut envoyer
cpi a, 36 ; aussi un 0 (par exemple), car il
jrnz ges04 ; correspond à la sortie Q35 qui n'
res 1, flags ; existe pas sur le MM 5450
call tictac
jp ges00
ges04 ld a, numbit ; si c'est le bit 37, c'est que le
cpi a, 37 ; dialogue est terminé (il n'y a
jrnz ges05 ; que 36 bits à envoyer)
jp ges26 ; Vers la sortie !!!
ges05 ; Ici, on sait maintenant que le bit n'est pas le 1, ni le
; 18, ni le 19, ni le 36 donc on peut commencer à travailler
ld a, numbit ; si c'est le bit 2 à 17, c'est
subi a, 20 ; pour les leds, et si c'est le
jrc ges06 ; bit 20 à 35, c'est pour les
jp ges16 ; triacs
ges06 ; ici, gestion des leds, avec numbit variant de 2 à 17
ld a, lignelsb
ld x, a
ld a, numbit ; gestion des leds: la led 1 (gauche)
subi a, 2 ; correspond au bit 7 de l'octet
cpi a, 8 ; fort de la ligne, et au bit 17
jrc ges07 ; du MM5450, et la led 16 (droite)
subi a, 8 ; au bit 0 de l'octet faible de la
ld brouill, a ; ligne, et au bit 2 du MM5450
ld a, lignemsb ; petite alchimie pour pouvoir
ld x, a ; utiliser le registre x
ld a, brouill
ges07 res 1, flags
cpi a, 7
jrnz ges08
jrr 7, x, ges08
set 1, flags
ges08 cpi a, 6
jrnz ges09
jrr 6, x, ges09
set 1, flags
ges09 cpi a, 5
jrnz ges10
jrr 5, x, ges10
set 1, flags
ges10 cpi a, 4
jrnz ges11
jrr 4, x, ges11
set 1, flags
ges11 cpi a, 3
jrnz ges12
jrr 3, x, ges12
set 1, flags
ges12 cpi a, 2
jrnz ges13
jrr 2, x, ges13
set 1, flags
ges13 cpi a, 1
jrnz ges14
jrr 1, x, ges14
set 1, flags
ges14 cpi a, 0
jrnz ges15
jrr 0, x, ges15
set 1, flags
ges15 call tictac
jp ges00
ges16 ; ici, gestion des triacs, avec numbit variant de 20 à 35
ld a, lignelsb
ld x, a
ldi a, 35 ; gestion des triacs: le triac 1
sub a, numbit ; correspond au bit 7 de l'octet
cpi a, 8 ; fort de la ligne, et au bit 20
jrc ges17 ; du MM5450, et le triac 16
subi a, 8 ; au bit 0 de l'octet faible de la
ld brouill, a ; ligne, et au bit 35 du MM5450
ld a, lignemsb
ld x, a
ld a, brouill
ges17 res 1, flags
cpi a, 7
jrnz ges18
jrr 7, x, ges18
set 1, flags
ges18 cpi a, 6
jrnz ges19
jrr 6, x, ges19
set 1, flags
ges19 cpi a, 5
jrnz ges20
jrr 5, x, ges20
set 1, flags
ges20 cpi a, 4
jrnz ges21
jrr 4, x, ges21
set 1, flags
ges21 cpi a, 3
jrnz ges22
jrr 3, x, ges22
set 1, flags
ges22 cpi a, 2
jrnz ges23
jrr 2, x, ges23
set 1, flags
ges23 cpi a, 1
jrnz ges24
jrr 1, x, ges24
set 1, flags
ges24 cpi a, 0
jrnz ges25
jrr 0, x, ges25
set 1, flags
ges25 call tictac
jp ges00 ; on boucle pour balayer les 35 bits
; à envoyer au MM5450.
ges26 ret
; Gestion de l'horloge du MM 5450
tictac ldi a, 10010000b ; valeur reset du drc
; rappelons que l'horloge du MM5450
; est sur le bit 5 du port C, et que
; le bit de donnée du MM5450 est sur
; le bit 6 du port C.
jrr 1, flags, tic00 ; s'il faut envoyer un 1, on envoie
set 6, a ; un 1, et si c'est un 0, alors un 0 !
tic00 ld drc, a ; on positionne la ligne data
set 5, a ; et on envoie un coup d'horloge
ld drc, a
res 5, a ; on redescend l'horloge
ld drc, a
ret
;---------------------------------------------------------------------------
; Gestion du temps qui passe: routine avec attente d'un évennement
; (passage base de temps): ne doit pas s'éterniser, sachant que la
; scrutation du zéro cross se fait sur une plage de 450 µs environ.
gesttemp ldi wdr, knonos ; On calme le chien de garde
jrs 7, tscr, tem00 ; si la base n'est pas passée
jp tem01 ; on reviendra plus tard
tem00 ldi tcr, ktempo ; on recharge le tcr pour suivant
res 7, tscr ; on rabaisse le drapeau
dec tempobp
jrnz tem01
ld a, dureebp ; toutes les tempos sont décrémentées
jrz tem01 ; jusqu'à zéro, où elles restent
dec dureebp
tem01 ret
;---------------------------------------------------------------------------