Programació en mpasm del PIC 16F690

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

Exemple RD - Registre de desplaçament

Anem a provar el funcionament d'un registre de desplaçament. Agafarem l'entrada analògica on hi ha connectat el potenciòmetre i mostrarem els vuit bits de més pes sobre vuit LED connectats a un registre de desplaçament.

En el següent diagrama es mostra com s'ha connectat el registre per controlar vuit LED.

Connexió del registre

El programa que emprarem serà:

#include <p16F690.inc>
	__config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
	cblock 0x20
Port			; Bits a enviar al port B
Sortida			; Valors a enviar al registre de desplaçament
Compta			; Variable per comptar els bits
Retard1			; Variables per als cicles de retard
Retard2
	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	TRISB		; Posa tots els bits del port B com a sortida
	clrf	TRISC		; Posa tots els bits del port C com a sortida
	movlw	b'00010000'	; Posa el conversor a 1/8 de la freqüència
	movwf	ADCON1		; Copia W a la configuració del conversor A/D
	bcf	STATUS,RP0
	bsf	STATUS,RP1	; Tria el banc 2
	movlw	b'00000001'
	movwf	ANSEL		; Configura 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
	clrf	Port		; Posa a zero tots els bits de la variable Port
	movf	Port,w
	movwf	PORTB		; I ho envia al port B
Bucle
	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 1
	movf	ADRESH,w	; Agafa els vuit bits superiors del valor llegit
	movwf	Sortida		; i ho prepara per enviar-ho al registre
	call	EnviaR8		; Ho envia al registre
	call	RetM		; Espera 0,2 s
	goto	Bucle		; Torna a llegir
					;
					; Bucle de retard de 0,2 s
					;
RetM
	decfsz	Retard1,f		
	goto	RetM		
	decfsz	Retard2,f	
	goto	RetM
	return
					;
					; Envia 8 bits a un registre de desplaçament
					;
EnviaR8				
				; Els bits estan a la variable Sortida
				; Al final de la funció, el valor de Sortida queda corromput
				; Si es vol conservar, cal copiar-lo a una altra variable
	bcf	Port,5		; S'assegura que Clock està desactivat
	bcf	Port,6		; S'assegura que Latch està desactivat
				; En cas contrari, els bits enviats es copiarien immediatament a les sortides
	movf	Port,w		; Agafa el valor de Port
	movwf	PORTB		; I el posa al port B
	movlw	.8		; Número de bits a enviar
	movwf	Compta		; Variable per comptar els bits
BucleR8
	bcf	Port,4		; Desactiva Data. Si toca activar-ho, ja ho farem
	rlf	Sortida,f	; Fa sortir el bit de més a l'esquerra cap a C i roda els altres a l'esquerra
	btfsc	STATUS,C	; Mira si el bit de l'esquerra era un 1
	bsf	Port,4		; Si era 1, activa Data
	movf	Port,w		; Agafa el valor de Port. El valor que ha canviat és Data
	movwf	PORTB		; I el posa al port B
	bsf	Port,5		; Activa Clock, forçant a llegir el bit
	movf	Port,w		; Agafa el valor de Port. El valor que ha canviat és Clock
	movwf	PORTB		; I el posa al port B
	bcf	Port,5		; Desactiva Clock
	movf	Port,w		; Agafa el valor de Port. El valor que ha canviat és Clock
	movwf	PORTB		; I el posa al port B
	decfsz	Compta		; Decrementa Compta
	goto	BucleR8		; Si Compta no és zero, repeteix el bucle
	bsf	Port,6		; Torna a activar Latch. Els valors es copiaran a la sortida del registre
	movf	Port,w		; Agafa el valor de Port. El valor que ha canviat és Latch
	movwf	PORTB		; I el posa al port B
	return
	end

 

 

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