Академический Документы
Профессиональный Документы
Культура Документы
PRCTICA 2:
-1-
1. Objetivos
Introducir al alumno en la programacin en ensamblador Conocer los tipos de direccionamiento en los PICs Simular el funcionamiento de programas-ejemplo.
La especificacin de la base en la que se expresan los datos u operandos es opcional: d65, b01000001,0x41, o101 y A son el mismo dato. El sufijo d o D se emplea para expresar un valor en decimal. El sufijo b o B expresa un valor en binario. Para expresar un valor en hexadecimal se emplea el sufijo 0x 0X. Un nmero en base octal se representa mediante el sufijo o O . Finalmente, un valor se puede expresar mediante un caracter ASCII si se encierra entre comillas simples como A.
-2-
MOVWF INDF INDF no est implementado fsicamente, por lo que no se acceder realmente a l. Si en cualquier instruccin se opera con este registro, en realidad se estar operando con la direccin a la que apunte el contenido de FSR. El direccionamiento indirecto nos permite crear rutinas generales que no usen registros especficos. Las direcciones de dichos registros se asignarn antes de entrar en la rutina. Lo nico extrao es el modo de notacin MOVWF INDF. Esta instruccin desplaza el contenido del registro de trabajo W al registro apuntado por FSR. Ya se ha indicado que ha de introducirse en FSR el nmero del registro direccionado, que ser empleado como puntero. Este modo de direccioamento permite acceder a 256 direcciones.
-3-
-4-
-5-
0x00 Inicio 0x05 Dato_B,W Dato_A,W STATUS,Z A_igual_B STATUS,C A_mayor_B Dato_A,W Dato_B,W Resultado Stop
;Salva el vector de interrupcin ;Carga el dato B ;Resta/compara con dato A ;Son iguales (Z=1)?? ;Si ;No. A mayor que B (C=0)?? ;Si ;No, A es menor que B ;Suma a ms B ;Guarda el resultado
Inicio
movf subwf btfsc goto btfsc goto movf addwf movwf goto
A_menor_B
A_mayor_B
A_igual_B Stop
-6-
3.2. Ejercicio:
Disead un programa que realice la suma del contenido de las posiciones de memoria 0x10, 0x12 y 0x14 y compare el resultado de la suma con el contenido de la posicin de memoria 0x16. Si el resultado de la comparacin es 0 que guarde el resultado de la suma en la posicin de memoria 0x20, si es mayor que 0 (suma>[0x16]), que decremente los contenidos de las posiciones de memoria 0x10, 0x12 y 0x14 en una unidad y repita el proceso de la comparacin; y si la comparacin es menor que 0 (suma<[0x16]), que aumente los contenidos de las posiciones de memoria 0x10, 0x12 y 0x14 en una unidad y repita el proceso de la comparacin.
;Carga el contador con 15 (en decimal) ;Inicia puntero con direccin inicial ;Carga patrn a almacenar ;Almacena patrn en pos. indicada por FSR ;Incrementa el puntero FSR ;Decrementa contador hasta llegar a 0 ;Contador no es 0 ;Poner breakpoint de parada
Bucle
movwf INDF incf FSR,F decfsz Contador,F goto Bucle nop nop end
Stop
-7-
3.4. Ejercicio:
Modificad el programa anterior para que almacena el patrn AA, 10 veces seguidas en la memoria de datos, empezando desde la direccin 0x30.
3.5. Ejercicio:
Modificad el programa anterior para que almacena el patrn 012345, 10 veces seguidas en la memoria de datos, empezando desde la direccin 0x10.
-8-
3.6. Ejercicio:
Cread un proyecto y simulad el funcionamiento del siguiente programa que realiza el producto de dos nmeros de 8 bits generando un resultado de 16 bits. El programa emplea la misma mecnica que al hacer un producto sobre el papel. Hay que destacar que el programa se ejecuta siempre en el mismo intervalo de tiempo, sean cuales fueren los operandos
;EJEMPLO 3 List p=16F84 ;Tipo de procesador include "P16F84.INC" ;Definiciones de registros internos cblock 0x10 ;Inicio de definicin de variables ;Variable para el multiplicando ;Variable para el multiplicador ;Parte alta del resultado ;Parte baja del resultado ;Reg. de estado temporal ;Variable con nmero de veces a operar ;Fin de definiciones 0x00 Inicio 0x05 ;Vector de Reset
Multiplicando Multiplicador Resultado_H Resultado_L Estatus_Temp Contador endc org goto org Inicio clrf movlw movwf bcf Bucle
clrf Resultado_H Resultado_L ;Pone a 0000 el resultado inicial 0x08 Contador ;Inicia el contador con 8 STATUS,C ;Borra el carry ;Carga el multiplicando ;Es 1 el bit de menos peso del multiplicador ?? ;Si, se suma el multiplicando
movf Multiplicando,W btfsc Multiplicador,0 addwf Resultado_H,F rrf rrf Resultado_H,F Resultado_L,F
;Rota a la derecha el multiplicador sin que se modifique el flag Carry Rota_sin_Carry movwf rrf movf movwf movf STATUS,W Estatus_Temp Multiplicador,F Estatus_Temp,W STATUS
;Salva temporalmente el carry ;Desplaza a la derecha el multiplicador ;Recupera el carry original ;Repite el bucle 8 veces
-9-
- 10 -