
;SATPOS.ASM
;POSITIONNEUR PARABOLE SATELLITE TV a PIC16C84 et affichage LCD retro-eclaire

;		PRINCIPE
;le tableau des valeurs de positions des satellites doit etre etabli suivant votre equipement
;principe : parabole motorisee par verin avec signal de retour sur ILS
;ce montage pilote le moteur, compte (et decompte ) les impulsions de l'ILS
;Le choix du satellite s'effectue avec un commutateur rotatif (1 circuit 12 positions).
;Ensuite le montage asservi la position en fonction de ce choix et des 
; valeurs memo dans le tableau
;voir ce tableau plus bas dans le code: "tableau des valeurs de positions des satellites"

;REGLAGE PREALABLE
;conserver la valeur 126 pour T2B 5.0 斡 (Telecom 2B)
;placer le commutateur sur la position T2B (l'affichage indique T2B)
;orienter en mode manuel (boutons < et >) la parabole sur T2B (controle sur image TV)
;RESET-ER le montage (mise a jour de la position courante a 126)
;en mode manuel, chercher les autres satellites, et noter les valeurs de positions obtenues
;sur l'affichage LCD
;vous n'avez plus qu'a mettre a jour le tableau (une fois pour toutes) et a recompiler le soft
;et a reprogrammer le PIC

;par la suite, le choix d'un satellite par le commutateur rotatif suivi d'un appui sur le
;bouton GOTO pointera la parabole sur le satellite.
;lorsque l'alim du montage est coupee, la position est retenue 
;- d'une part, par la monture de la parabole...
;- et d'autre part par la position du commutateur rotatif.
;il ne faut donc pas toucher au commutateur lorsque le montage est hors tension !
;en pour que tout se passe bien, il suffit que le commutateur rotatif soit positionne
;sur le bon satellite a la mise sous tension.

;dans le cas contraire, si la parabole est totalement desorientee, il suffit de:
;1- chercher un satellite manuellement (boutons < et >)
;2- positionner correctement le commutateur rotatif ( affichage du bon sat sur le LCD)
;3- RESETER


;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 possede 36 octets de RAM
;adresses OCh a 2Fh
;attention: le nb qui suit Ram0+... doit etre ecrit 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
memo1	equ	Ram0+10	;variable de travail
memo2	equ	Ram0+11	;variable de travail
memo3	equ	Ram0+12	;variable de travail
compte	equ	Ram0+133

pos1	equ	Ram0+14

val0	equ	Ram0+15	;position actuelle de l'antenne


moteur	equ	Ram0+16	;00=arret 01=droite 10=gauche 11=arret 1xx=rotation 0xx=arret
ils	equ	Ram0+17	;=0 ou 1 memo ILS	



        org     0       ;start address 0

        goto    start

;----------------------------------------------------------------------
;traitement interruption
;ici INT par RB0

	org	0004	;INT
	
	movwf	WW

	call	cptils
	call	tp2ms

	movf	WW,w

	bcf	INTCON,1
	retfie


;----------------------------------------------------------------------
;INITIALISATION DES PORTS
;----------------------------------------------------------------------
        org     0020


start		

restart	clrwdt

	movlw	B'00000000'	;0=sortie 1=entree (RA4=aussi RTCC) attention RA4 =drain ouvert
				;il faut donc cabler une R a VDD
	TRIS	PORTA		;config du port A (TRISA en page 1)
	movlw	B'00111101'
	TRIS	PORTB		;config du port B (RB0 aussi entree INT )

	bcf	PORTB,6		;sortie vers LM272 (pilote moteur)
	bcf	PORTB,7		;sortie vers LM272 (pilote moteur)
	clrf	moteur
;----------------------------------------------------------------------
;PROGRAMMATION DU REGISTRE OPTION
;VOIR page 144 et 143
;soit Timer0 = 1/128 -> PS2,1,0 = 111b  VOIR PAGE 135
;PSA (bit3) = 1 -> prediv affecte au chien de garde voir p:73
;RTE (bit4) = 0 -> inc sur front montant
;RTS (bit5) = 0 -> branche Timer0 sur horloge interne
;INTEDG=0   = INT sur front descendent de RB0	
;RBPU (bit7)=1 -> pas de R tirage a Vdd du port B (10k ext a GND sur PB2, et a VCC sur PB3,4,5)


;	   bits:  76543210
	movlw	B'10001111'
	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 a RB7 interdites.
;bit4 INTE=1 -> INT de RB0/INT autorisees.
;bit5 RTIE=0 -> INT par debordement Timer0 interdites.
;bit6 EEIE=0 -> INT EEPROM interdites
;bit7 GIE=1  ->INT GLOBALE autorisee.

	movlw	B'10010000'
	movwf	INTCON


;----------------------------------------------------------------------
;Initialisation des variables

	clrf	TMR0
	clrf	nb0
	clrf	nb1
	clrf	moteur

	movlw	.128	;valeur moyenne correspondant a T2B (5斡)
	movwf	val0

	bcf	PORTB,6
	bcf	PORTB,7


;-----------------------------------------------------------------------
;essai

;-----------------------------------------------------------------------
;RAZ LCD
	call dspclr
	call home
	call fset
	call setmod0
	call dsp10

	movlw	00h
	call	ddras

	movlw	.0	;offset "SatPos"
	call	texte1
	movlw	.2
	call	tx100ms

	movlw	00h
	call	ddras

	call dspclr	;efface LCD

	call	scr1	;lit le commutateur rotatif. resultat dans pos1
	call	affisat
	call	satpos	;retourne dans w, l'octet orientation du sat pointe par le commt rotatif
	movwf	val0	;initialise la variable de position courante avec cette valeur
	call	affipos


;----------------------------------------------------------------------
;BOUCLE PRINCIPALE
	

auto	clrwdt
	call	tp100ms

	btfss	PORTB,3	;bouton <
	goto	manuel	;passe en manuel ?
	btfss	PORTB,4	;bouton >
	goto	manuel	;passe en manuel ?

	movlw	00h
	call	ddras

	movf	pos1,w
	movwf	memo1
	call	scr1
	
	movf	memo1,w
	subwf	pos1,w		;ne touche pas pos1
	btfsc	STATUS,2	;bit z
	goto	auto2		;saute l'affichage si pos1 inchange

	call	affisat

auto2	btfsc	PORTB,5	;3eme bouton
	goto	auto	;boucle courte (sans pointer) tant que touche pas enfoncee

	call	pointer	;rotation de l'antenne si appui du 3eme bouton . c'est une boucle
	call	affipos	;lorsque pointage fini

	goto	auto


manuel	clrwdt

	call	testbtn
	call	cmdmotr
	call	affipos

	btfss	PORTB,5	;bouton M
	goto	auto	;passe en auto

	goto	manuel

       
;----------------------------------------------------------------------
;DEBUT DES PROCEDURES


;----------------------------------------------------------------------
;traitement des impultions ILS detectees par INT de RB0
cptils	btfsc	moteur,0
	goto	incils
	goto	decils	

incils	incf	val0,f
	goto	findec1

decils	decf	val0,f
	goto	findec1


findec1	return


;----------------------------------------------------------------------
;test appui boutons commande manuelle. pas de touche enfoncee = pas de changement du sens
;positionne 3 bits de la variable 'moteur'
testbtn	clrwdt
	bcf	moteur,2
	btfss	PORTB,3		;test touche <
	goto	sens1
	goto	test2

sens1	bcf	moteur,1	;sens
	bsf	moteur,0	;sens
	bsf	moteur,2	;marche
	goto	fin1

test2	btfss	PORTB,4		;test touche >
	goto	sens2
	goto	stop1		;pas de touche enfoncee

sens2	bcf	moteur,0
	bsf	moteur,1
	bsf	moteur,2	;marche
	goto	fin1
	
stop1	bcf	moteur,2	;bit arret/marche
fin1	return

;----------------------------------------------------------------------
;commande moteur
cmdmotr	clrwdt
	btfss	moteur,2	;test bit arret/marche
	goto	stop2	

	btfsc	moteur,0
	bsf	PORTB,6
	btfss	moteur,0
	bcf	PORTB,6

	btfsc	moteur,1
	bsf	PORTB,7
	btfss	moteur,1
	bcf	PORTB,7
	goto	fin2

stop2	bcf	PORTB,6		;stop le moteur
	bcf	PORTB,7
	return

fin2	return



;----------------------------------------------------------------------
;tableau des noms de satellites
;le texte doit obligatoirement finir par .0 pour sortir de la boucle
txt1	addwf   PCL,f                

        retlw   'S'	;0                  
	retlw   'a'           
        retlw   't'
        retlw   'P'
        retlw   'o'
        retlw   's'
	retlw	.0	;bsf w bit 7 -> fin

        retlw   'A'	;7             
	retlw   'S'                 
        retlw   'T' 
        retlw   'R' 
        retlw   'A' 
	retlw	.0	;bsf w bit 7 -> fin

 	retlw   'E'	;13            
	retlw   'U'                 
        retlw   'T' 
        retlw   '-' 
        retlw   'W' 
	retlw   '2' 
 	retlw	.0	;bsf w bit 7 -> fin

 	retlw   'H'	;20            
	retlw   'o'                 
        retlw   't'
	retlw   'B'
	retlw   'i'
	retlw   'r'
	retlw   'd' 
 	retlw	.0	;bsf w bit 7 -> fin

 	retlw   'E'	;28            
	retlw   'U'                 
        retlw   'T'
	retlw   '-'
	retlw   'W'
	retlw   '1' 
 	retlw	.0	;bsf w bit 7 -> fin

  	retlw   'I'	;35             
	retlw   '7'                 
        retlw   '0' 
        retlw   '7' 
 	retlw	.0	;bsf w bit 7 -> fin

	retlw   'T'	;40             
	retlw   '2'                 
        retlw   'B' 
 	retlw	.0	;bsf w bit 7 -> fin

	retlw   'T'	;44
	retlw   '2'
	retlw   'A' 
	retlw   '-'
	retlw   '2'
	retlw   'D' 
 	retlw	.0	;bsf w bit 7 -> fin

 	retlw   'H'	;51            
	retlw   'i'                 
        retlw   's' 
        retlw   'p' 
	retlw   'a'                 
        retlw   's' 
        retlw   'a'
        retlw   't'
 	retlw	.0	;bsf w bit 7 -> fin



;----------------------------------------------------------------------
;tableau des valeurs de positions des satellites
;taper les valeurs correspondant a votre equipement (monture + verin + ILS + site)
tabpos	addwf   PCL,f
	retlw	.196	; ASTRA		19.2 慟
	retlw	.189	; EUT-W2	16.0 慟
	retlw	.180	; HotBird	13.0 慟
	retlw	.170	; EUT-W1	10.0 慟
	retlw	.140	; I-707		 1.0 斡
	retlw	.126	; T2B		 5.0 斡
	retlw	.111	; T2A		 8.0 斡
	retlw	.35	; Hispasat	30.0 斡
	retlw	.128	; non utilise
	retlw	.128	; non utilise
	retlw	.128	; non utilise

;----------------------------------------------------------------------
;w doit contenir la position du commutateur rotatif [1..11]
satpos	movlw	.1
	subwf	pos1,w	;position (0..10) du commutateur rotatif de selection du sat
	call	tabpos	;retourne la valeur de l'octet de consigne de position dans w
	return

;----------------------------------------------------------------------
;decodage de la position du commutateur rotatif et
;affichage du nom du satellite en fontion de la variable pos1

affisat	movlw	00h	;affiche partie gauche du LCD
	call	ddras
	call dspclr	;efface LCD

	movlw	.1
	subwf	pos1,w		;ne touche pas pos1 ! result dans w
	btfss	STATUS,2	;bit z
	goto	sat2

;traitement sat1
	movlw	.7	;astra
	call	texte1
	goto	finafst

sat2	movlw	.2
	subwf	pos1,w
	btfss	STATUS,2
	goto	sat3

;traitement sat2
	movlw	.13	;EUT-W2
	call	texte1
	goto	finafst

sat3	movlw	.3
	subwf	pos1,w
	btfss	STATUS,2
	goto	sat4

;traitement sat3
	movlw	.20	;HotBird
	call	texte1
	goto	finafst

sat4	movlw	.4
	subwf	pos1,w
	btfss	STATUS,2
	goto	sat5

;traitement sat4
	movlw	.28	;EUT-W1
	call	texte1
	goto	finafst

sat5	movlw	.5
	subwf	pos1,w
	btfss	STATUS,2
	goto	sat6

;traitement sat5
	movlw	.35	;I707
	call	texte1
	goto	finafst

sat6	movlw	.6
	subwf	pos1,w
	btfss	STATUS,2
	goto	sat7

;traitement sat6
	movlw	.40	;T2B
	call	texte1
	goto	finafst

sat7	movlw	.7
	subwf	pos1,w
	btfss	STATUS,2
	goto	sat8

;traitement sat7
	movlw	.44	;T2A-2D
	call	texte1
	goto	finafst

sat8	movlw	.8
	subwf	pos1,w
	btfss	STATUS,2
	goto	sat9

;traitement sat8
	movlw	.51	;Hispasat
	call	texte1
	goto	finafst

sat9	


finafst	return

;----------------------------------------------------------------------
;affichage de la position actuelle
affipos	movlw	40h	;affiche partie droite du LCD
	call	ddras
	movf	val0,w
	call	affiw
	call	affi4
	call	tp10ms
	return

;-----------------------------------------------------------------------
;actionne le moteur pour pointer le satellite
pointer	call dspclr	;efface LCD
	call	affisat
	
bcl2	clrwdt

	movlw	40h
	call	ddras
	movlw	' '	;fait clignoter la fleche
	call	ecrire

	btfss	PORTB,3	;bouton <
	goto	finptr	;sort
	btfss	PORTB,4	;bouton >
	goto	finptr	;sort

	call	satpos
	movwf	memo2

	subwf	val0,w
	btfsc	STATUS,0	;bit c
	goto	sens11
	goto	sens22

sens11	bcf	moteur,0
	bsf	moteur,1
	movlw	40h
	call	ddras
	movlw	'>'
	call	ecrire
	goto	action

sens22	bcf	moteur,1
	bsf	moteur,0
	movlw	40h
	call	ddras
	movlw	'<'
	call	ecrire
	goto	action

action	bsf	moteur,2
	call	cmdmotr

;	call	affipos

	movf	memo2,w
	subwf	val0,w
	btfss	STATUS,2	;bit z	
	goto	bcl2		;boucle
	goto	finptr		;si la position de la consigne est atteinte

finptr	bcf	moteur,2
	call	cmdmotr		;stop
	return

;-----------------------------------------------------------------------
;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



;----------------------------------------------------------------------
;scrute le 4017
;resultat dans pos1

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	;debordement ? (toutes les sorties du 4017 NC)=pos10b
	btfss	STATUS,2	;bit z
	goto	bcl4017
	return


;-----------------------------------------------------------------------
clk4017	clrwdt
	bsf	PORTA,4
	call	tp300us
	bcf	PORTA,4	
	return



;***********************************************************************************************
;debut des procedures 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 serie 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 deplace

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 gele
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 la valeur ASCII du caractere a afficher
ecrire	clrwdt
	bcf	PORTA,2	;E=0
	bsf	PORTA,3	;R/S=1

	movwf	dtlcd
	
	call 	dt_out

	bsf	PORTA,2		;impuls E a 1 avec RS=1
	call 	tp10ms
	bcf	PORTA,2		;fin impulsion
	call 	tp10ms
	return

;----------------------------------------------------------------------
;impulsion E a 1 avec RS=0
impuls	bcf	PORTA,3		;R/S=0
	bsf	PORTA,2		;impulsion E a 1
	call tp10ms
	bcf	PORTA,2		;fin impulsion
	call tp10ms
	return

;----------------------------------------------------------------------
;SORTIE DATA (8 bits) en serie sur PA0 vers CD4015. PA1=Clock 4015.

dt_out	movlw	.8
	movwf	bitn
dtbcl	rlf	dtlcd,f
	bcf	PORTA,0		;bit = 0 (a 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	clrwdt
	movlw	.10
	subwf	aff4,w	;pour detecter depassement...
	btfsc	STATUS,0	;bit de carry
	goto	depass

	movf	aff4,w
	addlw	.48	;code ASCII de zero
	call ecrire

affi3	movf	aff3,w
	addlw	.48	;code ASCII de zero
	call ecrire
	
affi2	movf	aff2,w
	addlw	.48	;code ASCII de zero
	call ecrire

	movf	aff1,w
	addlw	.48	;code ASCII de zero
	call ecrire
	goto finaff

depass	movlw	"-"
	call	ecrire
	movlw	"-"
	call	ecrire
	movlw	"-"
	call	ecrire
	movlw	"-"
	call	ecrire

finaff	return

;------------------------------------------------------------------------
;nb decimaux dans AA(unites) et BB(centaines) au prealable
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 a 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	;recupere la retenue...
	call	affnb
	movf	aff3,w
	addlw	.48		;code ASCII de zero
	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

;-----------------------------------------------------------------------
;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
;resultat dans AA(unites) 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 a convertir dans AA
;resultat dans BB (dizaines) et dans AA (unites)
;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 a 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 a convertir dans AA
;resultat dans BB (centaines) et dans AA (unites)
;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 a 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 procedure

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 procedure

tx10ms	clrwdt
	movwf	t3

txlp2	clrwdt		;chien de garde
	call tp10ms
	decfsz	t3,f	
	goto txlp2
	return

	ORG     2007H	; Fuses
	DATA    3FF1H	;osc=XT


;----------------------------------------------------------------------
        end





