Está en la página 1de 12

P

rogramacin bsica

Diagramacin para lenguaje Ensamblador para PICs

www.softdata.com.mx

Ing. Marcos Kitaoka Castro

www.softdata.com.mx

Ing. Marcos Kitaoka Castro

Manual de Ensamblador para PICs

Diagramas de Flujo
Un diagrama de flujo es una interpretacin grafica de la secuencia de un programa. Debido a la complejidad del lenguaje ensamblador, a veces es conveniente realizar el programa de una forma grfica y fcil de interpretar y posteriormente hacer la conversin a partir de ah a ensamblador. Los bloques o figuras grficas que usaremos para realizar los diagramas de flujo durante este manual nos sirven para interpretar un programa para los microcontroladores PICs y hacer la traduccin a partir de ah a ensamblador, no obstante, en algunos casos esta traduccin no es la forma ms optima de minimizacin de cdigo, una vez traducido a ensamblador con las tablas de equivalencia a veces es necesario aplicarle algunas modificaciones con el fin de obtener un mayor rendimiento. Para darnos una idea aqu se muestra un programa sencillo hecho en diagramas de flujo con su correspondiente lenguaje ensamblador: Sistema que hace la funcin de una compuerta NOT, donde un Bit del Puerto A se configura como entrada y otro Bit como salida mostrando lo inverso de la entrada.

Otra forma de interpretarlo sera tambin de la siguiente manera:

www.softdata.com.mx

Ing. Marcos Kitaoka Castro

Manual de Ensamblador para PICs

Como se darn cuenta esta ltima forma est ms reducida tanto en diagrama de flujo como en cdigo ensamblador donde en los dos casos optimizamos los brincos (GOTO) y etiquetas de algunas lneas de cdigo. Tabla de bloques para los diagramas de flujo y su equivalente a las instrucciones de ensamblador
Diagrama a bloques Cdigo Ensamblador ORG 00H En el caso del MPLAB es PROG CODE END Configuracin por bits BSF 03H,5 ; ir al banco 1 de memoria (TRIS) BCF #registro , #bit ;configura un bit como salida BSF #registro , #bit ;configura un bit como entrada BCF 03H,5 ;regresar al banco 0 de memoria Configuracin por puerto BSF 03H,5 ; ir al banco 1 de memoria (TRIS) CLRF #registro ;configura un PUERTO como salida MOVLW 0FFH ; configura un PUERTO como entrada MOVWF #registro BCF 03H,5 ;regresar al banco 0 de memoria Otra forma usando el comando o nemnico TRIS CLRW ;configura un PUERTO como salida TRIS #registro MOVLW 0FFH ; configura un PUERTO como entrada TRIS #registro Ejemplos de cdigo BSF #registro , #bit BCF #registro , #bit MOVLW #numero MOVWF #registro etc ;pone a uno un bit de un registro ;pone a cero un bit de un registro ;cargar un numero a un registro Descripcin Ubicar el programa en la direccin 00H de memoria Indica la terminacin del programa Configurar que bits trabajan como entradas y/o salidas.

Configurar que puertos trabajan como entradas y/o salidas.

Pude ser cualquier cdigo en ensamblador con excepcin de instrucciones de comparacin y brincos incondicionales. Pueden ser uno o varias instrucciones dentro del mismo bloque.

www.softdata.com.mx

Ing. Marcos Kitaoka Castro

Manual de Ensamblador para PICs

Comparar un Bit de un registro #registro#bit == 1 BTFSC #registro , #bit #registro#bit == 0 BTFSS #registro , #bit Comparar el valor de un Registro #registro == #num (igual) MOVLW #num ;carga num a W SUBWF #registro,0 ;resta W con REG BTFSC 03H,2 ;brinca si no es uno el flag Z #registro != #num (diferente) MOVLW #num ;carga num a W SUBWF #registro,0 ;resta W con REG BTFSS 03H,2 ;brinca si no es cero el flag Z #registro > #num (mayor) MOVLW #num ;carga num a W SUBWF #registro,0 ;resta W con REG BTFSC 03H,0 ;brinca si no es uno el flag C #registro < #num (menor) MOVLW #num ;carga num a W SUBWF #registro,0 ;resta W con REG BCTSS 03H,0 ;brinca si no es cero el flag C etiqueta Los nombres o etiquetas deben de ser de 8 caracteres mximo y pueden llevar nmeros y letras siempre y cuando el primer carcter no sea un nmero. Tampoco se deben de poner carcter especiales como #$&+, etc. Las instrucciones de condicin estn diseadas como para que si se cumplen hace la instruccin que tienen a continuacin si no se brinca a la segunda instruccin que le sigue.

;brinca si no es uno

;brinca si no es cero

etiqueta

Instruccin

etiqueta

Instruccin de condicin

(Si)

Instruccin de condicin (ver tabla de condiciones) Una sola instruccin

Ejecuta una sola instruccin siempre y cuando se cumpla la condicin definida.

www.softdata.com.mx

Ing. Marcos Kitaoka Castro

Manual de Ensamblador para PICs

Instruccin de condicin (Si) GOTO END1 (No) Una sola instruccin END1 Si desea minimizar puede sustituirla con el siguiente cdigo. Se Invierte la Instruccin de condicin Una sola instruccin

Ejecuta una sola instruccin siempre y cuando no se cumpla la condicin definida.

(No)

(Si)

Instruccin de condicin (ver tabla de condiciones) GOTO etiqueta

Ejecuta un brinco incondicional a una etiqueta siempre y cuando se cumpla la condicin definida.

Instruccin de condicin (Si) GOTO END1 (No) GOTO etiqueta END1 Si desea minimizar puede sustituirla con el siguiente cdigo. Se Invierte la Instruccin de condicin GOTO etiqueta

Ejecuta un brinco incondicional a una etiqueta siempre y cuando no se cumpla la condicin definida.

(No)

Instruccin de condicin (ver tabla de condiciones) (Si) GOTO OK1 (No) GOTO END1 OK1 instruccin del Si instruccin del Si : END1 Si desea minimizar puede sustituirla con el siguiente cdigo. Se Invierte la Instruccin de condicin GOTO END1 instruccin del Si instruccin del Si :

Ejecuta varias instrucciones siempre y cuando se cumpla la condicin.

(No) (Si)

END1

www.softdata.com.mx

Ing. Marcos Kitaoka Castro

Manual de Ensamblador para PICs

(Si) (No)

Instruccin de condicin GOTO END1 instruccin del No instruccin del No :

Ejecuta varias instrucciones siempre y no cuando se cumpla la condicin.

END1

(Si) (No)

OK1 END1

Instruccin de condicin (ver tabla de condiciones) GOTO OK1 instruccin del No instruccin del No GOTO instruccin del Si instruccin del Si

Ejecuta una o varias instrucciones contempladas para el Si siempre y cuando se cumpla la condicin definida si en dado caso no se cumple ejecuta una o varias instrucciones contempladas para el No.

GOTO

etiqueta

Brinca a una lnea etiquetada en el programa. ; para llamar una subrutina Al terminar una subrutina regresa el control despus de la instruccin CALL de donde fue llamada. Ya en cdigo ensamblador las subrutinas deben de instansiarse antes de la instruccin END del programa Una subrutina puede llevar instrucciones, condiciones e incluso otras llamadas a subrutinas con excepcin de los brincos incondicionales (GOTO) fuera de la subrutina Hace una pausa en el programa de un tiempo definido por el programador.

CALL SUBRUTIN1

;********** etiqueta

subrutina SUBRUTINA1 ******** instruccin instruccin condicin : RETURN

Delay = 0.25 seg (clock = 4MHz) MOVLW 03H ; carga en W el tiempo de retardo de 0.25seg CALL DELAY ; llamada a subrutina ;************ subrutina DELAY ************* DELAY MOVWF 1AH ;contador 1 CLRF 1BH ;contador 2 CLRF 1CH ;contador 3 DELAY1 DECFSZ 1BH,1 GOTO DELAY1 DECFSZ 1CH,1 GOTO DELAY1 DECFSZ 1AH,1 GOTO DELAY1 RETURN

www.softdata.com.mx

Ing. Marcos Kitaoka Castro

Manual de Ensamblador para PICs

MOVLW 01H CALL TABLA1

; elegir con W la posicin de la tabla1 ; llamada a subrutina

Crea una tabla de datos. La posicin de La tabla a leer se da con el valor de W que se le suma al registro PCL y el resultado se carga en la misma W despus del llamado de la tabla

;************ subrutina TABLA1 ************* TABLA1 ADDWF 02H,1 ;carga a PCL la posicin de la tabla RETLW 10H ;posicin 0-carga a W el valor de 10H Posicin - > RETLW 20H ;posicin 1-carga a W el valor de 20H elegida RETLW 30H ;posicin 2-carga a W el valor de 30H RETLW 40H ;posicin 3-carga a W el valor de 40H RETURN

Ahora veremos un ejemplo de un programa que imprime en un display de 7 segmentos los nmeros 1-9.

www.softdata.com.mx

Ing. Marcos Kitaoka Castro

Manual de Ensamblador para PICs

El siguiente ejemplo se comporta como una AND donde RA0,y RA1 son entradas y RA2 salida.

Otra forma de realizar el diagrama de flujo seria de la siguiente manera:

www.softdata.com.mx

Ing. Marcos Kitaoka Castro

Manual de Ensamblador para PICs

Tabla de nemnicos o comandos para el PIC16F84A


No
1

Nemnico ADDWF f,d

INSTRUCCIONES QUE MANEJAN REGISTROS Descripcin Ejemplo


Suma el contenido del acumulador W con el registro f Si d = 0 el resultado se carga en W Si d = 1 se almacena en si mismo f
Antes: W = 7 , Puerto A(f => 0x5) = 13 Si el resultado es cero Cuando d=0 o d = diferente de 1 Z=1, si el resultado ADDWF 0x5 , 0 excede el rango de 8 Despus: W = 20 , Puerto A(f => 0x5) = 13 bits C y DC van a ser Cuando d=1 ADDWF 0x5 , 1 igual a uno Despus: W = 7 , Puerto A(f => 0x5) = 20 Antes: W = 5 , Puerto A(f => 0x5) = 10 Cuando d=0 o d = diferente de 1 ANDWF 0x5 , 0 Despus: W = 0 , Puerto A(f => 0x5) = 10 , Z=1 Cuando d=1 ANDWF 0x5 , 1 Despus: W = 5 , Puerto A(f => 0x5) = 0 , Z=1 Antes: Puerto A(f => 0x5) = 28 CLRF 0x5 Despus: Puerto A(F => 0x5) = 0 , Z = 1 Antes: W = 35 CLRW Despus: W = 0 , Z = 1

Ciclos

Flags

C DC Z

Multiplicacin lgica (AND) de bit a bit con el contenido del acumulador W con el registro f 2

ANDWF

f,d

Si d = 0 el resultado se carga en W Si d = 1 se almacena en si mismo f

3 4

CLRF f CLRW COMF f,d

Borra o pone a cero todo el registro f Borra o pone a cero el acumulador W Complementa el registro f

1 1

Z Z

Si d = 0 el resultado se carga en W Si d = 1 se almacena en si mismo f


Antes: W = 7 , Puerto A(f => 0x5) = 12 Cuando d=0 o d = diferente de 1 DECF 0x5 , 0 Despus: W = 11 , Puerto A(f => 0x5) = 12 , Z=1 Cuando d=1 DECF 0x5 , 0 Despus: W = 7 , Puerto A(f => 0x5) = 11 , Z=1 Decrementa el Puerto A, el resultado lo guarda en f y comprueba si es cero DECFSZ 0x5 , 1

Decrementa el registro f una unidad 6

DECF

f,d

Si d = 0 el resultado se carga en W Si d = 1 se almacena en si mismo f

Decrementa el registro f, si es cero salta la siguiente instruccin. 7

DECFSZ

f,d

Si d = 0 el resultado se carga en W Si d = 1 se almacena en si mismo f


Antes: W = 7 , Puerto A(f => 0x5) = 12 Cuando d=0 o d = diferente de 1 INCF 0x5 , 0 Despus: W = 13 , Puerto A(f => 0x5) = 12 , Z=1 Cuando d=1 INCF 0x5 , 0 Despus: W = 7 , Puerto A(f => 0x5) = 13 , Z=1

1(2)

Incrementa el registro f una unidad 8

INCF

f,d

Si d = 0 el resultado se carga en W Si d = 1 se almacena en si mismo f

www.softdata.com.mx

Ing. Marcos Kitaoka Castro

Manual de Ensamblador para PICs

INCFSZ

f,d

Incrementa el registro f, si es cero salta la siguiente instruccin Si d = 0 el resultado se carga en W Si d = 1 se almacena en si mismo f Suma lgica (OR) de bit a bit con el contenido del acumulador W con el registro f (sin acarreos de bits) Si d = 0 el resultado se carga en W Si d = 1 se almacena en si mismo f

Incrementa el Puerto A, el resultado lo guarda en f y comprueba si es cero INCFSZ 0x5 , 1

10

IORWF

f,d

Mueve el contenido del registro f 11

MOVF

f,d

Si d = 0 W toma el valor del registro f Si d = 1 se almacena en si mismo f

12 13 14

MOVWF f NOP RLF f,d

Mueve el contenido del acumulador W al registro f No espera Rota el registro f a la izquierda una posicin a travs del carry Si d = 0 el resultado se carga en W Si d = 1 se almacena en si mismo f Rota el registro f a la derecha una posicin a travs del carry Si d = 0 el resultado se carga en W Si d = 1 se almacena en si mismo f

Antes: W = 10 , Puerto A(f => 0x5) = 7 Cuando d=0 o d = diferente de 1 IORWF 0x5 , 0 Despus: W = 15 , Puerto A(f => 0x5) = 10 , Z=1 Cuando d=1 IORWF 0x5 , 1 Despus: W = 5 , Puerto A(f => 0x5) = 15 , Z=1 Antes: W = 7 , Puerto A(f => 0x5) = 12 Cuando d=0 o d = diferente de 1 MOVF 0x5 , 0 Despus: W = 12 , Puerto A(f => 0x5) = 12 , Z=1 Cuando d=1 MOVF 0x5 , 0 Despus: W = 7 , Puerto A(f => 0x5) = 12 , Z=1 Antes: W = 5 , Puerto A(f => 0x5) = 125 MOVWF 0x5 Despus: W = 5 , Puerto A(f => 0x5) = 5 NOP

1 1 1 C

15

RRF

f,d

1
Antes: W = 7 , Puerto A(f => 0x5) = 13 Cuando d=0 o d = diferente de 1 Si el resultado es cero SUBWF 0x5 , 0 Z=1, si el resultado es Despus: W = 20 , Puerto A(f => 0x5) = 13 negativo C y DC van Cuando d=1 a ser igual a uno SUBWF 0x5 , 1 Despus: W = 7 , Puerto A(f => 0x5) = 20 Antes: Puerto A(f => 0x5) = A5H Cuando d=0 o d = diferente de 1 SWAPF 0x5 , 0 Despus: W = 5AH , Puerto A(f => 0x5) = A5H Cuando d=1 SWAPF 0x5 , 1 Despus: Puerto A(f => 0x5) = 5AH Antes: W = 10 , Puerto A(f => 0x5) = 7 Cuando d=0 o d = diferente de 1 XORWF 0x5 , 0 Despus: W = 13 , Puerto A(f => 0x5) = 7 , Z=1 Cuando d=1 XORWF 0x5 , 1 Despus: W = 10 , Puerto A(f => 0x5) = 13 , Z=1

Resta el contenido del acumulador W con el registro f 16

SUBWF

f,d

Si d = 0 el resultado se carga en W Si d = 1 se almacena en si mismo f

C DC Z

17

SWAPF

f,d

Intercambia los cuatro bits menos significativos hacia los cuatro bits mas significativos y los bits mas significativos hacia los menos significativos. Si d = 0 el resultado se carga en W Si d = 1 se almacena en si mismo f

OR Exclusiva (XOR) de bit a bit con el contenido del acumulador W con el registro f

18

XORWF

f,d

Si d = 0 el resultado se carga en W Si d = 1 se almacena en si mismo f

www.softdata.com.mx

Ing. Marcos Kitaoka Castro

Manual de Ensamblador para PICs

10

No
19 20 21 22

Nemnico BCF BSF BTFSC BTFSS f,d f,d f,d f,d

INSTRUCCIONES QUE MANIPULAN BITS Descripcin Ejemplo


Borra o pone a cero el bit ( d ) del registro f Pone a uno el bit ( d ) del registro f Comprueba un bit ( d ) de f y salta la siguiente instruccin si es 0 Comprueba un bit ( d ) de f y salta la siguiente instruccin si es 1
Antes: Puerto A(f => 0x5) = 11111111=255 BCF 0x5 , 2 Despus: Puerto A(f => 0x5) = 11111011=251 Antes: Puerto A(f => 0x5) = 00000000 = 0 BSF 0x5 , 2 Despus: Puerto A(f => 0x5) = 00000100 = 4 Comprueba si el Puerto A el bit 2 es cero BTFSC 0x5 , 2 Comprueba si el Puerto A el bit 2 es uno BTFSS 0x5 , 2

Ciclos

Flags

1 1
1(2) 1(2)

No
23 24 25 26 27 28 29

Nemnico ANDLW CALL k k

INSTRUCCIONES DE CONTROL Y DE OPERANDOS INMEDIATOS Descripcin Ejemplo


Multiplicacin lgica (AND) inmediato con W Llamada a subrutina Borra Watchdog y el prescaler. TO y PD se ponen a 1 Salto incondicional Suma lgica (OR) inmediato con W Mueve a W un valor inmediato El contenido de W se carga en el registro OPTION. Este es un registro de slo escritura donde se configura el funcionamiento del prescaler y el TMR0.
Antes: W = 7 , k = 13 ANDLW 0DH Despus: W = 20 , Z=1 k = CUENTA => nombre o etiqueta de una subrutina CALL CUENTA CLRWDT k = INICIO => nombre o etiqueta de lnea de cdigo GOTO INICIO Antes: W = 10 , k = 7 IORLW 07H Despus: W = 15 , Z=1 Antes: W = 10 , k = 7 MOVLW 07H Despus: W = 7 Antes: W = 10 OPTION = 5 OPTION Despus: W = 10 , OPTION = 10 RETLW k1 RETLW k2 : RETLW kn SLEEP Antes: W = 255 TRIS 05H Despus: TRIS (Puerto A) = 255 Antes: W = 10 , k = 7 XORLW 07H Despus: W = 13 , Z=1

Ciclos

Flags

1 2 1 2 1 1 1

CLRWDT k GOTO IORLW MOVLW OPTION RETLW SLEEP TRIS XORLW f k k k k k

TO PD

30

W carga el valor k y el PC toma el valor de TOS (contenido de la cima stack) Pasa a estado de reposo. Al salir, activa el bit de estado TO y borra el PD, WTD y el prescaler. Al entrar en modo SLEEP se detiene el oscilador Carga el valor de W al TRIS f para configurar entradas y salidas OR Exclusiva (XOR) exclusiva inmediato con W

2 TO PD

31 32 33

1 1
configurado como entrada de datos

www.softdata.com.mx

Ing. Marcos Kitaoka Castro

Manual de Ensamblador para PICs

11

www.softdata.com.mx

Ing. Marcos Kitaoka Castro

Manual de Ensamblador para PICs

12