P01 Programacion en Ensamblador

Laboratorio de Microprocesadores II Docente: Ing. Roger Guachalla Narváez [email protected] PRACTICA 01: Programación e

Views 149 Downloads 0 File size 1MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Laboratorio de Microprocesadores II

Docente: Ing. Roger Guachalla Narváez [email protected]

PRACTICA 01: Programación en Ensamblador I.

Objetivo Realizar programas con retardos, bucles y toma de decisiones en lenguaje ensamblador PIC18F4550

II.

Algoritmos de programación

Aritmética Los microcontroladores PIC18F cuentan con las siguientes instrucciones aritméticas:  Para efectuar operaciones de suma: ADDWF f, d Suma el valor de w al registro f guardándolo en w o f ADDLW k Suma el valor de w al literal (número) k guardándolo en w  Para efectuar operaciones de resta: SUBWF f, d Resta al valor del registro f el valor de w (f-w) guardándolo en w o f SUBLW k Resta al valor del literal k el valor de w (k-w) guardándolo en w  Para realizar multiplicaciones por 2. RLNCF f, d Rota a la izquierda el valor del registro f guardándolo en w o f  Para realizar divisiones entre 2. RRNCF f, d Rota a la derecha el valor del registro f guardándolo en w o f  Para realizar la operación de multiplicación entre enteros: MULWF f Multiplica el valor del Acumulador con el valor del Registro f

Restar del acumulador Para restar un valor al acumulador se utiliza ADDLW y se le suma el complemento a 2 del valor a restar.

Ejemplo: Restar w – 1 Para restar 1 al acumulador se utiliza ADDLW 0xFF, en lugar de SUBLW 0x1 porque esta instrucción no resta el literal a w, sino al revés, al literal le resta w. Por lo tanto, para restar un literal de w debemos sumar el complemento a 2 del literal con w, en nuestro caso el literal es 1 (0000 0001 b) y el complemento a 2 de 1 es FFh: 0000 0001 1111 1110 +1 ----------1111 1111 (FF h)

Multiplicación de Enteros Multiplica el Acumulador con un Registro f. El resultado de esta operación se guarda en los registros PRODH y PRODL

Ejemplo: MOVLW MOVWF MOVLW MULWF

52h Dato 48h Dato

;Dato tiene el valor 52h ;El acumulador vale 48h ;Multiplicar 52h*48h=1710h ;PRODH=17h y PRODL=10h

Banderas (Flags) Las banderas se utilizan para dar información adicional cuando se realizan operaciones lógicas y aritméticas dentro del microcontrolador. Así, se puede tomar decisiones según el valor de cada una de las banderas. Existen diferentes tipos de banderas en un microcontrolador:

Las banderas en la suma Los registros básicos del microcontrolador PIC18F4550 tienen una longitud de 8 bits expresados en forma binaria, lo cual quiere decir que el número máximo expresado en forma decimal será el 255. En la suma existen tres tipos de banderas que pueden proporcionar mayor información del resultado. Estas banderas son denominadas CARRY (C), Acarreo de Dígito (DC) y el Estado Cero (Z). Todas estas banderas son activadas según sea el caso. Por ejemplo, en la suma, la bandera CARRY se coloca en "1" cuando el resultado supera el número 255 y permanecerá en "0" indicando que no se presentó ningún rebalse (overflow); es decir que el resultado de la suma fue menor que el máximo permitido. Por otro lado, existe otra bandera denominada Acarreo de Dígito DC que expresa lo que sucede con los 4 Bits menos significativos; es decir, si los cuatro bits menos significativos sobrepasan al número 15 (2 elevado a 4, incluyendo el cero) expresado en forma decimal, entonces la bandera DC = 1, en el caso contrario será "0". Finalmente, la bandera de estado Z se activa cuando la operación aritmética da como resultado un "1"; de lo contrario se coloca en "0".

Las banderas en la resta En la resta de dos números la bandera CARRY (C) se coloca en "1" cuando el resultado de la operación sea un número positivo, o se pone en cero para el caso contrario. Esto quiere decir por ejemplo que si A=20 y B=10 donde X=A-B; el resultado será X=10 (número positivo) y C=1; para el caso contrario si A=10 y B=20 donde X=A-B entonces X= - 10, obteniéndose un resultado negativo y C=0. La bandera de acarreo de dígito DC se colocará en "1" cuando los cuatro bits menos significativos del registro w sea menor que los cuatro bits menos significativos del registro que se desea restar, en caso contrario se colocará un cero. La bandera de estado Z solamente se activará cuando ambas cantidades sean iguales.

Operaciones de comparación Las operaciones de comparación utilizan la instrucción de resta.

Igualdad Supongamos que estamos intentando determinar si un número es igual a 2. MOVLW SUBWF BTFSS GOTO GOTO

.2 N, W ; W = N - 2 STATUS, Z NO_ES_IGUAL ES_IGUAL

Al número a comprobar (N) se le resta la cantidad de comparación (2) que se ha guardado en W. El resultado vuelve a guardarse en W para salvaguardar la variable N. Finalmente se comprueba la bandera Zero del registro Status.

Mayor que y menor que Para determinar si un número es mayor o menor de 2, una posibilidad es la siguiente: MOVLW SUBWF BTFSS GOTO GOTO

.2 N, W ; W = N - 2 STATUS, C MENOR MAYOR_IGUAL

Aquí se comprueba la bandera de acarreo C (Carry). Si Carry es 1 el resultado es positivo y si es 0 es negativo. Así, si N=20 then …. Opción por verdadero

Else …. Opción por falso Endif

movlw movwf movlw subwf btfss goto Verdadero: goto Falso:

.10 A .20 A,W STATUS,C Falso ;Opción por verdadero Listo ;Opción por falso

Listo:

do - case Do case Case A=1 …. Instrucciones Case A=10 …. Instrucciones CaseElse (Si no es ninguno de los anteriores) …. Instrucciones Endcase

while

movlw .1 xorwf A,W btfss STATUS,Z goto skip01 ;Instrucciones para A=1... goto FinalCase skip01: movlw .10 xorwf A,W btfss STATUS,Z goto skip10 ;Instrucciones para A=10... goto FinalCase skip10: ;Instrucciones para CaseElse FinalCase: ;...

Bucle: movf btfss goto

while(b=0) … Repetir hasta que B=0

SalirBucle:

B,F STATUS,Z Bucle ;...

wend

for For K=1 to 10 step 1 …. Instrucciones Next K

movlw movwf BucleFor: incf movf xorlw btfss goto ;...

.1 K ;Instrucciones K, F K, W .10 STATUS,Z BucleFor

Temporización Algoritmo de Retardos A veces se requiere introducir ciertos retardos de tiempo. Estos retardos se pueden obtener mediante hardware o por medio de ciclos repetitivos basados en software. Los retardos basados en software se realizan mediante un bucle e incrementando o disminuyendo un contador que cuando pase por cero hará que se salga de la condición. Como se sabe, un ciclo máquina es el tiempo utilizado por el microcontrolador para realizar sus operaciones internas y equivale a 4 ciclos de reloj u oscilador. Por lo tanto: 𝑓𝐶𝑀 =

𝑓𝑋𝑇𝐴𝐿 4 → 𝑇𝐶𝑀 = = 4 ∗ 𝑇𝑋𝑇𝐴𝐿 4 𝑓𝑋𝑇𝐴𝐿

Como cada instrucción necesita 4 ciclos de reloj para que se ejecute, si se usa un cristal de 4 MHz cada instrucción ocupará 1 microsegundo, a no ser que el contador del programa se modifique. El número de ciclos máquina utilizados por una instrucción para ser ejecutada depende de la misma. Las instrucciones que modifican el contador de programa necesitan dos ciclos máquina, mientras que todas las demás necesitan tan solo uno. De esta manera las instrucciones de salto necesitan 2 ciclos máquina para ejecutarse. La velocidad a la que se ejecuta el código (instrucciones) depende de la velocidad del oscilador y del número de ciclos-máquina ejecutados. Las instrucciones necesitan 1 o 2 ciclos de máquina para ser ejecutadas. El hecho de generar ciclos repetitivos por medio del programa y calcular el tiempo total de ejecución nos ayuda a generar tiempos precisos. La siguiente figura muestra un ejemplo de ciclo repetitivo:

Este algoritmo consume ciclos de la siguiente manera:

OPERACIÓN

CICLOS

la carga de k en W la carga de W en el contador el decremento del contador mientras no llegue a cero el decremento del contador cuando llegue a cero el salto a Loop

1c 1c k-1 2c 2 * (k - 1)

Total:

(3 * k) + 1

Por cada instrucción agregada debe incluirse en la cuenta total el número de ciclos correspondiente a dicha instrucción.

Trabajando a 4 MHz y asumiendo que k se remplaza por el valor 15 en decimal en el ejemplo se tendrá un tiempo igual a: Número de ciclos = (3*15) +1 = 46 ciclos máquina Tciclo máq. = 4 / 4 Mhz = 1 μs, el tiempo total entonces será de 46 μs.

Ejemplo: Rutinas MSEC1 y MIC4. Con un cristal de 4 MHz, MIC4 tarda en ejecutarse 4 microsegundos y haciendo uso de esto, MSEC1 proporciona un retardo de 1 milisegundo al ejecutar 249 veces MIC4: MSEC1: MOVLW 0xF9 NOP MIC4: ADDLW 0xFF BTFSS STATUS, Z GOTO MIC4 RETURN

;Carga 249 en el acumulador ;Por la llamada a la subrutina CALL MSEC1 ;Substraer 1 de W ;Revisar si se llegó a cero ;Si no llega a cero vuelve a restar

Un milisegundo son 1000 microsegundos, de manera que se necesita ocupar 1000 ciclos de reloj en la subrutina MSEC1. El bucle MIC4 - GOTO MIC4 necesita 4 microsegundos para ejecutarse:   

ADDLW toma 1 microsegundo BTFSS toma otro microsegundo GOTO necesita 2 microsegundos

Para restar 1 al acumulador se utiliza ADDLW 0xFF, en lugar de SUBLW 0x1 porque esta instrucción no resta el literal a w, sino al revés, al literal le resta w. Por lo tanto, para restar un literal de w se debe sumar el complemento a 2 del literal con w, en nuestro caso el literal es 1 (0000 0001 b) y el complemento a 2 de 1 es FFh: 0000 0001 1111 1110 +1 ----------1111 1111 (FFh) Después de restar, la subrutina MIC4, comprueba la bandera Z en el registro STATUS, que será puesto a uno cuando la resta sea 0. La comprobación del bit tarda un microsegundo a menos que se realice el salto, en cuyo caso se efectúa en 2 microsegundos. Ciclos de instrucción (c) de la subrutina: ETIQUETA MSEC1 MIC4

INSTRUCCIÓN MOVLW 0xF9 NOP ADDLW 0xFF BTFSS STATUS,Z GOTO MIC4 RETURN

CICLOS 1c 1c 1c 1c, 2c al saltar 2c 2c Total, 1000 c

TOTAL MIC4 => (249 * 4c) + 1c = 996 c

Como puede observarse después de ejecutar CALL MSEC1 transcurrirán 1000 ciclos de reloj, esto es 1 milisegundo antes de pasar a la siguiente instrucción. La subrutina no utiliza ningún registro aparte de w. Para periodos de tiempo más largos deberán utilizarse otros registros. La siguiente rutina es llamada con el número de milisegundos que deberán transcurrir dentro del acumulador según el valor de la variable CNTMSEC. Hace uso de la rutina MIC4. Se pueden realizar retardos de hasta un cuarto de segundo (1 - 255 msec): NMSEC: MSLOOP:

MOVWF MOVLW CALL NOP NOP DECFSZ GOTO RETURN

CNTMSEC 0xF8 MIC4

;Mover W al registro de cuenta de miliseg

CNTMSEC,f MSLOOP

;Decrementar el contador y revisar si es cero ;Vuelve a realizar el bucle ;Retornar

;248*4 + 2 = 994 ;Realizar el resto del bucle añadiendo 8 microseg

Programas en Lenguaje Ensamblador III. Ejemplo A: Contador Binario ASM a. Descripción Por el puerto RB se muestran en 8 leds un contador binario de 8 bits, desde: 00000000 (0) hasta 11111111 (255) para luego iniciar nuevamente en 0. Para poder observar los valores de conteo, se realiza un retardo después de cada valor de salida.

b. Diagrama Esquemático

c. Archivo fuente Ensamblador

IV.

Ejemplo B: Cálculo del área de un círculo sin uso de la instrucción de multiplicación a. Descripción La ecuación que permite calcular el área de un círculo es: 𝐴 = 𝜋𝑟 2 donde r es el radio. Debido a que el procesador solo maneja números enteros de manera directa, se usará la aproximación 𝜋 ≈ 3

b. Diagrama Esquemático

c. Archivo fuente Ensamblador

V.

Procedimiento Experimental en Laboratorio a) Tomar el Número de C.I. del primer integrante de Grupo, escribirlo en la Carátula. b) Obtener los siguientes valores:  Altura = Último dígito del C.I.  Frecuencia = Penúltimo dígito del C.I. *** Si alguno de los valores fuese cero (0), reemplazarlo por 4 Ejemplo: C.I. = 2711073 Altura=3 Frecuencia=7

Primera Firma: Volumen de un cilindro Realizar y depurar en Proteus un programa que calcule el Volumen de un cilindro: 𝑉𝐶 = 𝜋𝑟 2 ℎ Algoritmo del programa:  Radio (r) se ingresa por 4 switch conectados al nibble inferior del puerto RB (RB0…RB3)  Altura (h) es el valor obtenido del último dígito del C.I. y se incluye directamente en el programa  El valor de π se aproximará con el valor de 3  El Volumen se muestra en 8 leds conectados al puerto RD  Se regresa al inciso a)

Segunda Firma: Generador de Señal de Frecuencia kHz Realizar y depurar en Proteus un programa que genere una señal cuadrada de Frecuencia KHz de frecuencia por un pin de salida digital del PIC18F4550. Para ver la señal incluir el osciloscopio virtual en Proteus.

VI.

Informe de laboratorio I. II.

III.

Firmas del Docente en la Carátula que avalen los procedimientos realizados en Laboratorio TRABAJO DE INVESTIGACION: Registros de Función Especial SFR del PIC18F4550  Resumen escrito a mano (de un mínimo de 4 páginas)  Incluir Fuentes de Información (direcciones web, bibliografía) Conclusiones