Está en la página 1de 13

1 Objetivos

1-1 Objetivos Generales

1-2 Objetivos Específicos


1. Describir el funcionamiento del set de instrucciones completo del PIC.
2. Conocer los modos de direccionamiento y control de los datos en las distintas memorias de los
PIC.
3. Simular programas basados en el PIC16f84, para control y procesamiento de datos.
4. Aprender a usar las librerías de la programación del PIC para aprovechar y profundizar en el
desarrollo de aplicaciones de alto nivel.
5. Realizar un set de librerías para estructura los programas y facilictar la compresión del código y
reutilizar los programas.
6. Desarrollar programas para manipulación de datos
7. Saber cómo se define el juego de instrucciones de un procesador.
8. Conocer los tipos de instrucciones más habituales en el juego de instrucciones de un
computador de propósito general.
9. Saber cómo funciona cada una de las instrucciones del juego de instrucciones.
10. Aprender las nociones básicas necesarias para utilizar un juego de instrucciones de
bajo nivel.
11. Familiarizarse con las maneras de referenciar un dato en una instrucción.

2- Marco Teórico

2-1 Instrucciones
La mayoría de los programas se escriben en lenguajes de alto nivel, como C++, Java o
Pascal. Para poder ejecutar un programa escrito en un lenguaje de alto nivel en un procesador,
este programa se debe traducir primero a un lenguaje que pueda entender el procesador,
diferente para cada familia de procesadores. El conjunto de instrucciones que forman este
lenguaje se denomina juego de instrucciones o repertorio de instrucciones.
Para poder definir un juego de instrucciones, habrá que conocer bien la arquitectura del
computador para sacarle el máximo rendimiento; en este módulo veremos cómo queda definido
un juego de instrucciones según una arquitectura genérica.

2-2 Ciclo de ejecución

Ejecutar un programa consiste en ejecutar una secuencia de instrucciones, de manera que cada
instrucción lleva a cabo un ciclo de ejecución. Esta secuencia de instrucciones no será la
secuencia escrita que hacemos de un programa, sino la secuencia temporal de ejecución de las
instrucciones considerando las instrucciones de salto.

Diferencias en las fases del ciclo de ejecución

Las fases del ciclo de ejecución son comunes en la mayoría de los computadores actuales y las
diferencias principales se encuentran en el orden en el que se llevan a cabo algunas de las
operaciones de cada fase o en el que se hacen algunas de las operaciones en otras fases.

2-3Tipos de Direccionamiento

2-3-1 Direccionamiento Inmediato

El valor del dato inmediato (su valor literal) lo contiene el mismo código de operación que, en la
ejecución de la instrucción, se carga en el registro W para su posterior procesamiento. Por Ejemplo
IORLW Constante..
2-3-2 Direccionamiento Directo

La dirección de memoria RAM se encuentra en el mismo código de operación. Por ejemplo,


MOVWF TMR0 o ADDWF Variable.

2-3-3 Direccionamiento de BIT

Procesa datos de un bit. La dirección del dato es un bit. Porejemplo BCF STATUS,RP0.

2-3-4 Direccionamiento Indexado

Utilizado para manejar tablas mediante la instrucción Por ejemplo ADDWF PCL,F.

2-3-5 Direccionamiento Indirecto

El registro FSR sirve como puntero para direccionamiento indirecto además de servir para
seleccionar el banco activo. La posición 00 del mapa de RAM es la llamada dirección indirecta.

Si en cualquier instrucción se opera con la dirección 00, en realidad se estará operando con la
dirección a donde apunte el contenido del FSR.

Por ejemplo si el FSR contiene el valor 1Ah, una instrucción que opere sobre la dirección
0, en realidad lo hará sobre la dirección 1Ah. Puede decirse que la posición 1Ah de memoria fue
direccionada en forma indirecta a través del puntero FSR.

Ejemplo :

; Este programa borra 8 posiciones de memoria a partir de la dirección 1A

FSR  equ  04         ;(definición del puntero FSR)

movlw 8 ;prepara para repetir 8 veces


movwf DATO ;(el registro DATO es el contador del bucle)
movlw 1Ah ;apunta a la dirección 1Ah

movwf FSR ; guarda en FSR la dirección 1Ah


bucle clrf 0 ; borra una posición de memoria (pone a cero)
incf FSR ; apunta a la siguiente
decfsz DATO ;si todavía no borró todas (aún no es cero)
goto bucle ;salta a bucle (sigue borrando)

El direccionamiento indirecto es muy útil para procesar posiciones consecutivas de memoria


(como en el ejemplo) o para el direccionamiento de datos en subrutinas.
3- Lista de Materiales
Parte 5
 1 PIC16F84A
 8 Leds
 13 Resistencias
 8 pulsadores
B.- Parte Experimental

1.- Dado los siguientes datos localizado en la memoria de dato del PIC, realice un
programa que ordene de menor a mayor dichos datos en el mismo segmento de memoria,
realice un diagrama de flujo, comente cada línea de programa, pruebe en el simulador
MPLAB.

10 11 12 13 14 15 16 17 18 19
0x38 0x45 0x28 0xf0 0x33 0xe9 0x55 0xaa 0x78 0x31

2.- Para asegura que el código anterior ordena cualquier estructura de datos proponga un
programa que coloque en el segmento de memoria 10H – 19H, bytes aleatorios, indique
que método propone para garantizar que los datos son completamente aleatorios y no
puedan ser determinístico. Realice un diagrama de fluj0 y comente cada línea. Pruebe en
conjunto con la parte experimental 1.

3.- Aplicando la frecuencia de Nyquist se adquirieron los datos representados en la tabla 1,


en la memoria de datos con una frecuencia de muestreo de 1.6 kHz. Se sabe que los
datos son Enteros con signos, asi que se debe:

3.1.- Graficas apropiadamente los datos obtenidos siendo la dirección 0F el


inicio y la dirección 2F la final, para ello la dirección de inicio es el origen del sistema
cartesiano.

3.2.- Realizar una librería para que cuando se obtenga un data en ese rango se
procese los siguiente parámetros estadísticos:
Max_punto.INC Debe indicar cual es el valor máximo y en que posición de memoria se
encuentra. Min_Punto.INC  Debe indicar cual es el minimo valor y en que posición de
memoria se encuentra. Average.INC  Halla el valor medio de los datos representados.
RMS.INC  Halla el valor absoluto de los datos representados (para este caso asuma que
la señal es sinusoidal).
Cada librería debe tener su documentación en la cabecera del programa y comentarios en
cada línea de código, y su debido diagrama de flujo. Los resultados siempre deben
devolverse en el Registro de trabajo y en la dirección 0x0C, en caso Max_Punto. INC,
Min_Punto.INC la dirección que indica el resultado obtenido.

Tabla #1.

3.3.- Realice un programa principal que pruebe cada librería.


4.- Realice la ingeniería en reverso para probar, evaluar, reasegurar y comprender el
siguiente programa que forma parte de la librería de Aritmetica.inc, explique con detalles
el principio de funcioamiento del programa y realice el diagrama de flujo. Realice varias
corridas para que indique que hace el programa.

Arit_Multiplicando EQU Arit_Operando_1L


Arit_Multiplicador EQU
Arit_Operando_2L
Arit_Producto_H EQU Arit_Resultado_1H
Arit_Producto_L EQU Arit_Resultado_1L

Arit_Multiplica_8Bit
clrf Arit_Producto_H ; En principio el resultado es
cero. clrf Arit_Producto_L
movlw .8 ; Carga el contador de 8
bits. movwf Arit_ContadorBits
movf Arit_Multiplicando,W ;Carga el
multiplicando. Arit_MultiplicaBit8
Rrf Arit_Multiplicador,F ;Va comprobar el siguiente bit del
multiplicador. btfsc STATUS,C ; Si el bit del multiplicador es
"1"
addwf Arit_Producto_H,F ;suma el resultado parcial anterior más el
multiplicando. Rrf Arit_Producto_H,F ; Desplaza el resultado parcial un
lugar hacia la
Rrf Arit_Producto_L,F ; derecha, introduciendo un "0" por la
izquierda. Decfsz Arit_ContadorBits,F ; ¿Ha multiplicado los 8 bits?
goto Arit_MultiplicaBit8 ; Repite la
operación. return

El formato general el código anterior es una librería perteneciente a una librería que contiene
diversas funciones matemáticas, lo primeros que haremos será aguarla las variables de entrada
de la función de la cual fue llamada y reescribir sus valores en las variables que utilizara las
secciones de nuestra sub rutinas, luego resetearemos nuestras variables por si acaso si queso un
dato residual de otra operación, en la siguiente instrucción cargaremos una variable con un valor
8 permitiendo de que se realice la operación con los 8 bits del Multiplicando, luego procederemos
a realizar la multiplicación de los números que van a hacer la operación ,lo que haremos será
rotar a la derecha el bit menos significativo ,posterior a ello comprobaremos que el bit Carry del
registro STATUS es 0 con lo cual si es 1 sumara lo que sea que este en W a Arit_Producto_H luego rotara
a la derecha el bit menos significativo a la derecha de la variable Arit_Product_L este proceso se repetirá
hasta que Arit_ContadorBits,F sea igual a cero para ello decrementara en 1 y sse guardara el resultado
en el mismo
5.- Dado el programa abajo representado, comente adecuadamente cada instrucción con
precisión, explique que hace el programa con exactitud y elabore un Diagrama de Flujo.
Implemente en Proteus colocando la entrada con Logic_Toggle y la salida con un tren de
diodos.

Si en PortA=(Indique su ultimo digito del expediente), indique el valor PortB=

INCLUDE <P16F84A.INC> ; Incluye la librería del PIC16F84A.


__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ; Configuracion del
PIC.

ORG 0 ; El programa comienza en la dirección 0.

Inicio; Etiqueta que indica el inicio del programa.


bsf STATUS,RP0 ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
CLRF PORTB ; Configuramos el PORTB como salida
MOVLW H'1F' ;Movemos un literal a W para configurar
MOVWF PORTA ;el PORTA como entrada
bcf STATUS,RP0 ; Pone a 0 el bit 5 del STATUS. Acceso al Banco 0.
Principal ; Etiqueta que indica el programa principal.
MOVF PORTA,W ;Extraemos lo que hay en la entrada a W
ANDLW B'00011111' ;Realizamos una mascara para con la compuerta and para
quedarnos con la entrada
CALL Prende_LEDs ;Llamamos a una subrutina que permite encender los Leds
MOVWF PORTB ;Movemos la salida de nuestra subrutina anterior al PORTB
GOTOPrincipal ;Nos movemos a la subrutina Principal

Prende_LEDs ; Etiqueta que indica elPrende_LEDs_LEDs del programa.


ADDWF PCL,F ;Sumamos el valor que esta en W al Contador del Programa
Tabla
retlw B'00000000' ;Enciende 0 Leds
retlw B'00000000' ;Enciende 0 Leds
retlw B'00000001' ;Enciende 1 Leds
retlw B'00000011' ;Enctttiende 2 Leds
retlw B'00000111' ;Enciende 3 Leds
retlw B'00001111' ;Enciende 4 Leds
retlw B'00011111' ;Enciende 5 Leds
retlw B'00111111' ;Enciende 6 Leds
retlw B'01111111' ;Enciende 7 Leds
retlw B'11111111' ;Enciende 8 Leds
retlw B'11111111' ;Enciende 8 Leds
retlw B'11111110' ;Enciende 7 Leds
retlw B'11111110' ;Enciende 7 Leds
retlw B'11111100' ;Enciende 6 Leds
retlw B'11111000' ;Enciende 5 Leds
retlw B'11110000' ;Enciende 4 Leds
retlw B'11100000' ;Enciende 3 Leds
retlw B'11000000' ;Enciende 2 Leds
retlw B'10000000' ;Enciende 1 Leds

end
PALACIKOS E., REMIRO F., LOPEZ L., (2009) Microcontrolador PIC16F84,
Desarrollo de proyectos, 3era Edición. Mexico: Alfaomega

ANGULO, J. (2006). Microcontroladores PIC Diseño práctico de


aplicaciones. Caracas: McGraw Hill.

MORRIS-MANO, M. (1987). Diseño Digital. Mexico: Prentice Hall.


Anexos
Fiura 1 Direccionamiento Inmediato.

Figura 2 Direccionamiento Absoluto.

Figura 3 Direccionamiento Indirecto.

Figura 4 Direccionamiento paginado.

También podría gustarte