Programació en ASM del PIC 16F690 amb PICkit 2

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

Mastermind electrònic

En aquest projecte volem fer un joc del Mastermind. Per això disposarem de quatre LED tricolor per indicar les combinacions de color i quatre LED monocolor per indicar els encerts. Aquests LED els controlarem amb uns registres de desplaçament. També tindrem cinc polsadors connectats a una entrada analògica i un brunzidor piezoelèctric que ens permetrà, si ho desitgem, afegir una melodia al nostre joc. L'esquema de connexionat dels elements és el següent:

Circuit del Mastermind

Els LED tricolor no només ens permeten obtenir els tres colors que incorporen (vermell, blau i verd) sinó alguns colors més. En teoria, combinant aquests tres colors (amb diferents intensitats) podem obtenir quasi infinits colors. Però nosaltres només podem tenir els colors activats o desactivats (sense variar-ne la intensitat) i, per tant, el nombre de possibles colors és reduït. En principi, disposem dels de la taula següent:

Vermell (R) Verd (G) Blau (B) Color
1 0 0 Vermell
0 1 0 Verd
0 0 1 Blau
1 1 0 Groc
1 0 1 Magenta
0 1 1 Cian
1 1 1 Blanc

Alternant de forma ràpida dues o més combinacions podem fer alguns colors intermedis; per exemple:

Vermell (R) Verd (G) Blau (B) Color
1 0 1 Morat
0 0 1

El programa de l'exemple NM permet provar el brunzidor. i el programa de l'exemple PA permet provar els polsadors.

En el programa que farem com a exemple, tindrem les variables Sortida i Sortida+1 que és on posarem els valors que volem enviar als registres i, per tant, als LED. La següent taula ens indica a quin LED correspon cada bit i alguns exemples, que són els que veurem al programa de mostra.

Sortida+1 Sortida Comentari
B3 G3 R3 B2 G2 R2 B1 G1 R1 B0 G0 R0 M3 M2 M1 M0
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 Monocrom encesos i tricolor apagats
0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 Monocrom apagats i tricolor vermells
0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 Monocrom apagats i tricolor verds
1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 Monocrom apagats i tricolor blaus

El següent programa permet provar els registres de desplaçament:

#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:2		; Valors a enviar al registre de desplaçament
			; Sortida+1 correspon als bits del 8 al 15 i Sortida als bits del 0 al 7
			; Sortida+1				Sortida
			; B3 G3 V3 B2 G2 V2 B1 G1		R1 B0 G0 R0 M3 M2 M1 M0
Compta			; Variable per comptar els bits
Retard1			; Variables per als cicles de retard
Retard2
Retard3
	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
	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
	clrf	Port		; Posa a zero tots els bits de la variable Port
	movf	Port,w
	movwf	PORTB		; I ho envia al port B
Bucle
	movlw	b'00001111'	; Bits 0 a 3 a u (LED monocrom) i la resta a zero
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00000000'	; Bits 8 a 15 a zero
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.10		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw	b'10010000'	; LED multicolor a vermell
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00100100'
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.10		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw	b'00100000'	; LED multicolor a verd
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'01001001'
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.10		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw	b'01000000'	; LED multicolor a blau
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'10010010'
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.10		; Temps d'un segon
	call	Rets		; Espera 1 s
	goto	Bucle		; Torna a repetir
					;
					; Funció de retard de 0,2 W s
					;
Rets
	movwf	Retard3
Bucles
	decfsz	Retard1,f		
	goto	Bucles		
	decfsz	Retard2,f		
	goto	Bucles		
	decfsz	Retard3,f	
	goto	Bucles
	return
					;
					; Envia 16 bits a un registre de desplaçament
					;
					; Els bits estan a les variables Sortida (bits menys significatius)
					; i Sortida+1
					; Al final de la funció, el valor de Sortida queda corromput
					; Si es vol conservar, cal copiar-lo a una altra variable
EnviaR16
	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	.16		; Número de bits a enviar
	movwf	Compta		; Variable per comptar els bits
BucleR16
	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
	rlf	Sortida+1,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,f	; Decrementa Compta
	goto	BucleR16	; 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

A continuació posarem els programes realitzats pels grups. Estan tal com els han deixat i tenint present que no els va donar temps de simplificar-los o millorar-los. També pot ser que hi hagi errades ortogràfiques.

Programa del grup 1

Programa del grup 2

Programa del grup 3

Programa del grup 4

 

 

Licencia de Creative Commons
This obra by Oriol Boix is licensed under a Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0 Unported License.