;===================================================================== ; vide6.ASM - DIGIPRESS 96 - REGULATEUR DE POMPE A VIDE ;===================================================================== ;auteur: Silicium 628. ;premiere version : 02-05-1996. ;pour ST6210 (le 20 pattes 2K ROM) ;attention: espace mémoire ROM différent sur ST62T20 ;affichage sur AFFICHEUR LCD 16 caractères ;ATTENTION Qx = 3,2768 Mhz ;MODIF: 20-03-97 Silicium 628: (suppression de la fonction METEO) ;MODIF: 21-05-97 Silicium 628: (Hystérésis = 1 au lieu de 2) ;MODIF: 26-05-97 Silicium 628: Qx = 3,2768 Mhz au lieu de 4,000 Mhz ;si vous faites des modifs perso, S.V.P. indiquez les ci-dessus. merci. ;D'autre part je vous encourage à developper pour les PIC16F84 comme ;je le fais dorénavant moi-même... ;c'est le jour et la nuit comparé au ST6 ! Fred. ;--------------------------------------------------------------------- ;Directives d'assemblage .title "VIDE6" .vers "st6210" .romsize 4 .input "6215_reg.asm" .w_on ;Constantes os .equ 0FEh duree .equ 24 ;24 heures au départ ;adresses registres ;Les données en RAM commencent à l'adresse 84h (=132). voir p:15 ;FIN à BFh (=191) soit 60 octets. ; de 80h à 84h, ce sont les registres X, Y, V, W BB .def 84h ;pour opérations en bit unique sur port B AA .def 85h ;sauvegarde de A VV .def 86h rom .def 87h ;copie du drwr voir p:64 Aff1 .def 88h ;copie mémoire d'un digit Aff2 .def 89h Aff3 .def 8Ah Aff4 .def 8Bh delai1 .def 8Ch delai2 .def 8Dh memo0 .def 8Eh memo1 .def 8Fh memo2 .def 90h memo3 .def 91h valbin0 .def 92h valbin1 .def 93h unit .def 94h cent .def 95h compte .def 96h tm .def 97h ;pour mesure temps moteur mode .def 98h tare .def 99h depress .def 9Ah consign .def 9Bh caract .def 9Ch ;caractere a afficher nombre .def 9Dh data .def 9Eh ;data vers afficheur LCD decal .def 9Fh ;decallage adresses en ROM bitn .def 0A0h digit .def 0A1h decal_m .def 0A2h negatif .def 0A3h ;pour afficher signe (-) consi_m .def 0A4h tarvrai .def 0A5h ;valeur tare sans non corrigée div67 .def 0A6h heures .def 0A7h minutes .def 0A8h secondes .def 0A9h tot .def 0AAh ;pour totaliser temps moteur h_m .def 0ABh ;pour totaliser temps moteur mn_m .def 0ACh ;pour totaliser temps moteur s_m .def 0ADh ;pour totaliser temps moteur top .def 0AEh ;memorise le plus grand 'tm' on .def 0AFh ;on=0 -> arret on=1 ->marche ;------------------------------------------------------------------ .org 880h ;espace memoire pour ST6210 p:14 ;(adresse en ROM !) ;=================================== ;ATTENTION ORG=080h POUR LE ST62T20 ;=================================== string1 .ascii " PRESSION: " ;0 .ascii "DEPRESSION: " ;12 .ascii " CONSIGNE: " ;24 .ascii " PB TARAGE! " ;36 .ascii " FUITE !!! " ;48 .ascii "----" ;pour éviter brisure de page à 64 .ascii " " ;64 .ascii " BONJOUR ! " ;76 .ascii "Surpression!" ;88 .ascii "Reste " ;100 .ascii " -- FIN -- " ;112 .ascii "----" ;pour éviter brisure de page à 128 .ascii "Taux Fuite: " ;128 .ascii "T.Mot " ;140 .ascii "DIGIPRESS 96" ;152 .ascii "Tarage.... " ;164 .ascii "Ouvrir tube " ;176 .ascii "----" ;pour éviter brisure de page à 192 string2 .ascii "0123456789" ;================================================================= ; RAPPEL ;000 E + R ;001 E ;010 E + R + int ;011 E (PA0-3) ; E analogique (autres; 1 seule à la fois !) ;10x S drain ouvert 10mA (PA0-3) ; drain ouvert 5mA (autres) ;11x S sym ;================================================================= reset ldi wdr,os ;chargt chien de garde ldi ddra,11111111b ldi ora, 11111111b ldi dra, 00001111b ldi ddrb,00001111b ldi orb, 10001111b ;entrée PB7 analog ldi BB, 11000000b ld A,BB ld drb,A clr ddrc clr orc clr drc ldi ior, 00000000b ;interruptions interdites p:98 ldi tscr,01011100b ;quartz/16 p:99 ldi tcr,10 ldi div67,67 ldi secondes,60 ldi minutes,60 ldi heures,duree clr valbin0 clr valbin1 ldi mode,1 ldi compte,0 ldi tare,90 ;par défaut clr tm ldi tot,3 ldi h_m,1 ldi mn_m,1 ldi s_m,1 clr top clr on clr negatif clr A ;efface le bit de retenue reti ;retour au mode normal p:99 ;*********************************************************************** ;Corps du programme principal debut ldi ior,00010000b ;interruptions autorisées p:89; 98 ldi adcr,00010000b ;CAN ACTIF p:50 call tempo10 ;RAZ LCD call dspclr call home call fset call setmode call dsp10 ;message de bienvenue call vert ;allume LED verte ldi decal,152 ;DIGIPRESS 96 call affitxt call tempo1s ldi decal,76 ;bonjour call affitxt call tempo1s call lirecns ;lit pot. de consigne 1ere fois boucle ldi wdr,os call tarbute ;évite valeur abérante si mega parasite ! ld A,heures cpi A,duree jrc suite11 ldi heures,duree ;évite nb d'heures > 10 suite11 ld A,consign ld consi_m,A call lirecns ;lit pot. de consigne sub A,consi_m cpi A,2 jrc suite12 ;saut si consign inchangé (diff <2 ) cpi A,253 jrnc suite12 ;saut si consign inchangé (diff > 253 ) ld A,mode cpi A,9 jrz suite12 ;saut si FUITE. (Maintient mode alarme) ldi mode,2 ;on a touché au potentiomètre ;touche MODE (verte) ----------------------------- suite12 jrs 4,drb,suite20 ;saut si touche non détectée clr tm ;stop ALERTE éventuelle res 3,BB ;stop BUZZER ld A,BB ld drb,A inc mode ld A,mode cpi A,7 ;mode = 1..6 jrc att1 ldi mode,1 att1 ldi wdr,os call tempo10 call modes jrr 4,drb,att1 ;attend relachement touche ;touche JAUNE ------------------------------------------------------- suite20 jrs 5,drb,suite30 ;saut si touche non détectée clr tm ;stop ALERTE éventuelle ld A,mode cpi A,1 ;en mode DEPRESSION jrnz suite22 call arret call rouge call tarage jp att2 suite22 ld A,mode cpi A,4 jrnz suite25 call decTps ;en mode chrono jp att2 suite25 ld A,mode cpi A,5 ;en mode Taux de fuite jrnz suite27 clr top jp att2 suite27 nop ;si autres modes att2 ldi wdr,os call tempo10 jrr 5,drb,att2 ;attend relachement touche ;------------------------------------------------------------------- suite30 call lireprs ;lit pression sur MPX100 call pompe ;asservissement moteur ld A,on jrnz suite31 ;saut si le moteur tourne jp suite40 ;saut si moteur à l'arret suite31 dec tot jrnz suite32 ldi tot,3 call inc_tpm suite32 inc tm ;mesure rapport cyclique de marche ld A,tm cp A,top jrc suite34 ;saut si tm < top ld top,A ;si tm > top on fait: top:=tm ld A,tm suite34 cpi A,100 jrc suite40 ldi mode,9 ;ALERTE BUZZER: tps de pompage trop long clr top suite40 call modes call mult call affnb suite50 ld A,mode cpi A,4 jrnc suite55 ;pour ne pas afficher 0000 si mode > 3 call affi4 suite55 inc compte ld A,compte cpi A,250 jrnz suite60 clr tm ;pour mesurer le temps de marche clr compte suite60 jp boucle ;********************************************************************** ;début des procédures ;********************************************************************** ;========== traitement modes ================== ;----- dépression ----------------------------- modes nop ;os ? mode1 ld A,mode cpi A,1 jrz md11 jp mode2 md11 ldi decal,12 ld A,negatif jrz md12 ldi decal,88 md12 call affitxt call vert ld A,depress ret ;------ consigne ------------------------------- mode2 ld A,mode cpi A,2 jrz md21 jp mode3 md21 ldi decal,24 call affitxt call vert ld A,consign ret ;----- pression absolue ------------------------- ;pres abs =10 (101 - depress + 90 - tare) = 10 ( 191 -depress - tare) mode3 ld A,mode cpi A,3 jrnz mode4 ldi decal,0 call affitxt call vert ldi A,191 sub A,tare sub A,depress ret ;---------- chrono ---------------- mode4 ld A,mode cpi A,4 jrnz mode5 ldi decal,100 call affitxt call vert call affitps ret ;- taux de fuite ------------------ mode5 ld A,mode cpi A,5 jrnz mode6 ldi decal,128 call affitxt call vert call tempo10 call affitf ret ;- T. moteur total -------------------------------- mode6 ld A,mode cpi A,6 jrnz mode7 ldi decal,140 call affitxt call vert call affitpm ret ;------ PB DE TARAGE ------------------------------ mode7 ld A,mode cpi A,7 jrz mode7_1 jp mode8 mode7_1 ldi decal,36 call affitxt call rouge ld A,tarvrai ret ;------ FIN ------------------------------ mode8 ldi wdr,os ;parce que c'est une boucle ld A,mode cpi A,8 jrz mode8_1 jp mode9 mode8_1 ldi decal,112 call affitxt call rouge res 2,BB ;stop moteur ld A,BB ld drb,A ldi A,0 ;pour afficher 0000 call mult call affnb call affi4 jp mode8 ;BOUCLE ld A,tarvrai ret ;------- FUITE: ALARME BUZZER ---------------------- mode9 ld A,mode cpi A,9 jrz mode9_1 jp mode10 mode9_1 ldi decal,48 call affitxt call rouge set 3,BB ld A,BB ld drb,A ;commande du buzzer ld A,depress ret mode10 ldi mode,1 ;au cas ou mode > 9... ret ;====fin des modes ================================== ;------------------------------------------------------------------------ vert res 0,BB ;éteint led rouge set 1,BB ;allume led verte ld A,BB ld drb,A ret ;------------------------------------------------------------------------ rouge res 1,BB ;éteint led verte set 0,BB ;allume led rouge ld A,BB ld drb,A ret ;------------------------------------------------------------------------ ;conversion analogique -> binaire (résultat -> A) ;256 acquisitions cumulées dans valbin0 et valbin1 ;cumul div 256 -> A ;cette technique permet d'obtenir une valeur stable (instabilité du CAN...) lireprs ldi orb, 10001111b ;entrée PB7 analog ldi V,255 clr valbin0 clr valbin1 clr negatif anl1 set 5,adcr ;depart acquisition p:50 et 111 attente ldi wdr,os jrr 6,adcr,attente ;attend fin acqui res 5,adcr ;pret pour acqui suivante ld A,adr ;cumul resultat -> A sub A,tare ;offset. soit 1,76 V pour 1013mb -> affi 0 cpi A,250 jrc anl2 ldi A,0 ;zone de neutre anl2 cpi A,200 jrc anl3 ldi negatif,1 ;SURPRESSION ! com A ;A:=255-A anl3 ld W,A ld A,valbin0 add A,W ld valbin0,A ldi A,0 ;A=0 rlc A ;A=retenue1 add A,valbin1 ld valbin1,A dec V jrz finAnl jp anl1 finAnl ld A,valbin1 ;revient à diviser par 256 ret ;---------------------------------------------------------------------- ;lecture pot. de consigne ;conversion analogique -> binaire (résultat -> A) ;256 acquisitions cumulées dans valbin0 et valbin1 ;sortie div 256 -> A lirecns ldi orb, 01001111b ;entrée PB6 analog ldi V,255 clr valbin0 clr valbin1 cns1 set 5,adcr ;depart acquisition p:50 et 111 att3 ldi wdr,os jrr 6,adcr,att3 ;attend fin acqui res 5,adcr ;pret pour acqui suivante ld A,adr ;cumul resultat -> A cns2 ld W,A ld A,valbin0 add A,W ld valbin0,A ldi A,0 ;A=0 rlc A ;A=retenue1 add A,valbin1 ld valbin1,A dec V jrz fincns jp cns1 fincns ld A,valbin1 ;revient à diviser par 256 call div2A ;0..255 -> 0..128 (=0..-1280 mb max) ;(en fait -1 atm max bien sur !) butee cpi A,3 jrnc butee1 ldi A,3 ;-30 mb mini butee1 cpi A,80 jrc butee2 ldi A,80 ;-800 mb maxi butee2 ld consign,A ret ;---------------------------------------------------------------------- ;décrémente la durée totale 30 mn par 30 mn decTps ld A,minutes cpi A,32 jrc dec_h1 ;saut si minutes < 32 min30 ldi minutes,31 ;affichera 31-1 = 30 ret dec_h1 ld A,heures cpi A,2 jrc dec11 ;saut si heures < 2 jp dec_h2 ;saut si heures >= 2 (affichée >= 1 ) dec11 ld A,minutes cpi A,1 jrnz dec12 jp plein ;saut si h < 2 et mn = 1 (affi 0) dec12 ldi heures,1 ;affi 0 ldi minutes,1 ;affi 0 ldi secondes,60 ;affi 59 ret dec_h2 ld A,minutes cpi A,2 jrc dec_h3 ;saut si minutes < 2 (mn =1 ou mn =0 ) ldi minutes,1 ;si mn >=2 ldi secondes,60 ret dec_h3 dec heures ldi minutes,31 ret plein ldi secondes,60 ;le plein SVP, vérifiez la pression des pneus ldi minutes,60 ldi heures,duree ret ;---------------------------------------------------------------------- ;tare sera = 90 environ pour 1,76 V sur entrée A/D ;c.a.d pour 1013 mb si l'ampli est bien réglé ;si la pression athmospérique est < 1013 mb, tare sera > 90 ;si la pression athmospérique est > 1013 mb, tare sera < 90 tarage ldi decal,164 ;"Tarage..." call affitxt call tempo1s call tempo1s ldi decal,176 ;"Ouvrir tube" call affitxt ldi A,68 call ddras ;adresse 68 (position 1er chiffre) ldi caract,' ' ;(efface nbr déja affiché) call ecrire ldi caract,' ' call ecrire ldi caract,' ' call ecrire ldi caract,' ' ;espace (efface nbr déja affiché) call ecrire ldi V,40 boucle2 ldi A,68 call ddras ;adresse 68 (position 1er chiffre) ldi caract,'|' call ecrire call tp100ms ldi A,68 call ddras ;adresse 68 (position 1er chiffre) ldi caract,'/' call ecrire call tp100ms ldi A,68 call ddras ;adresse 68 (position 1er chiffre) ldi caract,'-' call ecrire call tp100ms ldi A,68 call ddras ;adresse 68 (position 1er chiffre) ldi caract,96 ;` call ecrire call tp100ms dec V jrz suite80 jp boucle2 suite80 ldi tare,0 ;important call lireprs ld tare,A ld tarvrai,A call tarbute inc A ;affi zéro garanti ld tare,A ldi mode,1 ret ;---------------------------------------------------------------------- tarbute ld A,tare cpi A,95 jrc tb1 ;saut si A < 95 ldi tare,90 ;par défaut ldi mode,7 ;pb de tarage ret tb1 cpi A,85 jrnc tb2 ;saut si A > 85 ldi tare,90 ldi mode,7 ;pb de tarage tb2 ret ;----------------------------------------------------------------------- ;Incrémente temps moteur inc_tpm inc s_m ld A,s_m cpi A,61 jrc fininc ldi s_m,1 inc mn_m ld A,mn_m cpi A,61 jrc fininc ldi mn_m,1 inc h_m fininc ret ;----------------------------------------------------------------------- ;sortie pompe pompe ld depress,A ld A,consign cp A,depress jrc arret ;si consign < depress ld A,consign subi A,1 ;hystérésis cp A,depress jrnc marche ;si consign-hystérésis > depress ret arret res 2,BB ld A,BB ld drb,A call tempo10 ldi on,0 ret marche set 2,BB ld A,BB ld drb,A ldi on,1 ret ;------------------------------------------------------------------------ ;multiplie la valeur de A range dans valbin0 et valbin1 mult ldi V,10 ;facteur de x ld memo3,A clr valbin0 clr valbin1 nf nop ;ldi wdr,os ld A,valbin0 add A,memo3 ;retenue possible par débordement ld valbin0,A ldi A,0 ;A=0 rlc A ;A=retenue1 add A,valbin1 ld valbin1,A dec V jrz sortie0 jp nf sortie0 ret ;------------------------------------------------------------------------- ;TEMPO 1ms (avec Qx=3.2768 MHz) ;n'utilise pas le TIMER, et ne modifie pas les registres ;cette tempo est OK. mesuree le 30-1-95 tp1ms ldi delai1,18 tp1m2 ldi wdr,os ;4 chargt chien de garde dec delai1 ;4 jrz fin1ms ;2 jp tp1m2 ;4 fin1ms ret ;3.2768 MHz/13 /(18 x 14 ) = 1000.2442 Hz ;------------------------------------------------------------------------- ;TEMPO 10ms (avec Qx=3.2768 MHz) ;n'utilise pas le TIMER, et ne modifie pas les registres ;cette tempo est OK. mesuree le 30-1-95 tempo10 ldi delai1,180 bcl2 ldi wdr,os ;4 chargt chien de garde dec delai1 ;4 jrz suiteTP ;2 jp bcl2 ;4 suiteTP ret ;3.2768 MHz/13 /(180 x 14 ) = 100,02442 Hz ;------------------------------------------------------------------------- ;TEMPO 100ms (avec Qx=3.2768 MHz) ;n'utilise pas le TIMER, et ne modifie pas les registres ;évite de faire un call supplémentaire tp100ms ldi delai2,10 ldi delai1,180 tp1 ldi wdr,os ;4 chargt chien de garde dec delai1 ;4 jrz tp2 ;2 jp tp1 ;4 tp2 dec delai2 jrz fintp jp tp1 fintp ret ;------------------------------------------------------------------------- ;TEMPO 1/2 s (avec Qx=3.2768 MHz) ;n'utilise pas le TIMER, et ne modifie pas les registres ;évite de faire un call supplémentaire tempo1s ldi delai2,50 ldi delai1,180 bcl1s1 ldi wdr,os ;4 chargt chien de garde dec delai1 ;4 jrz bcl1s2 ;2 jp bcl1s1 ;4 bcl1s2 dec delai2 jrz fin1s jp bcl1s1 fin1s ret ;------------------------------------------------------------------------ ;début des procédures d'affichage LCD ;---------------------------------------------------------------------- ;FUNCTION SET ;utilisation de res et de set sur dra permises because port entier en sortie fset res 2,dra ;E=0 res 3,dra ;R/S=0 ldi data,32+16+8 call dataout ;transmission série vers 4015 -> DATA // LCD call impuls ret ;---------------------------------------------------------------------- ;DISPLAY CLEAR dspclr res 2,dra ;E=0 res 3,dra ;R/S=0 ldi data,1 call dataout call impuls ret ;---------------------------------------------------------------------- ;RETURN HOME home ldi dra,0 ldi data,2 call dataout call impuls ret ;---------------------------------------------------------------------- ;ENTRY MODE SET setmode res 2,dra ;E=0 res 3,dra ;R/S=0 ldi data,4+2 ;sens inverse si 4+0 call dataout call impuls ret ;---------------------------------------------------------------------- ;DISPLAY ON OFF dsp10 res 2,dra ;E=0 res 3,dra ;R/S=0 ldi data,8+4 call dataout call impuls ret ;---------------------------------------------------------------------- ;DDRAM ADRESS SET (A) ;A doit contenir l'adresse (position d'affichage. voir doc) ddras res 2,dra ;E=0 res 3,dra ;R/S=0 ldi data,128 add A,data ld data,A call dataout call impuls ret ;---------------------------------------------------------------------- ;ECRIRE ecrire nop ;ldi wdr,os res 2,dra ;E=0 set 3,dra ;R/S=1 ld A,caract ld data,A call dataout set 2,dra ;impuls E à 1 avec RS=1 call tempo10 res 2,dra ;fin impulsion call tp1ms ret ;---------------------------------------------------------------------- ;impulsion E à 1 avec RS=0 impuls res 3,dra ;R/S=0 set 2,dra ;impulsion E à 1 call tempo10 res 2,dra ;fin impulsion call tempo10 ret ;---------------------------------------------------------------------- ;SORTIE DATA (8 bits) en série sur PA0 vers CD4015. PA1=Clock 4015. ;ne pas utiliser V dans cett procédure ! dataout ldi bitn,8 ld A,data dtbcl sla A jrc dt1 res 0,dra ;bit = 0 jp out dt1 set 0,dra ;bit = 1 out set 1,dra ;clock 4015 res 1,dra ;fin clock dec bitn jrnz dtbcl ret ;------------------------------------------------------------------------- ;AFFICHAGE MESSAGE EN ROM ;l'afficheur est structuré en 2 'lignes' (situées cote à cote) affitxt nop ;ldi wdr,os ld A,decal cp A,decal_m jrnz suiteaf ;affichage uniquement si decal a changé ret suiteaf ld A,decal ld decal_m,A call home ldi rom,string1.W ld A,rom ;on fait une copie voir p:64 ld drwr,A ld A,decal ;decallage dans le tableau en ROM ;on va ajuster le nº de la page de 64 octets lus en ROM page cpi A,64 jrc suitepg ld V,A inc rom ld A,rom ld drwr,a ld A,V subi A,64 jp page suitepg ldi V,string1.D ;voir p:65 add A,V ld X,A ldi nombre,8 ;affi 8 caract ldi A,0 call ddras ;adresse 0 (à gauche de l'affichage) bcl70 ld A,(X) ;lit 1 caractère dans le tableau ld caract,A call ecrire inc X dec nombre jrnz bcl70 ldi nombre,4 ;affi 4 car suivants ldi A,64 call ddras ;adresse 64 (2eme partie de l'affichage) bcl80 ld A,(X) ;lit 1 caractère dans le tableau ld caract,A call ecrire inc X dec nombre jrnz bcl80 ret ;------------------------------------------------------------------------- ;AFFICHAGE 1 DIGIT (nombre) sur afficheur LCD ;digit doit contenir ce nombre affi nop ;ldi wdr,os ldi rom,string2.W ld A,rom ;on fait une copie voir p:64 ld drwr,A ld A,digit ;decall dans le tableau de chiffres en ROM ldi V,string2.D ;voir p:65 add A,V ld X,A ld A,(X) ;lit 1 caractère dans le tableau ld caract,A call ecrire ret ;------------------------------------------------------------------------- ;AFFICHAGE 4 DIGITS sur afficheur LCD affi4 nop ;ldi wdr,os ldi A,68 call ddras ;adresse 68 (position 1er chiffre) ld A,Aff4 ld digit,A call affi ld A,Aff3 ld digit,A call affi ;-------- affi2 ld A,Aff2 ld digit,A call affi ld A,Aff1 ld digit,A call affi ret ;----------------------------------------------------------------------- ;AFFICHAGE taux de fuite ;2 DIGITS et de % sur afficheur LCD ;seuls Aff2 et Aff1 sont pris en compte affitf ldi A,68 call ddras ;adresse 68 (position 1er chiffre) ldi caract,' ' ;espace (efface nbr déja affiché) call ecrire ld A,top call affi_A call affi2 ldi caract,'%' call ecrire ret ;----------------------------------------------------------------------- ;affichage nombre 0..9999 ;valbin0 et valbin1 contiennent un nb 0..9999 affnb ld A,valbin0 call cvBCU ;convertit valbin0 en BCD ld A,V ld unit,A ld A,W ld cent,A ;on va ajouter valbin1 x 256 ld A,valbin1 ld memo3,A ;pour ne pas toucher valbin1 inc memo3 ;hors boucle bcl1 dec memo3 jrnz ici1 jp suitef ici1 ld A,unit addi A,56 ;(+56) retenue decimale possible cpi A,100 jrc st1 subi A,100 inc cent ;ajout retenue decimale st1 ld unit,A ld A,cent addi A,2 ;(+200) soit en tout +256 ld cent,A jp bcl1 suitef call affdeci ret ;------------------------------------------------------------------------ ; A doit contenir un octet binaire 0..255 affi_A call cvBCU ;fractionne l'octet en deux: 0..2 et 0..99 ld A,V ld unit,A ld A,W ld cent,A call affdeci ret ;------------------------------------------------------------------------ ;nb decimaux dans unit et cent au préalable affdeci ld A,unit ;0..99 call cvBDU ld A,V ld Aff1,A ld A,W ld Aff2,A ld A,cent ;0..99 call cvBDU ld A,V ld Aff3,A ld A,W ld Aff4,A ret ;-------------------------------------------------------------------- ;AFFICHAGE temps: HEURES:MINUTES:SECONDES affitps ldi A,64 ;adresse 1er pos affi à droite call ddras ld A,heures dec A call cvBDU ld A,V ld VV,A ld A,W ld digit,A call affi ;attention: affi touche V ld A,VV ld digit,A call affi ldi caract,'h' call ecrire ld A,minutes dec A call cvBDU ld A,V ld VV,A ld A,W ld digit,A call affi ld A,VV ld digit,A call affi ldi caract,39 ;(') call ecrire ld A,secondes dec A call cvBDU ld A,V ld VV,A ld A,W ld digit,A call affi ld A,VV ld digit,A call affi ret ;-------------------------------------------------------------------- ;AFFICHAGE TEMPS MOTEUR: HEURES,MINUTES,SECONDES affitpm ldi A,64 ;adresse 1er pos affi à droite call ddras ld A,h_m dec A call cvBDU ld A,V ld VV,A ld A,W ld digit,A call affi ;attention: affi touche V ld A,VV ld digit,A call affi ldi caract,'h' call ecrire ld A,mn_m dec A call cvBDU ld A,V ld VV,A ld A,W ld digit,A call affi ld A,VV ld digit,A call affi ldi caract,39 ;(') call ecrire ld A,s_m dec A call cvBDU ld A,V ld VV,A ld A,W ld digit,A call affi ld A,VV ld digit,A call affi ret ;-------------------------------------------------------------------- ;CONVERSION BINAIRE (1 octet incomplet 0..99 et pas 0..255) --> BCD ;nombre à convertir dans A ;resultat dans W (dizaines) et dans V (unités) ;ex: A=28 -> W=2 et V=8 cvBDU ldi V,0 ldi W,0 conv2 cpi A,10 jrc conv3 ;saut si A<10 subi A,10 ;en boucle : revient à diviser A par 10 inc W jp conv2 ;9 passages au max si nb <= 99 conv3 ld V,A ;reste de la division ret ;-------------------------------------------------------------------- ;CONVERSION BINAIRE (1 octet complet 0..255) --> DECIMAL 2 octets (0..99) ;nombre à convertir dans A ;resultat dans W (centaines) et dans V (unités) ;ex A=236 -> W=2 et V=36 cvBCU ldi V,0 ldi W,0 cv2 cpi A,100 jrc cv3 ;saut si A<100 subi A,100 ;en boucle : revient à diviser A par 100 inc W jp cv2 ;2 passages au max puisque A<=255 cv3 ld V,A ;reste de la division ret ;------------------------------------------------------------------------ ;fait a div 2 --> A (equ à rrc A qui n'existe pas) div2A rlc A rlc A rlc A rlc A rlc A rlc A rlc A rlc A res 7,A ret ;----------------------------------------------------------------------- ;GESTION INT TIMER ;ATTENTION Qx = 3.2768 Mhz IntTimer nop ;ldi wdr,os ld AA,A res 7,tscr ;RAZ du bit du TMZ voir page 104 et p:90 ld A,heures jrnz decompte ;on sort si heures non initialisees jp finint decompte dec div67 ;67 tops ecoules ? jrz bip ;toutes les secondes jp finint ;non : fin interruption bip ldi div67,67 ;rechargement diviseur ;3.2768Mhz/12/16/255/67 = 0.9989s dec secondes ;1 mn = 60 s jrz topmn jp finint topmn ldi secondes,60 ;rechargement dec minutes jrz toph jp finint toph ldi minutes,60 dec heures jrnz finint eteint clr heures ldi mode,8 ;FIN finint ld A,AA ;fin d interruption reti ;-------------------------------------------------------------------- ;VECTEURS D'INTERRUPTION .org 0FF0h ;conv A/D p:88 nop reti .org 0FF2h ;TIMER jp IntTimer .org 0FF4h ;ports B et C nop reti .org 0FF6h ;port A nop reti .org 0FFCh nmi nop reti .org 0FFEh res jp reset