;TIMERPIC.ASM ;TIMER à PIC16C84 et affichage LCD rétro-éclairé pour Agrandisseur PHOTO ;pour Qx=3,2768Mhz ;RAPPEL REGISTRE D'ETAT = STATUS : p:30 ;---------------------------------------------------------------------- ; ; w = 7 ; wreg = 7 ; LIST P=PIC16C84 ;qq include p16c84.inc ;SVP definir ScratchPadRam ici: ;Si vous utilisez un PIC16C5X definissez "departRam equ 0x10" ;sinon definissez "departRam equ 0x20" ;---------------------------------------------------------------------- w equ 0 f equ 1 ;attention: le PIC16C84 possède 36 octets de RAM ;adresses OCh à 2Fh ;attention: le nb qui suit Ram0+... doit être écrit en Hexa ! Ram0 equ 000C AA equ Ram0+00 ;mon registre de travail BB equ Ram0+01 ;mon registre de travail CC equ Ram0+02 ;mon registre de travail DD equ Ram0+03 ;mon registre de travail WW equ Ram0+04 ;pour sauvegarder w pendant INT nb0 equ Ram0+05 nb1 equ Ram0+06 t1 equ Ram0+07 ;pour les tempos t2 equ Ram0+08 t3 equ Ram0+09 dtlcd equ Ram0+0A ;data vers afficheur LCD aff1 equ Ram0+0B aff2 equ Ram0+0C aff3 equ Ram0+0D aff4 equ Ram0+0E bitn equ Ram0+0F memo3 equ Ram0+10 ;variable de travail compte equ Ram0+11 pos1 equ Ram0+12 pos2 equ Ram0+13 dixs equ Ram0+14 ;compte les dizièmes de seconde run equ Ram0+15 mode equ Ram0+16 frq0 equ Ram0+17 frq1 equ Ram0+18 service equ Ram0+19 ; ;bit0 : mode luxmetre (sert à traiter différemment l'INT en mode Luxmètre) ;bit1 : évite d'afficher plusieurs fois "BONJOUR" point equ Ram0+1A ;=00000001 ou 00000010 ou 00000100 val0 equ Ram0+1B val1 equ Ram0+1C org 0 ;start address 0 goto start ;---------------------------------------------------------------------- ;traitement interruption ;ici débordement du Timer0 ;3.2768Mz/4/256/32=100Hz org 0004 ;INT btfsc service,0 ;si mode luxmètre, traitement différent goto intlux movwf WW movlw .224 ;(256-32) movwf TMR0 ;ici on passe tous les 1/100 de sec decfsz dixs,f goto int2 movlw .20 ;ici on passe tous les 2/10 de sec movwf dixs btfss run,0 goto int2 decfsz compte,f;compte=0 ? goto int2 bcf run,0 ;oui => fin du décompte int2 bcf INTCON,2 ;ré-autorise int Timer0 voir p:136 et p:156 movf WW,w retfie intlux incf frq1,f bcf INTCON,2 ;ré-autorise int Timer0 voir p:136 et p:156 retfie ;---------------------------------------------------------------------- ;INITIALISATION DES PORTS ;---------------------------------------------------------------------- org 0020 start clrf service restart clrwdt bcf service,0 ;desactive mode lux movlw B'00010000' ;0=sortie 1=entree (RA4=aussi RTCC) TRIS PORTA ;config du port A (TRISA en page 1) movlw B'00011100' TRIS PORTB ;config du port B bcf PORTB,7 ;sortie vers optocoupleur ;---------------------------------------------------------------------- ;PROGRAMMATION DU REGISTRE OPTION ;VOIR page 144 et 143 ;soit Timer0 = 1/128 -> PS2,1,0 = 111b VOIR PAGE 135 ;PSA (bit3) = 0 -> prédiv affecté au Timer0 voir p:73 ;RTE (bit4) = 0 -> inc sur front montant ;RTS (bit5) = 0 -> branche Timer0 sur horloge interne ;INTEDG=x ;RBPU (bit7)=1 -> pas de R tirage à Vdd du port B (10k ext à GND sur PB7) ; bits: 76543210 movlw B'10000111' OPTION ;---------------------------------------------------------------------- ;PROG DU REGISTRE INTCON ;voir page 155 et surtout p:136 ;bit0 RBIF=x (sortie?) ;bit1 INTF=x (sortie?) ;bit2 RTIF=x (SORTIE?) ;bit3 RBIE=0 -> INT du port RB4 à RB7 interdites. ;bit4 INTE=0 -> INT de RB0/INT interdite. ;bit5 RTIE=1 -> INT par debordement Timer0 ;bit6 EEIE=0 -> INT EEPROM interdites ;bit7 GIE=1 ->INT GLOBALE autorisée. movlw B'10100000' movwf INTCON ;---------------------------------------------------------------------- clrf TMR0 clrf nb0 clrf nb1 clrf run clrf mode bcf PORTB,7 ;----------------------------------------------------------------------- ;essai ;----------------------------------------------------------------------- ;RAZ LCD call dspclr call home call fset call setmod0 call dsp10 movlw 03h call ddras movlw .0 ;offset (TIMER) call texte1 movlw .5 call tx100ms btfsc service,1 ;ceci ne séxecute qu'a la mise sous tension goto suite1 movlw 00h call ddras movlw .6 ;offset (BONJOUR) call texte1 movlw .5 call tx100ms call dspclr bsf service,1 ;évite dáfficher "BONJOUR" au retour luxmetre movlw 03h call ddras movlw .0 ;offset (TIMER) call texte1 ;---------------------------------------------------------------------- ;BOUCLE PRINCIPALE suite1 movlw .0 movwf compte loop1 clrwdt bcf PORTB,7 btfss PORTB,4 ;bouton poussoir RUN call dec_t movlw 00h call ddras call scr2 movf pos2,w call affiw call affi2 decf pos2,f btfsc STATUS,2 ;bit z call mode1 decf pos2,f btfsc STATUS,2 call mode2 decf pos2,f btfsc STATUS,2 call mode3 decf pos2,f btfsc STATUS,2 call mode4 decf pos2,f btfsc STATUS,2 call mode5 decf pos2,f btfsc STATUS,2 ;bit z goto mode6 ;le mode6 change la prog des INT; retour par reset soft movlw .2 call tx100ms goto loop1 ;---------------------------------------------------------------------- ;DEBUT DES PROCEDURES ;---------------------------------------------------------------------- ;le texte doit obligatoirement finir par .0 por sortir de la boucle txt1 addwf PCL,f retlw 'T' ;0 retlw 'I' retlw 'M' retlw 'E' retlw 'R' retlw .0 ;bsf w bit 7 -> fin retlw 'B' ;6 retlw 'O' retlw 'N' retlw 'J' retlw 'O' retlw 'U' retlw 'R' retlw ' ' retlw .0 ;bsf w bit 7 -> fin retlw 'L' ;15 retlw 'U' retlw 'X' retlw .0 ;bsf w bit 7 -> fin retlw 'S' ;19 retlw 'T' retlw 'O' retlw 'P' retlw .0 ;bsf w bit 7 -> fin ;---------------------------------------------------------------------- ;gamme des temps logarithmique ;dynamique = 160/5 = 32 gamlog addwf PCL,f retlw .5 retlw .7 retlw .10 retlw .14 retlw .20 retlw .28 retlw .40 retlw .55 retlw .80 retlw .110 retlw .160 ;---------------------------------------------------------------------- ;gamme logarithmique de luminosités (valeurs codées sur 2 octets) ;dynamique = 2048/32 = 64/1 gamlum addwf PCL,f retlw .32 ;1 retlw .0 ;=32 retlw .45 ;2 retlw .0 ;45 = 32 * 1.414 retlw .64 ;3 retlw .0 ;=64 retlw .90 ;4 retlw .0 ;=90 retlw .128 ;5 retlw .0 ;=128 retlw .53 ;6 retlw .1 ;181 (=128 x 1,414 ) retlw .106 ;7 retlw .1 ;362 retlw .0 ;8 retlw .2 ;512 retlw .212 ;9 retlw .2 ;724 retlw .0 ;10 retlw .4 ;1024 retlw .168 ;11 retlw .5 ;1448 retlw .0 ;12 retlw .8 ;2048 ;----------------------------------------------------------------------- ;le texte doit obligatoirement finir par .0 pour sortir de la boucle texte1 movwf DD looptx1 movf DD,w call txt1 andlw .255 ; pos bit z btfsc STATUS,2 ;test bit z return call ecrire incf DD,f goto looptx1 ;----------------------------------------------------------------------- ;echelle log 1 - 1.4 - 2 - 2.8 - 4 - 5.6 - 8... mode1 movlw 41h call ddras call scr1 decf pos1,f movf pos1,w call gamlog movwf compte call affitp return ;----------------------------------------------------------------------- ;echelle lin 1 - 2 - 3 - 4 - 5 - 6 - 7...11 mode2 movlw 41h call ddras call scr1 clrw call gamlin1 movwf compte call affitp return ;----------------------------------------------------------------------- ;echelle lin 11 - 12 - 13 - ...22 mode3 movlw 41h call ddras call scr1 call gamlin2 movwf compte call affitp return ;----------------------------------------------------------------------- ;echelle lin 22...33 mode4 movlw 41h call ddras call scr1 call gamlin3 movwf compte call affitp return ;---------------------------------------------------------------------- ;echelle lin 33..44 mode5 movlw 41h call ddras call scr1 call gamlin4 movwf compte call affitp return ;********************************************************************** ;luxmètre (mesure frq d'un TSL235) ;le mode luxmètre diffère beaucoup du mode TIMER. ;les INT sont différentes. ;en mode TIMER, le timer est relié à l'orloge interne. ;en mode luxmètre, le timer est relié à l'entrée externe. RTCC=pin 3 mode6 call dspclr movlw 05h call ddras movlw .15 ;offset (LUX) call texte1 bsf service,0 ;sert dans l'int TIMER0 ;---------------------------------------------------------------------- ;rePROGRAMMATION DU REGISTRE OPTION ;VOIR pages 28 (f1=RTCC) , 35 , 144 , 143 et 155 ;soit Chien de garde = f/128 -> PS2,1,0 = 111b VOIR PAGES 36 , 135 ;PSA (bit3) = 1 -> prédiviseur interne non selectionné pour RTCC. ;RTE (bit4) = 0 -> inc sur front montant ;RTS (bit5) = 1 -> Compte signal sur patte RTCC *-* :) ;INTEDG=x ;RBPU (bit7)=1 -> pas de R tirage à Vdd du port B (10k ext à GND sur PB7) ; bits: 76543210 movlw B'10101111' OPTION ;---------------------------------------------------------------------- ;rePROG DU REGISTRE INTCON ;voir page 155 et surtout p:136 ;bit0 RBIF=x (sortie?) ;bit1 INTF=x (sortie?) ;bit2 RTIF=x (SORTIE?) ;bit3 RBIE=0 -> INT du port RB4 à RB7 interdites. ;bit4 INTE=0 -> INT de RB0/INT interdites. ;bit5 RTIE=1 ->INT par debordement Timer0 ;bit6 EEIE=0 -> INT EEPROM interdites ;bit7 GIE=1 ->INT GLOBALE autorisée. (ici Timer0) movlw B'10100000' ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! movwf INTCON ;----------------------------------------------------------------------- loop4 clrwdt call acq_f ;stocke dans nb0 et nb1 movlw 41h call ddras call affnb call afilux clrwdt movlw 00h call ddras call caselum ;jauge la luminosité et retourne 1..21 step 2 bcf STATUS,0 ;RAZ bit de carry rrf compte,f ;=compte/2 (donc w = 0..10 suivant la lum.) movlw .10 movwf AA ;AA=10 movf compte,w ; subwf AA,w ;w:=10-compte ; call affiw ;pour tests ; call affi4 clrwdt call gamlog ;retoune une valeur en temps d'expo conseillé movwf compte call affitp call scr2 movlw .6 ;toujours mode6 ? subwf pos2,w btfss STATUS,2 ;bit z goto restart ;si sortie du mode 6 RESET prog call tp100ms goto loop4 ;************************************************************************* ;decrementation temps auto par Timer0 dec_t bsf run,0 bsf PORTB,7 movlw .5 call tx100ms ;temps anti rebond (évite arret d'urgence...) loop2 clrwdt ;tourne tant que le Timer0 n'a pas raz run,0 movlw 41h call ddras movf compte,w call affitp call tp10ms btfss PORTB,4 ;bouton poussoir RUN/STOP goto stopurg ;arret d'urgence ! btfsc run,0 goto loop2 bcf PORTB,7 return stopurg bcf PORTB,7 call dspclr movlw .19 ;offset (STOP) call texte1 movlw .5 call tx100ms call dspclr movlw 03h call ddras movlw .0 ;offset (TIMER) call texte1 return ;---------------------------------------------------------------------- ;case lum of... table des temps d'exposition ;cette procedure lit en entrée la valeur nb0,1 et la compare à une table ;elle sort une valeur de 1..à 11 qui servira à pointer dans la table gamlog caselum clrwdt clrf compte ;compteur de boucle decf compte,f boucle1 clrwdt incf compte,f movf compte,w call gamlum movwf val0 ;ici val0= 1er octet de la table incf compte,f movf compte,w call gamlum movwf val1 ;ici val0= 2eme octet de la table call compare ;positionne carry btfsc STATUS,0 ;test carry return ;retour normal. ici le resultat est = compte movlw .20 ;2 x nb de valeurs subwf compte,w btfss STATUS,0 ;bit carry goto boucle1 retlw .255 ;signale dépassement hors gamme ;---------------------------------------------------------------------- ;soit val0 et val1 la valeur de référence codée sur 16 bits ;en fait, comparaison par soustraction sur 16 bits ;compare nb0,1 à val0,1 compare movf nb1,w movwf memo3 ;pour ne pas l'abîmer... movf nb0,w ;w = nb0 subwf val0,w ;val0=val0-nb0 ; c=0 si val0 < nb0 btfsc STATUS,0 ;neg ? goto cp2 ;non incf memo3,f ;oui -> ajout retenue cp2 movf memo3,w subwf val1,w return ;---------------------------------------------------------------------- ;gamme des temps linéaire 1 - 2 - 3 ...11s ;lit pos1 (et le détruit), sort sur compte gamlin1 clrw lin1 clrwdt addlw .5 decfsz pos1,f goto lin1 return ;---------------------------------------------------------------------- ;gamme des temps linéaire 11 - 12 - 13 ...22 s gamlin2 movlw .55 goto lin1 ;---------------------------------------------------------------------- ;gamme des temps linéaire 22..33 s gamlin3 movlw .110 goto lin1 ;---------------------------------------------------------------------- ;gamme des temps linéaire 33..44 s gamlin4 movlw .165 goto lin1 ;---------------------------------------------------------------------- ;scrute le 4017 Nº1 scr1 clrwdt bsf PORTB,1 ;RAZ 4017 call tp300us bcf PORTB,1 ;FIN RAZ clrf pos1 incf pos1 ;pour partir de 1 et pas de 0 bcl4017 clrwdt btfsc PORTB,2 return call clk4017 incf pos1 movlw .11 xorwf pos1,w ;débordement ? (toutes les sorties du 4017 NC)=pos10b btfss STATUS,2 ;bit z goto bcl4017 return ;---------------------------------------------------------------------- ;scrute le commutateur rotatif nº2 cablé en // sur le même 4017 que le nº1 scr2 clrwdt bsf PORTB,1 ;RAZ 4017 call tp300us bcf PORTB,1 ;FIN RAZ clrf pos2 ;différence avec le procédure précédente incf pos2 ;pour partir de 1 et pas de 0 bcl40_2 clrwdt btfsc PORTB,3 ;différence avec le procédure précédente return call clk4017 incf pos2 movlw .11 xorwf pos2,w ;débordement ? (toutes les sorties du 4017 NC)=pos10b btfss STATUS,2 ;bit z goto bcl40_2 return ;----------------------------------------------------------------------- clk4017 clrwdt bsf PORTB,0 call tp300us bcf PORTB,0 return ;------------------------------------------------------------------------ ;début des procédures d'affichage LCD ;---------------------------------------------------------------------- ;FUNCTION SET fset bcf PORTA,2 ;E=0 bcf PORTA,3 ;R/S=0 movlw .56 ;(32+16+8) movwf dtlcd call dt_out ;transmission série vers 4015 -> DATA // LCD call impuls return ;---------------------------------------------------------------------- ;DISPLAY CLEAR dspclr bcf PORTA,2 ;E=0 bcf PORTA,3 ;R/S=0 movlw .1 movwf dtlcd call dt_out call impuls return ;---------------------------------------------------------------------- ;RETURN HOME home clrf PORTA movlw .2 movwf dtlcd call dt_out call impuls return ;---------------------------------------------------------------------- ;ENTRY MODE SET 0 ;le curseur se déplace setmod0 bcf PORTA,2 ;E=0 bcf PORTA,3 ;R/S=0 movlw .6 ;( 4+2 sens inverse si 4+0 ) movwf dtlcd call dt_out call impuls return ;---------------------------------------------------------------------- ;ENTRY MODE SET 1 ;curseur gelé setmod1 bcf PORTA,2 ;E=0 bcf PORTA,3 ;R/S=0 movlw .7 ;( 4+2+1 ) movwf dtlcd call dt_out call impuls return ;---------------------------------------------------------------------- ;DISPLAY ON OFF dsp10 bcf PORTA,2 ;E=0 bcf PORTA,3 ;R/S=0 movlw .12 ;( 8+4 ) movwf dtlcd call dt_out call impuls return ;---------------------------------------------------------------------- ;DDRAM ADRESS SET (A) ;w doit contenir l'adresse (position d'affichage. voir doc) ddras bcf PORTA,2 ;E=0 bcf PORTA,3 ;R/S=0 addlw .128 movwf dtlcd call dt_out call impuls return ;---------------------------------------------------------------------- ;CURSOR OR DISPLAY SHIFT ;DEFILEMENT DU TEXTE shiftT bcf PORTA,2 ;E=0 bcf PORTA,3 ;R/S=0 movlw .24 ;( 16+8 ) movwf dtlcd call dt_out call impuls return ;---------------------------------------------------------------------- ;CURSOR OR DISPLAY SHIFT ;DEFILEMENT DE LA POSITION D'AFFICHAGE (CURSEUR) shiftC bcf PORTA,2 ;E=0 bcf PORTA,3 ;R/S=0 movlw .16 ;( 16 ) movwf dtlcd call dt_out call impuls return ;---------------------------------------------------------------------- ;ECRIRE ;w doit contenir lavaleur ASCII du caractère à afficher ecrire clrwdt bcf PORTA,2 ;E=0 bsf PORTA,3 ;R/S=1 movwf dtlcd call dt_out bsf PORTA,2 ;impuls E à 1 avec RS=1 call tp10ms bcf PORTA,2 ;fin impulsion call tp10ms return ;---------------------------------------------------------------------- ;impulsion E à 1 avec RS=0 impuls bcf PORTA,3 ;R/S=0 bsf PORTA,2 ;impulsion E à 1 call tp10ms bcf PORTA,2 ;fin impulsion call tp10ms return ;---------------------------------------------------------------------- ;SORTIE DATA (8 bits) en série sur PA0 vers CD4015. PA1=Clock 4015. dt_out movlw .8 movwf bitn dtbcl rlf dtlcd,f bcf PORTA,0 ;bit = 0 (à priori) btfsc STATUS,0 ;test carry bsf PORTA,0 ;non, bit = 0 out bsf PORTA,1 ;clock 4015 call tp300us bcf PORTA,1 ;fin clock call tp300us decfsz bitn,f goto dtbcl return ;------------------------------------------------------------------------ ;affichage physique de 4 NOMBRES. affi4 movlw .10 subwf aff4,w ;pour détecter dépassement... btfsc STATUS,0 ;bit de carry goto depass movf aff4,w addlw .48 ;code ASCII de zéro call ecrire affi3 movf aff3,w addlw .48 ;code ASCII de zéro call ecrire affi2 movf aff2,w addlw .48 ;code ASCII de zéro call ecrire movf aff1,w addlw .48 ;code ASCII de zéro call ecrire goto finaff depass movlw "-" call ecrire movlw "-" call ecrire movlw "-" call ecrire movlw "-" call ecrire finaff return ;------------------------------------------------------------------------ ;nb decimaux dans AA(unités) et BB(centaines) au préalable affdeci clrwdt movf BB,w movwf CC ;memo BB danc CC because cvBDU utilise BB call cvBDU movf AA,w ;ld A,V movwf aff1 ;ld Aff1,A movf BB,w ;ld A,W movwf aff2 ;ld Aff2,A movf CC,w ;ld A,BB ;0..99 movwf AA call cvBDU movf AA,w movwf aff3 movf BB,w movwf aff4 return ;----------------------------------------------------------------------- ;affiche un octet complet dans variables aff1..4 ;W doit contenir l'octet à afficher affiw clrwdt movwf AA call cvBDU ;BB=18 et AA=4 movf AA,w movwf aff1 ;aff1=4 movf BB,w ;w=18 movwf AA ;AA=18 call cvBDU ;BB=1 et AA=8 movf AA,w movwf aff2 ;aff2=8 movf BB,w movwf aff3 ;aff3=1 clrf aff4 return ;----------------------------------------------------------------------- ;affiche un temps <= 51s affitp clrwdt clrf nb1 movwf nb0 bcf STATUS,0 ;RAZ bit de carry rlf nb0 ;multiplie par deux toutes les valeurs rlf nb1 ;récupère la retenue... call affnb movf aff3,w addlw .48 ;code ASCII de zéro movf aff3,f ;ne fait rien mais positionne le bit z btfsc STATUS,2 ;bit z blanc movlw .32 call ecrire movf aff2,w addlw .48 call ecrire movlw "." call ecrire movf aff1,w addlw .48 call ecrire movlw "s" call ecrire return ;----------------------------------------------------------------------- ;affiche le nb delux avec un point décimal flotant ;si w=1..=2..=3 afilux movlw .10 subwf aff4,w ;pour détecter dépassement... btfsc STATUS,0 ;bit de carry goto depss movf aff4,w addlw .48 ;code ASCII de zéro call ecrire movf aff3,w addlw .48 ;code ASCII de zéro call ecrire btfss point,2 goto alx1 movlw '.' ;point décimal call ecrire alx1 movf aff2,w addlw .48 ;code ASCII de zéro call ecrire btfss point,1 goto alx2 movlw '.' ;point décimal call ecrire alx2 movf aff1,w addlw .48 ;code ASCII de zéro call ecrire movlw ' ' ;efface à droite pour le cas de nb plus court. call ecrire goto finaff depss movlw "-" call ecrire movlw "-" call ecrire movlw "-" call ecrire movlw "-" call ecrire movlw "-" call ecrire return ;----------------------------------------------------------------------- ;affichage nombre 0..9999 ;nb0 et nb1 contiennent un nb 0..9999 affnb clrwdt movf nb0,w ;ld A,nb0 movwf AA call cvBCU ;convertit nb0 en BCD ;résultat dans AA(unités) et BB(centaines) ;on va ajouter nb1 x 256 movf nb1,w ;ld A,nb1 movwf memo3 ;ld memo3,A pour'pas toucher nb1 incf memo3,f ;hors boucle bcl1 decfsz memo3,f goto saut1 ;jrnz ici1 goto suitef ;ld A,AA saut1 movlw .56 addwf AA,f ;+56 retenue decimale possible movf AA,w sublw .99 ;carry =0 si AA>99 btfsc STATUS,0 ;bit de carry goto st1 ;donc saut si carry=1, c.a.d si A>99 ;jrc st1 movlw .100 subwf AA,f incf BB,f ;ajout retenue decimale st1 movlw .2 addwf BB,f ;(+200) soit en tout +256 goto bcl1 suitef call affdeci return ;------------------------------------------------------------------------ ;CONVERSION BINAIRE(1) (1 octet incomplet 0..99 et pas 0..255) --> BCD ;nombre à convertir dans AA ;resultat dans BB (dizaines) et dans AA (unités) ;ex: AA=237 -> BB=23 et AA=7 ;ex2 AA=84 -> BB=8 et AA=4 cvBDU clrf BB conv2 movlw .10 subwf AA,w ;w=AA-10 positionne le bit de carry si A<10 btfss STATUS,0 ;bit de carry goto conv3 ;donc saut ->conv3 si carry=1, c.a.d si A<10 movlw .10 subwf AA,f ;en boucle : revient à diviser A par 10 incf BB,f goto conv2 ;9 passages au max si nb <= 99 conv3 return ;-------------------------------------------------------------------- ;CONVERSION BINAIRE(2) (1 octet complet 0..255) --> BCD ;nombre à convertir dans AA ;resultat dans BB (centaines) et dans AA (unités) ;ex: AA=237 -> BB=23 et AA=7 cvBCU clrf BB conv4 movlw .100 subwf AA,w ;w=AA-100 positionne le bit de carry si A<100 btfss STATUS,0 ;bit de carry goto conv5 ;donc saut ->conv3 si carry=1, c.a.d si A<100 movlw .100 subwf AA,f ;en boucle : revient à diviser A par 100 incf BB,f goto conv4 ;9 passages au max si nb <= 999 conv5 return ;-------------------------------------------------------------------- ; Qx = 3,2768Mhz tp300us movlw .79 movwf t1 t3loop1 decfsz t1,f goto t3loop1 return ;---------------------------------------------------------------------- ; Qx = 3,2768Mhz tp2ms clrwdt movlw .16 movwf t1 t4loop1 movlw .32 movwf t2 t4loop2 decfsz t2,f goto t4loop2 decfsz t1,f goto t4loop1 return ;---------------------------------------------------------------------- ; Qx = 3,2768Mhz tp10ms clrwdt movlw .82 movwf t1 t1loop1 movlw .32 movwf t2 t1loop2 decfsz t2,f goto t1loop2 decfsz t1,f goto t1loop1 return ;---------------------------------------------------------------------- ; Qx = 3,2768Mhz tp100ms clrwdt movlw .170 movwf t1 t2loop1 movlw .160 movwf t2 t2loop2 clrwdt decfsz t2,f goto t2loop2 decfsz t1,f goto t2loop1 return ;---------------------------------------------------------------------- ; Qx = 3,2768Mhz ;tempo n x 100ms ;charger w avec n avant l'appel de cette procédure tx100ms clrwdt movwf t3 txloop clrwdt ;chien de garde call tp100ms decfsz t3,f goto txloop return ;---------------------------------------------------------------------- ; Qx = 3,2768Mhz ;tempo n x 10ms ;charger w avec n avant l'appel de cette procédure tx10ms clrwdt movwf t3 txlp2 clrwdt ;chien de garde call tp10ms decfsz t3,f goto txlp2 return ;---------------------------------------------------------------------- ;frequencemetre (sur 1 octet) ;Utilise l'Horloge RTCC comme compteur de transitions / patte RTCC (PORTA 3) ;voir page:35 et page:127 acq_f call scr1 movf pos1,w sublw .4 ;3 gammes max btfsc STATUS,0 ;bit carry goto suite2 movlw .3 ;si POS1 >= 4 movwf pos1 ;3 GAMMES (1/1 1/10 1/100) suite2 movlw .1 clrf point bsf point,0 decf pos1,f btfsc STATUS,2 ;bit z goto suiteaq movlw .10 ;le temps d'acquisition sera x par 10 clrf point bsf point,1 decf pos1,f btfsc STATUS,2 goto suiteaq movlw .100 ;le temps d'acquisition sera x par 100 clrf point bsf point,2 suiteaq clrf frq1 clrf TMR0 call tx10ms ;PLUSIEURS GAMMES... movf TMR0,w movwf nb0 movf frq1,w ;frq1 est mis a jour par l'INT TIMER0 movwf nb1 return ;---------------------------------------------------------------------- end