Está en la página 1de 66

Tecnológico Nacional de México

Campus Querétaro
Practica
Hardware del microc

Materia
Microcontroladores

Práctica
Programación en bajo nivel

Que presentan:
Corona García Aldo Alejandro (20140041)
García García Luis Martín (20140684)
Gonzáles Romero Julio Daniel (20140037)
Medellin Gonzalez Adrian (20140688)
Solís Cortez Alexandra (20140705)

Estudiantes de la carrera:
Ingeniería Electrónica

Asesor:
Armando Mora Campos

Fecha
Miércoles 22 de Marzo de 2023
Índice
Antecedentes…...………………………………………………………………………………….4

 Objetivo……………………………………………………………………………………….5

 Competencias a desarrollar…...………………………………………………………….5

 Introducción…………………………………………………………………………………6

 Marco Teórico……………………………………………………………………………….7
PIC16f887……………………………………………………………………………….……….7
Características.………………………………………………………………………………….7
Lenguaje Ensamblador.………………………………………………………………………13
Características.………………………………………………………………………………...14

Tipos de lenguaje ensamblador……………………………………………………...………16

Elementos básicos del lenguaje ensamblador……………………………………………...16

Instrucción ADDWF……………………………………………………………………………16

AND y OR……………………………………………………………………………………….19

AND……………………………………………………………………………………………...19
OR………………………………………………………………………………………………..19

 Desarrollo……………………………………………………………………………………20

 Conclusiones.………………………………………………………………………………70
Bibliografía……………………………………………………………………………………….70

2
Índice de Figuras
Figura 1 Diagrama a bloques del PIC16F887 .................................................................. 9
Figura 2 Registros de funciones especiales .................................................................. 13
Figura 3 Conjunto de instrucciones del PIC16F887....................................................... 13
Figura 4 Diagrama de los pines del PIC16F887 ............................................................ 14
Figura 5 Diagrama a bloques de las acciones a realizar por el programa y el
microcontrolador. .......................................................................................................... 21
Figura 6 Diagrama esquemático del microcontrolador 16F887 ..................................... 21
Figura 7 Diagrama de flujo de la función principal ......................................................... 22
Figura 8. Diagrama de flujo de la función inicialización ................................................. 23
Figura 9. F8 ................................................................................................................... 32
Figura 10. 57 ................................................................................................................. 32
Figura 11. Resultado de la suma en binario .................................................................. 32
Figura 12. Resultado de la suma en protoboard ............................................................ 33
Figura 13. Resultado de la resta positiva, F8-57. .......................................................... 33
Figura 14. Entradas de la resta positiva ........................................................................ 34
Figura 15. Resultado de la resta positiva en protoboard................................................ 34
Figura 16. Resultado de la resta negativa, 57-F8 .......................................................... 34
Figura 17. Entradas de la resta negativa ....................................................................... 35
Figura 18. Resultado de la resta negativa en protoboard .............................................. 35
Figura 19. Entradas de la operación OR, AA y 55 ......................................................... 36
Figura 20. OR entre AA y 55 en protoboard .................................................................. 36
Figura 21. Entradas de la operación AND ..................................................................... 37
Figura 22. Resultado del AND entre AA y 55 en protoboard ......................................... 37

3
Antecedentes.
El presente reporte de práctica consiste sobre la programación en bajo
nivel aplicado en microcontroladores, con el propósito de aprender este
tipo de programación y poder ejecutar cada uno de los programas que
nos solicite nuestro docente.

La práctica se divide en varias sesiones, en la primera de ellas se realizó el


primer programa de bajo nivel con ayuda de nuestro docente , en el
transcurso de las semanas empezamos a desarrollar varios programas
más complejos en programación en bajo nivel con el objetivo de conocer
los tipos deestructuras que conlleva esta programación y ejecutarlas de
manera adecuada y con ello desarrolle correctamente las instrucciones
solicitadas por el profesor.

4
 Objetivo.
Consolidar el conocimiento de la arquitectura interna de un
microcontrolador, por medio de la programación de aplicaciones básicas
en lenguaje ensamblador, para tener una mejor comprensión de su lógica
de operación.

 Competencias a desarrollar.
Especificas.
Realiza programas con las instrucciones y subrutinas en lenguaje
ensamblador, para lograr una comprensión solida de la arquitectura
interna del dispositivo.

Genéricas.
1. Destrezas tecnológicas relacionadas con el uso de maquinaria, destrezasde
computación; así como, de búsqueda y manejo de información.
2. Capacidad de trabajar en equipo Interdisciplinario y multidisciplinario.
3. Capacidad de aplicar los conocimientos en la práctica.

5
 Introducción.
En la siguiente practica se hizo uso del microcontrolador 16F887 para la
programación de dicho programa, el cual como herramienta para programar se
utiliza el programa CCS C COMPILER en el cual se nos pide que lo programemos
en base a instrucciones en ensamblador, tanto la función principal como la
función de inicialización, y para el caso de la simulación tenemos el apoyo de
PROTEUS donde se desarrolla nuestro diagrama esquemático y una vez
terminado nuestra programación probarlo en PROTEUS y verificar que nuestro
programa cumpla con varias instrucciones solicitadas por el docente, una de las
primeras sentencias que desarrollara nuestro programa será encender y apagar
un leed a una frecuencia determinada por nuestro docente la segunda consiste
encender y apagar un leed conectado a un pin de salida, en el tercero consiste
en el control del encendido/apagado de un LED conectado a un pin de salida
digital, de acuerdo al valor lógico, en la cuarta consiste en la operación AND
entre una constante (de 00 a FF) y el valor de lectura de un puerto de entrada
digital de 8 bits, con la exhibición del resultado en un puerto de salida digital de 8
bits, en la quinta sentencia consiste en la operación OR entre una constante (de
00 a FF) y el valor de lectura de un puerto de entrada digital de 8 bits, con la
exhibición del resultado en un puerto de salida digital de 8 bits. Las siguientes
dos consiste en Operación AND y OR entre el valor de lectura de dos puertos de
entrada digital de 8 bits cada uno, con la exhibición del resultado en un puerto de
salida digital de 8 bits. Como hemos estado viendo en clases anteriores y como
puntos a resaltar para la correcta enseñanza de esta materia y como futuros
desarrolladores de hardware tenemos que desarrollar una caja negra con todas
las entradas y salidas y entender como funcionara nuestro programa, el
desarrollo de nuestro diagrama esquemático y diagrama de flujo para cumplir
todos los requisitos como futuros ingenieros en electrónica.

A lo largo de este trabajo investigamos puntos importantes de la escritura


en ensamblador y características importantes de nuestro Pic a utilizar.

6
 Marco Teórico.
PIC16f887.

Características.
 Voltaje de suministro: 2V - 5V.
 Consumo de corriente: 480uA a 5V / 4MHz.
 Convertidor A/D de 10 bits
 Arquitectura RISC .
 Memoria de datos: 256 bytes SRAM, 256 bytes EEPROM.
Número de líneas de E / S: 24.
 Un oscilador externo (hasta 20 MHz) o uno interno de 8 MHz
 3 contadores / temporizadores.
 2 comparadores analógicos.
 Un puerto serie y un puerto paralelo controlado por hardware.
 Watchdog Timer.

Diagrama a bloques.
En la figura 1, observaremos el diagrama bloques que nos ofrece elPIC16F887.

7
Figura 1 Diagrama a bloques del PIC16F887.

8
Tipos de memoria.
En estos microcontroladores utilizan la arquitectura Harvard, como se
puede ver en la Figura 1. La memoria del programa es de tipo FLASH. En
los rangos de tipo 10Fxx, 12Fxx y 16Fxx donde no es directamente
accesible para el usuario; en rangos de tipos más altos, se habilita la
escritura incluso en la memoria del programa. La memoria de datos es
del tipo RAM, es posible el direccionamiento directo e indirecto. En rangos
de microcontroladores de tipo inferior (10Fxx, 12Fxx, 16Fxx),la memoria de
datos se divide, por razones tecnológicas, en bloques que tienen por
nombre bancos. Los bancos se pueden seleccionar mediante software y,
de tal manera que, se puede acceder a ellos de forma arbitraria incluso
durante la ejecucióndel programa. De igual forma tienen una memoria del
tipo EEPROM. Este microcontroladorpertenece al grupo de
microcontroladores de 8 bits. Todas las celdas de memoria, así como los
registros internos del microcontrolador, tienen un ancho de 8 bits. En la
terminología de los microcontroladores, se denominan colectivamente
registros a continuación se muestra en la figura 2 los registros de
funciones especiales.

9
Registros de funciones especiales.

Figura 2 Registros de funciones especiales.

10
A continuación tenemos una serie de conjunto de instrucciones que se muestran en
la figura 3.

Figura 3 Conjunto de instrucciones del PIC16F887.

11
En la siguiente figura 4 podemos observar el diagrama de pines del PIC16F887.

Figura 4 Diagrama de los pines del PIC16F887.

Lenguaje Ensamblador.

Un lenguaje ensamblador es un lenguaje de programación que puede utilizarse


para decirle directamente al ordenador lo que debe hacer. Un lenguaje
ensamblador es casi exactamente como el código máquina que puede entender un
ordenador, excepto que utiliza palabras en lugar de números. Un ordenador no
puede realmente entender un programa en ensamblador directamente. Sin
embargo, puede convertir fácilmente el programa en código máquina sustituyendo
las palabras del programa por los números querepresentan. Un programa que hace
esto se llama ensamblador.
Los programas escritos en lenguaje ensamblador suelen estar formados por
instrucciones, que son pequeñas tareas que el ordenador realiza cuando ejecuta el
programa. Se llaman instrucciones porque el programador las utiliza para indicar al
ordenador lo que debe hacer. La parte del ordenador que sigue las instrucciones es
el procesador.
El lenguaje ensamblador de un ordenador es un lenguaje de bajo nivel, lo que
significa quesólo puede utilizarse para realizar las tareas simples que un ordenador
puede entender directamente. Para realizar tareas más complejas, hay que indicarle
al ordenador cada una de las tareas simples que forman parte de la tarea compleja.
Por ejemplo, un ordenador no entiende cómo imprimir una frase en su pantalla. En
su lugar, un programa escrito en ensamblador debe decirle cómo hacer todos los
pequeños pasos que están involucrados en la impresión de la frase.
Un programa en ensamblador de este tipo estaría compuesto por muchísimas
instrucciones que, en conjunto, hacen algo que a un humano le parece muy simple
y básico. Esto hace que sea difícil para los humanos leer un programa en
ensamblador. En cambio, un lenguaje de programación de alto nivel puede tener
una sola instrucción como PRINT "¡Hola, mundo!" que le dirá al ordenador que
realice todas las pequeñas tareas por ti.

12
Esto es útil para programar microprocesadores, microcontroladores y otros circuitos
integrados programables. Cabe destacar que este tipo de CI están presentes en
toda computadora con sus procesadores, los televisores, dispositivos de audio,
Smartphone y muchos otros hardwares. En este sentido, cabe destacar que para
cada arquitectura de procesador es necesario un lenguaje ensambladorespecífico.
Generalmente esto siempre es definido por el fabricante del hardware.Esto es así
debido a que los desarrollos de dispositivos se basan en un conjuntode
instrucciones, tipos de datos, registros, posiciones de memoria y otrascaracterísticas
propias de un determinado lenguaje de ensamblador. Esto significa que un lenguaje
ensamblador es específico de una arquitectura de computadora en particular, al
contrario de los modernos lenguajes de programación de alto nivelde la actualidad.

Características.

 El código fuente resultante de este desarrollo en lenguaje ensamblador


tiene la extensión “asm”. A partir de este archivo se crea el códigomáquina, el
cual suele tener una extensión de archivo “Hex”.
 El hecho de que cada lenguaje de ensamblado sea específico para una
arquitectura determinada, tanto de una computadora física o computadora
virtual, impide que se puedan crear desarrollos verdaderamente
multiplataforma.
 Las apps desarrolladas directamente en un lenguaje ensamblador, son
mucho más eficientes en términos de recursos del sistema, y mucho más
rápidos también.
 Un programa desarrollado en lenguaje ensamblador puede ser bastante
más eficiente que un programa desarrollado en un lenguaje de alto nivel.
 Mediante el lenguaje ensamblador los desarrolladores pueden tener un
control mucho más efectivo de los procesos a llevar a cabo por el
procesador que se está programando.
 Una de las principales características del lenguaje ensamblador es que no
permite portarse a otras arquitecturas.

13
Tipos de lenguaje ensamblador.

En la actualidad existen múltiples tipos de lenguaje ensamblador, así como


categorías de ensambladores que, si bien realizan la misma función final, varían
de acuerdo al tipo de escenario en el que se lo utiliza.

 Ensamblador Cruzado: El primer tipo de ensamblador permite el soporte


de medios físicos tales como periféricos de entrada y salida. Es utilizado
principalmente en el desarrollo de programación para sistemas
específicos.
 Ensamblador Residente: Este tipo de ensambladores permanecen en la
memoria de la computadora, y solamente se cargan para permitir la
ejecución del programa objeto producido. Este tipo de ensamblador es el
más usado para la ingeniería de sistemas de control más pequeños.
 Ensambladores de una fase: Los ensambladores de una fase tienen la
particularidad de leer una línea de programa fuente, traducirla
directamente y producir una instrucción en lenguaje máquina por vez. Este
tipo de
 Macroensambladores: Este tipo específico de ensamblador permite el
uso de macroinstrucciones. Son aplicaciones, muchas veces de gran
tamaño, que tienen la particularidad de no permanecer en memoria una
vez que se ha terminado de generar el código objeto.
 Micro ensambladores: Este tipo de ensambladores le proporciona al
interprete instrucciones precisas de cómo debe llevar a cabo la CPU una
determinada tarea.
 Ensambladores de dos fases: Es el tipo de ensamblador más usado en
la actualidad. Su nombre se debe a que todo el proceso de traducción y
ejecución se lleva a cabo en dos etapas. En la primera de ellas el
ensamblador analiza el código fuente y lo construyen en una tabla de
símbolos. En la segunda etapa, se vuelve a analizar el código fuente del
programa ya para traducirlo.

Elementos básicos del lenguaje ensamblador.

 Instrucciones: Las instrucciones no son otra cosa que las operaciones


que debe realizar el microcontrolador. Estas instrucciones que pueden
llevar a cabo cada microcontrolador ya se encuentran definidas en su hoja
de datos.
- Operandos: Los operandos son los elementos básicos empleados en la
instrucción que se está ejecutando en ese momento. Generalmente, los

14
operandos son todos los registros, las variables o las constantes.

- Directivas: Las directivas cumplen una función parecida a las


instrucciones. Sin embargo, existe una diferencia. Las directivas son
propias del lenguaje ensamblador, pero son independientes del chip
microcontrolador que se utilice en el proyecto. Las directivas representan
ciertas características del lenguaje ensamblador, y se utilizan para
especificar el procesador empleado, así como su configuración. También
son utilizadas con el propósito de asignar locaciones de memoria, entre
muchas otras tareas.

- Comentarios: Los comentarios no son otra cosa que cualquier frase


quepuedes escribir en el propio código para hacerlo más claro para quien
lo lea, o para ti mismo. Cabe destacar que estos comentarios los puedes
ubicar en cualquier parte de tu código, siempre y cuando comiencen con
un punto y coma “;”.

Instrucción ADDWF.
ADDWF significa suma aritmética de W y un archivo (f). Esta suma el valor
almacenado en “w” con la constante llamada “k”. El resultado se sobre escribe en
“w” y lo guarda. Se bebe tener presente, que las operaciones aritméticas
modifican las banderas del registro STATUS (Z, C, DC).
 Z (Zero): Es un identificador que detecta cuando el resultado de las
operaciones haya salido “0”. En caso sea verdadero este identificador tomará
el valor de z=1. En caso sea falso (distinto de 0), tomara el valor de z=0.
 DC (Acarreo de mitad): Es un identificador que detecta cuando el resultado
de la operación haya pasado el valor de (0000 1111 =d15). En caso sea
verdadero, este identificador tomara el valor de DC=1. En caso de que sea
falso (el resultado es menor que d15) tomara el valor de DC=0.
 C (acarreo): Es un identificador que detecta cuando el resultado se ha
desbordado del resultado máximo (b bits=d255). En caso de que sea
verdadero, este identificador tomara el valor de C=1. En caso de que sea falso
(no hubo desbordamiento), tomara el valor de C=0.
 CALL Etiqueta Los programas deberían ser escritos de forma que las pocas
primeras instrucciones pongan al micro en el Inicio de Programa Principal.
El «Programa Principal» se localizará físicamente al final del listado y éste puede estar
en el final de la memoria o a mitad del camino, si el programa es aproximadamente250
bytes de largo.

15
 AND y OR.
Las Compuertas Lógicas son circuitos electrónicos conformados
internamente por transistores que se encuentran con arreglos especiales
con los que otorgan señales de voltaje como resultado o una salida de
forma booleana, están obtenidos por operaciones lógicas binarias (suma,
multiplicación). También niegan, afirman, incluyen o excluyen según sus
propiedades lógicas. Estas compuertas se pueden aplicar en
otras áreas de la ciencia como mecánica, hidráulica o neumática.

AND

Esta compuerta es representada por una multiplicación en el Algebra de


Boole. Indica que es necesario que en todas sus entradas se tenga un
estado binario 1 para que la salida otorgue un 1 binario. En caso contrario
de que falte alguna de sus entradas con este estado o no tenga si quiera
una accionada, la salida no podrá cambiar de estado y permanecerá en 0.
Esta puede ser simbolizada por dos o más interruptores en serie de los
cuales todos deben estar activos para que esta permita el flujo de la
corriente.

OR

En el Algebra de Boole esta es una suma. Esta compuerta permite que con
cualquiera de sus entradas que este en estado binario 1, su salida pasara a
un estado 1 también. No es necesario que todas sus entradas estén
accionadas para conseguir un estado 1 a la salida pero tampoco causa
algún inconveniente. Para lograr un estado 0 a la salida, todas sus entradas
deben estar en el mismo valor de
0. Se puede interpretar como dos interruptores en paralelo, que sin importar
cualse accione, será posible el paso de la corriente.
0 𝐴𝐴𝐴 0 = 0 0 𝐴𝐴 0 = 0
0 𝐴𝐴𝐴 1 = 0 0 𝐴𝐴 1 = 1
1 𝐴𝐴𝐴 0 = 0 1 𝐴𝐴 0 = 1
1 𝐴𝐴𝐴 1 = 1 1 𝐴𝐴 1 = 1

16
DESARROLLO

Inciso a) Escritura de una constante (de 00 a FF) a un puerto de salida digital de 8


bits.

Para comenzar con la correcta entrega de la practica debemos realizar el


diseñode lo que se requiere hacer, la cual lo podremos ver en la figura 5.

Figura 5 Diagrama a bloques de las acciones a realizar por el programa y el microcontrolador.

A partir de este diseño se tiene que las salidas se localizan en los


siguientes pines para no utilizar aquellos pines necesarios para la
programación del PIC:
𝑏0 → 𝑅𝐴0
𝑏1 → 𝑅𝐴1
𝑏2 → 𝑅𝐴2
𝑏3 → 𝑅𝐴3
𝑏4 → 𝑅𝐵0
𝑏5 → 𝑅𝐵1
𝑏6 → 𝑅𝐵2
𝑏7 → 𝑅𝐵3
𝑏8 → 𝑅𝐸0

Para continuar se realiza el diagrama esquemático del circuito antes de


comenzar a programar para establecer los pines de entradas que se
utilizaran, el diagrama se presenta en la figura 6

17
Figura 6 Diagrama esquemático del microcontrolador 16F887

Además del diagrama esquemático, se necesita un diagrama de flujo, para


establecer la lógica:

18
Figura 7. Diagrama de flujo de la función principal y de inicialización

Sabiendo lo que se quiere hacer, se procede a la elaboración del código,


resultando en lo siguiente:

Descripción: escritura de una constante (00 a FF) con lenguaje


ensamblador .Fecha de inicio: 08/03/2023.
Diseñador:Equipo4.
Empresa: TECNM CAMPUS QUERETARO.
////////////////////////////////////DIRECTIVAS////////////////////////
///////// #include <16F887.h> //Microcontrolador a
utilizar.

#device adc = 10 //Resolución del convertidor A/D (8 o 10 bits).

19
//Fusibles de configuración
hardware. #fuses XT
//OSCIL
ADOR.
//XT = Cristal oscilador <= 4MHz.
//Opciones fusible oscilador: LP, XT, HS,
//EC_IO, INTRC_IO, INTRC, RC_IO, RC.

#fuses PUT //TEMPORIZADOR AL ENERGIZAR (Power Up


Timer).
//PUT = Temporizador habilitado.
//Opciones temporizador al energizar: NOPUT, PUT.

#fuses NOWDT //TEMPORIZADOR PERRO GUARDIAN (Watch


Dog
Timer).
//NOWDT = No habilitado.
//Opciones Watch Dog Timer: NOWDT, WDT.

#fuses NOBROWNOUT //RESET POR BAJO


VOLTAJE.
//NOBROWNOUT = No reset por bajo voltaje.
//Opciones reset por bajo voltaje: NOBROWNOUT,
//BROWNOUT, BROWNOUT_SW, BROWNOUT_SW,
BORV21,
//BORV40.

#fuses NOFCMEN //MONITOR DE RELOJ DE PROTECCION ANTE


FALLADEL
//OSCILADOR EXTERNO.

20
//NOFCMEN = No protección ante falla de reloj.
//Opciones del monitor de reloj: NOFCMEN,
//FCMEN.

#fuses NOPROTECT //PROTECCIÓN DE CÓDIGO CONTRA


LECTURAS.
//NOPROTECT = No protegido.
//Opciones protección de código: NOPROTECT, PROTECT.

#fuses NOCPD //PROTECCIÓN MEMORIA EEPROM.


//NOCPD = No protegida.
//Opciones protección EEPROM: NOCPD, CPD.

#fuses NOWRT //PROTECCION MEMORIA DE PROGRAMA


CONTRAESCRITURA.
//NOWRT = No protegida.
//Opciones protección memoria programa: NOWRT,
//WRT_1000, WRT_800, WRT_100.

#fuses MCLR //USO PIN MCLR (como reset externo o como pin
E/S).
//MCLR = Pin utilizado como Master Clear.
//Opciones pin MCLR: NOMCLR, MCLR.

#fuses NOIESO //CONMUTACIÓN DEL RELOJ DE INTERNO A


EXTERNOEN
//EL ARRANQUE DEL MCU.
//NOIESO = Conmutación deshabilitada.
//Opciones: NOIESO, IESO.

21
#fuses NOLVP //PROGRAMACIÓN EN BAJO
VOLTAJE.
//NOLVP = programación en bajo voltaje desactivada.
//Opciones: NOLVP, LVP.

#fuses NODEBUG //DEPURACIÓN EN CIRCUITO


(ICD).
//NODEBUG = Depuración en circuito desactivada.
//Opciones: NODEBUG, DEBUG.

#use delay(clock=4MHz) //Indicando al compilador la frec. del reloj.


//Manejo de puertos.
#use fast_IO(A) //Manejo básico de puertos en este
compilador. #use fast_IO(B) //Otras opciones de manejo de
puertos:
#use fast_IO(C) //#use fixed_IO, #use
standard_IO. #use fast_IO(D)
#use fast_IO(E)
//Manejo de registros de 8 bits como si fuesen variables, con la directiva
#byte.#byte TRISA = 0x85
#byte PORTA
= 0x05#byte
TRISB = 0x86
#byte PORTB
= 0x06#byte
TRISC = 0x87
#byte PORTC
= 0x07#byte
TRISD = 0x88

22
#byte PORTD
= 0x08#byte
TRISE = 0x89
#byte PORTE
= 0x09
//.............
// NOTA: Es más adecuado hacer e incluir un archivo con todos los registros del
// MCU utilizado (por ejemplo registros_PIC16F887.c), que listar en esta
// sección los registros del microcontrolador.
//Manejo de un bit de un registro como varible de un bit, con la directiva #bit.
////////////////////////////////VARIABLES GLOBALES/////////////////////////////
/////////////////////////PROTOTIPOS DE FUNCIONES Y
TAREAS//////////////////////void inicializar(void); //Ejemplos.

void permisivos(void);

void imprimir_constante(void);
////////////////////////////////FUNCIÓN
PRINCIPAL//////////////////////////////void main(void) {
iniciali
zar();
permi
sivos()
;
while(true) { //Ciclo contínuo con
while.imprimir_constante();
}
} //Fin main.
23
////////////////////////////////////FUNCIONES//////////////////////////////////
/*Función de MOVLWinicialización de variables y configuración de
periféricos. Descripción: .
Entradas:
Ninguna.
Salidas:
Ninguna.
*/
void
inicializar(void
) {#asm
MOVLW
0X00
MOVWF
TRISD
#endasm
}
//Función para detectar que esten presentes todas las condiciones de operación,
//antes de iniciar el ciclo contínuo.
//Descripción: .
//Entradas: .
//Salidas: .
void permisivos(void) { }
//Función de operación del LED 1.
//Descripción: .
//Entradas: .
//Salidas: .
void
24
imprimir_constante(void
) {#asm
MOVLW
0X03
MOVWF
PORTD
#endasm
Los resultados de este inciso se presentan en las figuras 8:

Figura 8. Resultado Escritura de una constante (de 00 a FF) a unpuerto de


salida digital de en protoboard.

25
Inciso b) Apagado/encendido de un LED conectado a un pin de salida digital.

Para comenzar este segundo inciso para la correcta entrega de la


práctica de igual manera debemos realizar el diseño de lo que se
requiere hacer, la cual lo podremos ver en la figura 10.

Figura 9. Diagrama de flujo de la función principal y de inicialización

A continuar se realiza el diagrama esquemático del circuito antes de comenzara


programar para establecer los pines de entradas que se utilizaran, el diagramase
presenta en la figura 11.

26
Figura 10 Diagrama esquemático para el inciso b)

Sabiendo lo que se quiere hacer, se procede a la elaboración del código,


resultando en lo siguiente:

#include <16F887.h> //Microcontrolador a utilizar.


#device adc = 10 //Resolución del convertidor A/D (8 o 10 bits).

//Fusibles de configuración
hardware. #fuses XT
//OSCIL
ADOR.
//XT = Cristal oscilador <= 4MHz.
//Opciones fusible oscilador: LP, XT, HS,
//EC_IO, INTRC_IO, INTRC, RC_IO, RC.
#fuses PUT //TEMPORIZADOR AL ENERGIZAR (Power Up
Timer).
//PUT = Temporizador habilitado.
//Opciones temporizador al energizar: NOPUT, PUT.

#fuses NOWDT //TEMPORIZADOR PERRO GUARDIAN (Watch


Dog
Timer).
//NOWDT = No habilitado.

27
//Opciones Watch Dog Timer: NOWDT, WDT.

#fuses NOBROWNOUT //RESET POR BAJO


VOLTAJE.
//NOBROWNOUT = No reset por bajo voltaje.
//Opciones reset por bajo voltaje: NOBROWNOUT,
//BROWNOUT, BROWNOUT_SW, BROWNOUT_SW,
BORV21,
//BORV40.
#fuses NOFCMEN //MONITOR DE RELOJ DE PROTECCION
ANTEFALLA DEL
//OSCILADOR EXTERNO.
//NOFCMEN = No protección ante falla de reloj.
//Opciones del monitor de reloj: NOFCMEN,
//FCMEN.

#fuses NOPROTECT //PROTECCIÓN DE CÓDIGO


CONTRALECTURAS.
//NOPROTECT = No protegido.
//Opciones protección de código: NOPROTECT, PROTECT.

#fuses NOCPD //PROTECCIÓN MEMORIA EEPROM.


//NOCPD = No protegida.
//Opciones protección EEPROM: NOCPD, CPD.
#fuses NOWRT //PROTECCION MEMORIA DE PROGRAMA
CONTRAESCRITURA.
//NOWRT = No protegida.
//Opciones protección memoria programa: NOWRT,
//WRT_1000, WRT_800, WRT_100.
#fuses MCLR //USO PIN MCLR (como reset externo o como pin
E/S).
//MCLR = Pin utilizado como Master Clear.
//Opciones pin MCLR: NOMCLR, MCLR.

#fuses NOIESO //CONMUTACIÓN DEL RELOJ DE


INTERNO AEXTERNO EN
//EL ARRANQUE DEL MCU.
//NOIESO = Conmutación deshabilitada.
//Opciones: NOIESO, IESO.

#fuses NOLVP //PROGRAMACIÓN EN BAJO


VOLTAJE.
28
//NOLVP = programación en bajo voltaje desactivada.
//Opciones: NOLVP, LVP.

#fuses NODEBUG //DEPURACIÓN EN CIRCUITO (ICD).


//NODEBUG = Depuración en circuito desactivada.
//Opciones: NODEBUG, DEBUG.

#use delay(clock=4MHz) //Indicando al compilador la frec. del reloj.

//Manejo de puertos.
#use fast_IO(A) //Manejo básico de puertos en este
compilador. #use fast_IO(B) //Otras opciones de manejo de
puertos:
#use fast_IO(C) //#use fixed_IO, #use
standard_IO. #use fast_IO(D)
#use fast_IO(E)

//Manejo de registros de 8 bits como si fuesen variables, con la directiva


#byte.#byte TRISA = 0x85
#byte PORTA
= 0x05#byte
TRISB = 0x86
#byte PORTB
= 0x06#byte
TRISC = 0x87
#byte PORTC
= 0x07#byte
TRISD = 0x88
#byte PORTD
= 0x08#byte
TRISE = 0x89
#byte PORTE
= 0x09
//.............
// NOTA: Es más adecuado hacer e incluir un archivo con todos los registros del
// MCU utilizado (por ejemplo registros_PIC16F887.c), que listar en esta
// sección los registros del microcontrolador.

//Manejo de un bit de un registro como varible de un bit, con la


directiva #bit.#bit led_1 = PORTD.4 //Ejemplos del uso de la
directiva #bit.

29
////////////////////////////////VARIABLES GLOBALES/////////////////////////////

/////////////////////////PROTOTIPOS DE FUNCIONES Y
TAREAS//////////////////////void inicializar(void); //Ejemplos.
void permisivos(void);
void operacion_LED_1(void);

////////////////////////////////FUNCIÓN PRINCIPAL////////////////////////////// void main(void) {

iniciali

zar();

permi

sivos()

//Ciclo contínuo (una de las siguientes


opciones). while(true) { //Ciclo contínuo con
while.operacion_LED_1();
}

} //Fin main.

////////////////////////////////////FUNCIONES//////////////////////////////////

/*Función de inicialización de variables y configuración de


periféricos. Descripción: .
Entradas:
Ninguna.
Salidas:
Ninguna.
*/
void
inicializar(void
) {#asm
BCF PORTD,4 //led apagado
MOVLW 0xEF //cargar
30
constante a W
MOVWF TRISD // cargar lo de w a
TRISD#endasm
}
//Función para detectar que esten presentes todas las condiciones de operación,
//antes de iniciar el ciclo contínuo.
//Descripción: .
//Entradas: .
//Salidas: .
void permisivos(void) {
}
//Función de operación del LED 1.
//Descripción: .
//Entradas: .
//Salidas: .
void
operacion_LED_1(void
) {#asm
BSF PORTD,4 //led
encendido#endasm
delay_m
s(500);
#asm
BCF PORTD,4 //led
apagado#endasm
delay_ms(500);
}

Los resultados de este inciso B) se presentan en las figuras 11

31
Figura 11. Resultado en protoboard.

Inciso c) Control del encendido/apagado de un LED conectado a un pin de


salida digital, deacuerdo al valor lógico (0/1) en un pin de entrada digital.

Para comenzar este segundo inciso para la correcta entrega de la


práctica de igual manera debemos realizar el diseño a bloques de lo que
se requiere hacer,la cual lo podremos ver en la figura 12.

32
Figura 12 Diagrama de flujo de la función principal y de inicialización

A continuar se realiza el diagrama esquemático del circuito antes de


comenzara programar para establecer los pines de entradas que se
utilizaran, el diagramasepresenta en la figura 12

Figura 13 Diagrama esquemático para el inciso C)

33
Sabiendo lo que se quiere hacer, se procede a la elaboración del código,resultando
en lo siguiente:

Nombre del proyecto: apagar y encender un led con switch en lenguaje


ensamblador.
Nombre del programa: apagar/encender.
#include <16F887.h> //Microcontrolador a utilizar.

#device adc = 10 //Resolución del convertidor A/D (8 o 10 bits).

//Fusibles de configuración hardware.


#fuses XT //OSCILADOR.
//XT = Cristal oscilador <= 4MHz.
//Opciones fusible oscilador: LP, XT, HS,
//EC_IO, INTRC_IO, INTRC, RC_IO, RC.

#fuses PUT //TEMPORIZADOR AL ENERGIZAR (Power Up Timer).


//PUT = Temporizador habilitado.
//Opciones temporizador al energizar: NOPUT, PUT.

#fuses NOWDT //TEMPORIZADOR PERRO GUARDIAN (Watch


DogTimer).
//NOWDT = No habilitado.
//Opciones Watch Dog Timer: NOWDT, WDT.

#fuses NOBROWNOUT //RESET POR BAJO VOLTAJE.


//NOBROWNOUT = No reset por bajo voltaje.
//Opciones reset por bajo voltaje: NOBROWNOUT,
//BROWNOUT, BROWNOUT_SW, BROWNOUT_SW,
BORV21,
//BORV40.

#fuses NOFCMEN //MONITOR DE RELOJ DE PROTECCION ANTE


FALLA DEL
//OSCILADOR EXTERNO.
//NOFCMEN = No protección ante falla de reloj.
//Opciones del monitor de reloj: NOFCMEN,
//FCMEN.

#fuses NOPROTECT //PROTECCIÓN DE CÓDIGO CONTRA


LECTURAS.

34
//NOPROTECT = No protegido.
//Opciones protección de código: NOPROTECT, PROTECT.

#fuses NOCPD //PROTECCIÓN MEMORIA EEPROM.


//NOCPD = No protegida.
//Opciones protección EEPROM: NOCPD, CPD.

#fuses NOWRT //PROTECCION MEMORIA DE PROGRAMA CONTRA


ESCRITURA.
//NOWRT = No protegida.
//Opciones protección memoria programa: NOWRT,
//WRT_1000, WRT_800, WRT_100.

#fuses MCLR //USO PIN MCLR (como reset externo o como pin E/S).
//MCLR = Pin utilizado como Master Clear.
//Opciones pin MCLR: NOMCLR, MCLR.

#fuses NOIESO //CONMUTACIÓN DEL RELOJ DE INTERNO A


EXTERNO EN
//EL ARRANQUE DEL MCU.
//NOIESO = Conmutación deshabilitada.
//Opciones: NOIESO, IESO.

#fuses NOLVP //PROGRAMACIÓN EN BAJO VOLTAJE.


//NOLVP = programación en bajo voltaje desactivada.
//Opciones: NOLVP, LVP.

#fuses NODEBUG //DEPURACIÓN EN CIRCUITO (ICD).


//NODEBUG = Depuración en circuito desactivada.
//Opciones: NODEBUG, DEBUG.

#use delay(clock=4MHz) //Indicando al compilador la frec. del reloj.

//Manejo de puertos.
#use fast_IO(A) //Manejo básico de puertos en este compilador.
#use fast_IO(B) //Otras opciones de manejo de puertos:
#use fast_IO(C) //#use fixed_IO, #use standard_IO.
#use fast_IO(D)
#use fast_IO(E)

//Manejo de registros de 8 bits como si fuesen variables, con la directiva #byte.

35
#byte TRISA = 0x85
#byte PORTA = 0x05
#byte TRISB = 0x86
#byte PORTB = 0x06
#byte TRISC = 0x87
#byte PORTC = 0x07
#byte TRISD = 0x88
#byte PORTD = 0x08
#byte TRISE = 0x89
#byte PORTE = 0x09
//.............
// NOTA: Es más adecuado hacer e incluir un archivo con todos los registros del
// MCU utilizado (por ejemplo registros_PIC16F887.c), que listar en esta
// sección los registros del microcontrolador.

//Manejo de un bit de un registro como varible de un bit, con la directiva #bit.


#bit LED_1 = PORTD.4 //Ejemplos del uso de la directiva #bit.
#bit SW_1 = PORTD.5

////////////////////////////////VARIABLES GLOBALES/////////////////////////////

/////////////////////////PROTOTIPOS DE FUNCIONES Y TAREAS//////////////////////


void inicializar(void);
//Ejemplos.
void permisivos(void);
void operacion_LED_1(void);
////////////////////////////////FUNCIÓN PRINCIPAL//////////////////////////////
void main(void) {

inicializar();

permisivos();

//Ciclo contínuo (una de las siguientes opciones).


for(;;) { //Ciclo contínuo con for.

#asm //Forma de incluir instrucciones en ensamblador.


//Instrucciones en lenguaje ensamblador.
#endasm

36
do { //Ciclo contínuo con do...while.

} while(true);

while(true) { //Ciclo contínuo con while.

operacion_LED_1();
}

} //Fin main.

////////////////////////////////////FUNCIONES//////////////////////////////////

/*Función de inicialización de variables y configuración de periféricos.


Descripción: .
Entradas: Ninguna.
Salidas: Ninguna.
*/
void inicializar(void) {
#asm
BCF PORTD,4
MOVLW 0XEF //cargar una constante a W
MOVWF TRISD //cargar lo de W a TRISD
#endasm
//Pasos de inicialización y configuración de puertos paralelos.
//1. Inicializar los pines de salida (salida 0 o salida 1).
//2. Configurar operación analógica o digital de los pines de entrada.
//3. Configurar dirección de cada pin del puerto (E/S).

//Función para detectar que esten presentes todas las condiciones de operación,
//antes de iniciar el ciclo contínuo.
//Descripción: .
//Entradas: .
//Salidas: .
void permisivos(void) {

37
}

//Función de operación del LED 1.


//Descripción: .
//Entradas: .
//Salidas: .
void operacion_LED_1(void) {
#asm
BTFSC SW_1 // cuando sw esta en 1
BSF LED_1 // encendido
#endasm
#asm
BTFSS SW_1 // cuando sw esta en 0
BCF LED_1 // apagado
#endasm
}

Los resultados de este inciso C) se presentan en las figuras 14

Figura 14. Resultado Control del encendido/apagado de un LEDdigital en protoboard.

Inciso d) Exhibición en un puerto de salida digital de 8 bits, de la lectura de un puerto de


entradadigital de 8 bits.
38
Para comenzar este inciso d) de igual manera debemos realizar el diseño a
bloques de lo que se requiere hacer, la cual lo podremos ver en la figura 15

Figura 15 Diagrama de flujo de la función principal y de inicialización

A continuar se realiza el diagrama esquemático del circuito antes de comenzara


programar para establecer los pines de entradas que se utilizaran, el diagramase
presenta en la figura 16.

39
Figura 16 Diagrama esquemático para el inciso d).

Sabiendo lo que se requiere hacer, se procede a la elaboración del código,


resultando en lo siguiente:

#include <16F887.h> //Microcontrolador a utilizar.

#device adc = 10 //Resolución del convertidor A/D (8 o 10 bits).

//Fusibles de configuración hardware.


#fuses XT //OSCILADOR.
//XT = Cristal oscilador <= 4MHz.
//Opciones fusible oscilador: LP, XT, HS,
//EC_IO, INTRC_IO, INTRC, RC_IO, RC.

#fuses PUT //TEMPORIZADOR AL ENERGIZAR (Power Up Timer).


//PUT = Temporizador habilitado.
//Opciones temporizador al energizar: NOPUT, PUT.

#fuses NOWDT //TEMPORIZADOR PERRO GUARDIAN (Watch Dog Timer).


//NOWDT = No habilitado.
//Opciones Watch Dog Timer: NOWDT, WDT.

#fuses NOBROWNOUT //RESET POR BAJO VOLTAJE.


40
//NOBROWNOUT = No reset por bajo voltaje.
//Opciones reset por bajo voltaje: NOBROWNOUT,
//BROWNOUT, BROWNOUT_SW, BROWNOUT_SW, BORV21,
//BORV40.

#fuses NOFCMEN //MONITOR DE RELOJ DE PROTECCION ANTE FALLA DEL


//OSCILADOR EXTERNO.
//NOFCMEN = No protección ante falla de reloj.
//Opciones del monitor de reloj: NOFCMEN,
//FCMEN.
#fuses NOPROTECT //PROTECCIÓN DE CÓDIGO CONTRA LECTURAS.
//NOPROTECT = No protegido.
//Opciones protección de código: NOPROTECT, PROTECT.
#fuses NOCPD //PROTECCIÓN MEMORIA EEPROM.
//NOCPD = No protegida.
//Opciones protección EEPROM: NOCPD, CPD.
#fuses NOWRT //PROTECCION MEMORIA DE PROGRAMA CONTRA
ESCRITURA.
//NOWRT = No protegida.
//Opciones protección memoria programa: NOWRT,
//WRT_1000, WRT_800, WRT_100.
#fuses MCLR //USO PIN MCLR (como reset externo o como pin E/S).
//MCLR = Pin utilizado como Master Clear.
//Opciones pin MCLR: NOMCLR, MCLR.
#fuses NOIESO //CONMUTACIÓN DEL RELOJ DE INTERNO A EXTERNO EN
//EL ARRANQUE DEL MCU.
//NOIESO = Conmutación deshabilitada.
//Opciones: NOIESO, IESO.
#fuses NOLVP //PROGRAMACIÓN EN BAJO VOLTAJE.
//NOLVP = programación en bajo voltaje desactivada.
//Opciones: NOLVP, LVP.
#fuses NODEBUG //DEPURACIÓN EN CIRCUITO (ICD).
//NODEBUG = Depuración en circuito desactivada.
//Opciones: NODEBUG, DEBUG.
#use delay(clock=4MHz) //Indicando al compilador la frec. del reloj.
//Manejo de puertos.
#use fast_IO(A) //Manejo básico de puertos en este compilador.
#use fast_IO(B) //Otras opciones de manejo de puertos:
#use fast_IO(C) //#use fixed_IO, #use standard_IO.
#use fast_IO(D)
#use fast_IO(E)
//Manejo de registros de 8 bits como si fuesen variables, con la directiva #byte.
#byte TRISA = 0x85
#byte PORTA = 0x05
#byte TRISB = 0x86
#byte PORTB = 0x06
#byte TRISC = 0x87
#byte PORTC = 0x07
#byte TRISD = 0x88
#byte PORTD = 0x08
#byte TRISE = 0x89
#byte PORTE = 0x09
41
//.............
// NOTA: Es más adecuado hacer e incluir un archivo con todos los registros del
// MCU utilizado (por ejemplo registros_PIC16F887.c), que listar en esta
// sección los registros del microcontrolador.
//Manejo de un bit de un registro como varible de un bit, con la directiva #bit.
////////////////////////////////VARIABLES GLOBALES////////////////////////////
/////////////////////////PROTOTIPOS DE FUNCIONES Y TAREAS//////////////////////
void inicializar(void); //Ejemplos.
void permisivos(void);
void operacion(void);
////////////////////////////////FUNCIÓN PRINCIPAL//////////////////////////////
void main(void) {

inicializar();
permisivos();
while(true) { //Ciclo contínuo con while.
operacion();
}
} //Fin main.
////////////////////////////////////FUNCIONES//////////////////////////////////
/*Función de inicialización de variables y configuración de periféricos.
Descripción: .
Entradas: Ninguna.
Salidas: Ninguna.
*/
void inicializar(void) {
#asm
MOVLW 0X00
MOVWF TRISD
#endasm
#asm
MOVLW 0XFF
MOVWF TRISB
#endasm
}
//Función para detectar que esten presentes todas las condiciones de operación,
//antes de iniciar el ciclo contínuo.
//Descripción: .
//Entradas: .
//Salidas: .
void permisivos(void) {
}
//Función de operación del LED 1.
//Descripción: .
//Entradas: .
//Salidas: .
void operacion(void) {
#asm
MOVF PORTB,0
MOVWF PORTD
#endasm
}
42
Los resultados de este inciso d) se presentan en las figuras 17

Figura 18. Exhibición en un puerto de salida digital de 8 bits, de la lectura de un


puerto de entrada digital

43
Inciso e) Operación AND entre una constante (de 00 a FF) y el valor de lectura de un
puerto de entrada digital de 8 bits, con la exhibición del resultado en un puerto de salida
digital de8 bits.

Para comenzar este inciso e) de igual manera debemos realizar el diseño a


bloques de lo que se requiere hacer, la cual lo podremos ver en la figura 19.

Figura 19 Diagrama de flujo de la función principal y de inicialización

A continuar se realiza el diagrama esquemático del circuito antes de comenzar


a programar para establecer los pines de entradas que se utilizaran, el
diagramase presenta en la figura 20.

44
Figura 20 Diagrama esquemático para el inciso E).

Sabiendo lo que se requiere hacer, se procede a la elaboración del código,


resultando en lo siguiente:

Nombre del proyecto: PRACTICA 2 INCISO e) .


Descripción: programa de la operacion AND entre un valor constante y un valor que se ingresa
mediante un puerto de entrada de 8 bits, con una salida de 8 bits.
////////////////////////////////////DIRECTIVAS/////////////////////////////////
#include <16F887.h> //Microcontrolador a utilizar.

#device adc = 10 //Resolución del convertidor A/D (8 o 10 bits).

//Fusibles de configuración hardware.


#fuses XT //OSCILADOR.
//XT = Cristal oscilador <= 4MHz.
//Opciones fusible oscilador: LP, XT, HS,
//EC_IO, INTRC_IO, INTRC, RC_IO, RC.
#fuses PUT //TEMPORIZADOR AL ENERGIZAR (Power Up Timer).
//PUT = Temporizador habilitado.
//Opciones temporizador al energizar: NOPUT, PUT.
#fuses NOWDT //TEMPORIZADOR PERRO GUARDIAN (Watch Dog Timer).
//NOWDT = No habilitado.
//Opciones Watch Dog Timer: NOWDT, WDT.

#fuses NOBROWNOUT //RESET POR BAJO VOLTAJE.


//NOBROWNOUT = No reset por bajo voltaje.
//Opciones reset por bajo voltaje: NOBROWNOUT,
//BROWNOUT, BROWNOUT_SW, BROWNOUT_SW, BORV21,
//BORV40.
#fuses NOFCMEN //MONITOR DE RELOJ DE PROTECCION ANTE FALLA DEL
//OSCILADOR EXTERNO.
//NOFCMEN = No protección ante falla de reloj.
45
//Opciones del monitor de reloj: NOFCMEN,
//FCMEN.
#fuses NOPROTECT //PROTECCIÓN DE CÓDIGO CONTRA LECTURAS.
//NOPROTECT = No protegido.
//Opciones protección de código: NOPROTECT, PROTECT.
#fuses NOCPD //PROTECCIÓN MEMORIA EEPROM.
//NOCPD = No protegida.
//Opciones protección EEPROM: NOCPD, CPD.
#fuses NOWRT //PROTECCION MEMORIA DE PROGRAMA CONTRA ESCRITURA.
//NOWRT = No protegida.
//Opciones protección memoria programa: NOWRT,
//WRT_1000, WRT_800, WRT_100.
#fuses MCLR //USO PIN MCLR (como reset externo o como pin E/S).
//MCLR = Pin utilizado como Master Clear.
//Opciones pin MCLR: NOMCLR, MCLR.
#fuses NOIESO //CONMUTACIÓN DEL RELOJ DE INTERNO A EXTERNO EN
//EL ARRANQUE DEL MCU.
//NOIESO = Conmutación deshabilitada.
//Opciones: NOIESO, IESO.
#fuses NOLVP //PROGRAMACIÓN EN BAJO VOLTAJE.
//NOLVP = programación en bajo voltaje desactivada.
//Opciones: NOLVP, LVP.
#fuses NODEBUG //DEPURACIÓN EN CIRCUITO (ICD).
//NODEBUG = Depuración en circuito desactivada.
//Opciones: NODEBUG, DEBUG.
#use delay(clock=4MHz) //Indicando al compilador la frec. del reloj.
//Manejo de puertos.
#use fast_IO(A) //Manejo básico de puertos en este compilador.
#use fast_IO(B) //Otras opciones de manejo de puertos:
#use fast_IO(C) //#use fixed_IO, #use standard_IO.
#use fast_IO(D)
#use fast_IO(E)
//Manejo de registros de 8 bits como si fuesen variables, con la directiva #byte.
#byte TRISA = 0x85
#byte PORTA = 0x05
#byte TRISB = 0x86 #byte PORTB = 0x06#byte TRISC = 0x87 #byte PORTC = 0x07#byte TRISD
= 0x88 #byte PORTD = 0x08#byte TRISE = 0x89 #byte PORTE = 0x09
////////////////////////////////VARIABLES GLOBALES/////////////////////////////
/////////////////////////PROTOTIPOS DE FUNCIONES Y TAREAS//////////////////////
void inicializar(void); //Ejemplos.
void permisivos(void);
void operacion(void);
////////////////////////////////FUNCIÓN PRINCIPAL//////////////////////////////
void main(void) {

inicializar();

permisivos();
while(true) { //Ciclo contínuo con while.
operacion();
}

46
} //Fin main.

////////////////////////////////////FUNCIONES//////////////////////////////////

/*Función de inicialización de variables y configuración de periféricos.


Descripción: .
Entradas: Ninguna.
Salidas: Ninguna.
*/
void inicializar(void) {

TRISD=0B00000000;
TRISB=0B11111111;
}

//Función para detectar que esten presentes todas las condiciones de operación,
//antes de iniciar el ciclo contínuo.
//Descripción: .
//Entradas: .
//Salidas: .
void permisivos(void) {

//Función de operación del LED 1.


//Descripción: .
//Entradas: .
//Salidas: .
void operacion(void) {
#asm
MOVLW 0X33
ANDWF PORTB,0
MOVWF PORTD
#endasm}
Los resultados de este inciso E) se presentan en las figuras 21 y 22

47
Figura 21 Operación AND entre una constante (de 00 a FF).

Figura 22. Operación AND entre una constante (de 00 a FF) en protoboard.

48
Inciso f) Operación OR entre una constante (de 00 a FF) y el valor de lectura de un
puerto de entrada digital de 8 bits, con la exhibición del resultado en un puerto de salida
digital de8 bits.

Para comenzar este inciso F) de igual forma debemos realizar el diseño a bloques
de lo que se requiere hacer, la cual lo podremos ver en la figura 23.

Figura 23 Diagrama de flujo de la función principal y de inicialización

A continuar se realiza el diagrama esquemático del circuito antes de comenzara


programar para establecer los pines de entradas que se utilizaran, el diagramase
presenta en la figura 24.

49
Figura 24 Diagrama esquemático para el inciso F).

Sabiendo lo que se requiere hacer, se procede a la elaboración del código,


resultando en lo siguiente:

#include <16F887.h> //Microcontrolador a utilizar.

#device adc = 10 //Resolución del convertidor A/D (8 o 10 bits).

//Fusibles de configuración hardware.


#fuses XT //OSCILADOR.
//XT = Cristal oscilador <= 4MHz.
//Opciones fusible oscilador: LP, XT, HS,
//EC_IO, INTRC_IO, INTRC, RC_IO, RC.
#fuses PUT //TEMPORIZADOR AL ENERGIZAR (Power Up Timer).
//PUT = Temporizador habilitado.
//Opciones temporizador al energizar: NOPUT, PUT.

#fuses NOWDT //TEMPORIZADOR PERRO GUARDIAN (Watch Dog Timer).


//NOWDT = No habilitado.
//Opciones Watch Dog Timer: NOWDT, WDT.

#fuses NOBROWNOUT //RESET POR BAJO VOLTAJE.


//NOBROWNOUT = No reset por bajo voltaje.
//Opciones reset por bajo voltaje: NOBROWNOUT,
//BROWNOUT, BROWNOUT_SW, BROWNOUT_SW, BORV21,
//BORV40.

#fuses NOFCMEN //MONITOR DE RELOJ DE PROTECCION ANTE FALLA DEL


//OSCILADOR EXTERNO.
//NOFCMEN = No protección ante falla de reloj.

50
//Opciones del monitor de reloj: NOFCMEN,
//FCMEN.

#fuses NOPROTECT //PROTECCIÓN DE CÓDIGO CONTRA LECTURAS.


//NOPROTECT = No protegido.
//Opciones protección de código: NOPROTECT, PROTECT.

#fuses NOCPD //PROTECCIÓN MEMORIA EEPROM.


//NOCPD = No protegida.
//Opciones protección EEPROM: NOCPD, CPD.

#fuses NOWRT //PROTECCION MEMORIA DE PROGRAMA CONTRA ESCRITURA.


//NOWRT = No protegida.
//Opciones protección memoria programa: NOWRT,
//WRT_1000, WRT_800, WRT_100.

#fuses MCLR //USO PIN MCLR (como reset externo o como pin E/S).
//MCLR = Pin utilizado como Master Clear.
//Opciones pin MCLR: NOMCLR, MCLR.

#fuses NOIESO //CONMUTACIÓN DEL RELOJ DE INTERNO A EXTERNO EN


//EL ARRANQUE DEL MCU.
//NOIESO = Conmutación deshabilitada.
//Opciones: NOIESO, IESO.

#fuses NOLVP //PROGRAMACIÓN EN BAJO VOLTAJE.


//NOLVP = programación en bajo voltaje desactivada.
//Opciones: NOLVP, LVP.

#fuses NODEBUG //DEPURACIÓN EN CIRCUITO (ICD).


//NODEBUG = Depuración en circuito desactivada.
//Opciones: NODEBUG, DEBUG.

#use delay(clock=4MHz) //Indicando al compilador la frec. del reloj.


//Manejo de puertos.
#use fast_IO(A) //Manejo básico de puertos en este compilador.
#use fast_IO(B) //Otras opciones de manejo de puertos:
#use fast_IO(C) //#use fixed_IO, #use standard_IO.
#use fast_IO(D)
#use fast_IO(E)

//Manejo de registros de 8 bits como si fuesen variables, con la directiva #byte.


#byte TRISA = 0x85
#byte PORTA = 0x05
#byte TRISB = 0x86
#byte PORTB = 0x06
#byte TRISC = 0x87
#byte PORTC = 0x07
#byte TRISD = 0x88
#byte PORTD = 0x08
#byte TRISE = 0x89
#byte PORTE = 0x09
51
//.............
// NOTA: Es más adecuado hacer e incluir un archivo con todos los registros del
// MCU utilizado (por ejemplo registros_PIC16F887.c), que listar en esta
// sección los registros del microcontrolador.
//Manejo de un bit de un registro como varible de un bit, con la directiva #bit.
////////////////////////////////VARIABLES GLOBALES/////////////////////////////
/////////////////////////PROTOTIPOS DE FUNCIONES Y TAREAS//////////////////////
void inicializar(void); //Ejemplos.
void permisivos(void);
void operacion(void);
////////////////////////////////FUNCIÓN PRINCIPAL//////////////////////////////
void main(void) {
inicializar();
permisivos();
while(true) { //Ciclo contínuo con while.
operacion();
}
} //Fin main.
////////////////////////////////////FUNCIONES//////////////////////////////////
/*Función de inicialización de variables y configuración de periféricos.
Descripción: .
Entradas: Ninguna.
Salidas: Ninguna.
*/
void inicializar(void) {
TRISD=0X00;
TRISB=0XFF;
}
//Función para detectar que esten presentes todas las condiciones de operación,
//antes de iniciar el ciclo contínuo.
//Descripción: .
//Entradas: .
//Salidas: .
void permisivos(void) {
}
//Función de operación del LED 1.
//Descripción: .
//Entradas: .
//Salidas: .
void operacion(void) {
#asm
MOVLW 0B00110011
IORWF PORTB,0
MOVWF PORTD
#endasm
Los resultados de este inciso F) se presentan en las figuras 25,26.

52
Figura 25 Operación 0R entre una constante (de 00 a FF).

Figura 26. Operación OR entre una constante (de 00 a FF) en protoboard.

Inciso g) Operación AND entre el valor de lectura de dos puertos de entrada digital de
53
8 Bitscada uno, con la exhibición del resultado en un puerto de salida digital de 8 bits.

Para comenzar este inciso G) de igual forma debemos realizar el diseño a


bloques de lo que se requiere hacer, la cual lo podremos ver en la figura 27.

Figura 27 Diagrama de flujo de la función principal y de inicialización

A continuar se realiza el diagrama esquemático del circuito antes de comenzar a programar para
establecer los pines de entradas que se utilizaran, el diagramasepresenta en la figura 28

Figura 28 Diagrama esquemático para el inciso G).

54
Sabiendo lo que se requiere hacer, se procede a la elaboración del código,
resultando en lo siguiente:

#include <16F887.h> //Microcontrolador a utilizar.

#device adc = 10 //Resolución del convertidor A/D (8 o 10 bits).

//Fusibles de configuración hardware.


#fuses XT //OSCILADOR.
//XT = Cristal oscilador <= 4MHz.
//Opciones fusible oscilador: LP, XT, HS,
//EC_IO, INTRC_IO, INTRC, RC_IO, RC.

#fuses PUT //TEMPORIZADOR AL ENERGIZAR (Power Up Timer).


//PUT = Temporizador habilitado.
//Opciones temporizador al energizar: NOPUT, PUT.

#fuses NOWDT //TEMPORIZADOR PERRO GUARDIAN (Watch Dog


Timer).
//NOWDT = No habilitado.
//Opciones Watch Dog Timer: NOWDT, WDT.

#fuses NOBROWNOUT //RESET POR BAJO VOLTAJE.


//NOBROWNOUT = No reset por bajo voltaje.
//Opciones reset por bajo voltaje: NOBROWNOUT,
//BROWNOUT, BROWNOUT_SW, BROWNOUT_SW,
BORV21,
//BORV40.

#fuses NOFCMEN //MONITOR DE RELOJ DE PROTECCION ANTE


FALLA DEL
//OSCILADOR EXTERNO.
//NOFCMEN = No protección ante falla de reloj.
//Opciones del monitor de reloj: NOFCMEN,
//FCMEN.

#fuses NOPROTECT //PROTECCIÓN DE CÓDIGO CONTRA


LECTURAS.
//NOPROTECT = No protegido.
//Opciones protección de código: NOPROTECT, PROTECT.

#fuses NOCPD //PROTECCIÓN MEMORIA EEPROM.


55
//NOCPD = No protegida.
//Opciones protección EEPROM: NOCPD, CPD.

#fuses NOWRT //PROTECCION MEMORIA DE PROGRAMA CONTRA


ESCRITURA.
//NOWRT = No protegida.
//Opciones protección memoria programa: NOWRT,
//WRT_1000, WRT_800, WRT_100.

#fuses MCLR //USO PIN MCLR (como reset externo o como pin E/S).
//MCLR = Pin utilizado como Master Clear.
//Opciones pin MCLR: NOMCLR, MCLR.

#fuses NOIESO //CONMUTACIÓN DEL RELOJ DE INTERNO A


EXTERNO EN
//EL ARRANQUE DEL MCU.
//NOIESO = Conmutación deshabilitada.
//Opciones: NOIESO, IESO.

#fuses NOLVP //PROGRAMACIÓN EN BAJO VOLTAJE.


//NOLVP = programación en bajo voltaje desactivada.
//Opciones: NOLVP, LVP.

#fuses NODEBUG //DEPURACIÓN EN CIRCUITO (ICD).


//NODEBUG = Depuración en circuito desactivada.
//Opciones: NODEBUG, DEBUG.

#use delay(clock=4MHz) //Indicando al compilador la frec. del reloj.

//Manejo de puertos.
#use fast_IO(A) //Manejo básico de puertos en este compilador.
#use fast_IO(B) //Otras opciones de manejo de puertos:
#use fast_IO(C) //#use fixed_IO, #use standard_IO.
#use fast_IO(D)
#use fast_IO(E)

//Manejo de registros de 8 bits como si fuesen variables, con la directiva #byte.


#byte TRISA = 0x85
#byte PORTA = 0x05
#byte TRISB = 0x86
#byte PORTB = 0x06

56
#byte TRISC = 0x87
#byte PORTC = 0x07
#byte TRISD = 0x88
#byte PORTD = 0x08
#byte TRISE = 0x89
#byte PORTE = 0x09
//.............

//Manejo de un bit de un registro como varible de un bit, con la directiva #bit.


////////////////////////////////VARIABLES GLOBALES/////////////////////////////
/////////////////////////PROTOTIPOS DE FUNCIONES Y TAREAS//////////////////////
void inicializar(void); //Ejemplos.void permisivos(void);
void operacion(void);
////////////////////////////////FUNCIÓN PRINCIPAL//////////////////////////////
void main(void) {

inicializar();
permisivos();
while(true) { //Ciclo contínuo con while.
operacion();
}

} //Fin main.

////////////////////////////////////FUNCIONES//////////////////////////////////

/*Función de inicialización de variables y configuración de periféricos.


Descripción: .
Entradas: Ninguna.
Salidas: Ninguna.
*/
void inicializar(void) {
TRISB= 0XFF;
TRISC=0XFF;
TRISD=0X00;
}
//Función para detectar que esten presentes todas las condiciones de operación,
//antes de iniciar el ciclo contínuo.
//Descripción: .
//Entradas: .
//Salidas: .
void permisivos(void) {
57
}
//Función de operación del LED 1.
//Descripción: .
//Entradas: .
//Salidas: .
void operacion(void) {
#asm
MOVF PORTB,0
ANDWF PORTC,0MOVWF PORTD
#endasm

Los resultados de este inciso G) se presentan en las figuras 29.

Figura 29 Operación AND entre el valor de lectura de dos puertos.


.

58
Inciso h) Operación OR entre el valor de lectura de dos puertos de entrada digital de 8
Bits cadauno, con la exhibición del resultado en un puerto de salida digital de 8 Bits.

Para este último inciso H) de igual forma debemos realizar el diseño a bloques de
lo que se requiere hacer, la cual lo podremos ver en la figura 30.

Figura 30 Diagrama de flujo de la función principal y de inicialización

A continuar se realiza el diagrama esquemático del circuito antes de comenzar


a programar para establecer los pines de entradas que se utilizaran, el
diagramase presenta en la figura 31.

Figura 31 Diagrama esquemático para el inciso H).

59
Sabiendo lo que se requiere hacer, se procede a la elaboración del código,
resultando en lo siguiente:
#include <16F887.h> //Microcontrolador a utilizar.

#device adc = 10 //Resolución del convertidor A/D (8 o 10 bits).

//Fusibles de configuración hardware.


#fuses XT //OSCILADOR.
//XT = Cristal oscilador <= 4MHz.
//Opciones fusible oscilador: LP, XT, HS,
//EC_IO, INTRC_IO, INTRC, RC_IO, RC.

#fuses PUT //TEMPORIZADOR AL ENERGIZAR (Power Up Timer).


//PUT = Temporizador habilitado.
//Opciones temporizador al energizar: NOPUT, PUT.

#fuses NOWDT //TEMPORIZADOR PERRO GUARDIAN (Watch Dog


Timer).
//NOWDT = No habilitado.
//Opciones Watch Dog Timer: NOWDT, WDT.

#fuses NOBROWNOUT //RESET POR BAJO VOLTAJE.


//NOBROWNOUT = No reset por bajo voltaje.
//Opciones reset por bajo voltaje: NOBROWNOUT,
//BROWNOUT, BROWNOUT_SW, BROWNOUT_SW,
BORV21,
//BORV40.

#fuses NOFCMEN //MONITOR DE RELOJ DE PROTECCION ANTE


FALLA DEL
//OSCILADOR EXTERNO.
//NOFCMEN = No protección ante falla de reloj.
//Opciones del monitor de reloj: NOFCMEN,
//FCMEN.

#fuses NOPROTECT //PROTECCIÓN DE CÓDIGO CONTRA


LECTURAS.
//NOPROTECT = No protegido.
//Opciones protección de código: NOPROTECT, PROTECT.

#fuses NOCPD //PROTECCIÓN MEMORIA EEPROM.


//NOCPD = No protegida.
60
//Opciones protección EEPROM: NOCPD, CPD.

#fuses NOWRT //PROTECCION MEMORIA DE PROGRAMA CONTRA


ESCRITURA.
//NOWRT = No protegida.
//Opciones protección memoria programa: NOWRT,
//WRT_1000, WRT_800, WRT_100.
#fuses MCLR //USO PIN MCLR (como reset externo o como pin
E/S).
//MCLR = Pin utilizado como Master Clear.
//Opciones pin MCLR: NOMCLR, MCLR.

#fuses NOIESO //CONMUTACIÓN DEL RELOJ DE INTERNO A


EXTERNO EN
//EL ARRANQUE DEL MCU.
//NOIESO = Conmutación deshabilitada.
//Opciones: NOIESO, IESO.

#fuses NOLVP //PROGRAMACIÓN EN BAJO VOLTAJE.


//NOLVP = programación en bajo voltaje desactivada.
//Opciones: NOLVP, LVP.

#fuses NODEBUG //DEPURACIÓN EN CIRCUITO (ICD).


//NODEBUG = Depuración en circuito desactivada.
//Opciones: NODEBUG, DEBUG.

#use delay(clock=4MHz) //Indicando al compilador la frec. del reloj.

//Manejo de puertos.
#use fast_IO(A) //Manejo básico de puertos en este compilador.
#use fast_IO(B) //Otras opciones de manejo de puertos:
#use fast_IO(C) //#use fixed_IO, #use standard_IO.
#use fast_IO(D)
#use fast_IO(E)

//Manejo de registros de 8 bits como si fuesen variables, con la directiva #byte.


#byte TRISA = 0x85
#byte PORTA = 0x05
#byte TRISB = 0x86
#byte PORTB = 0x06
#byte TRISC = 0x87
#byte PORTC = 0x07
61
#byte TRISD = 0x88
#byte PORTD = 0x08
#byte TRISE = 0x89
#byte PORTE = 0x09
//.............
// NOTA: Es más adecuado hacer e incluir un archivo con todos los registros del
// MCU utilizado (por ejemplo registros_PIC16F887.c), que listar en esta
// sección los registros del microcontrolador.

//Manejo de un bit de un registro como varible de un bit, con la directiva #bit.

////////////////////////////////VARIABLES GLOBALES/////////////////////////////

/////////////////////////PROTOTIPOS DE FUNCIONES Y TAREAS//////////////////////


void inicializar(void); //Ejemplos.
void permisivos(void);
void operacion(void);
////////////////////////////////FUNCIÓN PRINCIPAL//////////////////////////////
void main(void) {

inicializar();

permisivos();
while(true) { //Ciclo contínuo con while.
operacion();
}
} //Fin main.
////////////////////////////////////FUNCIONES//////////////////////////////////
/*Función de inicialización de variables y configuración de periféricos.
Descripción: .
Entradas: Ninguna.
Salidas: Ninguna.
*/
void inicializar(void) {
TRISB=0XFF;
TRISC=0XFF;
TRISD=0X00;
}
//Función para detectar que esten presentes todas las condiciones de operación,

62
//antes de iniciar el ciclo contínuo.
//Descripción: .
//Entradas: .
//Salidas: .
void permisivos(void) {
}
//Función de operación del LED 1.
//Descripción: .
//Entradas: .
//Salidas: .
void operacion(void) {
#asm
MOVF PORTB,0
IORWF PORTC,0
MOVWF PORTD
#endasm
}

Los resultados de este inciso H) se presentan en las figuras 32.

Figura 43 Operación OR entre el valor de lectura de dos puertos.

63
 Conclusiones.
Se concluye con éxito la entrega de la practica 2, y la correcta programación en
CCS COMPILER para la correcta ejecución de cada uno de las ejecuciones
solicitadas por el docente, de tal forma que se adquieren conocimientos para el
diseño de estrategias para entender en este caso el lenguaje en ensamblador y
ser un poco más dinámicos a la hora de programar.

Durante el desarrollo de la misma se llevó a cabo la revisión constante de la hoja


de datos con instrucciones del fabricante para llevar a cabo la programación
apropiada de los diferentes incisos tanto en lenguaje de bajo nivel como en
lenguaje de alto nivel con el fin de familiarizarnos sobre el como es que dichos
comandos son realizados y comprender las instrucciones.

Se llevo de la misma manera el desarrollo completo de los diagramas requeridos


con el fin de realizar la programación necesaria siendo esta de la manera mas
simple posible y evitando algún problema relacionado a un fallo en la lógica o
referente a un problema para llevar acabo alguna parte de la misma.

Finalmente también cabe destacar que la practica se llevo de la mejor manera


posible y respetando los lineamientos de la mejor manera posible cuidando
detalles como lo son los puertos, la lógica de programación, las instrucciones en
la programación y el empleo apropiado de los acumuladores para el cumplimiento
de las funciones en los diferentes incisos.

64
Bibliografía.
Boyd, L. (2016). Programa de formación: Mecánico - electrotécnico Nombre del
programa: Procesamiento digital - microprocesadores III.
https://slideplayer.com/slide/8596661/

Marker, G. (S.F). El lenguaje ensamblador. https://www.tecnologiainformatica.com/el-


lenguaje-ensamblador/#Que_es_el_lenguaje_ensamblador

Centros. (S.F). Operaciones con números binarios.


http://centros.edu.xunta.es/iesmanuelchamosolamas/electricidade/fotos/numeracio
n.htm

RodrigoCarita. (22 de abril de 2017). Operaciones Aritméticas ADDLW-ADDWF


(tutorial completo y explicado). [Archivo de video].
https://www.youtube.com/watch?v=iFpQzj0YPf0

CCS C Compiler (5.025). (2020). [Software de ordenador]. CCS.


http://www.ccsinfo.com/compilers.php

Proteus Design Suite (8.8). (2019). [Software de ordenador]. Labcenter.


https://www.labcenter.com/

Microchip Technology Inc. (2007). PIC16F882/883/884/886/887 Data Sheet.


Microchip. http://ww1.microchip.com/downloads/en/devicedoc/41291d.pdf

MICROcontroladores. (2022, 30 marzo). Microcontroladores PIC - Su


arquitectura, proyectos, tipos y MÁS. Todo Sobre Microcontroladores.
https://microcontroladoress.com/pic/

65
Custom Computer Services, Inc. (s. f.). CCS, Inc. - Compiler Features. CCS Info.
http://www.ccsinfo.com/content.php?page=compiler-details

PICkit 3 Programmer (3.1). (2021). [Software de ordenador]. Microchip.


https://microchipdeveloper.com/pickit3:scripttool

Operaciones aritméticas con Sistema Binario: suma y resta. (s. f.).


weblab.
https://weblab.deusto.es/olarex/cd/UD/Puertas%20logicas_ES_final/operaci
one s_aritmticas_con_sistema_binario_suma_y_resta.html

66

También podría gustarte