Aller au contenu | Aller au menu | Aller à la recherche

CPUStick & StickOS

Utilisation de l'interface CPUStick sous StickOS

Fil des billets

mardi, mars 16 2010

Génération de 8 séries alphabétiques aléatoires ou presque...

Programme Basic complet

Générateur de nombres pseudo aléatoires

 8 dim index, alea, primes
10 let index=0, alea=0
11 dim prime[8]
12 dim Dig1, Dig2, Aff1, Aff2 as byte
13 data 3,5,7,11,13,17,19,23
14 for index=0 to 7
15 read prime[index]
16 next
911 for prime=0 to 7 
920 for index = 0 to 25
922 let alea = (prime[primes]+alea) % 29
926 next
930 let Dig1 = Symb1[alea]
940 let Dig2 = Symb2[alea]
.
.

En 922 on utilise la formule de transformation chaotique d'un vecteur décrite sur le site
http://jpbachy.free.fr
Pp21.jpg
L'adresse de la transformée chaotique C'i de la composante i du vecteur C initial (0 à n) est calculée de façon itérative par la formule
C'i= (C'i+step) modulo (n+1) où step et n+1 sont des nombres premiers.
La nouvelle valeur C'i (alea) est comprise entre 0 et n, n=29-1. Les lignes 13 à 16 enregistrent la suite des nombres premiers de 3 à 23 qui seront affectés successivement à la variable step

L'alphabet de a à z en code SIXTEM sur 2 afficheurs

Programme BASIC sur CPUStick

On introduit les masques des symboles dans le programme:

x 20 dim a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
x 30 data 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
x 35 data 20,21,22,23,24,25
x 40 read a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
x 50 dim Symb1[27], Symb2[27]as byte
x 60 let Symb1[a]= 0x58, Symb2[a]= 0x10
x 70 let Symb1[b] = 0x06, Symb2[b]= 0x4c
.
.
etc

samedi, mars 13 2010

Programme Multiplex

Programme Basic d'affichage d'un "b"
Affi_b.jpg

10 rem Programme Multiplex
20 dim Dig1, Dig2, Aff1, Aff2 as byte
30 dim panpar as byte at address 0x4010006a
40 dim ddran as byte at address 0x40100022
50 dim portan as byte at address 0x4010000a
60 let panpar = 0x00
70 let ddran = 0xff
80 dim scl as pin scl for digital output
90 dim sda as pin sda for digital output
100 configure timer 0 for 10 ms
110 let Dig1 = 0x06
120  let Dig2 = 0x4c
130 let Aff1= 1
140 rem main
150  while 1 do
160 on timer 0 do gosub interrupt
170 sleep 1 s
180 endwhile
190 sub interrupt
200 if Aff1==1 then
210 let Aff1= 0
220 gosub affiVert
230 else
240 let Aff2= 0
250   gosub affiRouge
260 endif
270 endsub
280 gosub ledR
290 sub affiRouge
300 let sda=0
310 let Aff1= 1
320 let portan=Dig1
330 let scl=1
340 endsub
350 sub affiVert
360 let scl=0
370 let Aff2=1
380 let portan=Dig2
390 let sda=1
400 endsub

vendredi, mars 12 2010

Programme BASIC d'essai des afficheurs

La broche an0 commande l'affichage du segment a

 10 dim sda as pin sda for digital output
 20 dim scl as pin scl for digital output
 30 dim an0 as pin an0 for digital output
 40 while 1 do
 50   let sda = 0
 60   let scl = 1
 70   sleep 10 ms
 80   let scl = 0
 90   let sda = 1
 100  sleep 10 ms
 110 endwhile

Dans un premier temps on essaie avec une tempo de 500 ms pour voir les afficheurs s'allumer alternativement. On diminue ensuite la tempo et la persistance lumineuse donne l'impression que les deux afficheurs sont allumés.

jeudi, mars 11 2010

Montage des afficheurs sur plaquette d'essais

Plaquette_essais.JPG

Les commandes sur l'hyperterminal:

dim sda as pin sda for digital output
let sda=1
Alimente les anodes du 2 ème afficheur
dim an2 as pin an2 for digital output
dim an3 as pin an3 for digital output
dim an4 as pin an4 for digital output
let an2=1
let an3=1
let an4=1
Met les broches des afficheurs à 0 (l'ULN2803 inverse le signal) Ici les initialisations sont faites grâce aux instructions dim
Dans le programme on écrira directement dans les registres du microcontrôleur.
Le masque pour la boucle orientée vers le bas qui est affichée est:
00111000 soit 0x38 en hexadécimal.
Le nom de la variable BASIC pour ce masque est BoucleBbas
Son écriture dans le buffer PORTAN avec le 2ème afficheur sélectionné génère son affichage durant 5 millisecondes. L'interruption suivante sélectionnera l'autre afficheur à qui il faudra de même fournir un masque d'affichage pour commuter à son tour les broches durant 5 ms.

vendredi, mars 5 2010

Entrée d'un programme basic sur StickOS

Un petit truc pour entrer les programmes sur le terminal de commande du CPUStick. Vous pouvez écrire votre programme sur un traitement de texte, le bloc notes ou textedit par exemple, en prenant soin de ne pas dépasser 80 caractères par ligne. Il suffit ensuite de faire un copié-collé sur l'hyperterminal suivi d'un retour chariot pour voir entrer les lignes numérotées que vous avez composées. Le programme se comporte alors comme si vous l'aviez entré directement au clavier. Vous pouvez de même faire un copié-collé des programmes affichés dans chaque billet...

mercredi, mars 3 2010

Nomination et affectation des masques

Règle de codage des segments:
Les segments de a à g correspondent aux bits 0 à 6 de PORTan(). Nous n'utilisons pas le point décimal. L'allumage des segments b et c par exemple se codera 0000 0110 (le bit de poids le + fort à gauche). Ce qui donne en hexadécimal 0x06. Si on veut allumer e et f, le masque sera 0011 0000 soit 0x30 en hexa. Affectation des masques en Basic:

10 dim PetBbas, PetBmilieu, PetBhaut,
20 dim GrdeBdrte, GrdeBgche as byte
20 dim BoucleGbas, BoucleDbas, BoucleBbas, BoucleHbas as byte
30 dim BoucleGhaut, BoucleDhaut, BoucleBhaut, BoucleHhaut as byte
40 let PetBbas=0x08, PetBmilieu=0x40, PetBhaut=0x01
50 let GrdeBdrte=0x06, GrdeBgche=0x30, BoucleGbas=0x58 
60 let BoucleDbas=0x4c, BoucleBbas=0x1c, BoucleHbas=0x54
70 let BoucleGhaut=0xc1, BoucleDhaut=0x83, BoucleBhaut=0xc2
80 let BoucleHhaut=0x43, PetBbasD=0x04,PetBhautD=0x02
90 let PetBbasG=0x10, PetBhautG=0x20, AffEteint=0x00

Chaque masque porte un nom qui rappelle le symbole:
PetBbas signifie petite barre horizontale en bas de l'afficheur
BoucleGbas signifie boucle orientée vers la gauche en bas de l'afficheur ( comme un C) etc
La nomination du symbole à afficher sur le 1er ou sur le 2ème afficheur simplifie l'écriture du caractère sixtem qui se compose de 2 symboles accolés
Le caractère "a" appelera BoucleGbas sur le 1er afficheur et PetBbasG sur le 2ème afficheur
Le caractère "b" GrdeBdrte et BoucleDbas
Le caractère "c" BoucleGbas et AffEteint
etc
Si vous voulez afficher des chiffres vous pouvez facilement programmer les segments correspondants à afficher et leur donner un nom de masque particulièrement signifiant comme un, deux, trois etc... ;-) et afficher des nombres de 0 à 100 sur les afficheurs. Je vous laisse faire, un peu de conversion de binaire à hexadécimal vous fera réviser vos bases...

lundi, mars 1 2010

Jeu de masques

L'affichage des symboles sixtem impose la composition de la matrice des segments à allumer sur l'afficheur 7 segments. Pour écrire l'octet de commande des afficheurs nous repèreront les segments par un chiffre de 0 à 7 comme ci-dessous
Masque.jpg
La mise à 1 du bit correspondant commande l'allumage du segment. Le chiffre ne correspond pas à la broche de sortie de l'afficheur. Le cablage doit se charger du routage correct vers les entrées an0 à an7 du microcontrôleur.
Les entrées scl et sda sont reliées aux bases des transistors de commutation des anodes communes. Le transistor doit permettre le passage du courant nécessaire à l'allumage simultané de 8 segments.
On appelle masque l'octet de commande de l'afficheur.
Exemples:
01100000.jpg 0110000000011010.jpg 0001101000001100.jpg 0000110000000010.jpg00000010
Six symboles sont nécessaires pour composer un caractère alphanumérique sur 2 afficheurs.
Pour l'apprentissage de la lecture il est intéressant de positionner les symboles de façon à ce qu'ils rappellent le plus possible la forme de la lettre. Ainsi la petite barre peut s'afficher à 3 niveaux, supérieur, médian et inférieur, la grande barre à droite ou à gauche de l'afficheur et les boucles en haut ou en bas de l'afficheur.

samedi, février 27 2010

Vivre dangereusement avec le CPUStick

(translation in english)

Le Stick0S a une particularité attirante:
Variables can also be dimensioned as MCU register variables at absolute addresses with the following statements:

 dim varabs at address addr
 dim varabs as (byte|short) at address addr
 dim varabs[n] at address addr
 dim varabs[n] as (byte|short) at address addr

avec un avertissement aux téméraires:
Note that you can trivially crash your MCU by accessing registers incorrectly.
Nous avons voulu explorer cette possibilité en commandant directement le PORTAN qui pilote les afficheurs 7 segments à travers le driver ULN2803.

Il faut d'abord étudier soigneusement le mapping des registres du microcontrôleur. Vous trouverez ici la traduction des éléments du manuel de référence qui concernent la commande des registres des E/S

D'après Rich le programme doit ressembler à ceci:

 10 dim panpar as byte at address 0x4010006a
 20 dim ddran as byte at address 0x40100022
 30 dim portan as byte at address 0x4010000a
 40 let panpar = 0x0
 50 let ddran = 0xff
 60 while 1 do
 70   let portan = ~portan
 80 endwhile

Note; vous pouvez également utiliser l'instruction dim ... as pin an... for digital output pour positionner les registres PANPAR et DDRAN, mais vous devrez configurer chaque sortie individuellement (une dim pour chaque sortie). Le programme ci-dessus fait cela en une fois.

Un premier essai d'écriture d'une instruction sur un registre nous réserve une surprise:
Le compilateur nous adresse un message d'erreur sur "at" qui nous fait craindre que l'aventure s'arrête là
Une seule solution un appel au secours à Rich...
Qui répond immédiatement et indique la solution: cette instruction ne marche qu'avec la version 1.70 du StickOS. Vérification faite: j'ai la version 1.60, une antiquité! Il faut donc upgrader le CPUStick avec le Stick0S 1.72. Pas de problème, Rich me rappelle le mode d'emploi qui figure d'ailleurs dans le manuel. C'est une affaire de 3 minutes... qu'il dit! 1 heure après j'en suis à la dizième ligne de petits points qui indiquent que le chargement du fichier S19 se fait. Appel angoissé, réponse inquiète de Rich que le comportement de son bébé surprend et qui me conseille d'attendre que le chargement se fasse. Enfin il se termine et un message triomphant s'affiche sur le terminal:
paste done!
programming flash for incompatible upgrade...
Au moment où je crois que tout est à recommencer un message de Rich:
Incompatible upgrade means the bootloader changed -- so we followed a riskier upgrade procedure that we might have liked to.
I forgot that could still happen. :-(
But assuming you waited a few seconds after that, you should be able to just disconnect the CPUStick now and then reconnect it.
When you connect, you should get a prompt with the new version.
J'ai effectivement une nouvelle version opérationnelle. Je réintroduis les commandes de base et après une déconnexion-reconnexion pour rebooter le système, la petite led verte clignotte de façon sympathique... et l'instruction refusée par la version 1.6 passe bien avec la nouvelle version.

jeudi, février 25 2010

Multiplexage sur 2 LEDs

Ici les LEDs sont activées alternativement au rythme des interruptions toutes les 5 millisecondes. C'est le phénomène de persistance visuelle qui donne l'impression que l'affichage est continu sur les 2 LEDS. Les valeurs à afficher dont contenues dans deux variables Dig1 et Dig2. Les valeurs seront recopiées dans le sous programme d'affichage pour être affichées durant 5 millisecondes seulement. Les LEDs sont éteintes à chaque fois que le sous programme d'interruption est appelé. C'est le sous programme spécifique à chaque LED qui lui dira si elle doit être allumée ou éteinte suivant l'état de Dig1 ou Dig2. Le programme d'interruption ne fait que cela: éteindre les leds et choisir la LED qui doit travailler.
Les parties du programme sont:
L'initialisation des variables, des broches de sortie, du timer
Le programme principal qui est une boucle d'une durée de 1 seconde mais rebouclée indéfiniment
La sous routine d'interruption
Les sous routines d'allumage des LEDs
Programme multiplex sur CPUStick

Le programme de multiplexage des afficheurs suit le même principe. Dans Dig1 et Dig2 sont mémorisés sur un octet les masques des symboles sixtem à afficher. C'est cet octet qui vient positionner les broches de sortie an0 à an7 du connecteur J8 et commander l'extinction ou l'allumage du segment correspondant de l'afficheur sélectionné par les sorties scl et sda à travers le transistor de commutation de l'anode commune de l'afficheur.

Clignotement de fréquences différentes sur 2 leds

L'affichage n'est pas multiplexé. On commande la bascule des affichages dans le même sous programme
Il y a rafraîchissement de l'affichage toutes les 5 millisecondes

 10 dim scl as pin sda for digital output
 20 dim sda as pin sda for digital output
 30 dim tic
 40 dim tac
 50 configure timer 0 for 5 ms
 55 while 1 do
 60   on timer 0 do gosub affichage
 62   sleep 1 s
 65 endwhile
 70 sub affichage
 90   if tic==100 then
100     let scl = !scl
110     let tic = 0
115   else
116     let tic = tic+1
120   endif
140   if tac==50 then
150     let sda = !sda
160     let tac = 0
165   else
166     let tac = tac+1
170   endif
180 endsub

La boucle principale dure 1 seconde et reboucle sur elle même. Elle ne fait qu'orienter le programme vers la sous routine d'interruption. On sort du programme par un ctrl C

mercredi, février 24 2010

Essai de la commande du ULN2803 par une tension de 3,3 V

Les sorties numériques du CPUStick sont à 3,3V. Il fallait vérifier qu'elles étaient capables de commander l'ULN2803 qui pilote les afficheurs à anode commune. Nous avons simulé le premier afficheur par une led rouge et le 2ème par une LED verte et vérifié que les instructions basic contrôlaient bien l'allumage. Le CPUStick a été enfiché dans une platine d'essai après avoir "alésé" les trous de broches devant recevoir les connecteurs J4 à J8 avec un trombone déplié.
DSCF0025.JPG
La configuration des 2 sorties se fait comme suit:
10 dim affich1as pin scl for digital ouput
20 dim affich2 as pin sda for digital ouput
La commande On/Off
30 let affich1=1
40 let affich2=1
50 end

dimanche, février 21 2010

Entrées sorties

Toutes les broches E/S supportent les entrées et sorties numériques. De plus, les 8 broches an(0-7) peuvent être analogiques. Nous les utiliserons ici en numérique. Les broches scl et sda seront utilisées pour piloter les cathodes communes des afficheurs.

Connecteur J8 du CPUStick
1 gnd, 2 +3V, 3 scl, 4 sda, 5 an0, 6 an1, 7 an2, 8 an3, 9 an4, 10 an5, 11 an6, 12 an7
configuration en sortie
exemple: config broches an0, an1 en sortie pour piloter les segments a et b des afficheurs en logique inversée (ULN 2803)

10 dim sega as pin an0 for digital output
20 dim segb as pin an1 for digital output
30 let sega = 1
40 let segb = 0
50 rem allume le segment a, éteint le segment b

jeudi, février 18 2010

Gestion des interruptions par le StickOS

5.4.10 Timers
StickOS supports up to four internal interval timers (0 thru 3) for use by the program. Timer interrupts are delivered when the specified time interval has elapsed since the previous interrupt was delivered.
Timer interrupt intervals are configured with the statement:
configure timer n for m (s|ms|us)
This configures timer n to interrupt every m seconds, milliseconds, or microseconds.
Note that the minimum timer resolution is the clock tick, which is 0.25 milliseconds.
The timer interrupt can then be enabled, and the statement(s) to execute when it is delivered specified, with the statement:
on timer n statement If statement is a "gosub subname ...", then all of the statements in the corresponding sub are executed when the timer interrupt is delivered;
otherwise, just the single statement is executed. The timer interrupt can later be completely ignored (i.e., discarded) with the statement:
off timer n
The timer interrupt can be temporarily masked (i.e., held off but not discarded) with the statement:
mask timer n
And can later be unmasked (i.e., any pending interrupts delivered) with the statement:
unmask timer n



Le StickOS prend en charge jusqu'à quatre timers internes (0 à 3). Les Interruptions sont délivrées lorsque l'intervalle de temps programmé s'est écoulé depuis la dernière interruption.
Les interruptions sont configurées avec l'instruction suivante:
configure timer n for m (s|ms|us)
Cela configure le timer n pour une interruption toutes les m secondes, millisecondes ou microsecondes.
Notez que la résolution du timer est le tic d'horloge, qui est de 0,25 millisecondes.
L'interruption peut alors être activée, et les instructions spécifiées à exécuter lorsqu'elle survient, avec l'affirmation:
on timer n statement
Si la déclaration est "Gosub subname ...", alors toutes les instructions de la sous routine d'interruption sont exécutées lorsque l'interruption survient;
Sinon, la seule instruction statement est exécutée.
L'interruption peut être ultérieurement complètement ignorée (càd mise de côté) avec l'énoncé suivant: off timer n
L'interruption peut être temporairement masquée (càd retenue, mais pas mise de côté) avec l'énoncé suivant:
mask timer n
Et peut ensuite être démasquée (càd, toutes les interruptions en attente) avec l'énoncé suivant: unmask timer n

Exemples

10 dim ticks
20 configure timer 0 for 1000 ms
30 on timer 0 do print "slow"
40 configure timer 1 for 200 ms
50 on timer 1 do gosub fast
60 sleep 3 s
70 print "ticks is", ticks
80 end
90 sub fast
100 let ticks = ticks+1
110 endsub
run

slow
slow
slow
ticks is 14

_

Adaptation au CPUStick

Configuration des E/S des afficheurs
8 sorties correspondant aux 7 segments + le point décimal. Les sorties du connecteur sont reliées aux broches du driver ULN2803. Les bases des transistors pilotant les cathodes communes ont leurs entrées respectives (mappées RA0 et RA1)

5.4.11 Digital I/O
StickOS supports digital I/O on all pins.
A pin is configured for digital I/O, and a variable bound to that pin, with the following statement:
dim varpin as pin pinname for digital (input|output)
If a pin is configured for digital output, then writing varpin with a 0 value will set the digital output pin to a low level, and writing it with a non-0 value will set the digital output pin to a high level. Reading the variable varpin will return the value 0 if the digital output pin is currently at a low level, or 1 if the digital output pin is currently at a high level.
If the inverted pin qualifier is used, all input and output values are logically inverted (i.e., 0->1, 1->0) at the pin.
If the open_drain pin qualifier is used, an output pin is tri-stated for a logic 1 output.



5.4.11 E/S numériques
Le StickOS soutient des E/S numériques sur toutes les broches.
Une broche est configurée pour l'E/S numérique, et une variable liée à cette broche, avec l'affirmation suivante:
dim varpin as pin pinname for digital (input|output)
Si une broche est configurée pour la sortie numérique, alors l'écriture d'une varpin avec la valeur 0 fixera la broche de sortie à un niveau bas, et l'écrire avec une valeur non-0 fixera la broche de sortie à un niveau haut.
La lecture d'une varpin renvoie la valeur 0 si la broche de sortie est à un niveau bas, et 1 si la broche de sortie est à un niveau haut.
Si le qualificatif broche inversée est utilisé, toutes les valeurs d'entrée et de sortie au niveau de la broche sont en logique inversée (à savoir, 0 -> 1, 1 -> 0)
Si le qualificatif broches open_drain est utilisé, une broche de sortie est à 3 états pour une sortie logique à 1.
Exemple:
10 dim gsel1 as pin utxd1 for digital output
20 let gsel1 = 0

organigramme du multiplexage

Initialisations:
Dig1, Dig2 et Dig3 variables digits unité, dizaines, centaines
Digtemp registre temporaire pour la valeur de Dig
D contient la valeur à afficher sur 2 digits
One, W_temp registres de travail

Pg principal (main):
Mise de RA0 et RA1 en sortie pour commander les cathodes communes
Configuration des paramètres de la routine d'interruption
Initialisation TMR0
Autorisation des interruptions
Chargement de la valeur à afficher en D
Extinction des afficheurs

Boucle principale (loop)
n'a pas d'autre instruction que de boucler sur elle même
c'est la sous routine d'interruption qui fait le travail

ISR
C'est la sous routine d'interruption
Sauvegarde du registre de travail W
Initialisation de TMR0 pour générer des interruptions toutes les 5 ms
Extinction des afficheurs
Test de l'afficheur à allumer unités ou dizaines
Suivant le résultat --> LSDon ou MSDon

LSDon
Si l'afficheur était allumé on mémorise l'état
On positionne le pointeur au début de la table des masques d'affichage Bcdto7seg
On appelle la macro Digibyte qui génère le chiffre à afficher (unités)
et les mémorise dans la variable Dig correspondantes
On appelle alors le masque correspondant au chiffre à afficher

MSDon
Fait la même chose que LSDon mais pour les dizaines

Notre programme sur CPUStick suivra les mêmes étapes à la différence de la macro qui sera spécifique. Celle-ci doit générer les 2 symboles sixtem correspondant au caractère alphanumérique à afficher sur 2 afficheurs. La table des masques est spécifique à l'affichage des symboles sixtem. Elle peut être très simple contenant uniquement 6 symboles ou plus riche si on veut avoir plusieurs possibilités d'affichage pour un même symbole.

mercredi, février 17 2010

Tableau alphabet sur matrice LEDs rouges et vertes

Le premier symbole est en rouge, le second en vert.
La réduction nécessaire pour l'affichage sur une matrice braille (6 ou 8 picots) rend plus difficile la lecture mais il n'y a que 6 symboles à mémoriser pour reconstituer la forme de la lettre.

Sixtem_matrix.jpg

Exemples sur afficheurs tactiles

A.jpg a M.jpg m W.jpg w G.jpg g E.jpg e T.jpg t
Les boucles orientées vers le haut et vers le bas sont différenciées par leur position sur la matrice, respectivement en haut (pour le n par exemple) et en bas de la matrice (pour le v). De même le "m", constitué de deux boucles vers le haut se situe sur le haut de la matrice et le "w" sur le bas. La lecture tactile demande donc un apprentissage supplémentaire car il n'est plus basé uniquement sur la forme des lettres. C'est le prix à payer pour utiliser un appareil disponible dans le commerce

mardi, février 16 2010

Circuits de commande

Le CPUStick fonctionne sous 3,3V mais il peut piloter les circuits logiques 5V ULN2003 et ULN2803 qui ont une entrée en courant sur un transistor Darlington

http://focus.ti.com/lit/an/slaa148/slaa148.pdf

http://www.edaboard.co.uk/uln2803-ok-to-be-driven-by-3-3v-logic-t443598.html

Driver LED ULN2003(7) ou ULN2803(8) réseau de 7 ou 8 darlingtonsuln2803.jpg

Driver.jpg

schéma interne
uln2803branchement.JPG
Exemple de montage à anode commune
Circuit de commande des anodes communes (LTspice)
Comprend 2 étages: le premier d'adaptation de la sortie 3V du microprocesseur, le second de puissance avec une paire de Sziklai pour commander les anodes communes.

Commande des relais:

documentation:
LED initiation Eyrolles Ed, "Les montages électroniques" J.P Lemoine

Electronique Pratique N°340 Le simulateur électronique LTspice
http://www.linear.com/designtools/software/ltspice.jsp
Electroaimant:
electroaimant.jpg
Type : KO4A
Dimensions : 20 x 13 x 11 mm
Tension nominale : 12 VDC
Puissance nominale : 1,0 W
Fixation : M2
Force initiale : 0,05 N
Force finale : 1,1 N
Force adherente : 2 N

Afficheurs tactiles à 6 points:
Afficheurs_magnetiques.jpg

Analyse du programme du PIC 16F84

Program "7seg.asm" displays decimal value of a number stored in variable D.
Example:
movlw .21
movlw D ; number 21 will be printed on 7seg display
Displaying digits is carried out in multiplex mode which means that the microcontroller alternately prints ones digit and tens digit. TMR0 interrupt serves for generating a time period, so that the program enters the interrupt routine every 5ms and performs multiplexing. In the interrupt routine, first step is deciding which segment should be turned on. In case that the tens digit was previously on, it should be turned off, set the mask for printing the ones digit on 7seg display which lasts 5ms, i.e. until the next interrupt.

For extracting the ones digit and the tens digit, macro digbyte is used. It stores the hundreds digit, the tens digit, and the ones digit into variables Dig1, Dig2, and Dig3. In our case, upon macro execution, Dig1 will equal 0, Dig2 will equal 2, and Dig3 will equal 1.



Le programme "7seg.asm" affiche la valeur décimale d'un nombre mis en mémoire dans la variable D.
Exemple:
movlw .21
movlw D; le nombre 21 sera affiché sur les afficheurs 7 segments
L'affichage des chiffres est réalisé en mode multiplexé ce qui signifie que le microcontrôleur affiche les unités et les dizaines. L'interruption TMRO génère la période de temps, de façon à ce que le programme entre dans la routine d'interruption chaque 5ms et réalise le multiplexage. Dans la routine d'interruption, la première tâche réalisée est de décider quel segment doit être allumé. Dans le cas où l'afficheur des dizaines était allumé précédemment, il devra être éteint, mettre le masque d'impression pour l'afficheur des unités qui sera actif pendant 5ms, c'est à dire jusqu'à la prochaine interruption.
Pour extraire les unités et les dizaines, on utilise la macro digibyte. Elle mémorise les centaines, les dizaines et les unités dans les variables Dig1, Dig2 et Dig3. Dans notre cas, au moment de l'execution de la macro, Dig1 sera égaleà 0, Dig2 à 2, Dig3 à 1.

Jeu d'instructions du 16F84

- page 1 de 2