Programació en C del PIC 16F690 amb PICkit 2

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

Combinant C i assemblador

A vegades pot ser interessant fer parts d'un programa en assemblador. En llenguatge assemblador podem generar codi més compacte i més ràpid. Abans de fer servir instruccions en assemblador dins el programa, caldrà que coneguem com es programa en llenguatge assemblador.

Una de les qüestions a destacar quan posem trossos en assemblador dins d'un programa en C és que no coneixem l'adreça exacta de les variables. Però tenim una manera de fer-les servir. La següent taula ens mostra un parell d'exemples de variables:

Tipus Bytes Nom en C Nom en ASM Comentari
Char 1 Var1 (_Var1)
Unsigned short 2 Var2 (_Var2) Byte menys significatiu
(_Var2+1) Byte més significatiu

Atès que no sabem on s'ha guardat la variable, cal que ens assegurem que estem en el banc correcte. Com que no sabem quin és, fem servir la instrucció banksel.

Les instruccions en assemblador les posarem entre les etiquetes #asm i #endasm.

A continuació hem posat, a tall d'exemple, el programa de l'exemple EA però amb un petit tros en assemblador.

#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF, CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
#include "pic16f690.h"				// Carrega el fitxer d'adreces i paràmetres del PIC 16F690
#include <xc.h>					// Carrega el fitxer de funcions
char Valor;					// Valor llegit
void main (void)
{
	TRISC = 0b00000000; 			// Posa el port C com a sortida
	TRISAbits.TRISA0 = 1;			// La pota RA0 és d'entrada
	ANSEL = 0;				// Desactiva totes les entrades analògiques
	ANSELH = 0;	
	ANSELbits.ANS0 = 1;			// I ara activa la del potenciòmetre (AN0)
	ADCON1 = 0b00010000;			// Posa el conversor a 1/8 de la freqüència
	ADCON0 = 0b00000001;			// Activa el conversor connectat a AN0
						// amb el resultat justificat per l'esquerra
	while (1)				// Bucle infinit
	{
		ADCON0bits.GO = 1;		// Posa en marxa el conversor
		while (ADCON0bits.GO == 1)	// Mentre no acabi
			;    			// ens esperem
#asm 
	banksel		ADRESH			; Banc on està ADRESH
	movf		ADRESH,w		; Agafem la lectura del conversor
	banksel		(_Valor) 		; Banc on està la variable
	movwf		(_Valor)		; Ho guarda a la variable
#endasm 
		PORTC = Valor/16;		// Copiem el resultat, dividit per 16, als LED
        _delay(200000);	    			// Retard per permetre la visualització
	}
}

 

 

Licencia de Creative Commons
Esta obra de Oriol Boix está licenciada bajo una licencia no importada Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0.