Je ne peux en aucun cas être tenu pour responsable en cas d'accident ou autre.
A quoi sert le montage?:
Description:
;****************************************************************************************************** ;montage minuterie. ;14/06/2000 ;programme de minuterie ; ;Auteur: Raphael Bourdon ;****************************************************************************************************** ; ;Remarque importante: ;Le decompte affiche est compris entre 0 et 9 pour les secondes ou les minutes, il est compris entre 0 ;et 5 pour les dizaines de secondes ou de minutes. Cependant, le programme est tel que l on decompte de ;10 a 1. La valeur "0" n'est pas utilisee pour le decompte mais comme indicateur. Il faut donc penser ;que un chiffre X affiche vaut un chiffre X+1 dans le programme. La traduction de la valeur programme ;en valeur decimale se fait dans le sous programme affiche. ; ; list p=16f84,f=inhx8m ; Type de PIC et format de fichier __config B'11111111110001' ; pas de protection du code, timer au demarrage, ; pas de chien de garde, oscillateur a quartz. #include "p16f84.inc" ; Librairie pour le compilateur ;definition des variables ligne1 equ H'00' ;ces definitions servent pour la lecture du clavier ligne2 equ H'01' ligne3 equ H'02' ligne4 equ H'03' colonn1 equ H'04' colonn2 equ H'05' colonn3 equ H'06' etat equ H'0C' ;etat est un registre qui contient des bits d etat time equ H'0D' ;bit0 -> marche 1 / arret 0 temp equ H'0E' ;bit1 -> positionne lors du passage dans clavier afficheur equ H'0F' ;bit2 -> positionne pour un changement dans clavier savstatus equ H'10' ;bit3 -> indicateur de "00:00" sec equ H'11' ;sec, dsec, min et dmin contiennent les secondes dsec equ H'12' ;et les minutes min equ H'13' dmin equ H'14' temp1 equ H'15' valeur equ H'16' temp2 equ H'17' temp3 equ H'18' temp4 equ H'19' temp5 equ H'1A' org 0 goto debut ;------------------------------------------------------------------------------------------------------ ;INTERRUPTION org H'04' movwf temp ;sauvegarde de W dans temp swapf STATUS,0 ;sauvegarde de STATUS movwf savstatus ;dans savstatus bcf STATUS,RP0 ;on passe dans la page memoire 0 movlw D'012' ;on initialise TMR0 a 12 movwf TMR0 bcf INTCON,T0IF ;remise a 0 du bit T0IF (il est mis a 1 a chaque interruption) btfss etat,0 ;si etat,0 est a 0, on ne decompte pas, on saute directement goto fininterrupt ;a fin_interrupt decfsz time,1 ;time1 sert de diviseur par 16. On decompte qu'une goto fininterrupt ;interruption sur 16. movlw D'16' ;reinitialisation de time a 16. movwf time decfsz sec,1 ;decremente seconde goto fininterrupt movlw H'0A' movwf sec decfsz dsec,1 ;decremente dsec goto fininterrupt movlw H'06' movwf dsec decfsz min,1 ;decremente min goto fininterrupt movlw H'0A' movwf min decfsz dmin,1 ;decremente dmin goto fininterrupt ;si on dmin vaut 0, on remet sec, dsec, min et dmin a 1. bcf etat,0 ;on met aussi le bit etat,0 a 0. Le decompte est alors movlw D'1' ;bloque. movwf sec movwf dsec movwf min movwf dmin fininterrupt swapf savstatus,0 ; restauration de STATUS movwf STATUS swapf temp,1 ; restauration de W swapf temp,0 retfie ;------------------------------------------------------------------------------------------------------ debut ; Initialisation bcf PORTA,4 movlw D'16' ; initialisation de time a 16 movwf time clrf afficheur bsf afficheur,4 ;initialisation de afficheur clrf valeur ;initialisation de tout les registres clrf temp2 clrf temp3 clrf temp4 clrf temp5 bcf etat,1 movlw D'1' ;on initialise sec, dsec, min et dmin a 1 au demarrage movwf sec ;sur les afficheurs on ne lit pas "1" mais "0" movlw D'1' movwf dsec movlw D'1' movwf min movlw D'1' movwf dmin bcf etat,0 ; Configuration de l'interruption et des ports A et B bsf STATUS,RP0 ; selection de la page memoire n1 movlw B'10000111' ; On configure le prediviseur movwf OPTION_REG ; interruption toutes les 256 instructions movlw B'10000000' ;les pattes 0/6 du port movwf TRISB ;B en sorties clrf TRISA ; Tout le port A en sortie bcf STATUS,RP0 ; on repasse dans la page memoire 0 bsf PORTA,0 ; on met le port A a zero bsf PORTA,1 bsf PORTA,2 bsf PORTA,3 clrf PORTB ; on met le port B a zero movlw B'10100000' ; on va configurer les interruptions movwf INTCON ;------------------------------------------------------------------------------------------------------ boucle bcf STATUS,C ;remise a zero de la retenue rrf afficheur,1 ;puis on fait tourner le bit de afficheur movf afficheur,1 ;afficheur-> afficheur btfsc STATUS,Z ;si afficheur vaut zero call init_afficheur ;on appel init_afficheur btfsc afficheur,0 ;si le bit 0 de afficheur vaut 1 movf dmin,0 ;on met dmin dans W btfsc afficheur,1 ;si le bit 1 de afficheur vaut 1 movf min,0 ;on met min dans W btfsc afficheur,2 ;si le bit 2 de afficheur vaut 1 movf dsec,0 ;on met dsec dans W btfsc afficheur,3 ;si le bit 3 de afficheur vaut 1 movf sec,0 ;on met sec dans W call affiche movwf PORTB comf afficheur,0 ;on complemente afficheur, on met le resultat dans W movwf PORTA ;W -> portA btfsc etat,0 bsf PORTA,4 btfss etat,0 bcf PORTA,4 call tempo ;la tempo sert a ralentir la vitesse sur les ports A et B btfss etat,1 ;on poursuit la boucle qu'une fois sur 4 goto boucle bcf etat,1 ;indique le passage dans la ;partie de boucle traitant le clavier bcf etat,2 ;etat2 indique un changement dans clavier movf temp2,1 btfss STATUS,Z bsf etat,2 movf temp3,1 btfsc STATUS,Z bsf etat,2 btfsc etat,2 ;si il n y a pas de changement, on retourne a boucle goto boucle btfsc etat,0 ;si la minuterie decompte, on va a arret goto arret movlw D'11' ;si la touche arret est pressee, on va debut (reinitialisation) subwf temp5,0 btfsc STATUS,Z goto debut movlw D'13' ;si la touche marche est pressee, on va a marche subwf temp5,0 btfsc STATUS,Z goto marche movlw D'12' ;si la touche zero est pressee, on remplace le 12 par 0 subwf temp5,0 movlw D'01' btfsc STATUS,Z movwf temp5 movf min,0 ;on fait le decalage vers la gauche des afficheurs movwf dmin movf dsec,0 movwf min movf sec,0 movwf dsec movf temp5,0 movwf sec goto boucle arret movlw D'11' ;si on presse la touche arret, le bit etat,0 est mis a zero subwf temp5,0 btfsc STATUS,Z bcf etat,0 goto boucle marche movlw D'16' ; on met 16 movwf time ; dans time call test_zero btfss etat,3 ;on met le bit etat,0 a 1 condition que les registres dmin bsf etat,0 ;min, dsec et sec ne soient pas a 1 (affiche alors un 0) goto boucle ;------------------------------------------------------------------------------------------------------ ;sous-programmes tempo decfsz temp1,1 goto tempo return test_zero bsf etat,3 ;indicateur de "00:00" movlw H'01' subwf dmin,0 btfss STATUS,Z bcf etat,3 ;enleve indicateur de "00:00" movlw H'01' subwf min,0 btfss STATUS,Z bcf etat,3 ;enleve indicateur de "00:00" movlw H'01' subwf dsec,0 btfss STATUS,Z bcf etat,3 ;enleve indicateur de "00:00" movlw H'01' subwf sec,0 btfss STATUS,Z bcf etat,3 ;enleve indicateur de "00:00" return init_afficheur bsf afficheur,3 ;on reinitialise afficheur movlw B'00001111' ;on eteind les afficheurs pendant la lecture du clavier movwf PORTA btfsc etat,0 ;on maintient le relais dans sa position bsf PORTA,4 btfss etat,0 bcf PORTA,4 bsf etat,1 bsf STATUS,RP0 ; selection de la page memoire n1 movlw B'11110000' ;on configure le port B en entree movwf TRISB bcf STATUS,RP0 ; on repasse dans la page memoire n0 movf temp2,0 ;on decale temp2 -> temp3 movwf temp3 movlw H'01' ;on commence la lecture du clavier movwf valeur ;valeur sera additionne a la colonne (1 2 3) selectionnee clrf PORTB ;on active la premiere ligne bsf PORTB,ligne1 call colonne ;on va voir quelle colonne est selectionnee movwf temp2 ;le sous programme colonne retourne la valeur movf temp2,1 ;correspondant a la touche sollicitee btfss STATUS,Z ;si aucune touche n a ete activee, on poursuit la lecture goto fin_clav movlw H'04' ;le programme se deroule de meme pour les movwf valeur ;lignes suivantes clrf PORTB bsf PORTB,ligne2 call colonne movwf temp2 movf temp2,1 btfss STATUS,Z goto fin_clav movlw H'07' movwf valeur clrf PORTB bsf PORTB,ligne3 call colonne movwf temp2 movf temp2,1 btfss STATUS,Z goto fin_clav movlw H'0A' movwf valeur clrf PORTB bsf PORTB,ligne4 call colonne movwf temp2 fin_clav bsf STATUS,RP0 ; selection de la page memoire n1 movlw B'10000000' movwf TRISB bcf STATUS,RP0 ; on repasse dans la page memoire n0 movf temp4,0 ;rotation dans les registres movwf temp5 movf temp2,0 addwf valeur,0 movwf temp4 return colonne btfsc PORTB,colonn1 retlw H'01' btfsc PORTB,colonn2 retlw H'02' btfsc PORTB,colonn3 retlw H'03' retlw H'00' affiche addwf PCL,1 ;on charge le registre PCL par la nop ;valeur qu'il contient plus la valeur retlw b'00111111' retlw b'00000110' ;de W retlw b'01011011' ;On se deplace ainsi a l'adresse: retlw b'01001111' ;adresse de 'addwf PCL,1' + W retlw b'01100110' ;il faut intercaler une instruction nop retlw b'01101101' ;car W varie de 1 a 10 Enfin, on retlw b'01111101' ;retourne dans W la valeur a afficher retlw b'00000111' retlw b'01111111' retlw b'01101111' end |
Realisation:
Voici l'implantation des composants et le typon du circuit (cliquez pour
agrandir):
Il faut superposer les deux circuits imprimés pistes contre pistes, vous pouvez les fixer avec des entretoises. Pour établir le contact entre entre les deux circuits, vous pouvez souder des morceaux de barrette tulipe sur un circuit imprimé et souder des queues de résistances (bien ajustées) sur l'autre. Il ne reste alors plus qu'à les connecter dos à dos.
Voici les photos de la réalisation:
Le dos de la minuterie. |
On distingue les barrettes tulipes. |
La minuterie vue de face. |
Vous devez telecharger le typon en cliquant ici tout en appuyant sur la touche MAJUSCULE.
Je rappelle qu'il faut telecharger le logiciel ARES Lite qui est gratuit. Il est
disponible sur le site suivant: http://www.multipower-fr.com
Vous pouvez egalement cliquer ici pour voir
comment faire pour imprimer votre typon
ATTENTION, ici il faut ouvrir le fichier de la manière suivante:
~ Ouvrez le logiciel ARES Lite
~ Cliquez sur File, puis sur Import Region.
Essais:
Lorsque vous branchez le montage: IL doit aussitôt afficher "00 00".
Le clavier est configuré comme un clavier de téléphone, la touche dièse sert de mise en marche et la touche étoile sert de bouton arret.
Le principe est le suivant: on programme une durée, par exemple 18minutes 45secondes, on tape 1 8 4 5. Puis on met la minuterie en marche en appuyant sur la touche marche (bas à droite); le relais se déclenche aussitôt (jusqu'à ce que la minuterie s'arrète). Il y a alors deux possibilités, la minuterie atteind "00 00" toute seule ou on décide de l'arreter en appuyant sur arret (bas à gauche); le relais se décolle alors. Une fois arretée, la minuterie peut-être remise à "00 00" (en appuyant une deuxième fois sur la touche arret) ou remise en marche ou encore reprogrammée sur une autre durée.
Remarques:
Je vous rappelle que je ne suis en aucun cas responsable des dommages corporels ou materiels que pourrait causer le montage.
Pour tout renseignement, question, commentaire, ... n'hesitez pas à m'écrire : rbourdon@enib.fr