Programació en mpasm del PIC 16F690

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

Exemple RL - Rotació de LED

Ara volem que els LED s'activin de manera seqüencial. Podríem fer un programa de l'estil dels anteriors on anéssim activant i desactivant els bits un darrera l'altre. També podem fer un programa més curt fent servir una instrucció de rotació de bits.

Els microcontroladors tenen unes instruccions que permeten desplaçar els bits d'una variable o registre cap a un costat. Per exemple la instrucció rrf fa girar els bits d'una variable cap a la dreta fent servir el registre d'arrossegament C (un dels bits d'estat) com a element d'entrada i sortida.

rrf

En el nostre cas volem treballar amb només quatre LED que estan connectats als quatre bits menys significatius (els quatre de la dreta) del port C. El que farem serà començar activant el bit 3 i anar rodant. Quan s'activi C vol dir que ja no tenim cap LED activat i llavors tornarem a activar el bit 3. La seqüència serà la següent:

rotacio

on el bit que està a 1 correspon al LED encès. El programa serà el següent:

#include <p16F690.inc>
	__config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
	cblock 0x20
Retard1				; Definim dues variables de comptatge
Retard2
Visualit			; I una variable on guardem el que mostraran els LED
	endc
	org 0
Inici
	bsf	STATUS,RP0	; Tria el banc 1
	clrf	TRISC		; Posa tots els bits del port C com a sortida
	bcf	STATUS,RP0	; Tria el banc 0
	movlw	b'00001000'	; Activa el bit 3 al registre W
	movwf	Visualit	; Copia el valor de W a la variable Visualit
Bucle
	movf	Visualit,w	; Copia la variable Visualit sobre el registre W
	movwf	PORTC		; Copia el valor de W al port C
Ret
	decfsz	Retard1,f	; Decrementa la variable 1
				; si dona zero, no es fa la instrucció següent
	goto	Ret		; Salta, excepte si el resultat ha estat zero
	decfsz	Retard2,f	; Decrementa la variable 2
	goto	Ret		; Salta, excepte si el resultat ha estat zero
	bcf	STATUS,C	; posa a zero el bit d'arrossegament
	rrf	Visualit,f	; Fa rodar els bits cap a la dreta
				; el bit d'arrossegament entra per l'esquerra
				; i el bit de la dreta passa a l'arrossegament
	btfsc	STATUS,C	; Comprova si s'ha activat l'arrossegament
				; Si no s'ha activat, salta una instrucció
	bsf	Visualit,3	; Si s'ha activat, torna a posar un 1
	goto	Bucle		; Repetim-ho...
	end

Anem a comentar les línies que estan en color, és a dir les que han canviat respecte al programa anterior. Hem definit una variable Visualit que serà la que farem rodar i on tindrem quin és el LED que s'activa a cada moment.

Com ara ja no treballem amb una sola sortida, hem fet servir la instrucció clrf per posar a 0 el registre TRISC; així tot el port C queda definit com a sortida.

Nosaltres volem activar el bit 3 de la variable Visualit i desactivar els altres; és a dir escriure-hi b'00001000'. No hi ha cap instrucció que ens permeti escriure directament un valor a una variable. El que farem serà carregar un valor a l'acumulador (registre W) i després copiar-lo a la variable. La instrucció movlw copia un valor a l'acumulador. Tot seguit la instrucció movwf ens copia l'acumulador a la variable Visualit.

Amb això hem acabat la inicialització. Ara anem al bucle. Al començament del cicle copiem la variable al port C. Com tampoc podem fer-ho directament, fem servir el mateix recurs que abans. Després hi ha el bucle de retard.

Després del retard volem fer la rotació de bits. Per evitar problemes, posem C a zero amb una instrucció bcf; així ens assegurem que l'únic 1 del registre és el que fem rodar. Tot seguit fem rodar i sabem que el bit de més a la dreta passarà a C. Per tant comprovem si s'ha activat C. Si no s'ha activat la instrucció següent es saltarà i, per tant, repetirem el bucle. Si, en canvi, s'ha activat C tornarem a activar el bit 3 de la variable per tenir altre cop el primer dels quatre estats.

Un cop hagueu provat el programa podeu repetir-ho posant b'00001100' o b'00001010' al registre i tindreu també rotacions de bits però amb dos bits encesos.

El microcontrolador també té una instrucció rlf que fa girar els bits cap a l'esquerra.

rlf

Fixem-nos que fer girar els bits cap a la dreta equival a dividir per 2 i fer-los girar cap a l'esquerra a multiplicar per 2. Vegem-ho:

Decimal Hexadecimal Binari
54 36h 0011 0110
27 1Bh 0001 1011

Si intentem fer el nostre programa amb aquesta instrucció, no funcionaria bé ja que quan estiguessin activats els bits 4, 5, 6 o 7 no hi hauria cap LED encès. Per fer girar els LED en sentit contrari hauríem de canviar el programa de manera que comencessim activant només el bit 0 i quan detectéssim l'activació del bit 4 tornaríem a activar el bit 0.

 

 

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