; *************************************************************************** ; ** C O M P T E U R D E J O U R S E J P ** ; ** ððððððððððððððððððððððððððððððððððððððððð ** ; ** --------------------------------------------------------------------- ** ; ** v1.6 [ALB] 11/04/1996 ** ; ********************************************************* CPTEJP16.ASM **** ; ; SPECIFICATIONS : - microcontr“leur ST62E20 (EPROM 4 Ko - quartz 8 MHz) ; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍ - d‚codage de la trame Pulsadis, ; - afficheur LCD, 1 ligne, 16 caractŠres (LM16155), ; - sauvegarde par pile 9v en cas de coupure secteur, ; - indication d'‚tat de fonctionnement (symboles), ; - indication de d‚tection de trame Pulsadis (.), ; - bouton 'correction ou RAZ compteur'. ; ;########################## D E C L A R A T I O N ########################### .W_ON .INPUT "ST_6215.reg" ; ; Registre DRx (PortX) - Pas de port C ! - ; PA .DEF dra!m ; port A (!m = visu dans SIMST6) PB .DEF drb!m ; port B ; ;Constantes : ; CLS .EQU 1 ; valeur pour effacer l'afficheur HOME .EQU 2 ; valeur pour la position 'home' NORM .EQU 0 ; ‚tat : normal AL .EQU 1 ; : alerte EJP .EQU 2 ; : EJP N1 .SET 5 ; num. 1e impulsion attendue (EJP) N2 .SET 15 ; num. 2e impulsion attendue (EJP) N10 .SET 11 ; num. 1e impulsion attendue (HC) N20 .SET 12 ; num. 2e impulsion attendue (HC) CHIEN .EQU 0FEH PRECHARG .EQU 238 ; T = 238 * 1,428 ms (f = 700,28 Hz) QUARTDEP .EQU 140 ; nb quarts p‚riode signal … int‚grer SEUIL .EQU 100 TOPDEP .EQU 3 FENETOPN .EQU 10 TESTTOPN .EQU 2 FENETR1 .SET (15+(50 * N1)) / 4 ; d‚lai en nb d'interruptions (EJP) FENETR2 .SET (15+(50 * N2)) / 4 FENETR10 .SET (15+(50 * N10))/ 4 ; d‚lai en nb d'interruptions (HC) FENETR20 .SET (15+(50 * N20))/ 4 FINTRAM .SET (15+(50 * 40)) / 4 ; 40Šme impulsion ; ; RAM interne 60 octets (de 84H … 0BFH) : ; DS Table,8 ; tableau 8 octets Fintabl .EQU 8CH DS Mesures,2 ; 2 octets DS Mespos,1 ; 1 octet DS Nbint,1 ; nb d'interruptions totalis‚es DS Imp1,1 ; ‚tat de la premiŠre impulsion DS Imp2,1 ; ‚tat de la deuxiŠme impulsion DS SauvAcc,1 ; reg. sauvegarde accu lors de l'int DS Cur_Pos,1 ; position du curseur LCD DS Sauv_a,1 ; sauvegarde du registre A DS Sauv_x,1 ; sauvegarde registre DS CopyPB,1 ; image du port B pour les E/S DS Puls,1 ; t‚moin de d‚tection de trame DS jEJP,1 ; compteurs des jours EJP DS Symb,1 ; contient nø symbole … afficher DS Cpt1,1 ; compteurs pour tempo DS Cpt2,1 DS Buf,1 ; tampon DS Prec,1 ; m‚moire ‚tat pr‚c‚dent DS Flag,1 ; indicateurs DS CptAppui,1 ; compteur 'touche appuy‚e' DS CptAl,1 ; compteur d‚t. alerte erron‚e ; ; bits : ; bPSI .EQU 3 ; TSCR.3 : bit de marche/arrˆt timer bTMZ .EQU 7 ; TSCR.7 : bit de red‚marrage du timer ; bE .EQU 0 ; PB.0 : ligne E LCD bRS .EQU 1 ; PB.1 : ligne RS LCD bVER .EQU 3 ; PB.3 : s‚lection version EJP/HC bAdj .EQU 4 ; PB.4 : correction compteur (B.P.) bSEC .EQU 7 ; PB.7 : entr‚e signal EDF (CA/N) ; ; indicateurs (flags) : ; fEjp .EQU 0 ; Flag.0 : indique ‚tat (EJP = 1) ;############################# M A C R O S ################################ .MACRO outpb val_PB ; MACRO. Ecrit sur le port B ld a,val_PB ; valeur … ‚crire sur le port B ld PB,a ; ‚crit sur le port .ENDM ;---------------------------------------------------------------------------- .MACRO swap_a ; MACRO. Interverti les quartets rlc a ; d‚cale avec carry rlc a rlc a rlc a rlc a .ENDM ;############################################################################ .ORG 0880H ; ‚mulation du modŠle ST62T10 ;########################## - Zone des Tableaux - ########################### ; ; tableau de d‚finition des nouveaux symboles (codes 0 … 7) du LCD ; Tab_Car .BYTE 00H,00H,08H,15H ; caractŠre nø0 (mode normal) .BYTE 02H,00H,00H,00H .BYTE 04H,0EH,0EH,0EH ; caractŠre nø1 (alerte) .BYTE 1FH,1FH,04H,04H .BYTE 02H,04H,08H,1FH ; caractŠre nø2 (mode EJP) .BYTE 02H,04H,08H,00H .BYTE 1FH,18H,18H,1EH ; caractŠre nø3 ('E' personnalis‚) .BYTE 18H,18H,1FH,00H .BYTE 1FH,06H,06H,06H ; caractŠre nø4 ('J' personnalis‚) .BYTE 06H,16H,0CH,00H .BYTE 1EH,19H,19H,1EH ; caractŠre nø5 ('P' personnalis‚) .BYTE 18H,18H,18H,00H ; ; þ Messages … afficher sur l'‚cran LCD : ; .ORG 08C0H ; 2iŠme fenˆtre ROM M_Init .ASCIZ "EJP - [ALB] v1.6" M_Cpt .BYTE 3,4,5 ; "EJP" personnalis‚ .ASCIZ ": " M_Ini2 .BYTE 3,4,5 ; "EJP" .ASCIZ ": --" ;**************************************************************************** ;* P R O G R A M M E * ;**************************************************************************** Reset ldi wdr,CHIEN ; chargementt chien de garde ; ldi ddra,11111111B ldi ora,00001111B ldi PA,00000000B ; PA.0 … PA.3 : sorties push-pull ; ldi ddrb,00000011B ; PB.7 : entr‚e num. (& ana.) ldi orb, 00000011B ; autres : entr‚es avec pull-up ldi drb, 00000000B ; PB.0/1 : sorties push-pull ldi CopyPB,0000000B ; 'image' du port B ; clr ddrc ; pas de port C clr orc clr drc ; set bSEC,orb ; conf. PB.7 en entr‚e analogique set bSEC,CopyPB outpb CopyPB ldi adcr,00110000B ; initialisation du convertisseur A/N ; ; pr‚-initialisation du timer ; ldi ior,00010000B ; interruption timer seulement ldi tcr,PRECHARG ; compte pour le relancement du timer ; ; initialisation m‚moire ; ldi y,Table ; Y : index r‚serv‚ … l'interruption ldi v,CptAl-Table ldi x,Table ; X : index r‚serv‚ au prog. principal clr a Raz ld (x),a ; remise … z‚ro de la m‚moire inc x dec v jrnz Raz ; reti ; retour au mode normal ; call TempoLcd res bSEC,orb ; conf. PB.7 en entr‚e num‚rique ldi wdr,CHIEN ; jette un os au chien clr Puls ; init. t‚moin d‚tection trame ('.') clr Prec ; init. m‚moire d'‚tat clr jEJP ; init. compteur de jours EJP clr Symb ; init. nø symbole (Normal) clr Flag ; init. des flags ; ; initialisation de l'afficheur LCD ; ldi drwr,Tab_Car.w ; init. reg. 'data ROM window' call Init_Lcd ; initialisation de l'afficheur ; ldi drwr,M_Init.w ; init. 2nd 'data ROM window' ldi x,M_Init.d ; init. du pointeur de message call Aff_Mess ; affiche le message d'init. call Tempo4s ; temporisation de 4 s call Cls_Lcd ; efface l'afficheur ; ; affichage du message standard ; ldi Cur_Pos,03H call SetCur ; curseur en 03 ld a,Symb call Aff_Car ; affiche symbole ; ldi Cur_Pos,40H call SetCur ; curseur en 40H ldi x,M_Ini2.d call Aff_Mess ; affiche 'EJP : --' ; ; identifie la version ; jrs bVER,PB,Ver_Ejp ; version EJP ? jp Ver_Hc ; non : saut version heures creuses ; ;-------------------------------------------------------------- ; V E R S I O N ' E J P ' ;-------------------------------------------------------------- ; Ver_Ejp ldi tscr,01111010B ; 1/4 de 8 MHz (T = 1,428 ms) ; ;-------------------------------------------------------------- ; DECODAGE DE LA TRAME PULSADIS ;-------------------------------------------------------------- ; 1. Recherche de l'impulsion de d‚part : ; Princip ld a,Mesures AttInt cp a,Mesures ; on attend l'incr‚mentation jrnz ReDep jp AttInt ; ReDep clr Mespos clr Mesures clr Mesures+1 ld a,Mesures Depart: cp a,Mesures ; on attend l'incr‚mentation jrnz Dep1 jrr bAdj,PB,Correct ; appui sur touche correction ? jp Depart ; Correct call Ajuste ; ajustage du compteur, ou RAZ jp Aff_Cpt ; affiche nouvelle valeur ; Dep1 ld a,Mesures cp a,Mespos ; toutes les mesures sont positives ? jrz Dep2 jp ReDep ; non : on attend ; Dep2 cpi a,TOPDEP ; nbre pr‚vu d'imp. [+] successives ? jrz Dep3 jp Depart ; non ; ; 2. Test de pr‚sence de la premiŠre impulsion attendue : ; Dep3 ldi v,FENETR1/256 ldi w,FENETR1%256 call TestImp ; impulsion pr‚sente au temps indiqu‚ ? ld Imp1,a ; r‚sultat du test ; ; 3. Test de pr‚sence de la deuxiŠme impulsion attendue : ; ldi v,FENETR2/256 ldi w,FENETR2%256 call TestImp ; test si impulsion pr‚sente ld Imp2,a ; r‚sultat du test ; ldi v,FINTRAM/256 ldi w,FINTRAM%256 call TestImp ; pour attendre derniŠre impulsion ; ; 4. Utilisation des signaux re‡us : ; call Exploite ; d‚termination ‚tat ; ; 5. Affichage de l'‚tat sur le LCD : ; call Cls_Lcd ; efface l'afficheur ldi Cur_Pos,02H call SetCur ; curseur en 02H ; inc Puls ; chgt ‚tat du t‚moin jrr 0,Puls,Temoin00 ; indique d‚tection d'une trame ldi a,'.' ; alterne le symbole suivant jp Temoin01 ; la parit‚ de Puls Temoin00 ldi a,' ' Temoin01 call Aff_Car ; affiche '.' ou ' ' ; ld a,Symb call Aff_Car ; affiche symbole (normal ou alerte) ; jrr fEjp,Flag,EffSymb ; on est en EJP ? ldi a,EJP ; oui : symbole = EJP jp AffSymb EffSymb ldi a,' ' ; non : efface le symbole AffSymb call Aff_Car ; affiche le symbole ; Aff_Cpt ldi Cur_Pos,40H call SetCur ; curseur en 40H ldi x,M_Cpt.d call Aff_Mess ; affiche 'EJP : ' ld a,jEJP call AffOctet ; affiche compteur EJP courant ; jp Princip ; attente trame suivante. ;**************************************************************************** ;* CORRECTION OU RAZ DU COMPTEUR * ;* ----------------------------- * ;* Entr‚e : * * ;* Sortie : jEJP * ;* Modifie : TSCR,WDR,Cpt1,Cpt2,CptAppui * ;**************************************************************************** ; un appui court incr‚mente le compteur, ; un appui long (>= 2 s) provoque une RAZ du microcontr“leur. ; Ajuste ldi CptAppui,16 ; init. compteur touche appuy‚e ; Adj3 ldi Cpt2,50 ; d‚compteur 2 (50 * 2,5 ms) Adj2 ldi Cpt1,0 ; d‚compteur 1 (256 * (6,5+3,25)æs) Adj1 dec Cpt1 ; d‚cr‚mente le compteur jrnz Adj1 ; compteur1 = 0 ? (t ÷ 2,5 ms) ldi wdr,CHIEN ; recharge le watch dog dec Cpt2 ; oui : d‚cr‚mente le compteur 2 jrnz Adj2 ; compteur2 = 0 ? (t ÷ 125 ms) ; jrs bAdj,PB,AdjInc ; toujours appuy‚ ? dec CptAppui ; oui : d‚cr‚mente compteur d'appui jrz RAZ_Soft ; d‚passement ? jp Adj3 ; RAZ_Soft res bPSI,tscr ; arrˆte le timer jp $ ; attend RAZ par watchdog ; AdjInc call IncCpt ; incr‚mente le compteur EJP ret ;**************************************************************************** ;* ATTENTE ET DETECTION D'UNE IMPULSION * ;* ------------------------------------ * ;* Entr‚e : Mesures * ;* Sortie : A * ;* Modifie : A,V,W,Mespos * ;**************************************************************************** TestImp ld a,v ; V : borne inf‚rieure de la fenˆtre cp a,Mesures+1 ; attend inc. jusqu'… la borne inf. jrnz TestImp ; octet fort d'abord ld a,w cp a,Mesures jrnz TestImp ; clr Mespos ; raz compteur de mesures ld a,w ; d‚cale VW … la borne sup‚rieure addi a,FENETOPN ; de la fenˆtre ld w,a jrnc TstI2 inc v ; TstI2 ld a,v cp a,Mesures+1 ; attend inc. jusqu'… la borne sup. jrnz TstI2 ; ld a,w cp a,Mesures jrnz TstI2 ; ld a,Mespos cpi a,TESTTOPN ; assez de lectures positives ? jrc TstI3 ; non : impulsion absente ; ldi a,1 ; oui : impulsion pr‚sente ret TstI3 clr a ret ;**************************************************************************** ;* UTILISATION DES SIGNAUX RECUS * ;* ----------------------------- * ;* Entr‚e : Imp1, Imp2 * ;* Sortie : compteur jEJP, indicateurs d'‚tat * ;* Modifie : A,Symb,Prec,jEJP,flag * ;**************************************************************************** ; A vaut 1 si fin pointe, 2 si alerte, 3 si pointe : ; ; 5 | 15 | ‚tat ; -------------------------------------- ; 0 | 0 | normal ; 0 | 1 | fin p‚riode de pointe ; 1 | 0 | alerte (la veille) ; 1 | 1 | p‚riode de pointe Exploite ld a,Imp1 sla a ; impulsion N1x en bit 1 add a,Imp2 ; impulsion N2x en bit 0 jrz Expl0a ; impulsion(s) EJP ? jp Expl00 ; oui ; Expl0a ld a,Symb ; non cpi a,AL jrz Expl01 ; ‚tat = alerte ? ret ; non : conserve affichage Expl01 ld a,CptAl ; oui cpi a,10 jrc Expl03 ; CptAl >= 10 ? ldi Symb,NORM ; oui : d‚tection alerte erron‚e clr CptAl ; r‚init. compteur ldi Prec,NORM ; mode normal ret Expl03 inc CptAl ; non : compte d‚tection erron‚e ret ; aucune impulsions : conserve aff. ; Expl00 cpi a,1 jrnz Expl10 ; fin pointe ? ldi Symb,NORM ; symbole normal ldi Prec,NORM ; mode normal res fEjp,Flag ; indique fin EJP clr CptAl ; r‚init. cpt d‚tection alerte erron‚e ret ; sort ; Expl10 cpi a,2 jrz Expl11 ; alerte ? jp Expl20 ; non Expl11 ldi Symb,AL ; symbole alerte jrs bVER,PB,Expl12 ; version HC ? ld a,Prec ; oui : cpt d‚j… incr‚ment‚ ? cpi a,NORM jrnz Expl13 ; d‚tection erron‚e ? jp FinExpl Expl13 ldi Prec,AL ; non : mode alerte HC call IncCpt ; incr‚mente le compteur EJP ret ; Expl12 ldi Prec,AL ; mode alerte (cas version EJP) clr CptAl ; r‚init. cpt d‚tection alerte erron‚e ret ; Expl20 cpi a,3 jrz Expl21 ; pointe EJP ? jp FinExpl Expl21 ldi Symb,' ' ; symbole (ni alerte, ni normal) clr CptAl ; r‚init. cpt d‚tection alerte erron‚e jrr bVER,PB,FinExpl ; version EJP ? ld a,Prec ; oui : d‚j… incr‚ment‚ ? cpi a,AL jrnz FinExpl ; d‚tection erron‚e ? ldi Prec,EJP ; non : mode EJP jrs fEjp,Flag,FinExpl ; on est d‚j… en EJP ? call IncCpt ; non : incr‚mente le compteur EJP set fEjp,Flag ; indique mode EJP FinExpl ret ;**************************************************************************** ;* INCREMENTATION D'UN COMPTEUR BCD * ;* -------------------------------- * ;* Entr‚e : compteur BCD jEJP * ;* Sortie : compteur BCD jEJP * ;* Modifie : A,WDR,jEJP * ;**************************************************************************** IncCpt ldi wdr,CHIEN ld a,jEJP cpi a,22H ; compteur = max (22) jrnz Inc01 ldi jEJP,1 ; oui : alors compteur = 1 ret ; Inc01 ld a,jEJP ; lit compteur andi a,0FH ; masque poids fort cpi a,09H ; poids faible = 9 ? jrnz Inc00 ; diff‚rent de 9 : incr‚mente ld a,jEJP addi a,07H ; ajustement d‚cimal (09H + 7 = 10H) ld jEJP,a ret ; Inc00 inc jEJP ; incr‚mente compteur ret ;**************************************************************************** ;* AFFICHAGE D'UN OCTET HEXA * ;* ------------------------- * ;* Entr‚e : donn‚e … afficher dans A * ;* Sortie : * * ;* Modifie : A,Sauv_x * ;**************************************************************************** AffOctet ld Sauv_x,a ; sauve accu swap_a ; interverti les quartets call ConvAsc ; converti MSB cpi a,'0' ; compare avec '0' jrnz AffOct00 ; z‚ro non significatif ? ldi a,' ' ; oui : on ne l'affiche pas AffOct00 call Aff_Car ; affiche MSB ld a,Sauv_x call ConvAsc ; converti LSB call Aff_Car ; et affiche ret ; ; Conversion hexad‚cimal vers ASCII ; ConvAsc andi a,0FH ; masque le poids fort jrr 3,a,NoAdj ; converti en ASCII jrs 2,a,Adj jrr 1,a,NoAdj ; Adj addi a,07H NoAdj addi a,30H ret ;######################### ROUTINES DE GESTION LCD ########################## ;**************************************************************************** ;* INITIALISATION DE L'AFFICHEUR LCD * ;* --------------------------------- * ;* Entr‚e : * * ;* Sortie : * * ;* Modifie : A,V,X,CopyPB * ;**************************************************************************** ; Initialisation en mode 4 bits (cf. doc Hitachi LCD-II) ; Init_Lcd res bRS,CopyPB outpb CopyPB ; ligne RS … 0 (registre d'instr.) ldi PA,0 ; met 0 sur PA set bE,CopyPB outpb CopyPB ; met E … 1 ldi PA,00000010B ; ‚crit la donn‚e sur PA res bE,CopyPB outpb CopyPB ; valide la donn‚e (latch) ; call TempoLcd ; tempo 5 ms ldi a,00101000B call Ecr_Inst ; mode 4 bits, ligne du bas call TempoLcd ; tempo 5 ms ldi a,00101000B call Ecr_Inst ; mode 4 bits, ligne du bas ; call TempoLcd ldi a,00001111B ; Lcd ON, curseur ON, clign. ON call Ecr_Inst ; call TempoLcd ldi a,00000110B call Ecr_Inst ; maniŠre de visu des caractŠres ; call TempoLcd ldi a,00010100B call Ecr_Inst ; d‚calage (curseur --> droite) ; call TempoLcd ldi a,HOME call Ecr_Inst ; afficheur en position Home (0,0) ; ; cr‚ation de nouveaux caractŠres (symboles) ; call TempoLcd ldi a,01000000B ; adresse caract. Nø0 en CG RAM call Ecr_Inst ldi v,8*6 ; compteur pour 6 caractŠres ldi x,Tab_Car.d ; init. du pointeur de tableau ; DefCar ld a,(x) ; lecture de la donn‚e point‚e call Aff_Car ; ‚crit la donn‚e en CG RAM inc x ; incr‚mente le pointeur dec v ; d‚cr‚mente le compteur jrnz DefCar ; toutes les donn‚es ‚crites ? ; call TempoLcd ldi a,CLS call Ecr_Inst ; efface l'afficheur ; call TempoLcd ldi a,00001100B ; LCD ON, curseur OFF, cligno. OFF call Ecr_Inst ret ;**************************************************************************** ;* AFFICHAGE D'UN CARACTERE SUR LE LCD * ;* ----------------------------------- * ;* Entr‚e : caractŠre … afficher dans A * ;* Sortie : * * ;* Modifie : * * ;**************************************************************************** Aff_Car call TempoLcd ; attend afficheur prˆt call Ecr_Data ; ‚crit la donn‚e sur l'afficheur ret ;**************************************************************************** ;* POSITIONNE LE CURSEUR DU LCD * ;* ---------------------------- * ;* Entr‚e : position du curseur dans Cur_Pos * ;* Sortie : * * ;* Modifie : A * ;**************************************************************************** SetCur ld a,Cur_Pos set 7,a ; met le bit 7 … 1 (cf. doc LCD) call TempoLcd ; attend afficheur prˆt call Ecr_Inst ; transmet la donn‚e … l'afficheur ret ;**************************************************************************** ;* EFFACE L'AFFICHEUR LCD * ;* ---------------------- * ;* Entr‚e : * * ;* Sortie : * * ;* Modifie : A * ;**************************************************************************** Cls_Lcd ldi a,CLS call TempoLcd call Ecr_Inst ; efface l'afficheur ret ;**************************************************************************** ;* MET LE CURSEUR EN POSITION HOME * ;* ------------------------------- * ;* Entr‚e : * * ;* Sortie : * * ;* Modifie : A * ;**************************************************************************** Home_Lcd ldi a,HOME call TempoLcd call Ecr_Inst ; met le curseur en (0,0) ret ;**************************************************************************** ;* AFFICHAGE D'UN MESSAGE SUR LE LCD * ;* --------------------------------- * ;* Entr‚e : adresse du message dans X * ;* Sortie : * * ;* Modifie : A,V,X,Cur_Pos * ;**************************************************************************** ; le message se termine par le caractŠre NULL (0) ! ; Aff_Mess ldi v,8 ; init. compteur de caractŠres ld a,(x) ; lecture caractŠre point‚ Aff_M1 call TempoLcd call Ecr_Data ; affiche le caractŠre dec v jrnz LitCar ; 8 caractŠres affich‚s ? ldi Cur_Pos,40H ; oui : call SetCur ; positionne le curseur (sp‚. LM16155) ; LitCar inc x ; incr‚mente le pointeur ld a,(x) ; lit la donn‚e point‚e jrz FinAffMe ; fin de message ? jp Aff_M1 ; non : continue FinAffMe ret ;**************************************************************************** ;* ECRITURE D'UNE DONNEE OU D'UNE INSTRUCTION SUR LE LCD * ;* ----------------------------------------------------- * ;* Entr‚e : la donn‚e ou l'instruction dans A * ;* Sortie : * * ;* Modifie : A,W,Buf,CopyPB,Sauv_a * ;**************************************************************************** Ecr_Data ldi wdr,CHIEN ld Sauv_a,a ; sauve la donn‚e set bRS,CopyPB outpb CopyPB ; s‚lectionne reg. de donn‚es ; ; traitement du MSB de la donn‚e ; ld a,Sauv_a Ecr_Inst ld Buf,a ; sauve la valeur d'origine swap_a ; interverti quartets andi a,00001111B ; masque le MSB ld Sauv_a,a ; sauve l'accu ldi PA,0 set bE,CopyPB outpb CopyPB ; ligne E … 1 ld a,Sauv_a ; restitue l'accu ld PA,a ; ‚crit la donn‚e MSB res bE,CopyPB outpb CopyPB ; ...et la valide (E = 0) ; ; traitement du LSB de la donn‚e ; ld a,Buf ; restitue la donn‚e d'origine andi a,00001111B ; masque le MSB ld Sauv_a,a ; sauve l'accu set bE,CopyPB outpb CopyPB ld a,Sauv_a ld PA,a ; ‚crit la donn‚e LSB res bE,CopyPB outpb CopyPB ; ...et la valide ; res bRS,CopyPB outpb CopyPB ; par d‚faut : s‚lection reg. instruc. ret ;**************************************************************************** ;* TEMPORISATION 5 ms POUR LE LCD * ;* ------------------------------ * ;* Entr‚e : * * ;* Sortie : * * ;* Modifie : Cpt1,Cpt2,WDR * ;**************************************************************************** ; þ Tempo calcul‚e avec un quartz de 8 MHz ! ; TempoLcd ldi Cpt2,2 ; d‚compteur 2 (2 * 2,5 ms) Dcpt2 ldi Cpt1,0 ; d‚compteur 1 (256 * (6,5+3,25)æs) Dcpt1 dec Cpt1 ; d‚cr‚mente le compteur jrnz Dcpt1 ; compteur1 = 0 ? (t ÷ 2,5 ms) ldi wdr,CHIEN ; recharge le watch dog dec Cpt2 ; oui : d‚cr‚mente le compteur 2 jrnz Dcpt2 ; compteur2 = 0 ? (t ÷ 5 ms) ret ;**************************************************************************** ;* TEMPORISATION 640 MS * ;* -------------------- * ;* Entr‚e : * * ;* Sortie : * * ;* Modifie : Cpt1,Cpt2,WDR * ;**************************************************************************** ; þ Tempo calcul‚e avec un quartz de 8 MHz ! ; Tempo ldi Cpt2,0 ; d‚compteur 2 (256 * 2,5 ms) Dcpt20 ldi Cpt1,0 ; d‚compteur 1 (256 * (6,5+3,25)æs) Dcpt10 dec Cpt1 ; d‚cr‚mente le compteur jrnz Dcpt10 ; compteur1 = 0 ? (t ÷ 2,5 ms) ldi wdr,CHIEN ; recharge le watch dog dec Cpt2 ; oui : d‚cr‚mente le compteur 2 jrnz Dcpt20 ; compteur2 = 0 ? (t ÷ 640 ms) ret ;**************************************************************************** ;* TEMPORISATION DE 4 S * ;* -------------------- * ;* Entr‚e : * * ;* Sortie : * * ;* Modifie : V * ;**************************************************************************** ; þ Tempo calcul‚e avec un quartz de 8 MHz ! ; Tempo4s ldi v,6 ; 6 * 640 ms = 3,84 s Tmp40 call Tempo dec v jrnz Tmp40 ; 6 * 640 ms ? ret ;**************************************************************************** ;* ROUTINE D'INTERRUPTION DU TIMER * ;* ------------------------------- * ;* Entr‚e : * * ;* Sortie : Mesures,Mespos * ;* Modifie : SauvAcc,WDR,TSCR,Y,ADCR,Nbint,Mesures,Table,Mespos * ;**************************************************************************** ; la fr‚quence d'interruption est de 700 Hz (4 * 175 Hz) ; IntTimer res bTMZ,tscr ; RAZ du bit TMZ ldi wdr,CHIEN ; on jette un os au chien de garde ld SauvAcc,a ; sauvegarde accu set bSEC,orb ; conf. PB.7 en entr‚e analogique set bSEC,CopyPB outpb CopyPB ldi a,PRECHARG-2 ; ‚tat actuel timer; on en tient compte add a,tcr ; pour le relancement du timer de sorte ; que la fr‚quence soit constante. ld tcr,a ; Le -2 inclut le temps de calcul ld a,adr ; acquisition de la tension d'entr‚e ldi adcr,030H ; lancement conversion suivante add a,(y) ; accumulation en table ld (y),a inc y jrnc Tim1 ; report de la retenue ‚ventuelle. inc (y) ; Tim1 inc y ; on pointe sur prochain mot en table ld a,y cpi a,Fintabl ; arrive … la fin ? jrc Tim2 ldi y,Table ; oui : on retourne au d‚but ; Tim2 inc Nbint ; nb de mesures faites ld a,Nbint cpi a,QUARTDEP jrnc Tim2a ; fin du cycle ? ld a,SauvAcc ; oui : restauration accu reti ; plus rien … faire ; Tim2a clr Nbint inc Mesures ; oui : un de plus jrnz Tim3 inc Mesures+1 ; Tim3 ld a,Table ; valeur de rang 0 sub a,Table+4 ; - valeur de rang 2 ld Table,a ; dans valeur de rang 0 jrnc Tim4 inc Table+5 ; si retenue, inc. valeur de rang 2 Tim4 ld a,Table+1 sub a,Table+5 ld Table+1,a jrr 7,a,Tim6 ; si diff‚rence n‚g., inverse le signe ld a,Table com a inc a ld Table,a jrnz Tim5 dec Table+5 ; si retenue ; Tim5 ld a,Table+1 com a ld Table+1,a Tim6 ld a,Table+2 ; valeur de rang 1 sub a,Table+6 ; - valeur de rang 3 ld Table+2,a ; dans valeur de rang 1 jrnc Tim7 inc Table+7 ; si retenue, inc. valeur de rang 2 Tim7 ld a,Table+3 sub a,Table+7 ld Table+3,a jrr 7,a,Tim9 ; si diff‚rence n‚g., inverse le signe ld a,Table+2 com a inc a ld Table+2,a jrnz Tim8 dec Table+7 ; si retenue ; Tim8 ld a,Table+3 com a ld Table+3,a Tim9 ld a,Table ; addition des deux valeurs absolues add a,Table+2 ld Table,a jrnc Tim10 inc Table+1 ; Tim10 ld a,Table+1 add a,Table+3 ld Table+1,a ld a,Table+1 jrnz Mesurbon ; si <>0, le cumul est > 255 : ok ; ld a,Table cpi a,SEUIL jrnc Mesurbon jp IntTim2 ; Mesurbon inc Mespos ; oui : une mesure positive de plus IntTim2 clr Table ; r‚initialisation du tableau clr Table+1 clr Table+2 clr Table+3 clr Table+4 clr Table+5 clr Table+6 clr Table+7 ; FinTim ld a,SauvAcc ; restauration accu reti ; fin de l'interruption. ;**************************************************************************** ;* ROUTINE D'INTERRUPTION DU CONVERTISSEUR A/N * ;* ------------------------------------------- * ;* Entr‚e : * * ;* Sortie : * * ;* Modifie : ADCR * ;**************************************************************************** IntADC ldi adcr,10010000B reti ;############################################################################ ;**************************************************************************** ;** PROGRAMME PRINCIPAL EN VERSION HEURES CREUSES (TEST) ** ;**************************************************************************** Ver_Hc ldi tscr,01111010B ; horloge vient du quartz, 1/4 de 8 MHz ; ;-------------------------------------------------------------- ; DECODAGE DE LA TRAME PULSADIS ;-------------------------------------------------------------- ; 1. Recherche de l'impulsion de d‚part : ; _Princip ld a,Mesures _AttInt cp a,Mesures ; on attend l'incr‚mentation jrnz _ReDep jp _AttInt ; _ReDep clr Mespos clr Mesures clr Mesures+1 ld a,Mesures _Depart cp a,Mesures ; on attend l'incr‚mentation jrnz _Dep1 jp _Depart ; _Dep1 ld a,Mesures cp a,Mespos ; toutes les mesures sont positives ? jrz _Dep2 jp _ReDep ; non : on attend ; _Dep2 cpi a,TOPDEP ; nombre pr‚vu d'imp. [+] successives ? jrz _Dep3 jp _Depart ; non ; ; 2. Test de pr‚sence de la premiŠre impulsion attendue : ; _Dep3 ldi v,FENETR10/256 ldi w,FENETR10%256 call TestImp ; imp. pr‚sente au temps indiqu‚ ? ld Imp1,a ; r‚sultat du test ; ; 3. Test de pr‚sence de la deuxiŠme impulsion attendue : ; ldi v,FENETR20/256 ldi w,FENETR20%256 call TestImp ; test si impulsion pr‚sente ld Imp2,a ; r‚sultat du test ; ldi v,FINTRAM/256 ldi w,FINTRAM%256 call TestImp ; pour attendre derniŠre impulsion ; ; 4. Utilisation des signaux re‡us : ; call Exploite ; d‚termination ‚tat ; ; affichage de l'‚tat ; call Cls_Lcd ; efface l'afficheur ldi Cur_Pos,02H call SetCur ; curseur en 02H ; inc Puls ; chgt ‚tat du t‚moin jrr 0,Puls,_Temoin0 ; indique d‚tection d'une trame ldi a,'.' ; alterne le symbole suivant jp _Temoin1 ; la parit‚ de Puls _Temoin0 ldi a,' ' _Temoin1 call Aff_Car ; affiche '.' ou ' ' ld a,Symb call Aff_Car ; affiche symbole ; ldi Cur_Pos,40H call SetCur ; curseur en 40H ldi x,M_Cpt.d call Aff_Mess ; affiche 'EJP : ' ld a,jEJP call AffOctet ; affiche compteur EJP courant ; jp _Princip ; attente trame suivante. ;**************************************************************************** ;* VECTEURS D'INTERRUPTIONS ET DE DEMARRAGE * ;**************************************************************************** .ORG 0FF0H Adc jp IntADC ; convertisseur A/N ; Timer jp IntTimer ; timer ; IntPBC nop ; port B (N.U.) reti ; IntPA nop ; port A (N.U.) reti .ORG 0FFCH Nmi nop ; interruption Non Masquable (N.U) reti ; Res jp Reset ; vecteur reset .END