Programació en mpasm del PIC 16F690

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Multiplicar i dividir

El PIC 16F690 no incorpora instruccions de multiplicació o divisió. Aquí veurem com podem fer algunes multiplicacions senzilles i com fem divisions per nombres que siguin potències de dos.

Multiplicació per dos

Multiplicar un valor per 2 és equivalent a fer girar els seus bits cap a l'esquerra entrant zeros per la dreta.

...
	bcf		STATUS,C	; Volem entrar un zero
	rlf		Resul,f		; Girem a l'esquerra
...

Quan els resultats puguin ser més grans que 255 caldrà fer operacions de més d'un byte. A continuació veurem com fer-ho quan el valor ocupa dos bytes. Guardem el resultat en dues posicions de memòria consecutives seguint l'estructura següent:

Resultat de dos bytes
...
	bcf		STATUS,C	; Volem entrar un zero
	rlf		Resul,f		; Girem a l'esquerra el byte de menys pes
	rlf		Resul+1,f	; Ara girem a l'esquerra el byte de més pes
					; El bit que a sortit per l'esquerra del primer ha entrat
					; per la dreta del segon
...

Si en lloc de multiplicar per dos volem fer-ho per quatre només caldrà fer les rotacions corresponents dues vegades tot posant a zero el bit C cada vegada. El mateix per qualsevol altra potència de dos. Quan ho fem, hem de preveure quants bits pot arribar a ocupar el resultat per assegurar que cap en l'espai que hem reservat. Si la multiplicació implica més de tres o quatre rotacions és preferible fer-ho iterativament.

Divisió per dos

De manera semblant, per dividir per dos només caldrà fer rodar els bits cap a la dreta entrant zeros per l'esquerra.

...
	bcf		STATUS,C	; Volem entrar un zero
	rrf		Resul,f		; Girem a la dreta
...

Si el valor ocupa dos byte serà:

Resultat de dos bytes
...
	bcf		STATUS,C	; Volem entrar un zero
	rrf		Resul+1,f	; Girem a la dreta el byte de més pes
	rrf		Resul,f		; Ara girem a la dreta el byte de menys pes
					; El bit que a sortit per la dreta del primer ha entrat
					; per l'esquerra del segon
...

Si en lloc de multiplicar per dos volem fer-ho per quatre només caldrà fer les rotacions corresponents dues vegades tot posant a zero el bit C cada vegada. El mateix per qualsevol altra potència de dos. Si la multiplicació implica més de tres o quatre rotacions és preferible fer-ho iterativament.

Multiplicació per altres valors

Per multiplicar, en principi, hem de sumar el mateix valor diverses vegades. Per exemple, si volem multiplicar el valor de la variable Val per 47 guardant el resultat a Valor i Valor+1 podríem fer:

...
	clrf 		Valor
	clrf 		Valor+1
	movlw 		.47
	movwf 		Comptador
BucleSum
	movf 		Val,w
	addwf 		Valor,f
	btfsc 		STATUS,C
	incf 		Valor+1,f
	decfsz 		Comptador,f
	goto 		BucleSum 	; A Valor+1,Valor tenim el numero multiplicat per 47
...

Una alternativa més eficient seria tenir present que 47 és 32 més 15 i que 32 és una potència de dos. Podríem fer cinc rotacions per multiplicar per 32 i després sumar-hi el valor només 15 cops. Per optimitzar el càlcul, podríem descompondre 47 en suma de potències de dos:

  32
   8
   4
   2
   1 
  47

Una manera, doncs, seria agafar quatre còpies del valor, rodar la primera cinc cops (multiplica per 32), la segona tres cops (multiplica per 8), la tercera dos cops (multiplica per 4) i la quarta un cop (multiplica per 2); obtindríem el resultat final sumant aquests quatre valors i afegint-hi el valor inicial. En aquest cas aquest mètode no és molt òptim perquè sumar 15 cops són poques operacions però pot ser molt eficient quan cal multiplicar per valors grans.

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.