Programació en mpasm del PIC 16F690

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

Exemple MT - Visualitzem la temperatura a la pantalla sèrie

En aquest exemple farem servir un sensor de temperatura i mostrarem la temperatura llegida a una pantalla sèrie.

#include <p16F690.inc>
	__config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
	cblock 0x20
Valor:2			; Valor llegit pel conversor (16 bits)
			; Valor és el bit menys significatiu i Valor+1 el més significatiu
D1			; Variable unitats de la conversió BCD
D2			; Variable desenes de la conversió BCD
			; D1:2 també és una variable auxiliar en els càlculs
			; D1 és el bit menys significatiu i D2 el més significatiu
D3			; Variable centenes de la conversió BCD
Caracter		; Caràcter o codi a enviar
			; D3:2 també és una variable auxiliar en els càlculs
			; D3 és el bit menys significatiu i Caracter el més significatiu
Control			; Variable amb bits de control
			; El bit 0 està a 1 si la temperatura és negativa
			; El bit 7 estarà a 1 si cal sumar 0,5 a la temperatura
Retard1			; Variables per als cicles de retard
Retard2
Retard3
	endc
	org 0
Inici
	movlw		.10		; Retard de 2 s
	call		Rets		; Esperem que arrenqui la pantalla
	bsf		STATUS,RP1	; Tria el banc 2
	movlw		b'00000101'
	movwf		ANSEL		; Configura AN0 i AN2 com entrada analògica
	clrf		ANSELH		; Desactiva les altres entrades analògiques
	bcf		STATUS,RP1
	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		; Tot el port C és de sortida
	clrf		TRISB		; Tot el port B és de 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
	bsf		TXSTA,BRGH	; Configuració de velocitat
	bcf		BAUDCTL,BRG16	; Paràmetre de velocitat de 8 bits
	movlw		.25		; Velocitat de 9600 baud
	movwf		SPBRG		; Paràmetre de velocitat
	bcf		TXSTA,SYNC 	; Comunicació asíncrona
	bcf		TXSTA,TX9 	; Comunicació de 8 bits
	bcf		STATUS,RP0	; Tria el banc 0
	bsf		RCSTA,SPEN	; Activa comunicació sèrie
	bsf		STATUS,RP0	; Tria el banc 1
	bsf		TXSTA,TXEN 	; Activa comunicació
	bcf		STATUS,RP0	; Tria el banc 0
	movlw		b'10001001'	; activa el conversor A/D connectat a AN2
	movwf		ADCON0		; amb el resultat justificat per la dreta
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
	bsf		STATUS,RP0	; Tria el banc 1
	movf		ADRESL,w	; Llegim byte inferior del resultat
	bcf		STATUS,RP0	; Tria el banc 0
	movwf		Valor		; El guardem
	movf		ADRESH,w	; Llegim byte superior del resultat
	movwf		Valor+1		; El guardem
					; Abans de res, posicionem el cursor a la pantalla
	movlw		.254		; Control de la posició del cursor
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	movlw		.0		; Filera 1 columna 1
	iorlw		b'10000000'	; Posa el bit de posicionat a 1
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
					; Comencem mirant si el valor es positiu o negatiu 
	bcf		Control,0	; Suposem que el valor llegit és positiu i ho comprovem
	movf		Valor+1,f	; Si el byte de més pes no és nul segur que es positiu
	btfss		STATUS,Z	; És zero?
	goto		Positiu		; No
	movlw		.102		; Si és més petit que 102 és negatiu
	subwf		Valor,w		; W = Valor - W
	btfss		STATUS,C	; C = 1 si Valor >= W
	bsf		Control,0	; El valor llegit és negatiu
Positiu					; Anem a multiplicar per tres la lectura (resultat a D1)
	movf		Valor,w		; Byte de menys pes
	movwf		D1
	movf		Valor+1,w	; Byte de més pes
	movwf		D1+1
	call		Suma		; D1 = D1 + Valor (sobre dos bytes)
	call		Suma		; D1 = D1 + Valor (sobre dos bytes)
					; Tenim 3 Valor a D1
	clrf		D3		; Aquí és on posarem la lectura multiplicada per 128
	movf		Valor,w		; Copiem el byte menys significatiu de la lectura
	movwf		D3+1		; I el posem on guardarem el més significatiu
	rrf		Valor+1,w	; No modifiquem la variable però passem el bit de la dreta a C
	rrf		D3+1,f		; Entrem aquest bit per l'esquerra a D3+1
	rrf		D3,f		; i el que ha sortit l'entrem a l'esquerra de D3
					; Tenim 128 Valor a D3
	call		Resta		; D3 = D3 - D1
					; Tenim 125 Valor a D3
	btfsc		Control,0	; Era negatiu?
	goto		Negatiu		; Sí
	movlw		.50		; Byte més significatiu de 12800
	movwf		D1+1
	clrf		D1		; Byte menys significatiu de 12800
	call		Resta		; D3 = D3 - D1
	goto		Escriu		; Anem a enviar-ho a la pantalla
					; Tenim 125 Valor a D3
					; Per a fer la resta, cal passar-ho a D1
Negatiu
	movf		D3+1,w
	movwf		D1+1
	movf		D3,w
	movwf		D1
	movlw		.50		; Byte més significatiu de 12800
	movwf		D3+1
	clrf		D3		; Byte menys significatiu de 12800
	call		Resta		; D3 = D3 - D1
					; Tenim el numerador a D3 i D3+1
					; Un cop dividit per 256, la part entera estarà a D3+1
					; I la part decimal dependrà del bit 7 de D3
					; Guardem el bit 7 a Control perquè la funció BCD sobrescriurà D3
Escriu	
	bcf		Control,7	; Suposem que el decimal és 0
	btfsc		D3,7		; Mira si està activat el bit 7
	bsf		Control,7	; Sí, doncs el decimal és un 5
	movf		D3+1,w		; Aquest és el valor que mostrarem a la pantalla abans de la coma
	call		BCD		; Ho convertim a BCD
	call		ASCII		; Ho convertim a ASCII
	movf		D3,w		; Llegeix el caràcter
	btfsc		Control,0	; Era negatiu?
	movlw		'-'		; Sí. Doncs posa un - en lloc del caràcter
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	movf		D2,w		; Llegeix el caràcter
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	movf		D1,w		; Llegeix el caràcter
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	movlw		','		; Posa la coma					
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	movlw		'0'		; Preparem un zero
	btfsc		Control,7	; Mirem si el decimal és 0 o 5
	movlw		'5'		; És 5
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	movlw		' '		; Espai en blanc
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	movlw		b'11011111'	; Graus
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	movlw		'C'		; Centígrads
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	movlw		0
	call		Retard		; Retard de 0,2 s
	call		Retard		; Retard de 0,2 s
	call		Retard		; Retard de 0,2 s
	goto		Bucle
EnviaL					; Enviem caràcters a visualitzar
	movf		Caracter,w	; Agafa el caràcter
	movwf		TXREG		; L'envia
	nop			
	nop				; Espera 2 us
	btfss		PIR1,TXIF	; El registre TXREG ha quedat lliure?
	goto		$-1		; No, doncs esperem
	return				; Tornem al lloc des d'on hem vingut
BCD					; Funció de conversió a BCD en ASCII
					; El valor a convertir està a W
	clrf		D3		; Posa D3 (centenes) a zero
	clrf		D2		; Posa D2 (desenes) a zero
	movwf		D1		; Guarda W (valor a convertir) a D1 
					; D1 són les unitats
Cent					; Anem a trobar les centenes (D3)
	movlw		.100		; Carrega 100 decimal a W
	subwf		D1,w		; Li resta W a D1
	btfss		STATUS,C	; Mira C i si és 1 no fa la següent
					; Si és 1 vol dir resultat positiu
	goto		Desen		; Si el resultat és negatiu les centenes ja estan
					; el valor de W es perd i anem a les desenes
	movwf		D1		; Guarda el resultat (W) a D1
	incf		D3,f		; La centena restada a D1 l'afegeix a D3
	goto		Cent		; Tornem-ho a fer
Desen					; Anem a trobar les desenes
	movlw		.10		; Carrega 10 decimal a W
	subwf		D1,w		; Li resta W a D1
	btfss		STATUS,C	; Mira C i si és 1 no fa la següent
					; Si és 1 vol dir resultat positiu
	goto		Final		; Si el resultat és negatiu les desenes ja estan
					; el valor de W es perd i anem a ASCII
	movwf		D1		; Guarda el resultat (W) a D1
	incf		D2,f		; La desena restada a D1 l'afegeix a D2
	goto		Desen		; Tornem-ho a fer
Final
	retlw		0		; Retorn amb un 0 a W
ASCII
	movlw		'0'		; Carrega el codi ASCII del número 0
					; Sumant-li la xifra tindrem el codi ASCII
	addwf		D3,f		; Ho afegeix al dígit
	addwf		D2,f		; Ho afegeix al dígit
	addwf		D1,f		; Ho afegeix al dígit
	movf		D3,w		; Llegeix el dígit
	xorlw		'0'		; Compara amb 0
	btfss		STATUS,Z	; Si Z està activat eren iguals
	return				; Si no eren iguals, ja estem
	movlw		' '		; Carrega un espai en blanc
	movwf		D3		; Substitueix el 0 per l'espai
	movf		D2,w		; Llegeix el dígit
	xorlw		'0'		; Compara amb 0
	btfss		STATUS,Z	; Si Z està activat eren iguals
	return				; Si no eren iguals, ja estem
	movlw		' '		; Carrega un espai en blanc
	movwf		D2		; Substitueix el 0 per l'espai
	return
Resta					; D3 = D3 - D1 (sobre dos bytes)
	comf		D1,f		; Complementa D1
	incf		D1,f		; I l'incrementa (el conjunt equival a canviar el signe)
	btfsc		STATUS,Z	; Mirem si s'activa Z
	decf		D1+1,f		; Si era zero cal decrementar D1+1
	comf		D1+1		; Complementem D1+1
	movf		D1,w		; Llegim a W la variable que hem de sumar
	addwf		D3,f		; L'afegim al byte de la dreta
	btfsc		STATUS,C	; Mirem si s'activa C
	incf		D3+1,f		; Si s'activa, incrementem el byte superior
	movf		D1+1,w		; Llegim a W la variable que hem de sumar
	addwf		D3+1,f		; L'afegim al byte de la dreta
	return
Suma					; D1 = D1 + Valor (sobre dos bytes)
	movf		Valor,w		; Llegim a W la variable que hem de sumar
	addwf		D1,f		; L'afegim al byte de la dreta
	btfsc		STATUS,C	; Mirem si s'activa C
	incf		D1+1,f		; Si s'activa, incrementem el byte superior
	movf		Valor+1,w	; Llegim a W la variable que hem de sumar
	addwf		D1+1,f		; L'afegim al byte de la dreta
	return
Retard					; Funció Retard, W conté el nombre de cicles de 771 us que cal fer
	movwf		Retard2		; Ho copia a la variable Retard2
BucRet	
	decfsz		Retard1,f	; Decrementa la variable 1
					; si dona zero, no es fa la instrucció següent
	goto		BucRet		; Salta, excepte si el resultat ha estat zero
	decfsz		Retard2,f	; Decrementa la variable 2
	goto		BucRet		; Salta, excepte si el resultat ha estat zero
	return				; Tornem al lloc des d'on hem vingut
Rets					; Funció de retard de 0,2 W s
	movwf		Retard3
Bucles
	decfsz		Retard1,f		
	goto		Bucles		
	decfsz		Retard2,f		
	goto		Bucles		
	decfsz		Retard3,f	
	goto		Bucles
	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.