You are on page 1of 74

See discussions, stats, and author profiles for this publication at: https://www.researchgate.

net/publication/351564559

Manual de prácticas de uC dsPIC y PIC24 con MikroC

Technical Report · March 2021


DOI: 10.13140/RG.2.2.30482.17605

CITATIONS READS
0 1,182

2 authors:

Maria Fernanda Cruz Maya Rigoberto Martinez Mendez


Universidad Autónoma del Estado de México (UAEM) Universidad Autónoma del Estado de México (UAEM)
1 PUBLICATION   0 CITATIONS    69 PUBLICATIONS   235 CITATIONS   

SEE PROFILE SEE PROFILE

Some of the authors of this publication are also working on these related projects:

Acondicionamiento de señales de un sistema de medición de fuerza multiaxial de siete grados de libertad para aplicaciones médicas mediante PSoC View project

Usabilidad View project

All content following this page was uploaded by Rigoberto Martinez Mendez on 13 May 2021.

The user has requested enhancement of the downloaded file.


UNIVERSIDAD AUTÓNOMA DEL ESTADO DE

MÉXICO

Facultad De Ingeniería

Ingeniería en Electrónica

Servicio Social

Manual de prácticas de microcontroladores dsPIC


(DSC/PIC24).

Desarrollado por: María Fernanda Cruz Maya

Marzo de 2021
Introducción
El manual de prácticas de microcontroladores dsPIC (DSC/PIC24) es una guía para
principiantes en la programación de microcontroladores en lenguaje de alto nivel
como C, en este manual se utiliza el PIC24F16KA102 que pertenece a una familia
de microcontroladores de 16 bits con un amplio conjunto de funciones periféricas y
un rendimiento computacional mejorado. Haciendo uso del compilador MIKRO C
PRO dsPIC/PIC24 para la creacion de programas o proyectos en lenguaje C. Esta
guía cuenta con documentación teórica sobre microcontroladores, como la
instalación y conocimiento básico sobre el compilador MIKRO C PRO dsPIC/PIC24,
de igual manera cuenta con 13 prácticas que incluyen un circuito eléctrico en
Proteus.

2
1 Índice
Introducción ............................................................................................................................ 2
Marco teórico .......................................................................................................................... 5
Microcontroladores ............................................................................................................. 5
Microprocesador ................................................................................................................. 5
CPU “Central Processor UNIT” (Unidad Central de Procesamiento). .............................. 5
Tipos de buses .................................................................................................................... 5
Unidad de memoria ............................................................................................................ 6
Tipos de memoria ............................................................................................................... 6
Bit……………. .................................................................................................................. 7
Byte…………..................................................................................................................... 8
Registro............................................................................................................................... 8
Registros SFR (Registros de funciones especiales) ............................................................ 8
Puertos de Entrada/Salida(E/S) .......................................................................................... 8
Interrupción ........................................................................................................................ 9
Configuración y uso de interrupciones. .......................................................................... 9
Oscilador............................................................................................................................. 9
Temporizadores .................................................................................................................. 9
Contadores ........................................................................................................................ 10
Temporizador perro guardián (Watchdog). ...................................................................... 10
Tipos de comunicación ..................................................................................................... 10
Velocidad de transmisión serial ........................................................................................ 10
UART “Universal Asynchronous Recerver/Transmitter” (Transmisor-Receptor
Asíncrono Universal) ........................................................................................................ 11
I2C “Inter Integrated Circuit” (Circuito Inter-Integrado). ................................................ 11
SPI “Serial Periferical Interface BUS” (Serial de Interfaz de Periféricos)....................... 12
Manual de uso....................................................................................................................... 14
Descargar el compilador MIKRO C PRO dsPIC/PIC24 versión 7.1.0. ........................... 15
Conocimientos básicos del panel vista principal de MIKRO C PRO dsPIC/PIC24 versión
7.1.0. 16
Crear nuevo proyecto........................................................................................................ 19
Project manager (Administrador de proyecto) ................................................................. 20
Library manager ............................................................................................................... 21
Project settings (Configuración de proyectos).................................................................. 21
Debbuger software en MIKRO C PRO dsPIC/PIC24 ...................................................... 22
Cargar el programa en el microcontrolador ...................................................................... 24
Herramientas del compilador ........................................................................................... 25
Editor de siete segmentos ............................................................................................. 25
Replace ......................................................................................................................... 26
Características del PIC24F16KA102.................................................................................... 27
Diagrama de pines ............................................................................................................ 28
Conexión básica................................................................................................................ 28
E/S Puertos ....................................................................................................................... 32
Registro TRISx ................................................................................................................. 32
3
Registro PORTx y LATx................................................................................................. 32
Configuración de pines de puerto analógico. ................................................................... 34
Interrupciones en el PIC24F16KA102 ............................................................................. 34
Interrupciones periféricas y señales externas ............................................................... 35
Registros de estado y control de interrupciones ........................................................... 35
Práctica 1.- Encender y apagar un Led con un push button. ................................................ 36
Práctica 2.- Leds en el Puerto B. .......................................................................................... 37
Práctica 3.-Encender y apagar Leds en el puerto B con condiciones switch, for y while. ... 38
Práctica 4.-Generar números en un display de 7 segmentos. ............................................... 40
Práctica 5.-Generar melodía en Buzzer. ............................................................................... 42
Práctica 6.- Encender y apagar: Leds y buzzer. ................................................................... 45
Práctica 7.- Pantalla LCD de 2x16. ...................................................................................... 48
Práctica 8.- Convertidor A/D ................................................................................................ 51
Práctica 9.-Medir el voltaje en un potenciómetro y mostrar el valor en un display LCD. ... 53
Práctica 10.-Cambiar ancho de pulso usando librería PWM. ............................................... 56
Práctica 11.- Con un potenciómetro cambiar el ancho de pulso de una señal PWM. .......... 58
Práctica 12.- Interrupción con timer1 ................................................................................... 60
Práctica 13.-Sensor de temperatura DS1820 ........................................................................ 62
Características del Display LCD 2x16 (Display de cristal líquido) ..................................... 66
Características básicas del Protocolo 1-wire ........................................................................ 69
Sensor de temperatura DS1820 ........................................................................................ 70
Características del sensor de temperatura:.................................................................... 70
Bibliografía ........................................................................................................................... 72

4
Marco teórico
Microcontroladores
Es un microcomputador realizado en un circuito integrado (chip). Un
microcontrolador contiene: un microprocesador, memoria de datos, memoria de
programa y las unidades de entrada y salida. [1]

Microprocesador
Es capaz de interpretar instrucciones y procesar los datos contenidos en los
programas de computadora proporcionando el control de las operaciones de
cálculo.

CPU “Central Processor UNIT” (Unidad Central de Procesamiento).


Unidad que controla todos los procesos dentro del microcontrolador. La CPU es el
“cerebro” del microcontrolador y actúa bajo el control del programa almacenado en
la memoria. La CPU se ocupa de traer las instrucciones del programa desde la
memoria, interpretarlas y hacer que se ejecuten. La CPU no es otra cosa que el
microprocesador.
a) Decodificador de instrucciones: parte que codifica las instrucciones del
programa y acciona otros circuitos basándose en estas.
b) ALU “Arithmetic and Logic Unit” (Unidad Lógica Aritmética): realiza todas las
operaciones matemáticas y lógicas sobre los datos.
c) Acumulador: es el registro asociado a las operaciones aritméticas y lógicas
que se pueden realizar en la ALU. En cualquier operación, uno de los datos
debe estar en el acumulador y es aquí donde se obtiene el resultado.

Tipos de buses
a) Bus de Direcciones: es un bus unidireccional (la información fluye en una
sola dirección) de la CPU a la memoria o a los elementos de entrada y salida.
La CPU solo puede colocar niveles lógicos en las n líneas de dirección, con
la cual se genera 2n posibles direcciones diferentes. Cada una de estas
direcciones corresponde a una localidad de la memoria o dispositivo de E/S.

b) Bus de Datos: bus bidireccional, dado que los datos pueden fluir hacia o
desde la CPU. El bus de datos es tan ancho como los datos, para este caso,
es de 8 bits o líneas de ancho.

c) Bus de control: este conjunto de señales se usa para sincronizar las


actividades y transacciones con los periféricos del sistema. Las señales más
importantes en el bus de control son las señales de cronómetros, que
generan los intervalos de tiempo durante los cuales se realizan las
operaciones. [2]

5
Unidad de memoria
La memoria del microcontrolador es el espacio donde se almacenan las
instrucciones del programa y los datos que manipula. Cada dirección de memoria
corresponde a una localidad de memoria. El contenido de cualquier localidad se
puede leer y se puede acceder al direccionarla.

Tipos de memoria
a) Memoria ROM “Read Only Memory” (Memoria De Solo Lectura): se utiliza
para guardar permanentemente el programa que se debe ejecutar en el
microcontrolador. La memoria ROM es una memoria de solo lectura y no
volátil. Dependiendo de la capacidad de almacenamiento de la memoria es
el tamaño del programa que se puede escribir. Por ejemplo, la memoria ROM
del PIC24 está dividida en varias secciones como se muestra en la figura 1,
el tamaño de estas secciones depende del dispositivo.

Fig. 1. Organización de memoria de programa (ROM) del PIC24.


Mikroe,27 agosto 2020. [En línea]. Available: https://www.mikroe.com/.

b) Memoria RAM “Random Access Memory” (Memoria de Acceso Aleatorio): la


RAM (memoria de datos) es una memoria de lectura y escritura, que además
es volátil, es decir, pierde la información almacenada cuando falta la energía
que alimenta la memoria. En la memoria RAM se almacenan temporalmente
los datos con los que trabaja el programa.

Tanto memorias como RAM y ROM son de acceso aleatorio, pero la costumbre
ha dejado el nombre de RAM para memoria de lectura y escritura. El término
“acceso aleatorio” se refiere a el tiempo necesario para localizar un dato, no
depende del lugar de la memoria donde esté almacenado. En las memorias de
acceso secuencial, en cambio, cuando más alejado esté un dato de la posición
a la que se ha accedido por última vez, más se tarda en localizarlo.
[3].

6
c) Memoria Flash: es posible escribir y borrar el contenido de esta memoria un
número limitado de veces. Por ejemplo, en una MCU PIC de 16 bits donde
se utiliza principalmente para contener instrucciones del programa. También
se puede utilizar para almacenar datos(constantes).

d) Memoria EEPROM “Electrically Erasable Programmable ROM” (ROM


programable y borrable eléctricamente): el contenido de la EEPROM se
puede cambiar durante el funcionamiento (similar a la RAM), pero se queda
permanente guardado después de la pérdida de la fuente de alimentación
(similar a la ROM). Un dispositivo EEPROM típico, independientemente de
su tipo (interno/externo) tiene las siguientes características: capacidad de
borrado eléctrico, reprogramabilidad eléctrica, interfaces series/paralelo para
líneas de dirección/datos (EEPROM externas) e interfaz de memoria fácil de
controlar mediante programación (EEPROM interna). Aunque también tiene
un periodo de vida útil y varía según cada memoria por lo que se debe
consultar en el datasheet.

Aplicaciones de las memorias EEPROM:


a) Cuando se construye un robot que realiza una misión específica
(escanear, buscar, rastrear) donde recolecta datos críticos. Se requiere
tener una copia de seguridad en su memoria EEPROM. En caso de
emergencia, puede transmitir estos datos a través de un bus serie a su
computadora en cualquier momento que desee.
b) Cuando se construye un sistema informático que necesita cambiar entre
programas (parcialmente), debe tener una memoria para almacenar
instrucciones del programa. Esta le permite cargar dichas instrucciones
en su memoria flash cuando las ocupe.
c) En la creación de un sistema integrado que requiera recordar datos
proporcionados por el usuario incluso después de un reinicio o una
condición de apagado. Como un casillero de dinero protegido con
contraseña de bloqueo digital, cuando la alimentación se apaga, la
contraseña del usuario debe almacenarse en un lugar seguro.
Bit
Un bit es solo un digito binario, el significado de un bit depende de la posición que
tiene en número binario. Ya que el sistema binario utiliza solamente dos dígitos, el
valor de un bit puede ser 0 o 1, como se muestra en la Figura 2.

Fig. 2.Un byte.


«Megan man,» 29 agosto 2014. [En línea]. Available: http://historiamega.blogspot.com/.

7
Byte
Consiste en 8 bits colocados de manera ordenada, los bytes representan los
números. Con 8 dígitos de un byte, se pueden representar 256 combinaciones
diferentes y el mayor número decimal que se puede crear es 255.
Registro
Un registro o celda de memoria, es un circuito electrónico capaz de memorizar el
estado de un byte. En el PIC, es un lugar donde se puede leer y/o escribir.

Registros SFR (Registros de funciones especiales)


Sus bits están conectados a los circuitos internos del microcontrolador tales como
temporizadores, convertidores Analógico/Digital, osciladores, entre otros; lo que
significa que directamente manejan el funcionamiento de estos circuitos, es decir,
del microcontrolador.

Puertos de Entrada/Salida(E/S)
La entrada y salida es particularmente importante en los microcontroladores, a
través de los puertos, el microcontrolador interacciona con el exterior. El bit de
registro TRIS (Pin=”0” lógico) correspondiente del puerto se configurará como una
salida, en cambio, TRIS (Pin=”1” lógico) se configurará como una entrada. (figura 3)

Fig. 3. Puertos de Entrada/Salida en un PIC.


«Explore Embedded,» 4 mayo 2016. [En línea]. Available: https://exploreembedded.com/.

Mientras más pines E/S haya, más baja es la corriente máxima de un pin. Todos los
puertos E/S comparten la corriente máxima declarada en la hoja de especificaciones
del microprocesador.

8
Interrupción
Una interrupción requiere que el microcontrolador detenga la ejecución normal del
programa y luego salte para ejecutar un código del programa relacionado con el
evento que causa la interrupción, solo una vez que el microcontrolador termine de
ejecutar el código de la interrupción, entonces puede continuar para terminar con el
programa principal.

Configuración y uso de interrupciones.


Hay tres conjuntos de bits de control que deben tenerse en cuenta al trabajar con
interrupciones:
a) Interrumpir banderas.
Indica que se ha producido un evento de interrupción.
Establecido por el hardware y aprobado por el programador.
b) Interrupción habilita.
Habilitar o deshabilitar fuentes de interrupción individuales.
c) Bits de prioridad de interrupción.
Establecer la prioridad de las fuentes de interrupción individuales. [4]

Aplicaciones de interrupciones.
a) Aplicaciones a prueba de fallas: Las aplicaciones que requieren la atención
inmediata del microcontrolador, pueden usar interrupciones externas. Por
ejemplo, durante una falla de energía, el microcontrolador tiene que tomar
acciones rápidas como apagar el sistema, una interrupción externa obligará
al microcontrolador a detenerse y realizar acciones determinadas.
b) Realizar tareas de rutina: cuando una aplicación requiere que el
microcontrolador realice tareas de rutina en momentos precisos (hacer
parpadear un led de estado, leer las entradas de sensores) una interrupción
del temporizador programada (con el tiempo requerido) puede desviar al
microcontrolador de la ejecución normal para realizar la tarea en el momento
indicado.

Oscilador
Los pulsos generados por el oscilador permiten el funcionamiento armónico y
síncrono de todos los circuitos del microcontrolador. El oscilador controla todos los
periféricos y el reloj de instrucciones. Las instrucciones del programa no se ejecutan
a la velocidad impuesta sino varias veces más despacio.[13]

Temporizadores
Se emplean para controlar periodos de tiempo. Los pulsos generados por el
oscilador de cuarzo son llevados al circuito una vez por cada ciclo de máquina o por
el preescalador, lo que aumenta el número en el registro del temporizador.

9
Contadores
Es un dispositivo que almacena la cantidad de veces que ocurrió un evento o
proceso, con respecto a una señal de reloj. Cuando se desean contar
acontecimientos que se materializan por cambios de nivel o flancos en alguno de
los pines del microcontrolador, el mencionado registro se va incrementado o
decrementando al ritmo de dichos impulsos. [5]

Temporizador perro guardián (Watchdog).


El perro guardián es un temporizador conectado a un oscilador RC completamente
independiente dentro del microcontrolador. Si el perro guardián está habilitado, cada
vez que cuenta hasta el máximo valor en el que ocurre el desbordamiento del
registro se genera una señal de reinicio del microcontrolador y la ejecución de
programa inicia en la primera instrucción. El punto es evitar que eso ocurra al utilizar
el comando adecuado. Si las instrucciones que reinician el temporizador perro
guardián se colocan en lugares estratégicos del programa, el funcionamiento no
afectará a la ejecución del programa.

Tipos de comunicación
Serial Comunication: la comunicación en serie utiliza un método binario digital para
intercambiar datos. Emplea una serie de interfaces y protocolos de comunicación
en serie, incluidos RS323, RS485, SPI e I2C. Para implementar la comunicación en
serie, se requiere un origen y un destino, también se le conoce como emisor y
receptor.

Modos de transmisión

DATOS: Permite que el origen y El origen y el destino


UNIDIRECCIONAL. destino estén activos, pero están activos, ambos
no simultáneamente. La pueden enviar y recibir
transmisión solo ocurre en datos simultáneamente.
una dirección.

Velocidad de transmisión serial


La velocidad de transmisión serial (baud rate) es el término utilizado para denotar el
número de bits transmitidos por segundo[bps]. El protocolo normalmente requiere
que cada byte se transmita junto con varios bits de control. Eso quiere decir que un
byte, en un flujo de datos serial, puede consistir en 11 bits.

10
UART “Universal Asynchronous Recerver/Transmitter” (Transmisor-Receptor
Asíncrono Universal)
Este tipo de comunicación es asíncrona. Lo que significa que no utiliza una línea
especial para transmitir la señal de reloj. Los dispositivos UART son empleados
comúnmente en conjunción con estándares de comunicación como EIA, RS-232,
RS-422 o RS-485. La UART es capaz de transmitir bytes de datos enviando bits
individuales de forma secuencial. El dispositivo receptor se encarga de reensamblar
estos bits en un byte completo.
Siempre que no se esté produciendo una transmisión de datos, la línea de salida
estará a nivel alto. Él envió de un carácter se completa con la secuencia mostrada
en la siguiente figura 4:

Fig. 4. Formato de envió de datos de la comunicación UART.


«COOFFEE Brain,» 2015 agosto 2015. [En línea]. Available: http://www.coffeebrain.org/blog/.

Cada transmisión se inicia con un bit de Start, en este caso la línea tendrá un nivel
lógico de cero. La información requerida se puede programar, el número de bits que
queremos transmitir está en un rango de 5-9 bits, aunque lo habitual son 8 bits (el
primer bit corresponde con el bit menos significativo). Opcionalmente se puede
transmitir un bit de paridad siempre y cuando no se haya elegido la transmisión de
9 bits de datos. Para finalizar la transmisión se envía un bit de Stop, a diferencia del
bit de Start nos encontramos con un nivel lógico de uno. [6]

I2C “Inter Integrated Circuit” (Circuito Inter-Integrado).


Sistema de intercambio de datos entre microcontroladores y circuitos integrados,
para la conexión de periféricos a distancias relativamente cortas y velocidades de
unos cientos de Kbps. El protocolo se implementa sobre dos líneas, una línea de
clock de sincronismo (SCL: Serial Clock) y otra para los datos (SDA: Serial Data).
Como los datos se transmiten por una sola línea, el sistema es bidireccional del tipo
Master/Slave.
El dispositivo que inicia una transacción en el bus I2C es denominado Master. El
Master controla las líneas de Clock SCL y Datos SDA durante una comunicación
típica. Un dispositivo siendo dirigido por el Master es llamado Slave. I2C es un bus
serial two-wire, como se muestra en la Figura 5.

11
Fig. 5. Protocolo I2C.
«DIIGNAL,» [En línea]. Available: https://dignal.com/.

SPI “Serial Periferical Interface BUS” (Serial de Interfaz de Periféricos)


Motorola creo el puerto SPI en 80´s para ser utilizado en sus microcontroladores. El
protocolo SPI es principalmente utilizado para permitir a los microcontroladores
comunicarse con dispositivos periféricos.
La interfaz periférica serie es síncrona (emplea una línea de reloj para sincronizar
las transmisiones de datos entre dispositivos) Master-Slave basada en un registro
de desplazamiento de 8 bits. El Master SPI genera una señal de clock usada por
todos los dispositivos SPI para coordinar la transferencia de datos. [7]

El protocolo SPI utiliza la conexión full duplex (los datos se envían y reciben
simultáneamente). Es un sistema para la comunicación serial que utiliza hasta 4
líneas para recibir y transmitir datos además de sincronizar y seleccionar el
dispositivo (figura 6). Cuando el Master genera el reloj y selecciona un dispositivo
Slave, los datos pueden ser enviados en una o ambas direcciones de manera
simultánea.

Fig. 6. Protocolo SPI.


S. C. García, «IMPLEMENTACIÓN DE ANALIZADORES DE PROTOCOLOS DE COMUNICACIONES SPI, I2C,» 2014.

SCLK (Clock): pulso que marca la sincronización. Con cada pulso de este reloj, se
lee o se envía un bit.
MOSI (Master Output Slave Input): salida de datos del Master y entrada de datos al
Slave.
MISO (Master Input Slave Output): salida de datos del Slave y entrada de datos al
Master.

12
SS/Select: para seleccionar un Slave, o para que el Master le diga al Slave que se
active.
El protocolo SPI es usado a distancias cortas o nivel de PBC, debido a que es un
protocolo que trabaja en altas frecuencias, cuando se trabaja con largas distancias
y altas frecuencias interviene el factor ruido. [8]

13
Manual de uso
El sistema de desarrollo Easy-33v6(figura 7) proporciona un entorno de desarrollo
para programar y experimentar con los microcontroladores PIC24 y dsPIC33.

Características generales:
a) El sistema de desarrollo Easy24-33v6 tiene incorporado el PIC24F14KA102
como microcontrolador base, pero cuenta con encapsulados DIP para la
incorporación de otros microcontroladores de la familia PIC24F y dsPIC33.
b) Easy24-33 se puede alimentar desde tu computador con el cable USB (USB
PROG) mismo que se usa para programar el microcontrolador.
c) Cuenta con los siguientes módulos: EEPROM serial (24AA01),
comunicación USB, RAM serial (23K640) de 64Kbit, RS-232 para
intercambiar datos entre el microcontrolador y un dispositivo externo,
comunicación CAN (MCP2551) y USB UART. También tiene incorporados
componentes como Buzzer, diodo leds, push button, teclado sensible al
tacto, pantalla LCD 2x16 y un sensor de temperatura DS1820.
d) Dispone de conectores para componentes externos conectados a los pines
E/S del microcontrolador.
e) Tiene un precio comercial desde $139.00 USD, y la adquisición del
compilador con licencia tiene un precio aproximado de $269.00 USD. [9]
Las prácticas de este manual fueron elaboradas en el compilador MIKROC PRO for
dsPIC/PIC24 y probadas en el sistema de desarrollo Easy24-33v6, pero, si requiere
elaborar las practicas solo es indispensable el compilador, ya que, el circuito
eléctrico puede ser elaborado con componentes comerciales.

Fig. 7. Sistema de desarrollo Easy-33v6


«MIKROE Time-saving embedded tools.,» 2021. [En línea]. Available: https://www.mikroe.com/.

14
Descargar el compilador MIKRO C PRO dsPIC/PIC24 versión 7.1.0.
Ingrese a la página de Mikroelektronika. La versión gratuita de los compiladores
admite proyectos con un tamaño inferior a 2K de palabras de programa, la versión
completa requiere una licencia.

Ingresa a compilers.

Selecciona dsPIC/PIC24 > C >MIKROC PRO for dsPIC> More info.

15
Descargue el archivo.

Descomprime la carpeta y ejecute el programa.

Conocimientos básicos del panel vista principal de MIKRO C PRO dsPIC/PIC24


versión 7.1.0.
Al iniciar el IDE del compilador MIKRO C PRO dsPIC/PIC24, aparecerá la siguiente
ventana:

«MIKROE Time-saving embedded tools.,» 2021. [En línea]. Available: https://www.mikroe.com/.

Si se quiere conocer los componentes basicos y sus funcionamientos,MIKRO C


PRO dsPIC/PIC24 nos proporciona informacion detallada de las herramientas en la
barra principal.

16
Para acceder a esta informacion da clic en Help ó F1.

Te aparecerá esta pantalla.

Las carpetas muestran información relacionada con MIKRO C PRO dsPIC/PIC24.

17
En la carpeta MIKROC PRO for dsPIC30/33 and PIC24 Environment, aparece la
descripción del Main Menu Options.

Se muestra un índice donde se encuentran librerías, funciones y operadores lógicos.

18
Crear nuevo proyecto.
New Project >Standard project > next.

Ingrese el nombre y la ubicación del proyecto, seleccione el dispositivo y el valor


de frecuencia del oscilador.

19
Agrega los archivos al proyecto disponibles (siempre puede incorporar archivos de
proyecto más tarde usando Project Manager):

Project manager (Administrador de proyecto)


Un programa escrito en el compilador MIKRO C PRO dsPIC/PIC24 no es un archivo
autónomo, sino que forma parte de un proyecto que incluye un código hex, un
código ensamblador y otros archivos. Algunos de ellos se requieren para compilar
el programa, mientras que otros se crean durante el proceso de compilación. La
ventana Project Manager le permite manejar todos los ficheros del proyecto.

20
Library manager
Las librerías en MIKRO C PRO dsPIC/PIC24 facilitan la realización de programas.
Al marcar una librería, se añade automáticamente al proyecto y se enlaza durante
el proceso de la compilación. Así, no necesita incluir las librerías manualmente en
sus archivos del código fuente por medio de la directiva del preprocesador #include.

Project settings (Configuración de proyectos)


Device: Al seleccionar el tipo de microcontrolador, permite al compilador extraer el
archivo de definición asociado.
Oscillator: Se debe especificar la velocidad de operación del microcontrolador.
Build/Debugger Type: Todo el proceso de compilar está compuesto por análisis
sintáctico, compilar, enlazar y generar los archivos hex.
Build type - release: Al elegir esta opción, el compilador no puede afectar más a la
ejecución de programa después de la compilación. El programa a cargar en el
microcontrolador no será modificado de ninguna manera.
Build type - ICD debug: El archivo hex generado contiene los datos adicionales que
permiten el funcionamiento del depurador. Una vez completado el proceso de la
compilación y cargado el programa en la memoria del microcontrolador, el
compilador se queda conectado al microcontrolador por medio del cable USB y el
programador; todavía puede afectar a su funcionamiento. Una herramienta
denominada mikroICD (Depurador en circuito - In Circuit Debugger) permite ejecutar
el programa paso a paso y proporcionar un acceso al contenido actual de todos los
registros del microcontrolador.

21
Debbuger software en MIKRO C PRO dsPIC/PIC24
Se utiliza para probar y depurar programas en tiempo real. El proceso se realiza al
monitorear los estados de todos los registros dentro del microcontrolador durante
su funcionamiento en entorno real.
Seleccione View>Toolbars>Debugger Toolbar.

22
En el panel principal selecciona Start Debugger.

En la parte superior derecha de la pantalla aparecerá Watch Values.

En la figura 4.1 se puede apreciar mejor cada icono y su función de Watch Values.

«MIKROE Time-saving embedded tools.,» 2021. [En línea]. Available: https://www.mikroe.com/.

23
Debugger también ofrece opciones tales como ejecutar el programa paso a paso,
detener la ejecución de programa para examinar el estado de los registros
actualmente activos por medio de los puntos de ruptura, monitorizar los valores de
algunas variables, etc.
Hay varios iconos (utilizados para el funcionamiento del simulador) que aparecerán
en la barra de herramientas cuando el compilador entre en este modo.

«MIKROE Time-saving embedded tools.,» 2021. [En línea]. Available: https://www.mikroe.com/.

Significado de los iconos:


Step Into: Ejecuta una sola instrucción. Cuando la instrucción es una llamada a una
subrutina, el depurador hará un salto a la subrutina y se detendrá después de
ejecutar la primera instrucción dentro de la subrutina.
Step Over: Se ejecuta una sola instrucción. Cuando la instrucción es una llamada a
una subrutina, el depurador no hará un salto a la subrutina, sino que se ejecutará
toda la subrutina. El depurador se detiene a la primera instrucción después de la
llamada a la subrutina. Parece como si se saltara una línea de programa, aunque
se ha ejecutado toda la subrutina. El estado de todos los registros será cambiado.
Este comando se ejecuta cuando es necesario acelerar la ejecución de los bucles
de programa largos.
Run To Cursor: El programa se ejecuta hasta la línea en la que se encuentre el
cursor.
Step out: Se ejecutan las demás instrucciones dentro de la rutina. El depurador se
detiene inmediatamente al salir de la subrutina.

Cargar el programa en el microcontrolador


Si ha solucionado todos los errores en su código y el programa está listo, el siguiente
paso es cárgalo en el microcontrolador. El programador PICflash se utiliza para este
propósito.
Está compuesto por dos partes:
a) La parte hardware se utiliza para poner en el búfer un código hexadecimal y
para programar el microcontrolador por medio de niveles de voltaje
específicos. Durante el proceso de programación, un nuevo programa se

24
escribe en la memoria flash del microcontrolador, mientras que el programa
anterior se borra automáticamente.
b) La parte de software se encarga de enviar el programa (archivo. hex) a la
parte hardware del programador por medio de un cable USB.

«MIKROE Time-saving embedded tools.,» 2021. [En línea]. Available: https://www.mikroe.com/.

Herramientas del compilador


El compilador MIKRO C PRO dsPIC/PIC24 proporciona herramientas que
simplifican el proceso de escribir el programa, estas herramientas se encuentran en
el menú Tools.

Editor de siete segmentos


En el apartado de Tools>Seven Segment Editor te ayuda a generar el numero (o
letra) en Hexadecimal o decimal para el display ya sea ánodo o cátodo. Descripción
del editor:

«MIKROE Time-saving embedded tools.,» 2021. [En línea]. Available: https://www.mikroe.com/.

25
Replace
Es una herramienta para agilizar la escritura del programa en lenguaje C, reemplaza
una palabra o renglón según desees corregir. Primero seleccionas el código donde
realizaras modificaciones y luego en Edit>Replace.

En seguida te aparecerá Replace Text en Search for la palabra que deseas corregir
y en Replace with se coloca la palabra correcta.

26
Características del PIC24F16KA102
Los microcontroladores PIC24F16KA102 (figura 8) son una gran familia de
microcontroladores fabricados por Microchip Technology Inc. Se basan en una
arquitectura Harvard modificada.

Fig. 8. Características del PIC24F16KA102.


MICROCHIP, «PIC24F16KA102 Family Data Sheet,» 2008.

27
Diagrama de pines

Fig. 9.Diagrama de pines del PIC24F16KA102.


MICROCHIP, «PIC24F16KA102 Family Data Sheet,» 2008.

Conexión básica
Al comenzar con la familia PIC24F16KA102 de microcontroladores de 16 bits, se
requiere atención a un conjunto mínimo de conexiones de pines del dispositivo antes
de continuar con el desarrollo.
Los siguientes pines siempre deben estar conectados:
a) Todos los pines VDD y VSS.
Es necesario el uso de condensadores de desacoplamiento en cada par de
pines de la fuente de alimentación, como VDD y VSS.
Valor y tipo de capacitor: Se recomienda un capacitor de 0.1 μF (100 nF), 10-
20V. El condensador debe ser un dispositivo de baja ESR con una frecuencia
de resonancia en el rango de 200 MHz y superior. Se recomiendan los
condensadores cerámicos.
Colocación en la placa de circuito impreso: Los condensadores de
desacoplamiento deben colocarse lo más cerca posible de los pines.
b) Pin MCLR.
El pin MCLR proporciona dos funciones específicas del dispositivo: reinicio,
programación y depuración del dispositivo. (figura 10:configuración típica)

28
Fig. 10. Conexiones mínimas recomendadas.
MICROCHIP, «PIC24F16KA102 Family Data Sheet,» 2008.

Durante la programación y la depuración, se considera la resistencia y


capacitancia que se puede agregar al pin. Los programadores y depuradores
de dispositivos controlan el pin MCLR, se recomienda que el condensador
C1 se aísle del pin MCLR durante las operaciones de programación y
depuración mediante un puente, un ejemplo de conexión en la figura 11.

Fig.11. Ejemplo de conexiones del pin MCLR.


MICROCHIP, «PIC24F16KA102 Family Data Sheet,» 2008.

29
Estos pines también deben estar conectados si se utilizan en la aplicación final:
a) El Oscilador Primario (POSC) en los pines OSCI y OSCO, para cuando se
utiliza una fuente de oscilador externo: En general, el oscilador primario se
puede configurar para una entrada de reloj externa o un cristal externo. El
oscilador primario tiene hasta 5 modos de funcionamiento (Tabla 9-1).

MICROCHIP, «PIC24F16KA102 Family Data Sheet, » 2008.

El circuito dentro del dispositivo es un amplificador inversor que está


diseñado para impulsar el oscilador de cuarzo con la corriente de excitación
adecuada según el modo seleccionado. Hay tres niveles de corriente de
excitación para el oscilador de cuarzo:

LP: este modo de oscilador selecciona el ajuste de ganancia más bajo para
el amplificador-inversor interno (es el consumo de corriente más bajo de los
tres modos). Está diseñado para impulsar un cristal tipo diapasón de 32,768
khz.

XT: este modo de oscilador selecciona la ganancia intermedia para el


amplificador-inversor interno. Se selecciona típicamente para cristales o
resonadores en el rango de 4 Mhz o menos.

HS: este modo de oscilador selecciona la configuración de ganancia más alta


para el amplificador-inversor interno (modo de corriente más alto) y
generalmente se usa con cristales o resonadores por encima del rango de 4
Mhz a 25 Mhz.

El cristal o resonador está conectado a los pines OSC1 y OSC2 como se


muestra en la figura 12. El cristal o resonador también requerirá
condensadores (C1 y C2) en cada pin en el rango de 22pF-33pF.

30
Fig. 11. Conexión del oscilador en modo XT o HS.
MICROCHIP, «PIC24F Family Reference Manual, Sect. 6 Oscillator,» 2009.

Conforme a la información anterior; el circuito base se ilustra en la figura 13, en


todas las prácticas de este manual se usará esta conexión, solo se le agregará
algunos componentes según requiera la práctica.

Fig. 13. Conexión Básica del PIC24F16KA102.

31
Para las especificaciones (configuración) del oscilador en MIKRO C PRO
dsPIC/PIC24 > Project >Edit Project.

E/S Puertos
Todos los puertos de E/S tienen cuatro registros asociados directamente con la
operación del puerto, donde “x” es una letra que denota el puerto de E/S en
particular como se puede muestra en la figura 14.

Fig. 14. Registros de E/S Puertos.


MICROCHIP, « PIC24F Family Section 12. I/O Ports with Peripheral Pin Select (PPS),» 2007.

Registro TRISx
Los bits de control de registro TRISx determinan si cada pin es una entrada o una
salida. Si el bit TRISx para un pin es "1", entonces el pin es una entrada, si es "0",
el pin está configurado para una salida.

Registro PORTx y LATx.


El PIC24F16KA102 tiene un registro LATx que posiblemente otros PICs como
PIC16F882/883/884/886/887 no lo tienen, tal vez pueda existir confusión al
momento de usar PORT o LAT, así que, para comprenderlo mejor, se hará uso del
diagrama de bloques (figura 15); que es una estructura típica de puerto compartido
del datasheet del PIC24F16KA102.

32
Fig. 15.-Diagrama de bloques de una estructura típica de puerto compartido.
MICROCHIP, «PIC24F16KA102 Family Data Sheet,» 2008.

Se puede acceder a los datos de un pin I/O a través de un registro PORTx.


Registro PORTx

Leer Escribir

Lee el valor de los datos del PIN I/O. Escribe el valor de los datos en el Data latch del
puerto.

El registro LATx está asociado con un pin I/O elimina los problemas que podrían
ocurrir con las instrucciones de lectura-modificación-escritura.
Registro LATx

Leer Escribir

Lee el valor de los datos retenido los Laches del Escribe el valor de los datos en el Data latch del
puerto. puerto.

Una operación de lectura-modificación-escritura en el registro LATx, asociada con


un puerto I/O, evita la posibilidad de escribir los valores de los pines de entrada en
los latches del puerto.

33
Configuración de pines de puerto analógico.
El registro de función especial AD1PCFG controla la asignación A/D de cada pin. El
uso de los registros AD1PCFG y TRISx controla el funcionamiento de los pines del
puerto A/D. Los pines del puerto que se desean como entradas analógicas deben
tener su bit TRISx correspondiente establecido (entrada). Si se borra el bit
TRISx(salida), se convertirá el nivel de salida digital (VOH o VOL).
Al leer el registro PORTx, todos los pines configurados como canales de entrada
analógica se leerán como borrados (un nivel bajo). Los niveles analógicos en
cualquier pin que se define como una entrada digital (incluidos los pines ANx)
pueden hacer que el búfer de entrada consuma corriente que exceda las
especificaciones del dispositivo.

Interrupciones en el PIC24F16KA102
Para la familia de microcontroladores PIC24F, en la sección 8: denominada
Interrupciones, cuenta con la tabla de vectores de interrupción (IVT) con hasta 118
fuentes de interrupción. Cada fuente de interrupción puede desencadenar la
ejecución de una pieza de código única, denominada rutina de servicio de
interrupción (ISR).

La dirección de inicio de cada ISR se almacena en la Tabla de vectores de


interrupción primaria (IVT) como se muestra en la figura 16: en general, cada fuente
de interrupción tiene su propio vector. Cada vector de interrupción contiene una
dirección amplia de 24 bits.

Fig. 16. Tabla de vectores de interrupción primaria (IVT).


Microchip , «Microchip Developer Help,» [En línea]. Available: https://microchipdeveloper.com/.

34
Interrupciones periféricas y señales externas
Estas son las solicitudes de interrupción regulares y enmascarables que provienen
de una variedad de periféricos MCU implementados:
• Pines de interrupción externos.
• Captura de entrada / Comparación de salida.
• Interfaces de comunicación (UART / SPI / I2C / USB / Ethernet).
• Puerto Master paralelo (PMP).
• E/S analógicas (comparador, ADC / DAC).

Registros de estado y control de interrupciones


El controlador de interrupciones es responsable de la preparación y
preprocesamiento de las interrupciones:
Los registros IECx mantienen todos los bits de habilitación de interrupciones. Estos
bits de control se utilizan para habilitar individualmente las interrupciones de los
periféricos o señales externas.
Los registros IFSx mantienen todos los indicadores de solicitud de interrupción.
Cada fuente de interrupción tiene un bit de estado, que es establecido por los
respectivos periféricos, y se borra a través del software.
Los registros IPCx se utilizan para establecer el nivel de prioridad de interrupción
para cada fuente de interrupción, el usuario puede asignar entre 1y 8 niveles de
prioridad. Si a una interrupción se le asigna el nivel de prioridad 0, es lo mismo que
si los bits establecidos en IECx (no permiten ninguna interrupción).
Las funciones de control de interrupciones globales se controlan desde INTCON1 e
INTCON2. INTCON1 contiene el bit Interrupt Nesting Disable (NSTDIS), así como
los indicadores de control y estado para las fuentes de trampa del procesador.
El registro INTCON2 controla el comportamiento de la señal de solicitud de
interrupción externa y el uso de la tabla AIV. [10]

35
Práctica 1.- Encender y apagar un Led con un push button.
Un led se enciende y apaga; por un periodo de tiempo, cuando se presione el push
button el led comenzará a parpadear, en caso de no ser presionado el led se
mantendrá apagado.
Consideraciones:
- Utilizar conexión básica del PIC24F16KA102 (ver apéndice Conexión
básica).
- Habilitar Leds del puerto B en la tarjeta Easy-33v6.
Práctica 1: Conexión eléctrica.

C1
U1
2
RA0/CN2/VREF+/AN0
3 22pF
RA1/CN3/VREF-/AN1
RA2/CN30/CLKI/OSCI
9 X1
RA3/CN29/CLKO/OSCO
10 CRYSTAL
C2 R2
12 330
RA4/CN0/U2CTS/T1CK/SOSCO
1
RA5/VPP/MCLR
20
RA6/CN8/CTED1/INT2/C2OUT/OC1
19 22pF
RA7/CN9/IC1
4
R1
RB0/CN4/U2TX/C2INB/C1IND/AN2/PGD1
5 330
RB1/CN5/U2BCLK/U2RX/C2INA/C1INC/AN3/PGC1
RB2/CN6/U1BCLK/U1RX/C2IND/C1INB/AN4
6 D2
7 LED-BIBY
RB3/CN7/C2INC/C1INA/AN5
11
RB4/CN1/U2RTS/SOSCI
14
RB5/CN27/SDA1A/PGD3
RB6/CN24/SCL1A/PGC3
15 R3
16 10K
RB7/CN23/INT0/U1TX
17
RB8/CN22/SCL1/U1CTS
18
RB9/CN21/SDA1/U1RTS
21
RB10/CN16/PMD2/SDI1/PGD2
22
R4
RB11/CN15/SCK1/PGC2
23 470
RB12/CN14/CTED2/HLVDIN/AN12
24
RB13/CN13/CTPLS/SDO1/AN11
25
RB14/CN12/INT1/C1OUT/OCFA/RTCC/CVREF/AN10
RB15/CN11/T3CK/T2CK/SS1/REFO
26 C3
0.01uF
PIC24F16KA102

Práctica 1: Código.
void main()
{
ADPCFG = 0x1C3F; // Configurar los pines AN como digital.
TRISB=0; //El puerto B se configura como salida.
TRISA=0xFF; //El puerto A se configura como entrada.
PORTA=0; //El puerto A se inicializa en cero.
PORTB=0; //El puerto B se inicializa en cero.
while(1) //Se ejecuta Bucle.
{
if(PORTA.f0==1) //Si se presiona el push button.
{
RB0_bit=1; //En RB0=1 lógico(se enciende el led).
Delay_ms(1000); //Durante 1 segundo.
RB0_bit=0; //En RB0=0 lógico(se apaga el led).
Delay_ms(1000); //Durante 1 segundo.
}else { //En caso de no esta presionado push button.
RB0_bit=0; //En RB0=0 lógico(se apaga el led).
} 36
}
}
Práctica 2.- Leds en el Puerto B.
Encender y apagar los leds conectados a los pines RB0 a RB7 de manera
permanente.
Consideraciones:
- Utilizar conexión básica del PIC24F16KA102.
- Habilitar Leds del puerto B en la tarjeta Easy-33v6.

Práctica 2: Conexión eléctrica.


C1
OSC1

22pF

U1 X1
2 CRYSTAL
C2 R3
RA0/CN2/VREF+/AN0
3 OSC0
RA1/CN3/VREF-/AN1 10k
9 OSC1
RA2/CN30/CLKI/OSCI
10 OSC0 22pF
RA3/CN29/CLKO/OSCO
12
RA4/CN0/U2CTS/T1CK/SOSCO
1
R4
RA5/VPP/MCLR
20 470
RA6/CN8/CTED1/INT2/C2OUT/OC1
19
RA7/CN9/IC1 RN1 U2
RB0/CN4/U2TX/C2INB/C1IND/AN2/PGD1
4 1 16 1 20 C3
5 2 15 2 19 0.01uF
RB1/CN5/U2BCLK/U2RX/C2INA/C1INC/AN3/PGC1
6 3 14 3 18
RB2/CN6/U1BCLK/U1RX/C2IND/C1INB/AN4
7 4 13 4 17
RB3/CN7/C2INC/C1INA/AN5
11 5 12 5 16
RB4/CN1/U2RTS/SOSCI
14 6 11 6 15
RB5/CN27/SDA1A/PGD3
15 7 10 7 14
RB6/CN24/SCL1A/PGC3
16 8 9 8 13
RB7/CN23/INT0/U1TX
17 9 12
RB8/CN22/SCL1/U1CTS
18 330 10 11
RB9/CN21/SDA1/U1RTS
21
RB10/CN16/PMD2/SDI1/PGD2
22 LED-BARGRAPH-GRN
RB11/CN15/SCK1/PGC2
23
RB12/CN14/CTED2/HLVDIN/AN12
24
RB13/CN13/CTPLS/SDO1/AN11
25
RB14/CN12/INT1/C1OUT/OCFA/RTCC/CVREF/AN10
26
RB15/CN11/T3CK/T2CK/SS1/REFO
PIC24F16KA102

Práctica 2: Código
void main()
{
ADPCFG = 0x1C3F; // Configurar los pines AN como digital.
TRISA=0xFF; //El puerto A configuran como entrada.
TRISB=0; //El puerto B se configuran como salida.
PORTB=0; //El puerto B inicializa en cero.
PORTA=0; //El puerto A inicializa en cero.
while(1) //Se ejecuta Bucle.
{ //Pines en puerto B=76543210.
PORTB=0xFF; //RB0-RB7=11111111(se encienden leds).
Delay_ms(100); //Tiempo de encendido por 100ms.
PORTB=0x00; //RB0-RB7=00000000(se apagan leds).
Delay_ms(200); //Tiempo de apagado por 200ms.
}
}

37
Práctica 3.-Encender y apagar Leds en el puerto B con condiciones
switch, for y while.
En la primera etapa los leds del puerto B se encienden por 100ms y luego se apagan
por 500ms usando el ciclo for, en la segunda etapa se escribe el valor 0x55 y
después en un bucle generado por while se invierte el estado lógico usando ~ que
es un complemento a uno en MIKRO C.
Consideraciones:
- Utilizar conexión básica del PIC24F16KA102.
- Habilitar Leds del puerto B en la tarjeta Easy-33v6.

Práctica 3: Conexión eléctrica.


C1
OSC1

22pF

U1 8MHZ
2 CRYSTAL
C2 R3
RA0/CN2/VREF+/AN0
3 OSC0
RA1/CN3/VREF-/AN1 10k
9 OSC1
RA2/CN30/CLKI/OSCI
10 OSC0 22pF
RA3/CN29/CLKO/OSCO
12
RA4/CN0/U2CTS/T1CK/SOSCO
1
R4
RA5/VPP/MCLR
20 470
RA6/CN8/CTED1/INT2/C2OUT/OC1
19
RA7/CN9/IC1 RN1 U2
RB0/CN4/U2TX/C2INB/C1IND/AN2/PGD1
4 1 16 1 20 C3
5 2 15 2 19 0.01uF
RB1/CN5/U2BCLK/U2RX/C2INA/C1INC/AN3/PGC1
6 3 14 3 18
RB2/CN6/U1BCLK/U1RX/C2IND/C1INB/AN4
7 4 13 4 17
RB3/CN7/C2INC/C1INA/AN5
11 5 12 5 16
RB4/CN1/U2RTS/SOSCI
14 6 11 6 15
RB5/CN27/SDA1A/PGD3
15 7 10 7 14
RB6/CN24/SCL1A/PGC3
16 8 9 8 13
RB7/CN23/INT0/U1TX
17 9 12
RB8/CN22/SCL1/U1CTS
18 330 10 11
RB9/CN21/SDA1/U1RTS
21
RB10/CN16/PMD2/SDI1/PGD2
22 LED-BARGRAPH-GRN
RB11/CN15/SCK1/PGC2
23
RB12/CN14/CTED2/HLVDIN/AN12
24
RB13/CN13/CTPLS/SDO1/AN11
25
RB14/CN12/INT1/C1OUT/OCFA/RTCC/CVREF/AN10
26
RB15/CN11/T3CK/T2CK/SS1/REFO
PIC24F16KA102

38
Práctica 3: Código.
//Encender y apagar los leds del puerto B con ayuda de las sentencias:
//switch, for and while.
int i; //Declarando variable global.
void main()
{
ADPCFG = 0x1C3F; // Configurar los pines AN como digital.
TRISA=1; //Los pines del puerto A se configuran como entrada.
TRISB=0; //Los pines del puerto B se configuran como salida.
PORTA=0; //Inicializa en cero.
PORTB=0; //Inicializa en cero.
for(i=1; i<20; i++) //Primera Etapa: inicia el bucle para ON/OFF leds.
{
switch(PORTB) //Monitorea el estado del PORTB.
{
case 0x00: //Si el PORTB=0.
PORTB=0xFF; //Entonces cambiar a PORTB=0xFF.
Delay_ms(100); //Con un tiempo de retardo de 100ms.
break;
case 0xFF: //Si el PORTB=0xFF.
PORTB=0x00; //Entonces cambiar a PORTB=0x00.
Delay_ms(500); //Con un tiempo de retardo de 500ms.
}
}
PORTB=0x55; //Ingresar datos en el puerto B.
while(1)
{
PORTB= ~PORTB; //Invertir el estado lógico del puerto B.
Delay_ms(200); //Con un tiempo de retardo de 200ms.
}
}

39
Práctica 4.-Generar números en un display de 7 segmentos.
Visualizar en el display de 7 segmentos cátodo común una secuencia de números
del 1 al 9 de manera consecutiva. En la conexión básica hay leds conectados a los
mismos pines que el display para la visualización de 0 y 1 lógicos.
Consideraciones:
- Utilizar conexión básica del PIC24F16KA102.
- Habilitar Leds del puerto B en la tarjeta Easy-33v6.
- En MIKRO C PRO dsPIC/PIC24 en el apartado de Tools>Seven Segment
Editor te ayuda a generar el valor en Hexadecimal o decimal para el display
ya sea ánodo o cátodo.

Práctica 4: Conexión eléctrica.


C1
OSC1

22pF

U1 X1
2 CRYSTAL
C2 R3
RA0/CN2/VREF+/AN0
3 OSC0
RA1/CN3/VREF-/AN1 10k
9 OSC1
RA2/CN30/CLKI/OSCI
10 OSC0 22pF
RA3/CN29/CLKO/OSCO
12
RA4/CN0/U2CTS/T1CK/SOSCO
1
R4
RA5/VPP/MCLR
20 470
RA6/CN8/CTED1/INT2/C2OUT/OC1
19
RA7/CN9/IC1 RN1 U2
4 A 1 16 1 20 C3
RB0/CN4/U2TX/C2INB/C1IND/AN2/PGD1
5 B 2 15 2 19 0.01uF
RB1/CN5/U2BCLK/U2RX/C2INA/C1INC/AN3/PGC1
6 C 3 14 3 18
RB2/CN6/U1BCLK/U1RX/C2IND/C1INB/AN4
7 D 4 13 4 17
RB3/CN7/C2INC/C1INA/AN5
11 E 5 12 5 16
RB4/CN1/U2RTS/SOSCI
14 F 6 11 6 15
RB5/CN27/SDA1A/PGD3
15 G 7 10 7 14
RB6/CN24/SCL1A/PGC3
16 8 9 8 13
RB7/CN23/INT0/U1TX
17 9 12
RB8/CN22/SCL1/U1CTS
18 330 10 11
RB9/CN21/SDA1/U1RTS
21
RB10/CN16/PMD2/SDI1/PGD2
22 LED-BARGRAPH-GRN
RB11/CN15/SCK1/PGC2
23
RB12/CN14/CTED2/HLVDIN/AN12
24
RB13/CN13/CTPLS/SDO1/AN11
25
RB14/CN12/INT1/C1OUT/OCFA/RTCC/CVREF/AN10
26 A
RB15/CN11/T3CK/T2CK/SS1/REFO
B
PIC24F16KA102 C
D
E
F
G

R1
30

40
Práctica 4: Código

// Combinación de valores para mostrar números en un display de 7 segmentos.


void main()
{
ADPCFG = 0x1C3F; // Configurar los pines AN como digital.
TRISA=1; //Los pines del puerto A se configuran como entrada.
TRISB=0; //Los pines del puerto B se configuran como salida.
PORTA=0; //Inicializa en cero.
PORTB=0; //Inicializa en cero.
while(1)
{
PORTB=0x3F; //Número Cero.
Delay_ms(200); //Tiempo de visualización del número 0.
PORTB=0x06; //Número Uno.
Delay_ms(200); //Tiempo de visualización del número 1.
PORTB=0x5B; //Número Dos.
Delay_ms(200); //Tiempo de visualización del número 2.
PORTB=0x4F; //Número Tres.
Delay_ms(200); //Tiempo de visualización del número 3.
PORTB=0x66; //Número Cuatro.
Delay_ms(200); //Tiempo de visualización del número 4.
PORTB=0x6D; //Número Cinco.
Delay_ms(200); //Tiempo de visualización del número 5.
PORTB=0x7D; //Número Seis.
Delay_ms(200); //Tiempo de visualización del número 6.
PORTB=0x47; //Número Siete.
Delay_ms(200); //Tiempo de visualización del número 7.
PORTB=0x7F; //Número Ocho.
Delay_ms(200); //Tiempo de visualización del número 8.
PORTB=0x67; //Número Nueve.
Delay_ms(200); //Tiempo de visualización del número 9.
}
}

41
Práctica 5.-Generar melodía en Buzzer.
Debido a un buzzer integrado, el sistema de desarrollo es capaz de emitir señales
de audio. Para que un buzzer funcione es necesario generar una señal de voltaje
de una frecuencia especificada. La frecuencia de resonancia del buzzer es 3.8kHz
y se genera en el microcontrolador por medio del código apropiado, escrito en su
memoria. Se puede utilizar otras frecuencias en el rango 20Hz a 20kHz, pero su
mejor funcionamiento es en las frecuencias de 2kHz a 4kHz.
La señal de voltaje se puede generar por medio de los pines del microcontrolador
RB8 o RB9. Pueden ser una simple señal de pitido, así como melodías de distintas
duraciones. En este ejemplo se muestra la generación de sonido por medio de
funciones que pertenecen a la librería Sound.
Consideraciones
- Para que este ejemplo funcione apropiadamente, es necesario marcar las
siguientes librerías en la ventana Library Manager antes de compilar el
programa: Button y Sound.
- Habilitar buzzer en el pin RB8.

Práctica 5: Conexión eléctrica.

C1 3V
22pF
U1
RA0/CN2/VREF+/AN0
2 8MHZ R3
3 10k
RA1/CN3/VREF-/AN1 C2
9 CRYSTAL
RA2/CN30/CLKI/OSCI
10 22pF
RA3/CN29/CLKO/OSCO
12
RA4/CN0/U2CTS/T1CK/SOSCO
1
RA5/VPP/MCLR
20
RA6/CN8/CTED1/INT2/C2OUT/OC1
19
R4 470
RA7/CN9/IC1
4 (2) C3
RB0/CN4/U2TX/C2INB/C1IND/AN2/PGD1
5
D
C
E

B
A

RB1/CN5/U2BCLK/U2RX/C2INA/C1INC/AN3/PGC1 0.01uF
6
RB2/CN6/U1BCLK/U1RX/C2IND/C1INB/AN4
7
RB3/CN7/C2INC/C1INA/AN5
11
RB4/CN1/U2RTS/SOSCI
14
RB5/CN27/SDA1A/PGD3
15
RB6/CN24/SCL1A/PGC3
16 5V
RB7/CN23/INT0/U1TX
17
RB8/CN22/SCL1/U1CTS
18
RB9/CN21/SDA1/U1RTS
21 LS1
RB10/CN16/PMD2/SDI1/PGD2
22
RB11/CN15/SCK1/PGC2
RB12/CN14/CTED2/HLVDIN/AN12
23 R6
24 1k
RB13/CN13/CTPLS/SDO1/AN11
25
RB14/CN12/INT1/C1OUT/OCFA/RTCC/CVREF/AN10
26
RB15/CN11/T3CK/T2CK/SS1/REFO
SPEAKER
PIC24F16KA102
R5
10k
Q1
C
D
A
B

BC846B

R1R2R7R8R9
1k 1k 1k 1k 1k

42
Práctica 5: Código parte 1.
void Tone1() { //Genera una señal de onda cuadrada.
Sound_Play(659, 250); // Frecuencia= 659Hz, Duración = 250ms.
}

void Tone2() {
Sound_Play(698, 250); // Frecuencia = 698Hz, Duración = 250ms.
}

void Tone3() {
Sound_Play(784, 250); // Frecuencia = 784Hz, Duración = 250ms.
}

void Melody() { //Reproduce la melodía"Yellow house" para el push button en RB3.


Tone1(); Tone2(); Tone3(); Tone3();
Tone1(); Tone2(); Tone3(); Tone3();
Tone1(); Tone2(); Tone3();
Tone1(); Tone2(); Tone3(); Tone3();
Tone1(); Tone2(); Tone3();
Tone3(); Tone3(); Tone2(); Tone2(); Tone1();
}

void ToneA() {
Sound_Play( 880, 50); // Frecuencia = 880Hz, Duración = 50ms.
}
void ToneC() {
Sound_Play(1046, 50); // Frecuencia = 1046Hz, Duración =50ms.
}
void ToneE() {
Sound_Play(1318, 50); // Frecuencia = 1318Hz, Duración = 50ms.
}

void Melody2() { //Melodía para el push button en RB4.


unsigned short i;
for (i = 9; i > 0; i--) {
ToneA(); ToneC(); ToneE();
}
}

43
Práctica 5: Código parte 2.

void main() {

ADPCFG = 0x1C3F; // Configurar los pines AN como digital.


TRISB = 0xF8; // Configurar RB3- RB7 son entradas.
LATB=0; //Escribir una salida en puerto B.

Sound_Init(&PORTB, 8); //Inicialice el pin RB8 para reproducir sonido.


Sound_Play(880, 1000); //Reproduce un sonido de 880Hz en una duración 1000ms.

while (1) {
if (Button(&PORTB,7,1,1)) // RB7 reproduce Tone1,

//Button(dirección del puerto, pin de push button,


//periodo de eliminación en ms, considera estado activo).

Tone1();
while (RB7_bit); // Espere a que suelte el push button.

if (Button(&PORTB,6,1,1)) // RB6 reproduce Tone2.


Tone2();
while (RB6_bit); // Espere a que suelte el push button.

if (Button(&PORTB,5,1,1)) // RB5 reproduce Tone3.


Tone3();
while (RB5_bit); // Espere a que suelte el push button.

if (Button(&PORTB,4,1,1)) // RB4 reproduce Melody2.


Melody2();
while (RB4_bit); // Espere a que suelte el push button.

if (Button(&PORTB,3,1,1)) // RB3 reproduce Melody.


Melody();
while (RB3_bit); // Espere a que suelte el push button.
}
}

44
Práctica 6.- Encender y apagar: Leds y buzzer.
Dependiendo del estado en el que se encuentra los push button se genera una
acción. Al push button en RA0 lo llamamos SW1 y al push button en RA1 lo
llamamos SW2. En la siguiente tabla se describe las acciones que realizara en cada
caso.
Caso SW1 SW2 Acción

1 0 lógico 0 lógico No realizara ninguna acción.

2 1 lógico 0 lógico Reproducirá una melodía, la que se encuentra


en la función void melodia().

3 0 lógico 1 lógico Se visualizará los datos en el vector luces[] la


cantidad de veces que presiones el push button
será la posición en el vector a través de la
variable contador.

4 1 lógico 1 lógico En este caso en los leds se mantendrá este


valor en binario 01010101 por 100ms y después
10101010 por 100ms.

Consideraciones:
- Utilizar conexión básica del PIC24F16KA102.
- Habilitar Leds del puerto B en la tarjeta Easy-33v6.
- Habilitar librería de Sound.
- Habilitar buzzer en el pin RB8.

Práctica 6: Conexión eléctrica.

R2 R1
1k 1k
(2)

(2)

C1 3V
22pF
U1
RA0/CN2/VREF+/AN0
2 8MHZ R3
3 10k
RA1/CN3/VREF-/AN1 C2
9 CRYSTAL
RA2/CN30/CLKI/OSCI
10 22pF
RA3/CN29/CLKO/OSCO
12
RA4/CN0/U2CTS/T1CK/SOSCO
1
RA5/VPP/MCLR
20
RA6/CN8/CTED1/INT2/C2OUT/OC1
19
R4 470
RA7/CN9/IC1 RN1 U2
RB0/CN4/U2TX/C2INB/C1IND/AN2/PGD1
4 1 16 1 20 C3
5 2 15 2 19 0.01uF
RB1/CN5/U2BCLK/U2RX/C2INA/C1INC/AN3/PGC1
6 3 14 3 18
RB2/CN6/U1BCLK/U1RX/C2IND/C1INB/AN4
7 4 13 4 17
RB3/CN7/C2INC/C1INA/AN5
11 5 12 5 16
RB4/CN1/U2RTS/SOSCI
14 6 11 6 15
RB5/CN27/SDA1A/PGD3
15 7 10 7 14
RB6/CN24/SCL1A/PGC3
16 8 9 8 13
RB7/CN23/INT0/U1TX
17 9 12
RB8/CN22/SCL1/U1CTS
18 330 10 11
RB9/CN21/SDA1/U1RTS
21
RB10/CN16/PMD2/SDI1/PGD2
22 LED-BARGRAPH-GRN
RB11/CN15/SCK1/PGC2
23 5V
RB12/CN14/CTED2/HLVDIN/AN12
24
RB13/CN13/CTPLS/SDO1/AN11
25
RB14/CN12/INT1/C1OUT/OCFA/RTCC/CVREF/AN10
26 LS1
RB15/CN11/T3CK/T2CK/SS1/REFO
PIC24F16KA102 R6
1k

SPEAKER
R5
1k
Q1
BC846B

45
Práctica 6: Código parte 1.

//Visualizar leds y producir sonido en un Buzzer.


#define sw1 RA0_bit // El pin RA0 se le asigna el nombre de SW1.
#define sw2 RA1_bit // El pin RA1 se le asigna el nombre de SW1.
char luces[]={0,0b00000001,0b00000010,0b00000100,8,16,32,64,128};
char contador=0;
void melodia(); //Existe una función llamada melodia().
void main()
{
AD1PCFG=0x1C3F; //Configurar los pines AN como I/O digital.
TRISA=0xFF; //El puerto A se configura como entrada.
TRISB=0; //El puerto B se configura como salida.
PORTB=0; //El puerto B se inicializa en cero.
Sound_Init(&PORTB,8); //Inicializa el pin RB8 para reproducir sonido.
while(1)
{
if((sw1==0)&&(sw2==0)) //Caso 1: sw1=sw2=cero.
{
PORTB=0; //No realiza ninguna acción.
}else if((sw1==1)&&(sw2==0)){ //Caso 2:Si sw1= 1 lógico.
melodia(); //Ejecuta función.
}else if ((sw1==0)&&(sw2==1)){ //Caso 3:Si sw2 tiene un 1 lógico.
//Conforme al valor de contador será la posición en el vector luces.
PORTB=luces[contador]; //PORTB se le asigna el vector luces.
Delay_ms(200);
contador++; //Incrementa contador.
if(contador>8)
{
contador=0;
}
}else{ //Caso 4:Si no es ninguno de los anteriores leds combinación.
PORTB=0x55;
Delay_ms(100);
PORTB=0xAA;
Delay_ms(100);
}
}
}

46
Práctica 6: Código parte 2.

void melodia(){ //Melodia para el Buzzer.


Sound_play(660,100); //Frecuencia = 660Hz, Duración = 100ms.
Delay_ms(75);
Sound_play(660,100);
Delay_ms(75);
Sound_play(660,100);
Delay_ms(150);
Sound_play(660,100);
Delay_ms(150);
Sound_play(660,100);
Delay_ms(50);
Sound_play(770,100);
Delay_ms(150);
Sound_play(380,100);
Delay_ms(275);
Sound_play(510,100);
Delay_ms(287);
Sound_play(380,100);
Delay_ms(225);
Sound_play(320,100);
Delay_ms(200);
Sound_play(440,100);
Delay_ms(250);
Sound_play(480,80);
Delay_ms(150);
Sound_play(450,100);
Delay_ms(165);
Sound_play(430,100);
Delay_ms(75);
Sound_play(380,100);
Delay_ms(150);
Sound_play(660,80);
Delay_ms(100);
Sound_play(760,50);
Delay_ms(100);
Sound_play(860,100);
Delay_ms(75);
Sound_play(700,80);
Delay_ms(150);
Sound_play(760,50);
Delay_ms(75);
Sound_play(660,80);
Delay_ms(175);
}

47
Práctica 7.- Pantalla LCD de 2x16.
El potenciómetro que se está utilizando es para ajustar el brillo de la pantalla, la
comunicación entre el microcontrolador y el display LCD (ver apéndice
Características del Display LCD 2x16 (Display de cristal líquido)) es de 4 bits, y los
dígitos alfanuméricos se visualizan en 2 líneas con 16 caracteres c/ u.
En esta práctica se escribe texto en la primera y segunda fila, y se mueve el texto
de derecha a izquierda.
Consideraciones:
- Utilizar conexión básica del PIC24F16KA102.
- Habilitar librería Lcd.

Práctica 7.-Diagrama eléctrico.

LCD1
C1 LM016L
U1
2 RA0
RA0/CN2/VREF+/AN0
3 RA1 osc1 22pF
RA1/CN3/VREF-/AN1
9 osc1 X1
RA2/CN30/CLKI/OSCI
10 osc0 osc0
8MHz
RA3/CN29/CLKO/OSCO C2
12 RA4
RA4/CN0/U2CTS/T1CK/SOSCO
1
RA5/VPP/MCLR

VDD
VSS

VEE
20

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
RA6/CN8/CTED1/INT2/C2OUT/OC1

E
19 22pF
RA7/CN9/IC1 5V

1
2
3

4
5
6

7
8
9
10
11
12
13
14
4
RB0/CN4/U2TX/C2INB/C1IND/AN2/PGD1
5

RB4

RB5

RB6
RA0
RA1
RA4
RB1/CN5/U2BCLK/U2RX/C2INA/C1INC/AN3/PGC1 RV1
6
RB2/CN6/U1BCLK/U1RX/C2IND/C1INB/AN4
RB3/CN7/C2INC/C1INA/AN5
7 R2
11 RB4 10k
RB4/CN1/U2RTS/SOSCI 5V
14 RB5
RB5/CN27/SDA1A/PGD3
15 RB6
RB6/CN24/SCL1A/PGC3
16
R1
RB7/CN23/INT0/U1TX
17 470
RB8/CN22/SCL1/U1CTS
18 1k
RB9/CN21/SDA1/U1RTS
21
RB10/CN16/PMD2/SDI1/PGD2
RB11/CN15/SCK1/PGC2
22 C3
23 0.01uF
RB12/CN14/CTED2/HLVDIN/AN12
24
RB13/CN13/CTPLS/SDO1/AN11
25
RB14/CN12/INT1/C1OUT/OCFA/RTCC/CVREF/AN10
26
RB15/CN11/T3CK/T2CK/SS1/REFO
PIC24F16KA102

48
Práctica 7: Código parte 1.
// LCD módulo de conexiones, sbit permite acceder a bits individuales de
Códigode 8 bits,
variables
//las siguientes variables globales deben definirse en todos los proyectos que
utilizan la
//biblioteca Lcd.

sbit LCD_RS at LATB4_bit; // RS línea.


sbit LCD_EN at LATB5_bit; // habilitar(E) línea.
sbit LCD_D4 at LATB6_bit; // línea de datos 4.
sbit LCD_D5 at LATA0_bit; // línea de datos 5.
sbit LCD_D6 at LATA1_bit; // línea de datos 6.
sbit LCD_D7 at LATA4_bit; // línea de datos 7.

sbit LCD_RS_Direction at TRISB4_bit; // RS del display conectado a RB4 del PIC.


sbit LCD_EN_Direction at TRISB5_bit; // E del display conectado a RB5 del PIC.
sbit LCD_D4_Direction at TRISB6_bit; // D4 del display conectado a RB6 del PIC.
sbit LCD_D5_Direction at TRISA0_bit; // D5 del display conectado a RA0 del PIC.
sbit LCD_D6_Direction at TRISA1_bit; // D6 del display conectado a RA1 del PIC.
sbit LCD_D7_Direction at TRISA4_bit; // D7 del display conectado a RA4 del PIC.

// Termina LCD módulo de conexiones

char txt1[] = "Servicio Social"; //cadena de caracteres constantes.


char txt2[] = "Easy24-33 v6";
char txt3[] = "Lcd4bit";
char txt4[] = "ejemplo";

char i; // Variable para bucle.

void Move_Delay() // Función utilizada para mover texto.


{
Delay_ms(500); // Velocidad de movimiento.
}

49
Práctica 7: Código parte 2.
void main()
{
AD1PCFG = 0x1C3F; // Configurar los pines AN como digital.

Lcd_Init(); // Inicialización del visualizador LCD.

Lcd_Cmd(_LCD_CLEAR); // Borrar display.


Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off.
Lcd_Out(1,6,txt3); // Escribe texto en la primera fila.

// Lcd_Out(char fila, chart columna, chart texto);


// Escribe el texto "Lcd4bit" en Lcd en fila 1 y columna 6.

Lcd_Out(2,6,txt4); // Escribe texto en la segunda fila.


// Escribe el texto "ejemplo" en Lcd en fila 2 y columna 6.

Delay_ms(2000); //Retardo.
Lcd_Cmd(_LCD_CLEAR); // Borrar display.

Lcd_Out(1,1,txt1); // Escribe texto en la primera fila.


// Escribe el texto "Servicio Social" en Lcd en fila 1 y columna 1.

Lcd_Out(2,5,txt2); // Escribe texto en la segunda fila.


// Escribe el texto "Easy24-33 v6" en Lcd en fila 2 y columna 5.
Delay_ms(2000);

// Moviendo el texto
for(i=0; i<4; i++)
{ // Mover el texto a la derecha 4 veces
Lcd_Cmd(_LCD_SHIFT_RIGHT);//Desplazar la pantalla a la derecha sin cambiar la RAM
Move_Delay(); // de datos de la pantalla.

while(1) // Ciclo infinito


{
for(i=0; i<8; i++) // Mover el texto a la izquierda 7 veces
{
Lcd_Cmd(_LCD_SHIFT_LEFT);// Desplazar la pantalla a la izquierda sin cambiar la
RAM
Move_Delay(); // de datos de la pantalla.
}

for(i=0; i<8; i++) // Mover el texto a la derecha 7 veces


{
Lcd_Cmd(_LCD_SHIFT_RIGHT); // Desplazar la pantalla a la derecha sin
cambiar la RAM
Move_Delay(); //Llamando a al procedimiento utilizado para
mover texto.
}
}
}
50
Práctica 8.- Convertidor A/D
El convertidor A/D es lineal, el voltaje analógico de entrada influye en el valor de
salida digital. El convertidor A/D integrado en el microcontrolador convierte un valor
de voltaje analógico a un numero de 10 bits. Los potenciómetros pueden variar el
voltaje de entrada entre 0-3.3 volts, mientras que las resistencias de 220 ohm son
para delimitar el flujo de corriente hacia el microcontrolador. Convertir el voltaje
variable entrante en un valor binario mostrado en los leds del puerto B.

Consideraciones:
- Utilizar conexión básica del PIC24F16KA102.
- Habilitar Leds en el puerto B en la tarjeta.
- Habilitar librería ADC.

Práctica 8: Diagrama eléctrico.

RV1

C1
OSC1
5k
22pF

U1 8MHZ
2 CRYSTAL
C2 R3
RA0/CN2/VREF+/AN0
3 OSC0
RA1/CN3/VREF-/AN1 10k
9 OSC1
RA2/CN30/CLKI/OSCI
10 OSC0 22pF
RA3/CN29/CLKO/OSCO
12
RA4/CN0/U2CTS/T1CK/SOSCO
1
R4
RA5/VPP/MCLR
20 470
RA6/CN8/CTED1/INT2/C2OUT/OC1
19
RA7/CN9/IC1 RN1 U2
RB0/CN4/U2TX/C2INB/C1IND/AN2/PGD1
4 1 16 1 20 C3
5 2 15 2 19 0.01uF
RB1/CN5/U2BCLK/U2RX/C2INA/C1INC/AN3/PGC1
6 3 14 3 18
RB2/CN6/U1BCLK/U1RX/C2IND/C1INB/AN4
7 4 13 4 17
RB3/CN7/C2INC/C1INA/AN5
11 5 12 5 16
RB4/CN1/U2RTS/SOSCI
14 6 11 6 15
RB5/CN27/SDA1A/PGD3
15 7 10 7 14
RB6/CN24/SCL1A/PGC3
16 8 9 8 13
RB7/CN23/INT0/U1TX
17 9 12
RB8/CN22/SCL1/U1CTS
18 330 10 11
RB9/CN21/SDA1/U1RTS
21
RB10/CN16/PMD2/SDI1/PGD2
22 LED-BARGRAPH-GRN
RB11/CN15/SCK1/PGC2
23
RB12/CN14/CTED2/HLVDIN/AN12
24
RB13/CN13/CTPLS/SDO1/AN11
25
RB14/CN12/INT1/C1OUT/OCFA/RTCC/CVREF/AN10
26
RB15/CN11/T3CK/T2CK/SS1/REFO
PIC24F16KA102

51
Práctica 8: Código
/*
* Descrición
Usando la librería ADC.
Mostrar los resultados ADC en el display con el PORTB.
* Configuración
MCU: PIC24FJ16KA102
* NOTES:
- J14: RA0 - ADC pin de entrada
- Encienda los LED de PORTB en SW4.2
*/

unsigned ADCresult;
void main() {
TRISA = 0xFF; // Todos los pines del puerto PORTA se configuran como entrada.
TRISB = 0; // Todos los pines del puerto PORTB se configuran como salida.

while (1) { // Se ejecuta el bucle.


ADCresult = ADC1_Read(0); // Adquirir el resultado de la conversión de A/D
PORTB = ADCresult; // y mostrarlo en los LEDs de PORTB.
}
}

52
Práctica 9.-Medir el voltaje en un potenciómetro y mostrar el valor en
un display LCD.
Generar voltaje variable con un potenciómetro en la entrada RB0, el valor del
potenciómetro se muestra en el display LCD. La alimentación del potenciómetro es
de 3V.
Consideraciones:
- Utilizar conexión básica del PIC24F16KA102.
- Habilitar la pantalla LCD en la tarjeta.
- Habilitar librería LCD.
-
Práctica 9: Conexión eléctrica.
C1
LCD1
LM016L
U1 22pF
2 RA0 X1
RA0/CN2/VREF+/AN0
3 RA1 8MHz
RA1/CN3/VREF-/AN1 C2
9
RA2/CN30/CLKI/OSCI
10
RA3/CN29/CLKO/OSCO
12 VDD1
RA4/CN0/U2CTS/T1CK/SOSCO RA4
1 22pF
RA5/VPP/MCLR

VDD
VSS

VEE
20

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
RA6/CN8/CTED1/INT2/C2OUT/OC1

E
19
RA7/CN9/IC1

1
2
3

4
5
6

7
8
9
10
RB6 11
RA0 12
RA1 13
14
RB0/CN4/U2TX/C2INB/C1IND/AN2/PGD1
4 R3
5

RB4

RB5
RB1/CN5/U2BCLK/U2RX/C2INA/C1INC/AN3/PGC1 10k
6 3V RV1
RB2/CN6/U1BCLK/U1RX/C2IND/C1INB/AN4
7
RB3/CN7/C2INC/C1INA/AN5
11 RB4
R2

RA4
RB4/CN1/U2RTS/SOSCI
14 RB5 10k
RB5/CN27/SDA1A/PGD3
15 RB6
RB6/CN24/SCL1A/PGC3
RB7/CN23/INT0/U1TX
16
RV2 C3
17 1uF
RB8/CN22/SCL1/U1CTS
18 1k
RB9/CN21/SDA1/U1RTS
21
RB10/CN16/PMD2/SDI1/PGD2
22 1k
RB11/CN15/SCK1/PGC2
23
RB12/CN14/CTED2/HLVDIN/AN12
24
RB13/CN13/CTPLS/SDO1/AN11
25
RB14/CN12/INT1/C1OUT/OCFA/RTCC/CVREF/AN10
26
RB15/CN11/T3CK/T2CK/SS1/REFO
PIC24F16KA102

53
Práctica 9: Código parte 1.
//medir voltaje en un potenciómetro y mostrar el valor de voltaje en una
//pantalla LCD

//conexiones de la LCD
sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;
sbit LCD_D4 at LATB0_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D7 at LATB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;


sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// Final de las conexiones del módulo LCD

// Declarar variables
unsigned char ch;
unsigned int adc_rd;
char *text;
long tlong;
unsigned ADCresult;

void main() {
ADPCFG = 0x1C3B; // Configurar los pines AN como digital y AN0 como analógica.
TRISA=0xEC; //Los pines del puerto A se configuran como entrada.
TRISB=0; // Los pines del puerto B se configuran como salida.
TRISB_bit=1; // El pin RB0 se configuran como entrada.

Lcd_Init(); // Inicialización del visualizador LCD.


Lcd_Cmd(_LCD_CURSOR_OFF); // Comando LCD (apagar el cursor).
Lcd_Cmd(_LCD_CLEAR); // Comando LCD (borrar el LCD).
text = "mikroElektronika"; // Definir el primer mensaje.
Lcd_Out(1,1,text); // Escribir el primer mensaje en la primera línea.

text = "PIC24F16KA102"; // Definir el segundo mensaje.


Lcd_Out(2,1,text); // Escribir el segundo mensaje en la segunda línea.

TRISA = 0xFF; // Todos los pines del puerto PORTA se configuran como
entradas
Delay_ms(2000);

text = "Voltage:"; // Definir el tercer mensaje.

54
Práctica 9: Código parte 2.

while (1)
{
ADCresult = ADC1_Read(0); // Conversión A/D. Pin RA0 es una entrada.
Lcd_Out(2,1,text); // Escribir el resultado en la segunda línea.
tlong = (long)ADCresult * 5000; // Convertir el resultado en milivoltios.
tlong = tlong / 1023; // 0..1023 -> 0-5000mV.
ch = tlong / 1000; // Extraer voltios (miles de milivoltios).

// del resultado
Lcd_Chr(2,9,48+ch); // Escribir resultado en formato ASCII.
Lcd_Chr_CP('.');
ch = (tlong / 100) % 10; // Extraer centenas de milivoltios.
Lcd_Chr_CP(48+ch); // Escribir resultado en formato ASCII.
ch = (tlong / 10) % 10; // Extraer decenas de milivoltios.
Lcd_Chr_CP(48+ch); // Escribir resultado en formato ASCII.
ch = tlong % 10; // Extraer unidades de milivoltios.
Lcd_Chr_CP(48+ch); // Escribir resultado en formato ASCII.
Lcd_Chr_CP('V');
Delay_ms(1);
}
}

55
Práctica 10.-Cambiar ancho de pulso usando librería PWM.
Generar una señal PWM de 5kHz usando el PIC24F16KA102 con la librería PWM
que te proporciona MIKRO C dsPIC/PIC24, en este caso se modifica el ancho de
pulso usando push button, en la entrada RB5 se usa para incrementar el ancho de
pulso y RB6 para disminuir el ancho de pulso.
Consideraciones:
- Utilizar conexión básica del PIC24F16KA102.
- Habilitar Leds en el puerto B en la tarjeta.
- Habilitar la librería PWM.

Práctica 10: Conexión eléctrica.

C1
R3(2) OSC1

U1 22pF
RA0/CN2/VREF+/AN0
2 R3 X1
3 10k
RA1/CN3/VREF-/AN1 C2
9 OSC1 CRYSTAL
RA2/CN30/CLKI/OSCI
10 OSC0 OSC0
RA3/CN29/CLKO/OSCO
12
RA4/CN0/U2CTS/T1CK/SOSCO
1
R4 22pF
RA5/VPP/MCLR
20 470
RA6/CN8/CTED1/INT2/C2OUT/OC1
19
RA7/CN9/IC1

RB0/CN4/U2TX/C2INB/C1IND/AN2/PGD1
4 R5 C3
5 1k 0.01uF
RB1/CN5/U2BCLK/U2RX/C2INA/C1INC/AN3/PGC1
6
RB2/CN6/U1BCLK/U1RX/C2IND/C1INB/AN4 A
7
RB3/CN7/C2INC/C1INA/AN5
11
RB4/CN1/U2RTS/SOSCI B
14
RB5/CN27/SDA1A/PGD3
RB6/CN24/SCL1A/PGC3
15 D1 C
16 LED-BIGY
RB7/CN23/INT0/U1TX
17
RB8/CN22/SCL1/U1CTS D
18
RB9/CN21/SDA1/U1RTS
21
RB10/CN16/PMD2/SDI1/PGD2
22
RB11/CN15/SCK1/PGC2
23
RB12/CN14/CTED2/HLVDIN/AN12
24
RB13/CN13/CTPLS/SDO1/AN11
25
RB14/CN12/INT1/C1OUT/OCFA/RTCC/CVREF/AN10
26
RB15/CN11/T3CK/T2CK/SS1/REFO
PIC24F16KA102 (2)

R1
1k

(2)

R2
1k

56
Práctica 10: Código 1.
//Cambiar el ancho de pulso y visualizar en un led.
//Con ayuda de dos push button controladores de ancho de ancho de pulso.
unsigned int current_duty, old_duty ;
unsigned int pwm_period1 ;

void Intmain(){
ADPCFG=0x1C3F; //Configurar los pines AN como digital.
TRISA=1; //Todos los puertos se configuran como entrada,
TRISA6_bit=0; //menos RA6 se configura como salida del PWM en el pin OC1.
TRISB=0; //Todos los puertos se configuran como salida,
TRISB5_bit=1; //menos RB4 se configura como entrada,
TRISB6_bit=1; //menos RB5 se configura como entrada.
}
void main( )
{
Intmain(); //Llamando al procedimiento Intmain().
current_duty =16; //Valor inicial para el ancho del pulso.

//Generar PWM de 5kHZ, salida en OC1, prescaler 1:1, TIMER 2.


pwm_period1 = PWM_Init(5000, 1, 1, 2);
PWM_Start(1); //Inicia PWM en el canal solicitado en el canal 1
(OC1).
PWM_Set_Duty(current_duty,1); //Se encarga de cambiar el ancho del pulso en OC1.

while (1) //Inicio del ciclo.


{
if (RB5_bit) //Si RB4 esta presionado.
{
Delay_ms(20);
current_duty=current_duty+1; // Incrementar current_duty en 1.
if (current_duty > pwm_period1) // Si current_duty es mayor pwm_period1 value.
{
current_duty = 0; // Restablecer current_duty.
}
PWM_Set_Duty(current_duty,1); // Establecer el ancho de pulso.
}
if (RB6_bit) //Si RB5 esta presionado.
{
Delay_ms(20);
current_duty=current_duty-1; //Decrementar current_duty en 1.
if (current_duty > pwm_period1)//Si current_duty mayor pwm_period1 del valor
(desbordamiento).
{
current_duty = pwm_period1; //Establecer current_duty al valor max posible.
}
PWM_Set_Duty(current_duty, 1); // Establecer el ancho del pulso.
}
Delay_ms(5);
}
}

57
Práctica 11.- Con un potenciómetro cambiar el ancho de pulso de
una señal PWM.
En esta práctica se genera una señal PWM de 977Hz en el PIC24F16KA102 y a
través de un potenciómetro en RA0 se cambia el ancho de pulso. Esta señal se
introducirá a un driver (L298) para mover el ciclo de trabajo de un motor. Con RB0
y RB1 se cambia el giro del motor, la selección de giro se hace con el push button
sin presionar gira a la derecha y de lo contrario a la izquierda.

Consideraciones:
- Utilizar conexión básica del PIC24F16KA102.
- Habilitar Leds en el puerto B en la tarjeta.
- Habilitar la librería PWM.

Práctica 11: Conexión eléctrica.


3V(1)

RV1
C1

1k 22pF 3V
U1 X1
2
RA0/CN2/VREF+/AN0 C2
RA1/CN3/VREF-/AN1
3 CRYSTAL R3
9 10k
RA2/CN30/CLKI/OSCI
10
RA3/CN29/CLKO/OSCO
12 22pF
RA4/CN0/U2CTS/T1CK/SOSCO
1
RA5/VPP/MCLR
20
RA6/CN8/CTED1/INT2/C2OUT/OC1
19
R4 470
RA7/CN9/IC1
4 RB0 R5 C3
RB0/CN4/U2TX/C2INB/C1IND/AN2/PGD1
5 RB1 1k 0.01uF
RB1/CN5/U2BCLK/U2RX/C2INA/C1INC/AN3/PGC1
6
RB2/CN6/U1BCLK/U1RX/C2IND/C1INB/AN4 A
7
RB3/CN7/C2INC/C1INA/AN5
11
RB4/CN1/U2RTS/SOSCI B
14
RB5/CN27/SDA1A/PGD3
RB6/CN24/SCL1A/PGC3
15 D1 C
16 LED-BIGY
RB7/CN23/INT0/U1TX
17
RB8/CN22/SCL1/U1CTS D
18 5V 12V
RB9/CN21/SDA1/U1RTS U2
21 9 4
RB10/CN16/PMD2/SDI1/PGD2
22
RB11/CN15/SCK1/PGC2
23 (2) RB0 5
RB12/CN14/CTED2/HLVDIN/AN12 IN1 VCC VS
24 RB1 7 2
RB13/CN13/CTPLS/SDO1/AN11 IN2 OUT1
25 10
RB14/CN12/INT1/C1OUT/OCFA/RTCC/CVREF/AN10 IN3
26 12 3
RB15/CN11/T3CK/T2CK/SS1/REFO IN4 OUT2
6
ENA
PIC24F16KA102 11 13
ENB OUT3
1 14
SENSA OUT4
15
SENSB GND

R6 8 L298
1k

58
Práctica 11: Código
//cambiar el ancho del pulso con un Potenciómetro.
sbit N1 at RB0_bit;
sbit N2 at RB1_bit;
sbit sw1 at RB2_bit;

unsigned int codigo;


unsigned int velocidad;
unsigned int pwm_period1;
void derecha(){ //Girar a la derecha.
N1=1;
N2=0;
}
void izquierda(){ //Girar a la izquierda.
N1=0;
N2=1;
}
void main()
{
AD1PCFG=0x1C3E; //Configurar los pines AN como I/O digital.
TRISA=1; //Todos los puertos se configuran como entrada,
TRISA6_bit=1; //menos RA6 se configura como salida del PWM en el pin OC1.
TRISB=0; //Todos los puertos se configuran como salida,
TRISB2_bit=1; //menos RB2 se configura como entrada.

//Generar PWM de 977HZ, salida en OC1, prescaler 1:1, TIMER 2.


pwm_period1=PWM_Init(977,1,1,2);
//PWM_Set_Duty(pwm_period1/2,1);

PWM_Start(1); //Inicia PWM en el canal solicitado en el canal 1 (OC1).

while(1)
{
codigo=ADC1_Read(0); // Adquirir el resultado de la conversión de A/D.
velocidad=codigo*8191.0/1023.0; //Ecuación para modificar el ancho de pulso.
PWM_Set_Duty(velocidad,1); // Establecer el ancho de pulso.

if(sw1==0) //Condiciones de giro.


{
derecha();
}else{
izquierda();
}
}
}

59
Práctica 12.- Interrupción con timer1
Generar interrupción (ver apéndice Configuración y uso de interrupciones.) con
ayuda de TimerCalculator que es una aplicación de MICRO C para generar código
en C de interrupciones con características determinadas.
Consideraciones:
- Utilizar conexión básica del PIC24F16KA102.
- Habilitar Leds en el puerto B en la tarjeta.
- Link de descarga TimerCalculator (https://www.mikroe.com/timer-calculator )

Práctica 12: Conexión eléctrica.

C1
OSC1

22pF

U1 X1
2 CRYSTAL
C2 R3
RA0/CN2/VREF+/AN0
3 OSC0
RA1/CN3/VREF-/AN1 10k
9 OSC1
RA2/CN30/CLKI/OSCI
10 OSC0 22pF
RA3/CN29/CLKO/OSCO
12
RA4/CN0/U2CTS/T1CK/SOSCO
1
R4
RA5/VPP/MCLR
20 470
RA6/CN8/CTED1/INT2/C2OUT/OC1
19 330 LED-BARGRAPH-GRN
RA7/CN9/IC1 RN2 U2
RB0/CN4/U2TX/C2INB/C1IND/AN2/PGD1
4 1 16 1 20 C3
5 2 15 2 19 0.01uF
RB1/CN5/U2BCLK/U2RX/C2INA/C1INC/AN3/PGC1
6 3 14 3 18
RB2/CN6/U1BCLK/U1RX/C2IND/C1INB/AN4
7 4 13 4 17
RB3/CN7/C2INC/C1INA/AN5
11 5 12 5 16
RB4/CN1/U2RTS/SOSCI
14 6 11 6 15
RB5/CN27/SDA1A/PGD3
15 7 10 7 14
RB6/CN24/SCL1A/PGC3
16 8 9 8 13
RB7/CN23/INT0/U1TX
17 a 9 12
RB8/CN22/SCL1/U1CTS
18 b a 1 16 10 11
RB9/CN21/SDA1/U1RTS
21 c b 2 15
RB10/CN16/PMD2/SDI1/PGD2
22 d c 3 14 1 20
RB11/CN15/SCK1/PGC2
23 e d 4 13 2 19
RB12/CN14/CTED2/HLVDIN/AN12
24 f e 5 12 3 18
RB13/CN13/CTPLS/SDO1/AN11
25 g f 6 11 4 17
RB14/CN12/INT1/C1OUT/OCFA/RTCC/CVREF/AN10
26 h g 7 10 5 16
RB15/CN11/T3CK/T2CK/SS1/REFO
h 8 9 6 15
PIC24F16KA102 7 14
330 8 13
RN1 9 12
10 11

LED-BARGRAPH-GRN
U3

60
Práctica 12: Código.

//Timer1
//Prescaler 1:1; PR1 Preload = 1200; Actual Interrupt Time = 300 us

void Timer1Int() iv IVT_ADDR_T1INTERRUPT


{
T1IF_bit = 0; // Clear T1IF.
LATB = ~ PORTB; // Invertir PORTB.
}

void main() {
ADPCFG=0x1C3F; // Inicializar pines de entrada y salida digital.
TRISB=0; // PORTB es una salida.
LATB=0xAAAA; // Inicializar valor en el PORTB.
IPC0=IPC0 | 0x1000; // Interrupción de nivel=1.
T1IF_bit = 0; // Clear T1IF.
T1IE_bit = 1; // Habilitar Timer1 interrupts.

T1CON = 0x8000; // Timer1 ON.


PR1=1200;
while (1) // Bucle sin fin, interrumpido por Timer1Int.
;
}

61
Práctica 13.-Sensor de temperatura DS1820
La comunicación serie 1-wire (ver apéndice Características básicas del Protocolo 1-
wire)permite la transmisión de datos por medio de una sola línea de comunicación,
mientras que el proceso mismo está bajo el control del microcontrolador Master. La
ventaja de tal comunicación es que utiliza sólo un pin de microcontrolador. Todos
los dispositivos Slave por defecto disponen de un código ID único, lo que permite
que el dispositivo Master identifique fácilmente los dispositivos que comparte la
misma interfaz de comunicación.
Sensor de temperatura DS1820(ver apéndice Sensor de temperatura DS1820) que
utiliza la comunicación 1-wire. El sistema de desarrollo Easy24-33 v6 proporciona
un zócalo separado para el DS1820. Puede utilizar uno de los pines, RB8 o RB9,
para la comunicación con el microcontrolador. Cabe mencionar que en proteus no
se encuentra en sensor DS1820 así que para la conexión física se utiliza el sensor
DS1822; pero solo para mostrar la conexión de pines, todo el programa está
diseñado para el sensor DS1820.
Consideraciones:
- Utilizar conexión básica del PIC24F16KA102.
- Habilitar la librería Lcd.
- Habilitar la librería One Wire.

Práctica 13.-Diagrama eléctrico.

LCD1
C1 LM016L
U1
2 RA0
RA0/CN2/VREF+/AN0
3 RA1 osc1 22pF
RA1/CN3/VREF-/AN1
9 osc1 X1
RA2/CN30/CLKI/OSCI
10 osc0 osc0
8MHz
RA3/CN29/CLKO/OSCO C2
12 RA4
RA4/CN0/U2CTS/T1CK/SOSCO
1 R
RA5/VPP/MCLR
VDD
VSS

VEE

20
RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
RA6/CN8/CTED1/INT2/C2OUT/OC1
E

19 22pF
RA7/CN9/IC1 5V
1
2
3

4
5
6

7
8
9
10
11
12
13
14
4
RB0/CN4/U2TX/C2INB/C1IND/AN2/PGD1
5
RB4

RB5

RB6
RA0
RA1
RB1/CN5/U2BCLK/U2RX/C2INA/C1INC/AN3/PGC1
6 RV1 RA4
RB2/CN6/U1BCLK/U1RX/C2IND/C1INB/AN4
7
RB3/CN7/C2INC/C1INA/AN5
11 RB4
RB4/CN1/U2RTS/SOSCI 5V
14 RB5
RB5/CN27/SDA1A/PGD3
15 RB6
RB6/CN24/SCL1A/PGC3
16
RB7/CN23/INT0/U1TX
RB8/CN22/SCL1/U1CTS
17 R3
18 1k 10k
RB9/CN21/SDA1/U1RTS
21
RB10/CN16/PMD2/SDI1/PGD2
RB11/CN15/SCK1/PGC2
22 R1 R2
23 R
RB12/CN14/CTED2/HLVDIN/AN12 1k
24 U2 10k
RB13/CN13/CTPLS/SDO1/AN11
25 3
RB14/CN12/INT1/C1OUT/OCFA/RTCC/CVREF/AN10 VCC
26 2 27.0 C3
RB15/CN11/T3CK/T2CK/SS1/REFO DQ
1 1uF
GND
PIC24F16KA102
DS1822

62
Práctica 13: Código parte 1.
/*
* Project name:
OneWire (Interfacing the DS1820 temperature sensor)
* Copyright:
(c) mikroElektronika, 2016.
* Description:
MCU lee la temperatura del sensor y la imprime en la pantalla LCD.
Para obtener resultados correctos, es necesario ajustar la resolución
de temperatura del 18x20 (TEMP_RESOLUTION constante).
* Test configuration:
MCU: PIC24F16KA102
Dev. Board: Easy24-33 v6
http://www.mikroe.com/easy24-33/
Oscillator: HS, 8.00000 MHz
Ext. Modules: None.
SW: mikroC PRO for dsPIC
http://www.mikroe.com/mikroc/dspic/

*/

//Inicio de LCD módulo de conexiones


sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;
sbit LCD_D4 at LATB6_bit;
sbit LCD_D5 at LATA0_bit;
sbit LCD_D6 at LATA1_bit;
sbit LCD_D7 at LATA4_bit;

sbit LCD_RS_Direction at TRISB4_bit;


sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISA0_bit;
sbit LCD_D6_Direction at TRISA1_bit;
sbit LCD_D7_Direction at TRISA4_bit;
// Final de LCD módulo de conexiones

// Configure TEMP_RESOLUTION a la resolución correspondiente del sensor DS18x20


usado:
// 18S20: 9 (Configuración predeterminada; puede ser 9,10,11 o 12)
// 18B20: 12

const unsigned short TEMP_RESOLUTION = 12; //Declarando variables.


char *text = "000.0000";
unsigned temp;

63
Práctica 13: Código parte 2.

void Display_Temperature(unsigned int temp2write)


{
const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
char temp_whole;
unsigned int temp_fraction;

// Compruebe si la temperatura es negativa.


if (temp2write & 0x8000)
{
text[0] = '-';
temp2write = ~temp2write + 1;
}

// Extraer temp_whole
temp_whole = temp2write >> RES_SHIFT ;

// Convertir temp_whole en caracteres.


if (temp_whole/100)
text[0] = temp_whole/100 + 48;
else
text[0] = '0';

text[1] = (temp_whole/10)%10 + 48; // Extraer digito de decenas.


text[2] = temp_whole%10 + 48; // Extraer digito de unidades.

// Extraer temp_fraction y convertirlo en unsigned int.


temp_fraction = temp2write << (4-RES_SHIFT);
temp_fraction &= 0x000F;
temp_fraction *= 625;

// Convertir temp_fraction en caracteres.


text[4] = temp_fraction/1000 + 48; // Extraer digito de miles.
text[5] = (temp_fraction/100)%10 + 48; // Extraer digito de centenas.
text[6] = (temp_fraction/10)%10 + 48; // Extraer digito de decenas.
text[7] = temp_fraction%10 + 48; // Extraer digito de unidades.

// visualizar la temperatura en el LCD.


Lcd_Out(2, 5, text);
}

64
Práctica 13: Código parte 3.
void main() {
ADPCFG = 0x1C3F; // Configurar los pines AN como digital.

Lcd_Init(); // Iniciar el LCD


Lcd_Cmd(_LCD_CLEAR); // Borrar el LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Apagar el cursor
Lcd_Out(1, 1, " Temperatura: ");

// Visualizar el carácter de grado , 'C' para centígrados


Lcd_Chr(2,13,178); // Imprimir carácter de grado, 'C' para grados centígrados.

// Las diferentes pantallas LCD tienen diferentes códigos de caracteres para el


grado.
Lcd_Chr(2,14,'C'); // Si ve la letra alfa griega, intente escribir 178 en lugar
de 223.

//Bucle principal.
do
{
//--- realizar lectura de temperatura
Ow_Reset(&PORTB, 9); //señal de reinicio de Onewire, para restablecer el DS1820
que está conectado al pin.

Ow_Write(&PORTB, 9, 0xCC); // ejecutar el comando SKIP_ROM.


Ow_Write(&PORTB, 9, 0x44); // ejecutar el comando CONVERT_T.
Delay_us(120);

Ow_Reset(&PORTB, 9);
Ow_Write(&PORTB, 9, 0xCC); // ejecutar el comando SKIP_ROM
Ow_Write(&PORTB, 9, 0xBE); // ejecutar el comando
READ_SCRATCHPAD
Delay_ms(400);

temp = Ow_Read(&PORTB, 9);


temp = (Ow_Read(&PORTB, 9) << 8) + temp;

//--- Formatear y visualizar el resultado en el Lcd


Display_Temperature(temp);

Delay_ms(500);
} while (1);
}

65
Características del Display LCD 2x16 (Display de cristal líquido)
El LCD (Liquid Crystal Dysplay) o pantalla de cristal líquido es un dispositivo
empleado para la visualización de contenidos o información de una forma gráfica,
mediante caracteres, símbolos o pequeños dibujos dependiendo del modelo.
Está gobernado por un microcontrolador el cual dirige todo su funcionamiento. En
este caso vamos a emplear un LCD de 16x2 (dispone de 2 filas de 16 caracteres
cada una).
Los pines de conexión de estos módulos incluyen un bus de datos de 8 bits, un pin
de habilitación (E), un pin de selección que indica si lo que se está enviando por el
bus es un dato o una instrucción (RS) y un pin que indica si se va a leer o escribir
en el módulo (RW).
Pines de conexión del Display LCD 2x16.
Pin Símbolo Nombre y función
1 VSS GND (Tierra 0V)
2 VDD Alimentación a +5V
3 VEE Ajuste del contraste
4 RS Selección de DATO/CONTROL
5 RW Lectura o escritura LCD
6 E Habilitación
7 D0 D0 bit menos significativo
8 D1 D1
9 D2 D2D
10 D3 D3
11 D4 D4
12 D5 D5
13 D6 D6
14 D7 D7 bit más significativo

Según la operación que se desee realizar en el módulo LCD, los pines de control E,
RS, RW deben tener un estado determinado. Además, se debe tener en el bus de
datos un código que indique un carácter para mostrar en la pantalla o una
instrucción de control para el display.
Por ejemplo:
Para: RW=0,1 →escribe
RS=0 →comando
E=1 → habilita

Para: RW=1 →lectura


RS=1 →dato
E=1 → deshabilitado

66
El LCD se controla mediante comandos que se envían al registro de control del LCD,
seleccionado al poner la señal RS a nivel bajo (0). Cuando lo que se quiere es
imprimir caracteres en el display o enviar información a la CG RAM para definir
caracteres se selecciona el registro de datos poniendo RS a nivel alto (1). En la
tabla 3 se muestra un resumen de los comandos del LCD.

Tabla 1. Resumen de los comandos de la pantalla LCD.

67
Nota: En el pin RS debe tomar el valor 0 (cero) cuando lo que se va a enviar es una
instrucción de control y debe tomar el valor 1 (uno) cuando lo que se va a enviar es
un dato.

68
Características básicas del Protocolo 1-wire
1-Wire es un protocolo de comunicaciones en serie diseñado por Dallas
Semiconductor, para permitir que los dispositivos de otros fabricantes se conectaran
a las redes de bus serial 1-Wire. Un bus serie es un vínculo para transportar datos
de un bit a la vez entre un microcontrolador (Master) y una serie de dispositivos de
control (Slave) como se puede visualizar en la figura 17.

Fig. 17. Comunicación 1-Wire.


M. E. C. Piqueras, «Modelado y Análisis Formal del Protocolo de Comunicación de Sensores One Wire,» 2017

1-Wire es un protocolo bidireccional (Half-Duplex) que transporta datos y alimenta


a los dispositivos que se conecten al bus por medio de una única línea o cable y
tierra. Acepta solamente un Master en el bus y uno o más Slave, por lo que se dice
que es multipunto.

El protocolo incluye un sistema de direccionamiento. Cada dispositivo de la


MicroLan debe tener un ID de 64 bits codificado en la misma. Esto sirve como su
dirección. El ID es único e incluye un código de la familia de 8 bits que indica el tipo
de dispositivo y la funcionalidad.

El protocolo 1-Wire puede funcionar en dos velocidades de transmisión de Datos:


estándar: 15.4 kbps y overdrive: 125 kbps. La comunicación se realiza con intervalos
de tiempo que varía entre alto y bajo en tiempos determinados, para producir así la
representación de uno y cero.
Un intervalo de tiempo es el uso controlado de impulsos de baja duración de tiempo
para codificar los unos y ceros binarios. El intervalo de tiempo depende de la
velocidad de transmisión a la que se decida enviar la data: Velocidad estándar: 60
μs o velocidad overdrive: 8 μs.

En el protocolo 1-Wire, para garantizar la integridad de los datos, se tiene varios


tipos de señales. Se definen mediante este protocolo las siguientes señales: el pulso
de Reset, el pulso de presencia, escritura de 0, escritura de 1, lectura de 0, lectura
de 1.
El Master del bus inicializa todas estas señales, con excepción del pulso de
presencia. Los dispositivos Slave 1-Wire pueden ser alimentados de dos maneras:
usando el pin VDD, o en modo Parasite Power. El modo Parasite Power es muy

69
utilizado, porque permite con un único cable alimentar y mantener comunicación
entre el Master y el Slave.

a) Proceso de inicialización: Toda la comunicación con el protocolo 1-Wire


comienza con una secuencia de inicialización que consiste en un pulso de
reset desde el Master seguido por un pulso de presencia desde el Slave.
b) Intervalo tiempo de escritura: Existen dos tipos de intervalo de tiempo de
escritura: el intervalo de tiempo de escritura de 1 y el intervalo de tiempo de
escritura de 0. El Master del bus utiliza el intervalo de tiempo de escritura de
1 para escribir un 1 en dispositivo Slave, y utiliza el intervalo de tiempo de
escritura de 0, para escribir un 0 en el dispositivo Slave.
c) Un intervalo de tiempo de lectura: Es iniciado por el dispositivo Master
poniendo el bus 1-Wire en bajo por un mínimo de 1 μs y luego liberando el
bus. Los dispositivos Slaves en el protocolo 1-Wire solo pueden transmitir
datos al Master del bus cuando este empieza los intervalos de lectura.

Los tipos de dispositivos atendidos por el bus 1-Wire incluyen sensores, en


particular para los termómetros y estaciones meteorológicas. El sistema también se
aplica en llaves electrónicas. En esta categoría, 1-Wire está integrado en una
unidad llamada iButton, que se asemeja a una pila de reloj. [11]

Sensor de temperatura DS1820


Básicamente un sensor de temperatura es un instrumento electrónico capaz de
realizar una lectura precisa de una temperatura en un ambiente determinado.
Las aplicaciones en las que esta característica es útil incluyen controles ambientales
de HVAC, detección de temperaturas dentro de edificios, equipos o maquinaria, y
monitoreo y control de procesos. Uno de los sensores digitales más utilizados para
medir cambios de temperatura en el ambiente industrial y universitario es el DS1820
o DS18B20, dado su fácil implementación, alta precisión y rango de apertura. [12]

Características del sensor de temperatura:


El DS1820 es un sensor digital de temperatura que utiliza el protocolo 1-Wire para
comunicarse, este protocolo necesita solo un pin de datos para comunicarse y
permite conectar más de un sensor en el mismo bus.
El termómetro digital DS18B20 proporciona lecturas de temperatura de 9 a 12 bits
(configurables) que indican la temperatura del dispositivo. La realización de
conversiones de temperatura se puede derivar de la propia línea de datos sin
necesidad de una fuente de alimentación externa.

Lo primero que podemos destacar es su distribución de pines, el circuito integrado


que realiza la medición de temperatura, contiene tres pines: GND, DQ y VDD. Los
cuales corresponden a los pines de Tierra, Datos y Voltaje; como se muestra en la
figura 18.

70
Fig. 18. Descripción de pines del sensor DS18B20.
Dallas Semiconductor , «DS18B20 Programmable Resolution 1-wire».

Es capaz de medir las temperaturas dentro del rango de -55 a 125°C y proporcionar
la exactitud de medición de ±0.5°C para las temperaturas dentro del rango de -10 a
85°C. Para su funcionamiento se requiere un voltaje de alimentación de 3.3V. El
DS1820 tarda como máximo 750ms en calcular la temperatura con una resolución
de 9 bits. [13]

71
Bibliografía

[1] J. C. Lopez, «Proyecto de robótica educativa,» 2018.


[2] ITPN, «Unidad V: Puertos y buses de comunicación para microcontrolador».
[3] F. V. Pérez, Microcontroladores: fundamentos y aplicaciones con PIC, Marcocombo,
2007.
[4] Microchip , «Microchip Developer Help,» [En línea]. Available:
https://microchipdeveloper.com/16bit:exceptions .
[5] O. E. B. Zapata, Microcontroladores PIC con programación PBP, España: RA-MA,
2015.
[6] B. D. Mulas, «UART (UNIVERSAL ASYNCHRONOUS
RECEIVER/TRANSMITTER),» [En línea]. Available: https://e-
archivo.uc3m.es/bitstream/handle/10016/23730/TFG_Borja_Diaz_Mulas.pdf?sequen
ce=1&isAllowed=y.
[7] J. R. Osio, «Descripción General de un Microcontrolador (Módulos de
Comunicación),» 2011.
[8] D. X. V. Redrobán, «ANALIZADOR DE PROTOCOLO SPI,» GUAYAQUIL –
ECUADOR, 2013.
[9] «MIKROE Time-saving embedded tools.,» 2021. [En línea]. Available:
https://www.mikroe.com/.
[10] Microchip Technology Inc., «PIC24F16KA102 Family,» 2009. [En línea].
Available:
http://ww1.microchip.com/downloads/en/DeviceDoc/PIC24F16KA102_Family_data
sheet_39927b.pdf.
[11] «Ingeniería Mecafenix,» 15 octubre 2018. [En línea]. Available:
https://www.ingmecafenix.com/electronica/el-buzzer/.
[12] «Geek Factory,» [En línea]. Available:
https://www.geekfactory.mx/tutoriales/tutoriales-arduino/ds18b20-con-arduino-
tutorial-de-sensor-de-temperatura-digital/.
[13] «MIKROE Time-saving embedded tools.,» [En línea]. Available:
https://www.mikroe.com/ebooks.
[14] «ElectroSoftCloud,» 15 marzo 2020. [En línea]. Available:
https://www.electrosoftcloud.com/schmitt-trigger-que-es/.
[15] «Arquitecturas de sistemas UC3M,» Universidad de Carlos III de Madrid, 2017. [En
línea]. Available: http://www.it.uc3m.es/pbasanta/asng/course_notes/ch13s11.html.
[16] M. G. M. Ordóñez, «USO DEL PROTOCOLO 1-WIRE CON COMPROBACIÓN
DE REDUNDANCIA CÍCLICA,» Guatemala, 2015.
[17] Microchip Technology Inc., «PIC24F16KA102 Family datasheet,» 2009 . [En línea].
Available:
http://ww1.microchip.com/downloads/en/DeviceDoc/PIC24F16KA102_Family_data
sheet_39927b.pdf.

72
[18] «DISPLAYS DE CRISTAL LIQUIDO,» [En línea]. Available:
http://galia.fc.uaslp.mx/~cantocar/microprocesadores/MANUALES_PDF/LCD_ESP
A_OL.PDF.
[19] Mikro C, «Mikroe,» 27 agosto 2020. [En línea]. Available:
https://www.mikroe.com/. [Último acceso: 2021].
[20] «Megan man,» 29 agosto 2014. [En línea]. Available:
http://historiamega.blogspot.com/.

73

View publication stats

You might also like