Programació en mpasm del PIC 16F690

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

Exemple VV - Rotació de LED a velocitat variable

En aquest exemple es combinen coses dels exemples RL i EA.

Com en l'exemple anterior, en aquest cas llegirem el potenciòmetre utilitzant una entrada analògica. Ara el que farem serà utilitzar els 8 bits superiors del valor llegit per variar la velocitat. A l'Exemple RL definíem la velocitat de rotació dels LED amb dos bucles, un dins un altre, que es repetien 256 vegades. Ara variarem, en funció del potenciòmetre, el nombre de cops que es repeteix el bucle exterior.

A l'Exemple RL el bucle començava amb la variable a zero i s'anava restant (255, 254, 253, etc.) fins arribar altre cop a zero. Ara el valor llegit al potenciòmetre estarà entre 0 i 255. Si recordem que el bucle intern és de 771 μs, les durades que correspondrien a cada valor de la lectura del potenciòmetre serien:

Valor Cicles Durada
0 256 256 * 771 μs = 197,4 ms
1 1 1 * 771 μs = 0,7 ms
2 2 2 * 771 μs = 1,5 ms
... ... ...
254 254 254 * 771 μs = 195,8 ms
255 255 255 * 771 μs = 196,6 ms

I ens trobem que a l'extrem hi ha un valor que no encaixa i ens donaria un efecte visual estrany. Per evitar aquest problema, a la lectura del conversor li sumem 1. També ens trobem que el cicle mínim és de 0,7 ms que és molt poc. Per això, després dels cicles variables, farem un cicle fix de 10 ms (13 iteracions del bucle llarg).

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
	movlw	0xFF		; Posa l'acumulador a FFh (tot uns)
	movwf	TRISA		; Posa tots els bits del port A com a entrada
	clrf	TRISC		; Posa tots els bits del port C com a sortida
	movlw	b'00010000'
	movwf	ADCON1		; Posa el conversor a 1/8 de la freqüència
	bcf	STATUS,RP0
	bsf	STATUS,RP1	; Tria el banc 2
	movlw	b'00000001'
	movwf	ANSEL		; Posa AN0 com entrada analògica
	bcf	STATUS,RP0
	bcf	STATUS,RP1	; Tria el banc 0
	movlw	b'00000001'	; activa el conversor A/D connectat a AN0
	movwf	ADCON0		; amb el resultat justificat per l'esquerra
	movlw	b'00001000'	; Activa el bit 3
	movwf	Visualit	; Ho copia sobre la variable Visualit
Bucle
	movf	Visualit,w	; Copia la variable Visualit a l'acumulador
	movwf	PORTC		; Copia el resultat sobre els LED
	nop			; espera un microsegon
	nop			; espera un microsegon
	nop			; espera un microsegon
	nop			; espera un microsegon
	nop			; espera un microsegon, en total 5
	bsf	ADCON0,GO	; Inicia la conversió
	btfsc	ADCON0,GO	; Quan el bit sigui 0 la conversió haurà acabat
	goto	$-1		; repetim la línia fins que deixi de ser 0
	movf	ADRESH,w	; Copia els bits superiors a l'acumulador
	addlw	1		; Li suma 1 i tenim la durada variable del cicle
	movwf	Retard2		; Ho copia a la variable Retard2
RetVar
	decfsz	Retard1,f	; Decrementa la variable 1
				; si dona zero, no es fa la instrucció següent
	goto	RetVar		; Salta, excepte si el resultat ha estat zero
	decfsz	Retard2,f	; Decrementa la variable 2
	goto	RetVar		; Salta, excepte si el resultat ha estat zero
	movlw	.13		; El punt indica que es un valor decimal
	movwf	Retard2		; Comença un altre cicle de durada fixa (10 ms)
Ret10ms	
	decfsz	Retard1,f
	goto	Ret10ms
	decfsz	Retard2,f
	goto	Ret10ms
Rotar
	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 (0000 1000)
	goto	Bucle		; Repetim-ho...
	end

 

 

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