Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Libro Microchip

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 155

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

net/publication/325404486

dsPIC de Microchip

Book · January 2010

CITATIONS READS

0 1,825

3 authors, including:

Carlos Gerardo Hernández Capacho


Universidad Pontificia Bolivariana
10 PUBLICATIONS 11 CITATIONS

SEE PROFILE

All content following this page was uploaded by Carlos Gerardo Hernández Capacho on 28 May 2018.

The user has requested enhancement of the downloaded file.


dsPIC
de
Microchip
en Lenguaje de Ensamblador

Carlos Gerardo Hernández C.


Laura Clarena Maestre C.
Viviana Afanador Peña
dsPIC de Microchip en Lenguaje de Ensamblador
Primera edición 2010

Universidad Pontificia Bolivariana - Bucaramanga


Campus Universitario, Kilómetro 7 via Piedecuesta
Teléfono: (7) 6 79 62 20 ext. 437 - 438 - 203
www.upb.edu.co

carlos.hernandez@upb.edu.co

ISBN: 978-958-8506-12-8
INTRODUCCIÓN

En los dsPIC existen los dsPIC30F y los dsPIC33F, para esta obra se tendrán en cuenta
solo los primeros, ya que son los que tienen mayor trayectoria y poseen unas bondades
tradicionales en niveles de voltajes, encapsulados y número de pines.

El docente Carlos Gerardo Hernández Capacho, la Ingeniera Electrónica Laura Clarena


Maestre Carrillo y la estudiante de trabajo de grado Viviana Afanador Peña han prepara-
do este trabajo bibliográfico para el servicio de los estudiantes que desean empezar su
trabajo con una herramienta tan poderosa como lo es el dsPIC de Microchip.

La obra está divida en dos partes fundamentales; una teórica que comprende los capítu-
los 1 al 6 y una de ejemplos de aplicación que corresponde al capítulo 7. En la primera
parte se presenta y explica la terminología que el fabricante ha asignado a esta podero-
sa máquina que es todo un sistema microprocesado, el cual integra un microcontrolador
con utilidades de DSP. La segunda parte son ejemplos de aplicación diseñados, desa-
rrollados y aplicados por docente, monitores y grupos de laboratorios de la asignatura
Arquitectura de Computadores I en la Universidad Pontificia Bolivariana, Seccional Bu-
caramanga, resueltos en lenguaje de programación “ensamblador”.

Los autores expresan sus agradecimientos por la colaboración en el desarrollo de este


libro a los estudiantes: John Alexander Peñaloza, Tatiana Lucia Gómez Moreno, An-
drea Patiño, Edgardo Villamizar, Angélica Jerez, Sergio Espinosa, Alexander Ariza, Juan
Andrés Duran Sánchez, Luis Alonso Osorio Molina, Mauricio Lizarazo, Catalina Luna
Monsalve, Luis Enrique Corzo Parra, Carlos Pinto, Freddy Alberto Vega Reyes, Diana
Zuliana García Jaimes, Rossy Lizcano y Eder Antolinez Portillo.
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

CONTENIDO

dsPIC de Microchip

1. DESCRIPCIÓN GENERAL DE LOS dsPIC30F

1.1 Definición de los dsPIC30F


1.2 Familias de los dsPIC30F
1.3 Características generales
1.4 Diagrama de Bloques
1.5 Oscilador

2. REGISTROS DE FUNCIONES ESPECIALES (SFR)

2.1 Registros de Trabajo


2.2 Registro W15 y SPLIM
2.3 Registro Status, (SR)
2.4 Registro de Control, CORCON
2.5 Registro RCOUNT
2.6 Registros DCOUNT, DOSTART DOEND
2.7 Registros Shadow

3. dsPIC30F2010

3.1 Configuración de pines


3.2 Características generales
3.3 Memoria de Datos
3.4 Memoria de Programa

4. dsPIC30F3014

4.1 Configuración de pines


4.2 Características generales
4.3 Memoria de Datos
4.4 Memoria de Programa
4.5 Descripción de las instrucciones adicionales

5. MÓDULOS DE LOS dsPIC30F

5.1 Interrupciones
5.2 Puertos I/O
5.3 Timers
5.4 Conversor Analógico-Digital
5.5 Memoria Flash Y Memoria EEPROM

3 5
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

6. HERRAMIENTAS DE DISEÑO

6.1 Software de Programación


6.2 Conjunto de Instrucciones

7. EJEMPLOS DE APLICACIÓN

8. BIBLIOGRAFÍA

6 4
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

1. DESCRIPCIÓN GENERAL DE LOS dsPIC30F

1.1 Definición de los dsPIC30F

Un dsPIC, controlador de señal digital fabricado por la empresa Microchip, es un dispositivo que
combina el alto rendimiento de un microcontrolador de 16 bits con el cálculo de alta velocidad de
un procesador de señales digitales (DSP). El dispositivo dsPIC se diseñó con el fin de integrar las
características que debe tener un DSP y un Microcontrolador (MCU), de forma que las secciones
de los dos trabajan de forma conjunta, compartiendo la carga de instrucciones y la lógica de
decodificación.

El dsPIC es un circuito integrado conformado por un DSP y un Microcontrolador, de forma que el


conjunto de instrucciones que posee el dispositivo está divido en instrucciones MCU, cuando se
utiliza solamente como un microcontrolador y en instrucciones DSP, cuando se procesan señales.
Para ejecutar las instrucciones MCU se utiliza una ALU, Unidad Lógica Aritmética y la máquina
DSP se encarga de las instrucciones DSP. La mayoría de las instrucciones se ejecutan en un ciclo
único buscando la ejecución rápida, el conjunto de instrucciones, es de 94, donde 16 son
consideradas instrucciones DSP y las restantes 78 son instrucciones MCU.

Microchip tiene en el mercado los dsPIC30F, los cuales poseen una arquitectura moderna para
facilidad de direccionamiento ó Harvard modificada, porque además de contar con la Memoria de
Programa, tiene dos Memorias de Datos, Memoria X y Memoria Y. En cuanto a la arquitectura de la
CPU, es una arquitectura de Set Reducido de Instrucciones (RISC) modificada, de alto
desempeño.

Algunos de los recursos que poseen son: arreglo de 16 registros de trabajo, un multiplicador de 16
x 16 bits, una barra de corrimiento y un soporte para operaciones de división. Todas las
operaciones pueden ser interrumpidas, también poseen registros shadow o de sombra, que son
localidades de memoria ocultas que permiten mantener datos de ciertos registros en algunas
ocasiones especiales como las subrutinas.

1.2 Familias de los dsPIC30F

Los dispositivos dsPIC30F se dividen en 3 Familias con ciertas características que las hacen
adecuadas para una aplicación determinada. Las Familias son:

Familia de Sensores. La familia de sensores dsPIC30F tiene características diseñadas para


soportar aplicaciones de control de bajo costo y altas prestaciones. Los dispositivos de esta familia
se encuentran encapsulados en 18 y 28 pines, de forma que estos dispositivos se utilizan en
aplicaciones donde se necesitan pocos puertos de entrada y salida, además de pocos módulos
para periféricos, con códigos pequeños por el limitado rango de direcciones que conforma la
Memoria de Programa. La descripción de cada una de las características de los dispositivos de la
familia de sensores se encuentra en la tabla 1.1.

5 7
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Tabla 1.1 Familia de Sensores


Memoria de Output A/D
TN 2 TN
Dispositivo Pines Programa SRAM EEPROM Timer Input Comp/ 12-bit UART SPI IC
Bytes Bytes Bytes 16-bit Cap Std 100Ksps
Instrucc PWM
dsPI30F2011 18 12K 4K 1024 0 3 2 2 8ch 1 1 1
dsPI30F3012 18 24K 8K 2048 1024 3 2 2 8ch 1 1 1
dsPI30F2012 28 12K 4K 1024 0 3 2 2 10ch 1 1 1
dsPI30F3013 28 24K 8K 2048 1024 3 2 2 10ch 2 1 1

Familia de Propósito General. La familia de Propósito General dsPIC30F es la adecuada para


una gama amplia de aplicaciones que requieren un MCU de 16-bits. Esta Familia contiene desde
40 hasta 80 pines, con amplio rango de direcciones para la Memoria de Programa, al igual que
para la Memoria EEPROM y Memoria SRAM y un mayor número de Periféricos. La descripción de
cada una de las características de los dispositivos de la familia de Propósito General se encuentra
en la tabla 1.2.

Tabla 1.2 Familia de Propósito General


Memoria Output Interface A/D
Dispositivo Pines de SRAM EEPROM Timer Input Comp/ Codec 12-bit UART SPITN I2CTN CAN
Programa Bytes Bytes 16-bit Cap Std 100Ksps
Bytes PWM
Instru
dsPI30F3014 40/44 24K 8K 2048 1024 3 2 2 ___ 13ch 2 1 1 __

dsPI30F4013 40/44 48K 16K 2048 1024 5 4 4 AC‟97,I2S 16ch 2 1 1 1


2
dsPI30F5011 64 66K 22K 4096 1024 5 8 8 AC‟97,I S 16ch 2 2 1 2

dsPI30F6011 64 132K 44K 6144 2048 5 8 8 ___ 16ch 2 2 1 2


2
dsPI30F6012 64 144K 8K 8192 4096 5 8 8 AC‟97,I S 16ch 2 2 1 2
dsPI30F5013 80 66K 22K 4096 1024 5 8 8 AC‟97,I2S 16ch 2 2 1 2

dsPI30F6013 80 132K 44K 6144 2048 5 8 8 ___ 16ch 2 2 1 2

dsPI30F6014 80 144K 48K 8192 4096 5 8 8 AC‟97,I2S 16ch 2 2 1 2

Familia para control de motores y conversión de potencia. Esta familia de controladores


dsPIC30F está diseñada para soportar variedad de aplicaciones para control de motores, como
motores de inducción monofásicos y trifásicos y motores de reactancia conmutada. Estos
productos están también indicados para fuentes de alimentación ininterrumpidas (UPS), inversores,
fuentes de alimentación conmutadas y corrección del factor de potencia, también puede ser usada
para controlar el módulo de gestión de potencia en servidores, equipos de telecomunicaciones y
otros equipos industriales. Los dispositivos poseen desde 20 pines hasta 80 pines, tienen módulo
especial para PWM. La descripción de cada una de las características de los dispositivos de la
Familia para control de motores y conversión de potencia se encuentra en la tabla 1.3.

8 6
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Tabla 1.3 Familia de Motores y Conversión de Potencia


Memoria Output Motor A/D
Dispositivo Pines de SRAM EEPROM Timer Input Comp/ Cntrl 12-bit Quad UART SPITN I2CTN CAN
Programa Bytes Bytes 16-bit Cap Std PWM 100Ksps Enc
Bytes Inst PWM
dsPI30F2010 28 12K 4K 512 1024 3 4 2 6ch 6ch 1 1 1 1 __

dsPI30F3010 28 24K 8K 1024 1024 5 4 2 6ch 6ch 1 1 1 1 __

dsPI30F4012 28 48K 16K 2048 1024 5 4 2 6ch 6ch 1 1 1 1 1

dsPI30F3011 40/44 24K 8K 1024 1024 5 4 4 6ch 9ch 1 2 1 1 __

dsPI30F4011 40/44 48K 16K 2048 1024 5 4 4 6ch 9ch 1 2 1 1 1


dsPI30F5015 64 66K 22K 2048 1024 5 4 4 8ch 16ch 1 1 2 1 1

dsPI30F6010 80 144K 8K 8192 4096 5 4 8 8ch 16ch 1 2 2 1 2

1.3 Características Generales

Las siguientes son las características para la mayoría de los dsPIC30F:

 Arquitectura Harvard modificada.


 96 instrucciones.
 24 bits para la Memoria de Programa y 16 bits para la Memoria de Datos.
 64 Kbytes para el direccionamiento de la memoria de Datos.
 144 Kbytes de Memoria de Programa Flash, con capacidad de 48K para instrucciones
(Estos son los máximos rangos pero pueden ser menores dependiendo del dispositivo).
 8 Kbytes de la Memoria de Datos RAM implementada (depende del dispositivo).
 4 Kbytes de la Memoria de Datos no volátil EEPROM (depende del dispositivo).
 Arreglo de registros de trabajo de 16x16 bits.
 Soporta diversos modos de direccionamiento: indirecto, módulo de direccionamiento y
módulo de inversión de bits para transformada rápida de fourier de base 2.
 Dos acumuladores de 40 bits con opcional saturación lógica.
 Un sólo ciclo para operaciones MAC, multiplicación y acumulación.
 Barra de corrimientos aritméticos y lógicos hasta de 40 bits.
 Un multiplicador de 17-bits x 17-bits.
 30 millones de instrucciones por segundo como máximo, la velocidad depende del reloj, se
tiene la opción de multiplicar el reloj por 4x, 8x y 16x utilizando el PLL.
 41 fuentes de interrupción; se puede seleccionar entre 8 niveles de prioridad.
 Tabla de 62 vectores, donde 54 corresponden a vectores de interrupción y 8 a vectores por
errores de trampa.
 5 Fuentes de interrupciones externas.
 Timer de 16 ó 32 bits.
 Módulo Input Capture de 16 bits.
 Módulo Output Compare de 16 bits con funciones para PWM.
 Conversor analógico-digital de 10 o 12 bits.
2
 DCI, Interface de convertidor de datos utilizando protocolos AC‟97 e I S.
 Soporte de módulos UART.
 Soporte para comunicación utilizando el módulo Esclavo/Maestro I2C.
 Módulo para protocolo CAN.

7 9
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

1.4 Diagrama de Bloques

El diagrama de los dsPIC30F se observa en la Figura 1.1. El dispositivo posee una Unidad Lógica
Aritmética (ALU), donde se realizan las operaciones cuando se trabaja como microcontrolador y
una máquina DSP cuando se trabaja como DSP.

La Memoria de Programa maneja 24 bits donde se almacenan instrucciones y datos. Para acceder
a los datos se utilizan métodos como el PSV (Espacio de programa Visible desde la Memoria de
Datos) y las instrucciones Table que permiten tomar los datos que se encuentren en la Memoria de
Programa y almacenarlos en la Memoria de Datos.

La Memoria de Datos trabaja con direcciones de 16 bits y se divide en dos Espacios de Memoria:
Memoria de Datos X y Memoria de Datos Y, cada una con sus respectivas Unidades de
Generación de Direcciones (AGU) que permiten acceder a las direcciones efectivas de la Memoria
a través de sus buses de datos.

Los dispositivos cuentan hasta con 5 timers de 16 bits, un contador "Watchdog", protección de bajo
voltaje de programación, diferentes tipos de osciladores y la posibilidad de utilizar PLL (lazo de
enganche por fase) para aumentar la frecuencia de algunos osciladores, con el fin de aumentar la
velocidad de procesamiento. También se tienen convertidores A/D de muestreo simultáneo de
alta velocidad de 10 bits y convertidores A/D de 12 bits.

10 8
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Figura 1.1 Diagrama de Bloques de los dsPIC30F

DATA LATCH BUS DE DIRECCIONES X

BUS DE DATOS Y 16

BUS DE DATOS X

16 16 16 16
Controlador
de DATO LATCH DATO LATCH
interrupciones
8 16 MEMORIA DE MEMORIA DE
DATOS DATOS
Acceso a la RAM Y RAM X
Memoria de Datos
24 con PSV y Table DIREC. LATCH DIREC. LATCH

24 Bus de 16 16
direcciones
PCU PCH PCL Y 16 X RAGU
Contador de Programa X WAGU 16

DIREC. LATCH Control Control


de pila de Lazo Y AGU
MEMORIA DE
PROGRAMA
MUX
EEPROM 16
DATO LATCH 16
16 16
ROM IR
LATCH
24

16
DEDODIF. Arreglo de Registros de
DE INSTRUC
Y CONTROL
Trabajo W 16 x 16
16
POWER-UP
TIMER 16 16
Generación de OSC START-
Contador Máquina Soporte de
UP TIMER DSP División
OSC1/CLK1
POR/BOR

RESET
WATCHDOG
MCLR ALU , 16 bits

TIMER
LOW VOLT
16 16
VDD, VSS
AVDD, AVSS DE PROG.

CAN1, ADC de Módulo de Módulo de I2 C


CAN2 10 ó 12 bits Input Capture Output Compare
10 ó 12 bit 10 ó 12 bit

Timers DCI SPI1, SPI2 UART1, UART2 Puertos I/O

9 11
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

La arquitectura de los dsPIC30F presentan muchos periféricos de alto rendimiento incluyendo


hasta 8 funciones de captura, 8 de comparación, decodificador de cuadratura de fase y PWM
dedicado para la familia de motores y control de potencia. Tiene soporte de interfaces para
expansiones de periféricos con distintas combinaciones de: RS-485, UART, I2C, SPI, AC97, CAN e
I2S.

1.5 Oscilador

Un ciclo de máquina necesita 4 ciclos de reloj, lo que se conoce como TCY, el cual depende del tipo
de oscilador que se escoja. El sistema de reloj puede provenir de varias fuentes como son el
Oscilador Primario, Oscilador Secundario, Oscilador FRC (oscilador interno rápido RC) ó el
Oscilador LPRC (oscilador de bajo poder RC).

La fuente del oscilador que permitirá la ejecución de las instrucciones se debe configurar en el
momento de programar el dispositivo, los valores para la respectiva configuración se almacenan en
el registro FOSC que se encuentra en la memoria no volátil. Se utilizan los bits FOS<1:0> del
registro FOSC que determinan si la fuente es primaria, secundaria, FRC ó LPRC. Los bits
FPR<3:0> del registro FOSC, determinan el modo del oscilador primario.

FOSC, Registro de Configuración del oscilador

--- --- --- --- --- --- --- ---

bit 23 bit 26

FCKSM<1:0> --- --- --- --- FOS<1:0>

bit 15 bit 8

--- --- --- --- FPR<3:0>

bit 7 bit 0
Bit 23-16: Sin implementar: Se lee como cero.

Bit 15-14: FCKSM<1:0>:Bit selector del modo del cambio de reloj y el FSCM.
1x: Deshabilitar cambio de reloj, deshabilitar FSCM.
01: Habilitar cambio de reloj, deshabilitar FSCM.
00: Habilitar cambio de reloj, habilitar FSCM.

Bit 13-10: Sin implementar: Se lee como cero.

12 10
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Bit 9-8: FOS<1:0>: Bit selector de la fuente del Oscilador.


11: Oscilador Primario.
10: Oscilador Secundario.
01: Oscilador FRC.
00: Oscilador LPRC.

Bit 7-4: Sin implementar: Se lee como cero.

Bit 3-0: FPR<3:0>: Bits selectores del modo del Oscilador Primario.
1111: Reloj externo EC w/PLL, habilitado 16xPLL. Pin OSC2 es I/0.
1110: Reloj externo EC w/PLL, habilitado 8xPLL. Pin OSC2 es I/0.
1101: Reloj externo EC w/PLL, habilitado 4xPLL. Pin OSC2 es I/0.
1100: Reloj externo ECIO. Pin OSC2 es I/0.
1011: Reloj externo EC. Pin OSC2 es salida de reloj (FOSC/4).
1010: No se usa.
1001: Oscilador RC externo, ERC. Pin OSC2 es salida de reloj(FOSC/4).
1000: Oscilador RC externo, ERCIO. Pin OSC2 es I/0.
0111: Oscilador con cristal XT, habilitado 16xPLL (4MHz-7.5MHz).
0110: Oscilador con cristal XT, habilitado 8xPLL (4MHz-10MHz).
0101: Oscilador con cristal XT, habilitado 4xPLL (4MHz-7.5MHz).
0100: Oscilador con cristal XT, (4MHz-10MHz).
001x: Oscilador con cristal HS, (10MHz-25MHz).
000x: Oscilador con cristal XTL, (200KHz-4MHz).

PLL (lazo de enganche por fase). El PLL multiplica la frecuencia del reloj generado por
algunas de las fuentes del oscilador primario. En la tabla 1.4 se muestran los rangos de entrada, el
factor posible de la multiplicación y los correspondientes rangos de salida.

Tabla 1.4 Rango de Frecuencias con el PLL

Frecuencia de Entrada Multiplicador PLL Frecuencia de Salida


4MHz-10MHz x4 16MHz-40MHz
4MHz-10MHz X8 32MHz-80MHz
4MHz-7.5MHz X16 64MHz-120MHz

Cuando se va a programar el dispositivo se realiza la correspondiente configuración de bits que


determina con qué factor se multiplica la entrada del reloj, si es 4x, 8x ó 16x, configurando
inmediatamente los bits FPR<3:0> del registro FOSC.

Oscilador Primario

El oscilador primario está destinado para que trabajen los pines OSC1 y OSC2. Este oscilador
tiene 13 modos de operación, los cuales se explican en la Tabla 1.5.

Cuando se trabaja con osciladores XT, XTL y HS se utiliza un oscilador de cristal en los pines
OSC1 y OSC2, la diferencia entre las tres formas es el rango de frecuencias en que trabajan. El XT
es el único oscilador que soporta PLL, esto quiere decir que su frecuencia puede ser multiplicada
por los factores de 4, 8 y 16.

11 13
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Tabla 1.5 Modos de operación del oscilador Primario

Modo del Oscilador Descripción Función alternativa del pin OSC2


EC Entrada de reloj externo (0-40MHz) FOSC/4
ECIO Entrada de reloj externo (0-40MHz). I/0
EC w/PLL 4x Entrada de reloj externo (4-10MHz) I/0
EC w/PLL 8x Entrada de reloj externo (4-10MHz) I/0
EC w/PLL 16x Entrada de reloj externo (4-7.5MHz) I/0
ERC Oscilador externo RC FOSC/4
ERCIO Oscilador externo RC I/0
XT Cristal 4MHz-10MHz Oscilador externo
XT w/PLL 4x Cristal 4MHz-10MHz Oscilador externo
XT w/PLL 8x Cristal 4MHz-10MHz Oscilador externo
XT w/PLL 16x Cristal 4MHz-7.5MHz Oscilador externo
XTL Cristal 200kHz-4MHz Oscilador externo
HS Cristal 10MHz-25MHz Oscilador externo

Los modos del oscilador primario ERC y ERCIO utilizan el oscilador interno RC, y realizando la
conexión respectiva de un condensador y resistencias externos en el pin OSC1, se puede obtener
un reloj. La diferencia de estos modos, radica en que el pin OSC2, puede utilizarse como un reloj
con una frecuencia de trabajo de FOSC/4 cuando se trabaja en el modo ERC, mientras que al
trabajar con el modo ERCIO el pin OSC2 se utiliza como un pin configurado para entrada o salida.

Los modos EC y ECIO consisten en entradas de reloj externo. El pin OSC1 puede ser manejado
por drivers CMOS, convirtiéndose este pin en alta impedancia y el pin OSC2 en el modo EC puede
configurarse como reloj FOSC/4 y cuando se trabaja con el modo ECIO el pin OSC2 se utiliza como
un pin de entrada o salida digital.

Oscilador Secundario. El oscilador Secundario es el LP, low Power, como su nombre lo indica,
se utiliza para operaciones de baja potencia y trabaja con un cristal de 32 KHz, el cual debe ser
conectado en los pines OSC1 y OSC2 del dispositivo; cuando estos pines se usan como oscilador
no pueden ser empleados en otras funciones. Cuando se configura el oscilador secundario en el
momento de programar se coloca en cero los bits FOS del registro FOSC.

Oscilador Rápido Interno, FRC. Trabaja con frecuencia de 8 MHz. Permite ser utilizado
cuando se necesitan velocidades altas sin necesidad de un cristal externo, o una red RC. Cuando
se programa este oscilador los bits FOS<1:0> se colocan en 01.

Oscilador Interno de baja potencia, LPRC. El oscilador LPRC es un componente del


Watchdog Timer (WDT) y oscila con una frecuencia de 512 KHz. Este es un oscilador que puede
ser utilizado para el Power-up Timer, el WDT y el circuito de monitoreo de reloj. Cuando se
programa este oscilador los bits FOS<1:0> se colocan en 10, al igual que los bits COSC<1:0> del
registro OSCCON.

14 12
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

2. REGISTROS DE FUNCIONES ESPECIALES (SFR)

Los registros de funciones especiales se utilizan para:

 Almacenar datos para realizar operaciones en la ALU.


 El manejo de las interrupciones.
 El manejo de los periféricos.
 Acceder a la Memoria de Programa desde la Memoria de Datos.
 El manejo de la Pila (stack).
 El direccionamiento, en la Memoria de Datos, en la Memoria EEPROM y en la Memoria de
Programa.

En la Figura 2.1 se observan algunos de estos registros con sus respectivos bits y su función
específica. Se tienen los registros PC (contador de programa) y los registros TBLPAG, PSVPAG,
los cuales permiten acceder a datos que se encuentren almacenados en la Memoria de Programa.

2.1 Registros de Trabajo (W0, W1, W2, W3, W4, W5, W6, W7, W8, W9, W10, W11,
W12, W13, W14, W15). Los dsPIC30F contienen 16 registros de trabajo W, los cuales permiten
almacenar datos así como direcciones, de forma que se puede acceder al dato que se encuentre
en una determinada dirección utilizando el direccionamiento indirecto. Las instrucciones que se
utilizan para acceder a los registros de trabajo, se dividen en dos tipos:

Instrucciones registro: Pueden funcionar de dos formas:

 Para almacenar una constante en un registro de trabajo W. Ejemplo:

MOV #0x0020,W0 ; W0 almacena el valor de 20 en hexadecimal (32 en decimal)


MOV #32,W0 ; W0 almacena el valor de 32 en decimal

 Para almacenar una dirección en un registro de trabajo W, de forma que funcione como un
registro puntero. Ejemplo:

MOV #0x0800,W2 ; W2 almacena la dirección 0800 perteneciente a la memoria


; de datos
MOV W0,[W2] ; el valor que se almacenó en W0 quedó guardado en la
; dirección que apunta W2, es decir 0800

13 15
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Figura 2.1 Registros de los dsPIC30F

W0(WREG)
W1
W2
W3
Operandos para W4
Instrucciones
W5
DSP
W6 Registros
W7 de Trabajo
Almacenan
Direcciones para W8
Instrucciones W9
DSP W10
W11
W12
W13
W14
Registros Shadow. Puntero de la pila, W15
Utilizan PUSH.s y POP.s
SPLIM

7 0
‘ Almacena la dirección de la página del
TBLPAG programa para instrucciones TABLE
7 0 Almacena la dirección de la página
PSVPAG del programa para el método PSV
Almacena la página del programa para
15 0
instucciones Table
RCOUNT Contador del lazo REPEAT
15 0 Almacena la página del programa
DCOUNT
para instucciones
Contador del lazoTable
DO
22 0
Dirección en que comienza
DOSTART 0
el lazo REPEAT
22 0
Dirección en que comienza
DOEND 0 el lazo DO
SRH SRL
OA OB SA SB OAB SAB DA DC IPL<2:0> RA N OV SZ C Registro
Status, SR
15 0
0 Registro de Control
CORCON

Cuando se utilizan instrucciones que contienen el registro entre el símbolo [ ], se hace referencia al
valor que se encuentra guardado en la dirección que almacena ese registro, y es lo que se conoce
como direccionamiento indirecto.

16 14
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Instrucciones file registro: En estas instrucciones se accede a un valor almacenado en la


Memoria de Datos, colocando la dirección donde se encuentra el dato. Para este tipo de
instrucciones sólo se puede utilizar el registro de trabajo WREG, o registro W0.

Ejemplo:

MOV WREG,0x0824 ; se almacena en la dirección 0x0824 el valor de W0


ADD 0X0824,WREG ; se adiciona el valor de la dirección a W0, almacenando el
; resultado en W0

2.2 Registro W15 y SPLIM. El registro de trabajo W15 también sirve como un puntero para la
pila (stack), de forma que en W15 se almacena una dirección de la memoria de datos disponible, y
a partir de esa dirección, se guardan los valores de registros que no se desean perder cuando
ocurre una interrupción o una subrutina, utilizando las instrucciones PUSH y POP. En la figura 2.2
se puede ver un ejemplo acerca del funcionamiento de la pila.

El rango de direcciones en que puede trabajar la pila depende del puntero, registro W15 (donde se
almacena la dirección inicial para trabajar la pila) y del registro SPLIM (donde se almacena la
dirección final de la pila). Cuando se ejecuta una instrucción PUSH el registro W15 se incrementa
en dos, es decir apunta a la siguiente dirección, y constantemente se compara con la dirección que
contiene SPLIM, cuando la dirección de W15 exceda este valor se genera un error trampa que
indica que no es posible acceder a la pila, porque ha salido del rango de direcciones configurado
para la misma. El siguiente es un ejemplo de la rutina que se coloca en un programa para el
dsPIC30F2010.

 Ejemplo:

__reset:

MOV #0x0800, W15 ; inicializa con un valor de dirección de la


; Memoria X RAM
MOV #0x956,W0 ; corresponde al valor con que termina la pila,
; suele ser de la Memoria Y
MOV W0, SPLIM ; almacena el valor del registro W0 en el registro
; que almacena la dirección límite de la pila

15 17
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Figura 2.2 Ejemplo del funcionamiento de la pila

0x0000
0x0000

W15 0XFE45 0x0850


0x0850
W15 0x0852

0x0956
0x0956
. PUSH W2 ; el valor de W2 se almacena
MOV #0x0850,W15 ; donde apuntaba W15 y este
MOV #0xFE45,W2 ; se incrementa en 2
MOV #0x6785,W3

0x0000 0x0000

0XFE45 0x0850 0XFE45 0x0850


0X6785 0x0852 W15 0x0852
W15 0x0854 0x0854

0x0956 0x0956

PUSH W3 ; el valor de W3 se almacena POP W1 ;el último valor que se


; donde apuntaba W15 y este ; guardó el cual correspondía
; se incrementa en 2 ; a W3 se almacena en W1
; y W15 se decrementa en 2

2.3 Registro Status, (SR). Los dsPIC30F tienen un Registro Status SR de 16 bits, donde el
Byte menos significativo se conoce como SRL y el byte más significativo como SRH. SRL contiene
banderas de estado para las operaciones de la ALU, los bits de prioridad de las interrupciones de
CPU y el bit que indica que se está realizando un lazo de repetición utilizando la instrucción
REPEAT. SRH contiene los bits que se utilizan para las instrucciones DSP, además el bit que
indica que se está realizando un lazo DO, y el indicador de un Carry Digital.

18 16
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Registro SR

SRH

OA OB SA SB OAB SAB DA DC

bit 15 bit 8

SRL

IPL<2:0> RA N OV Z C

bit 7 bit 0

Bit 15: OA: Bandera de Overflow en el Acumulador A.


1: En el Acumulador A ha ocurrido overflow.
0: En el Acumulador A no ha ocurrido overflow.

Bit 14: OB: Bandera de Overflow en el Acumulador B.


1: En el Acumulador B ha ocurrido overflow.
0: En el Acumulador b no ha ocurrido overflow.

Bit 13: SA: Bandera de Saturación en el Acumulador A.


1: En el Acumulador A ha ocurrido saturación.
0: En el Acumulador A no ha ocurrido saturación.

Bit 12: SB: Bandera de Saturación en el Acumulador B.


1: En el Acumulador B ha ocurrido saturación.
0: En el Acumulador B no ha ocurrido saturación.

Bit 11: OAB: Bandera de Overflow en el Acumulador A ó en el Acumulador B.


1: En el Acumulador A ó B ha ocurrido overflow.
0: En el Acumulador A ó B no ha ocurrido overflow.

Bit 10: SAB: Bandera de Saturación en el Acumulador A o en el Acumulador B.


1: En el Acumulador A ó B ha ocurrido saturación.
0: En el Acumulador A ó B no ha ocurrido saturación.

Bit 9: DA: Bandera de la activación de un Lazo DO.


1: Un Lazo DO está en progreso.
0: Un Lazo DO no está en progreso.

Bit 8: DC: Bandera de un Carry/Borrow.


1: Ha ocurrido un carry en el cuarto bit del byte menos significativo (datos byte) o
en los 8 bits de la palabra menos significativa (datos word).
0: No ha ocurrido un carry en los cuatro bits menos significativos (datos byte) o en
los 8 bits menos significativos (datos word).

17 19
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Bit 7-5: IPL<2:0>: Indicadores del nivel de prioridad de las interrupciones CPU.
111: El nivel de prioridad de interrupción CPU es 7 (15).
110: El nivel de prioridad de interrupción CPU es 6 (14).
101: El nivel de prioridad de interrupción CPU es 5 (13).
100: El nivel de prioridad de interrupción CPU es 4 (12).
011 :El nivel de prioridad de interrupción CPU es 3 (11).
010: El nivel de prioridad de interrupción CPU es 2 (10).
001: El nivel de prioridad de interrupción CPU es 1 (9).
000: El nivel de prioridad de interrupción CPU es 0 (8).

Los bits IPL<2:0> se concatenan con el bit IPL<3> del registro CORCON,
formando el nivel de prioridad de interrupciones de la CPU.

Bit 4: RA: Bandera de la activación de un Lazo REPEAT.


1: Un Lazo REPEAT está en progreso.
0: Un Lazo REPEAT no está en progreso.

Bit 3: N: Bandera de un resultado negativo.


1: El resultado de una operación es negativo.
0: El resultado de una operación no es negativo.

Bit 2: OV: Bandera de overflow en instrucciones MCU.


Este bit se utiliza cuando se emplean datos que tienen el formato complemento a
dos. Hay overflow cuando cambia la magnitud del signo dando un resultado
incorrecto.
1: Ha ocurrido Overflow.
0: No ha ocurrido Overflow.

Bit 1: Z: Bandera de cero.


1: Resultado de una operación lógica o aritmética es cero.
0: Resultado de una operación lógica o aritmética no es cero.

Bit 0: C: Bandera de un Carry/Borrow.


1: Ha ocurrido un carry en el bit más significativo.
0: No ha ocurrido un carry en el bit más significativo.

2.4 Registro de Control, CORCON

El Registro CORCON contiene los bits para controlar las operaciones realizadas en la máquina
DSP, así como el control de las operaciones cuando se realiza un lazo DO. También tiene el bit
que permite habilitar el método PSV, el cual se utiliza para acceder a los datos que se encuentran
en la memoria de programa.

20 18
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Registro CORCON

--- --- --- --- EDT DL<2:0>

bit 15 bit 8

SATA SATB SATDW ACCSAT IPL3 PSV RND IF

bit 7 bit 0
Bit 15-12: Sin implementar: Se lee como cero.

Bit 11: EDT: Bit de control de la terminación temprana del lazo DO.
1: Se desea terminar el lazo DO, antes que todos los ciclos hayan sido
ejecutados.
0: El lazo DO se termina hasta que se completen todos los ciclos.

Bit 10-8: DL<2:0>: Bit que indica cuántos lazos DO son ejecutados.
111: Están activos 7 lazos DO.
110: Están activos 6 lazos DO.
101: Están activos 5 lazos DO.
100: Están activos 4 lazos DO.
011: Están activos 3 lazos DO.
010: Están activos 2 lazos DO.
001: Están activos 1 lazos DO.
000: Están activos 0 lazos DO.

Bit 7: SATA: Bit habilitador de Saturación en el acumulador ACCA.


1: Habilitar la saturación en el acumulador A.
0: Deshabilitar la saturación en el acumulador A.

Bit 6: SATB: Bit habilitador de Saturación en el acumulador ACCB.


1: Habilitar la saturación en el acumulador B.
0: Deshabilitar la saturación en el acumulador B.

Bit 5: SATDW: Bit habilitador de saturación de la escritura en la memoria de datos.


1: Habilitar la saturación de la escritura en la memoria de datos.
0: Deshabilitar la saturación de la escritura en la memoria de datos.

Bit 4: ACCSAT: Bit selector del modo de saturación.


1: Super saturación.
0: Saturación normal.

Bit 3: IPL3: Bit para indicar nivel de prioridad de las interrupciones CPU.
1: El nivel de prioridad de las interrupciones CPU es mayor que 7.
0: El nivel de prioridad de las interrupciones CPU es menor o igual que 7.
El IPL3 se concatena con los bits IPL<2:0> del registro SR.

19 21
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Bit 2: PSV<2:0>: Habilitador del espacio de programa visible desde el espacio de


datos.
1: Espacio de programa visible desde el espacio de datos.
0: Espacio de programa no visible.

Bit 1: RND: Bit selector del modo de redondeo.


1: Redondeo Convencional.
0: Redondeo Convergente.

Bit 0: IF: Bit selector del formato de datos, entero o fraccional.


1: Para instrucciones DSP formato de datos enteros.
0: Para instrucciones DSP formato de datos fraccionales.

2.5 Registro RCOUNT. La instrucción REPEAT es una de las dos formas que utilizan los
dsPIC30F para construir acciones repetitivas. REPEAT permite repetir una misma instrucción un
número de veces específico, el cual se indica con un valor literal +1, o un número guardado en un
registro Wn+1.

Ejemplo:
REPEAT #2
ADD #3,W1 ; esta instrucción se ejecuta tres veces
MOV #4,W2
REPEAT W2
ADD #3,W1 ; esta instrucción se ejecuta cinco veces

El registro RCOUNT de 14 bits almacena el número de veces que dura el lazo y se va


decrementando cada vez que se ejecuta la instrucción, hasta que llegue a 0. Cuando el registro
RCOUNT está trabajando se coloca en 1 la bandera RA del registro SR.

2.6 Registros DCOUNT, DOSTART DOEND. La instrucción DO permite ejecutar un grupo de


instrucciones un número de veces específico. Este número de veces corresponde a un valor literal
+1, o a un valor guardado en un registro wn+1. El bit DA del registro SR se coloca en alto cuando
un lazo DO está activo.

El registro DCOUNT almacena el valor de las iteraciones y cada vez que se realiza un ciclo va
decrementando en 1. El registro DOSTART almacena la dirección de la primera instrucción del
ciclo y en el registro DOEND se almacena la dirección de la última instrucción del ciclo, de esta
manera se saben las instrucciones que se deben ejecutar. En el siguiente ejemplo se puede ver
cómo funcionan los registros.

 Ejemplo:

DO #6,loop_End
INC W2,W2; DOSTART=000136, siendo esta la dirección que ocupa en la
; Memoria de Programa, esta instrucción, la cual es la última que
; se ejecuta en el lazo DO
DEC W1,W1
loop_End:
ADD W2,W1,W3 ; DOEND=00013A, siendo esta la dirección que ocupa en la
; Memoria de Programa esta instrucción, la cual es la última que se ejecuta
; en el lazo DO

22 20
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

En el ejemplo anterior se ejecutan 6+1 veces las instrucciones INC y DEC, porque éstas anteceden
a la etiqueta que indica el lazo DO. La instrucción ADD también hace parte del lazo, siendo ésta la
instrucción que indica que termina el lazo porque va después de la etiqueta.

2.7 Registros Shadow. Los registros shadow o registros sombra, se encuentran ocultos y no se
pueden acceder directamente. Su función es guardar temporalmente el contenido de los registros
que se encuentran asociados a ellos en el instante en que ocurra un evento como una subrutina o
una interrupción. En la Figura 2.1 se pueden ver los registros que se encuentran asociados con los
registros shadow.

Los registros que permiten guardar su valor en los registros shadow cuando se utilizan las
instrucciones PUSH.s y POP.s son los siguientes:

 W0......W3.
 TBLPAG.
 PSVPAG.
 SR (solamente almacena los valores de los bits N, OV, Z y C).

Los valores que almacenan los siguientes registros se guardan en los registros shadow cuando la
instrucción DO es ejecutada.

 DOSTART
 DOEND
 DCOUNT

De esta forma es posible ejecutar dentro de un lazo DO, otro lazo DO, porque los registros shadow
se encargan de almacenar temporalmente los valores del primer lazo, mientras se ejecuta el otro
lazo. Es posible tener hasta siete lazos DO. En los bits DL<2:0> del registro CORCON, se indica
cuántos lazos están activos.

En el siguiente ejemplo se puede ver cómo un lazo DO se puede realizar dentro de otro lazo DO,
ya que los valores de los registros del primer lazo se almacenan en los registros shadow de forma
que en el siguiente lazo se puedan almacenar nuevos valores y cuando se termine este lazo los
valores de los registros shadow vuelven al destino original que controla el primer lazo.

Ejemplo:

MOV #0x0004,W0
MOV #0x0002,W1
DO W1,_rutina ; se realiza 2 + 1 veces la etiqueta _rutina, DCOUNT=2,
; DOSTART=000132, DOEND=00013A
DO W0,_osea ; los valores de los registros anteriores se almacenan en los registros
; shadow y ahora se realiza se realiza 4+ 1 veces la etiqueta _osea,
; DCOUNT=2, DOSTART=000136, DOEND=00013A

ADD W0,W1,W2
_osea:
NOP ; es la última instrucción de la etiqueta _osea
_rutina ; al terminar el anterior lazo los registros DCOUNT, DOSTART,
; DOEND, quedan almacenados con sus primeros valores
NOP ; es la ultima instrucción de la etiqueta _rutina

21 23
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

3. dsPIC30F2010

3.1 Configuración de Pines

MCLR 1 28 AVDD
EMUD3/AN0/VREF+/CN2/RBO 2 27 AVSS
EMUC3/AN1/VREF-/CN3/RB1 3 26 PWM1L/RE0
AN2/SS1/CN4/RB2 4 25 PWM1H/RE1
AN3/INDX/CN5/RB3 5 24 PWM2L/RE2
AN4/QEA/IC7/CN6/RB4 6 23 PWM2H/RE3
AN5/QEB/IC8/CN7/RB5 7 22 PWM3L/RE4
VSS 8 21 PWM3H/RE5
OSC1/CLKI 9 20 VDD
OSC2/CLK0/RC15 10 19 VSS
EMUD1/SOSC2/T2CK/U1ATX/CN1/RC13 11 18 PGC/EMUC/U1RX/SDI1/SDA/RF2
EMUC1/SOSC1/T1CK/U1ARX/CN0/RC14 12 17 PGD/EMUD/U1TX/SDO1/SCL/RF3

VDD 13 16 FLTA/INT0/SCK1/OCFA/RE8
EMUD2/OC2/IC2/INT2/RD1 14 15 EMUC2/OC1/IC1/INT1/RD0

3.2 Características Generales

Las siguientes son las características del dsPIC30F2010:

 Arquitectura Harvard modificada.


 96 instrucciones.
 24 bits para la Memoria de Programa y 16 bits para la Memoria de Datos.
 64 Kbytes para el direccionamiento de la Memoria de Datos.
 12 Kbytes de Memoria de Programa Flash, con capacidad de 4K para instrucciones.
 512 bytes de la Memoria de Datos RAM implementada .
 1 Kbytes de la Memoria de Datos no volátil EEPROM.
 Arreglo de registros de trabajo de 16x16 bits.
 Soporta diversos modos de direccionamiento: indirecto, módulo de direccionamiento y
módulo de inversión de bits para transformada rápida de fourier de base 2.
 Dos acumuladores de 40 bits con opcional saturación lógica.
 Un solo ciclo para operaciones MAC, multiplicación y acumulación.
 Barra de corrimientos aritméticos y lógicos hasta de 40 bits.
 Un multiplicador de 17-bits x 17-bits.
 30 millones de instrucciones por segundo como máximo, la velocidad depende del reloj, se
tiene la opción de multiplicar el reloj por 4x, 8x y 16x utilizando el PLL.
 41 fuentes de interrupción; se puede seleccionar entre 8 niveles de prioridad.

24 22
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

 Tabla de 62 vectores, donde 54 corresponden a vectores de interrupción y 8 a vectores por


errores de trampa.
 3 fuentes de interrupciones externas.
 3 timers de 16 bits.
 4 canales para Módulo Input Capture.
 2 módulos Output Compare con funciones para PWM.
 6 entradas análogas para conversor análogo-digital de 10 bits con cuatro canales con la
posibilidad de muestreo simultáneo.
 8 canales para el módulo de PWM.
 1 canal para el módulos UART.
2
 1 canal para el módulo Esclavo/Maestro I C.

3.3 Memoria de Datos

En la Memoria de Datos se encuentra el espacio para los registros de funciones especiales que se
encuentran desde la dirección 0x0000 hasta la dirección 0x07FF. La Memoria RAM comienza en la
dirección 0x0800, la cual se divide en dos bloques: Memoria X y Memoria Y, para acceder a estas
memorias se utiliza el direccionamiento indirecto. El rango de direcciones de las memorias
dependen del dispositivo. En la figura 3.1 se puede ver la Memoria de Datos para el
dsPIC30F2010, donde el espacio de la Memoria X es de 256 bytes comprendido entre 0x0800
hasta 0x08FF, y el espacio de la Memoria Y es de 256 bytes comprendido entre 0x0900 hasta
0x09FF.

Hay un espacio de la memoria que se denomina Memoria de Datos Cercana, donde es posible
acceder directamente a las localidades de la memoria utilizando las instrucciones file registro. El
rango de esta memoria también depende del dispositivo que se utilice, para el dsPIC30F2010 la
memoria está conformada por el espacio de los registros de función especial, la Memoria X y la
Memoria Y implementada.

A partir de la dirección 0x8000 se encuentra la Memoria X sin implementar, a la cual no se puede


acceder por direccionamiento indirecto.

23 25
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Figura 3.1 Memoria de Datos del dsPIC30F2010

16-bits
MSByte LSByte
0x0001 0x0000
Espacio de Registros de
Función Especial
0x07FF 0x07FE
0x0801 0x0800

Memoria de Datos
RAM X
Memoria 0x08FF 0x08FE
de Datos 0x0901 0x0900
Cercana

Memoria de Datos
RAM Y
0x09FF 0x09FE
0x0A01 0x0A00

0x8001 Sin implementar 0x8000

Espacio de
Programa
Visible en el
Espacio de
Datos

Memoria de Datos
RAM X sin implementar

0xFFFF 0xFFFE

En la figura 3.2 se observa el mapa de los registros de función especial, donde se muestra la
localidad de memoria de los registros del dsPIC30F2010.

26 24
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Modos de Direccionamiento. Las instrucciones soportan los siguientes modos de


direccionamiento:

 Directo: El contenido en un registro es accedido directamente. Ejemplo:


MOV W2,W3 ; el valor almacenado en W2 se guarda en el registro W3.

 Indirecto: El contenido de un registro de trabajo, Wn, se convierte en una dirección


efectiva, de forma que se puede acceder al valor almacenado en esa dirección de modo
indirecto. Ejemplo:
MOV [W3],W2 ; En W2 se almacena el valor que tiene la dirección de W3

 Indirecto con modificación posterior: Además de acceder al valor que almacena la


dirección efectiva del registro, se incrementa o disminuye el valor de esta dirección
dependiendo de un valor constante. Ejemplo:
MOV [W3++],W2 ; en W2 se almacena el valor que tiene la dirección de W3
; el valor de la dirección W3 se incrementa en dos.

 Indirecto con modificación precedida: Primero incrementa o disminuye el valor de


la dirección efectiva del registro dependiendo de un valor constante, y después se accede
al valor almacenado en esta dirección modificada. Ejemplo:
MOV [--W3],W2 ; en W2 se almacena el valor que tiene la dirección de W3
; el valor de la dirección W3 decrementada en dos.

 Indirecto con un registro offset: Se accede a la dirección efectiva que conforma la


suma del registro Wn más un registro base Wb. Ejemplo:
MOV [W3+W4],W2 ; en el registro W2 se almacena el valor que contiene la
; dirección que conforman el valor del registro W3 más el
; valor del registro W4.

 Indirecto con un literal offset: Se accede a la dirección efectiva que conforma la suma
del registro Wn más el valor de un literal. Ejemplo:
MOV [W3+6],W2 ; en el registro W2 se almacena el valor que contiene la
; dirección que conforma el valor del registro W3 más la
; constante 6

25 27
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Figura 3.2 Mapa de Registros de Función Especial

0x0000 W0 x009C IPC4 0x0222 SPI1CON


0x0002 W1 0x009E IPC5 0x0224 SPI1BUF
0x0004 W2 0x00A6 IPC9 0x0280 ADCBUF0
0x0006 W3 0x00A8 IPC10 0x0282 ADCBUF1
0x0008 W4 0x00B0 INTREG 0x0284 ADCBUF2
0x000A W5 0x00C0 CNEN1 0x0286 ADCBUF3
0x000C W6 0x00C4 CNPU1 0x0288 ADCBUF4
0x000E W7 0x0100 TMR1 0x028A ADCBUF5
0x0010 W8 0x0102 PR1 0x028C ADCBUF6
0x0012 W9 0x0104 T1CON 0x028E ADCBUF7
0x0014 W10 0x0106 TMR2 0x0290 ADCBUF8
0x0016 W11 0x0108 TMR3HLD 0x0292 ADCBUF9
0x0018 W12 0x010A TMR3 0x0294 ADCBUFA
0x001A W13 0x010C PR2 0x0296 ADCBUFB
0x001C W14 0x010E PR3 0x0298 ADCBUFC
0x001E W15 0x0110 T2CON 0x029A ADCBUFD
0x0020 SPLIM 0x0112 T3CON 0x029C ADCBUFE
0x0022 ACCA 0x0122 T3CON 0x029E ADCBUFF
0x0022 ACCAL 0x0124 DFLTCON 0x02A0 ADCON1
0x0024 ACCAH 0x0126 POSCNT 0x02A2 ADCON2
0x0026 ACCAU 0x0128 MAXCNT 0x02A4 ADCON3
0x0028 ACCB 0x0140 IC1BUF 0x02A6 ADCHS
0x0028 ACCBL 0x0142 IC1CON 0x02A8 ADPCFG
0x002A ACCBH 0x0144 IC2BUF 0x02AA ADCSSL
0x002C ACCBU 0x0146 IC2CON 0x02C6 TRISB
0x002E PC 0x0158 IC7BUF 0x02C8 PORTB
0x002E PC 0x015A IC71CON 0x02CA LATB
0x0030 PCH 0x015C IC8BUF 0x02CC TRISC
0x0032 TBLPAG 0x015E IC8CON 0x02CE PORTC
0x0034 PSVPAG 0x0180 OC1RS 0x02D0 LATC
0x0036 RCOUNT 0x0182 OC1R 0x02D2 TRISD
0x0038 DCOUNT 0x0184 OC1CON 0x02D4 PORTD
0x003A DOSTART 0x0186 OC2RS 0x02D6 LATD
0x003A DOSTARTL 0x0188 OC2R 0x02D8 TRISE
0x003C DOSTARTH 0x018A OC2CON 0x02DA PORTE
0x003E DOEND 0x01C0 PTCON 0x02DC LATE
0x003E DOENDL 0x01C2 PTMR 0x02DE TRISF
0x0040 DOENDH 0x01C4 PTPER 0x02E0 PORTF
0x0042 SR 0x01C6 SEVTCMP 0x02E2 LATF
0x0044 CORCON 0x01C8 PWMCON1 0x0740 RCON
0x0046 MODCON 0x01CA PWMCON2 0x0742 OSCCON
0x0048 XMODSRT 0x01CC DTCON1 0x0760 NVMCON
0x004A XMODEND 0x01D0 FLTACON 0x0762 NVMADR
0x004C YMODSRT 0x01D4 OVDCON 0x0764 NVMADRU
0x004E YMODEND 0x01D6 PDC1 0x0766 NVMKEY
0x0050 XBREV 0x01D8 PDC2 0x0770 PMD1
0x0052 DISICNT 0x01DA PDC3 0x0772 PMD2
0x0080 INTCON1 0x0200 I2CRCV
0x0082 INTCON2 0x0202 I2CTRN
0x0084 IFS0 0x0204 I2CBRG
0x0086 IFS1 0x0206 I2CCON
0x0088 IFS2 0x0208 I2CSTAT
0x008C IEC0 0x020A I2CADD
0x008E IEC1 0x020C U1MODE
0x0090 IEC2 0x020E U1STA
0x0094 IPC0 0x0210 U1TXREG
0x0096 IPC1 0x0212 U1RXREG
0x0098 IPC2 0x0214 U1BRG
0x009A IPC3 0x0220 SPI1STAT

28 26
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

3.4 Memoria de Programa

Los dispositivos dsPIC30F tienen un espacio de direcciones de memoria de programa de 4M x 24-


bits. El mapa de la Memoria de programa se divide en el espacio de programa y el espacio de
configuración.

El espacio de programa comienza en la dirección 000000 y llega hasta la dirección 7FFFFE y


comprende el vector de RESET, los vectores de interrupción, la Memoria de Programa Flash, y la
Memoria de datos EEPROM. Los rangos de direcciones de las Memorias dependen del dispositivo
utilizado. En la figura 3.3 se puede ver el Mapa de la Memoria de Programa del dsPIC30F2010.

El espacio de configuración permite almacenar los registros de configuración de bits que


determinan las características del dispositivo cuando se programa. El rango de este espacio va,
desde la dirección 800000 hasta la dirección FFFFFE.

Las instrucciones de los programas se ubican en la Memoria de Programa Flash, esto quiere decir
que el código del programa comienza en la dirección 000100. El rango de memoria para almacenar
las instrucciones depende del dispositivo que se utiliza, para el dsPIC30F2010 la memoria para el
programa va hasta 1FFE, teniendo así un espacio de 4K para ejecutar el programa.

Contador de Programa (PC). El Contador de Programa es el Registro PC<22:1>, donde se


almacena la dirección de Memoria de Programa que se tiene cuando se está accediendo a una
instrucción. El contador de Programa tiene realmente 23 bits, de los cuales el bit 0 siempre está en
bajo, PC<0>=0. Las instrucciones tienen un ancho de 24 bits pero el PC es de 23 bits; teniendo en
cuenta que el espacio de programa va desde 000000 hasta 7FFFFE, de forma que el bit 23 es
igual a 0.

27 29
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Figura 3.3 Mapa de la Memoria de Programa del dsPIC30F2010

Instrucción GOTO RESET


Dirección Target RESET

TABLA DE
VECTORES DE
Tabla de Vector de INTERRUPCIÓN
Interrupciones

Reservado
Tabla del Vector 000084 TABLA DE VECTORES
ESPACIO Alternativo ALTERNATIVOS
000FE DE INTERRUPCIÓN
DE Programa de Memoria 000100
FLASH
PROGRAMA 4K instrucciones
001FFE
Reservado 002000
Se lee como 0
7FFBFE
7FFC00
Memoria de Datos
EEPROM
(1Kbyte)

7FFFFE
800000

Reservado

8005BE
ESPACIO Reservado 8005C0
8005FE
DE 800600
Reservado
CONFIGURACIÓN F7FFFE
Registros de configuración F80000
de dispositivos
F8000E
F80010

Reservado

FEFFFE
Reservado FF0000
FFFFFE

30 28
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

4. dsPIC3014

4.1 Configuración de Pines

AVDD
MCLR 1 40
AN0/VREF+
REF+/CN2/RB0 2 39 AVss
AN1/VREF+
REF-/CN3/RB1
3 38 AN9 /RB9
AN2/SS1/LVDIN/CN4/RB2 4 37 AN10 /RB10

AN3/CN5/RB3 5 36 AN11 /RB11

AN4/CN6/RB4 6 35 AN12 /RB12


AN5/CN7/RB5 7 34 OC1/EMUC2/RD0
PGC/EMUC /AN6/OCFA/RB6 8 33 OC2/EMUD2/RD1
PGD/EMUD/AN7/RB7 9 32 VDD
AN8/RB8 10 31 Vss
VDD 11 30 RF0
Vss 12 29 RF1
OSC1/CLKI 13 28 U2RX/RF4
OSC2/CLKO/RC15 14 27 U2TX/RF5
EMUD1/SOSC2/T2CK/U1ATX/CN1/RC13 15 26 U1RX/SDI1/SDA/RF2
16 25 EMUD3/U1TX/SDO1/SCL/RF3
EMUC1/SOSC1/T1CK/U1ARX/CN0/RC14
INT0/RA11 17 24 EMUC3/SCK1/RF6
IC2/INT2/RD9 18 23 IC1/INT1/RD8
RD3 19 22 RD2
Vss 20 21 VDD

4.2 Características del dsPIC30F3014

Las siguientes son las características del dsPIC30F3014:

 Arquitectura Harvard modificada.


6
 96 instrucciones. 7
 24 bits para la Memoria de 8Programa y 16 bits para la Memoria de Datos.
 9
64 Kbytes para el direccionamiento de la memoria de Datos.
 24 Kbytes de Memoria de Programa Flash, con capacidad de 8K para instrucciones.
 2048 bytes de la Memoria de Datos RAM implementada.
 1 Kbytes de la Memoria de Datos no volátil EEPROM.
 Arreglo de registros de trabajo de 16x16 bits.

29 31
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

 Soporta diversos modos de direccionamiento: indirecto, módulo de direccionamiento y


módulo de inversión de bits para transformada rápida de fourier de base 2.
 Dos acumuladores de 40 bits con opcional saturación lógica.
 Un solo ciclo para operaciones MAC, multiplicación y acumulación.
 Barra de corrimientos aritméticos y lógicos hasta de 40 bits.
 Un multiplicador de 17-bits x 17-bits.
 30 millones de instrucciones por segundo como máximo, la velocidad depende del reloj, se
tiene la opción de multiplicar el reloj por 4x, 8x y 16x utilizando el PLL.
 41 fuentes de interrupción; se puede seleccionar entre 8 niveles de prioridad.
 Tabla de 62 vectores, donde 54 corresponden a vectores de interrupción y 8 a vectores por
errores de trampa.
 3 fuentes de interrupciones externas.
 3 timers de 16 bits.
 2 canales para Módulo Input Capture.
 2 módulos Output Compare con funciones para PWM.
 13 entradas análogas para conversor analógico-digital de 12 bits
 2 canales para el módulo UART.
2
 1 canal para el módulo Esclavo/Maestro I C.

4.3 Memoria de Datos

En la Memoria de Datos se encuentra el espacio para los registros de funciones especiales que se
encuentran desde la dirección 0x0000 hasta la dirección 0x07FF. La Memoria RAM comienza en la
dirección 0x0800, la cual se divide en dos bloques: Memoria X y Memoria Y, para acceder a estas
memorias se utiliza el direccionamiento indirecto. El rango de direcciones de las memorias
dependen del dispositivo. En la figura 4.1 se puede ver la Memoria de Datos para el
dsPIC30F3014, donde el espacio de la Memoria X es de 1024 bytes comprendido entre 0x0800
hasta 0x0BFF, y el espacio de la Memoria Y es de 1024 bytes comprendido entre 0x0C00 hasta
0x0FFF.

Hay un espacio de la memoria que se denomina Memoria de Datos Cercana, donde es posible
acceder directamente a las localidades de la memoria utilizando las instrucciones file registro. El
rango de la Memoria de Datos Cercana depende del dispositivo que se utilice, para el
dsPIC30F3014 esta memoria está conformada por el espacio de los registros de función especial,
la Memoria X y la Memoria Y implementada.

A partir de la dirección 0x8000 se encuentra la Memoria X sin implementar, a la cual no se puede


acceder por direccionamiento indirecto.

En la figura 4.2 se observa el mapa de los registros de función especial, donde se muestra la
localidad de memoria de los registros del dsPIC30F3014.

4.4 Memoria de Programa

El mapa de la Memoria de programa se divide en el Espacio de programa y el Espacio de


configuración.

El espacio de programa comienza en la dirección 000000 y llega hasta la dirección 7FFFFE y


comprende el vector de RESET, los vectores de interrupción, la Memoria de Programa Flash, y la
Memoria de datos EEPROM. En la figura 4.3 se puede ver el Mapa de la Memoria de Programa del
dsPIC30F3014.

32 30
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Las instrucciones de los programas se ubican en la Memoria de Programa Flash, esto quiere decir
que el código del programa comienza en la dirección 000100. El rango de memoria para almacenar
las instrucciones depende del dispositivo que se utiliza, para el dsPIC30F3014 la memoria para el
programa va hasta 3FFE, teniendo así un espacio de 8K para ejecutar el programa.

Figura 4.1 Memoria de Datos del dsPIC30F3014


16-bits

MSByte LSByte
0x0001 0x0000
Espacio de Registros de
Función Especial
0x07FF 0x07FE
0x0801 0x0800

Memoria de Datos
RAM X
Memoria 0x0BFF 0x0BFE
de Datos 0x0C01 0x0C00
Cercana

Memoria de Datos
RAM Y
0x0FFF 0x0FFE
0x1001 0x1000

0x8001 Sin implementar 0x8000

Espacio de
Programa
Visible en el
Espacio de Memoria de Datos
Datos RAM X sin implementar

0xFFFF 0xFFFE

31 33
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Figura 4.2 Mapa de Registros de Función Especial

0x0000 W0 0x009C IPC4 0x02C4 LATB


0x0002 W1 0x009E IPC5 0x02C6 TRISB
0x0004 W2 0x00A0 IPC6 0x02C8 PORTB
0x0006 W3 0x00A8 IPC10 0x02CA LATB
0x0008 W4 0x00B0 INTREG 0x02CC TRISC
0x000A W5 0x00C0 CNEN1 0x02CE PORTC
0x000C W6 0x00C4 CNPU1 0x02D0 LATC
0x000E W7 0x0100 TMR1 0x02D2 TRISD
0x0010 W8 0x0102 PR1 0x02D4 PORTD
0x0012 W9 0x0104 T1CON 0x02D6 LATD
0x0014 W10 0x0106 TMR2 0x02DE TRISF
0x0016 W11 0x0108 TMR3HLD 0x02E0 PORTF
0x0018 W12 0x010A TMR3 0x02E2 LATF
0x001A W13 0x010C PR2 0x0740 RCON
0x001C W14 0x010E PR3 0x0742 OSCCON
0x001E W15 0x0110 T2CON 0x0760 NVMCON
0x0020 SPLIM 0x0112 T3CON 0x0762 NVMADR
0x0022 ACCA 0x0140 IC1BUF 0x0764 NVMADRU
0x0022 ACCAL 0x0142 IC1CON 0x0766 NVMKEY
0x0024 ACCAH 0x0144 IC2BUF 0x0770 PMD1
0x0026 ACCAU 0x0146 IC2CON 0x0772 PMD2
0x0028 ACCB 0x0200 I2CRCV
0x0028 ACCBL 0x0202 I2CTRN
0x002A ACCBH 0x0204 I2CBRG
0x002C ACCBU 0x0206 I2CCON
0x002E PC 0x0208 I2CSTAT
0x002E PC 0x020A I2CADD
0x0030 PCH 0x020C U1MODE
0x0032 TBLPAG 0x020E U1STA
0x0034 PSVPAG 0x0210 U1TXREG
0x0036 RCOUNT 0x0212 U1RXREG
0x0038 DCOUNT 0x0214 U1BRG
0x003A DOSTART 0x0220 SPI1STAT
0x003A DOSTARTL 0x0222 SPI1CON
0x003C DOSTARTH 0x0224 SPI1BUF
0x003E DOEND 0x0280 ADCBUF0
0x003E DOENDL 0x0282 ADCBUF1
0x0040 DOENDH 0x0284 ADCBUF2
0x0042 SR 0x0286 ADCBUF3
0x0044 CORCON 0x0288 ADCBUF4
0x0046 MODCON 0x028A ADCBUF5
0x0048 XMODSRT 0x028C ADCBUF6
0x004A XMODEND 0x028E ADCBUF7
0x004C YMODSRT 0x0290 ADCBUF8
0x004E YMODEND 0x0292 ADCBUF9
0x0050 XBREV 0x0294 ADCBUFA
0x0052 DISICNT 0x0296 ADCBUFB
0x0080 INTCON1 0x0298 ADCBUFC
0x0082 INTCON2 0x029A ADCBUFD
0x0084 IFS0 0x029C ADCBUFE
0x0086 IFS1 0x029E ADCBUFF
0x0088 IFS2 0x02A0 ADCON1
0x008C IEC0 0x02A2 ADCON2
0x008E IEC1 0x02A4 ADCON3
0x0090 IEC2 0x02A6 ADCHS
0x0094 IPC0 0x02A8 ADPCFG
0x0096 IPC1 0x02AA ADCSSL
0x02C0 TRISA
0x02C2 PORTA

34 32
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Figura 4.3 Mapa de la Memoria de Programa del dsPIC30F3014

Instrucción GOTO RESET


Dirección Target RESET

TABLA DE
VECTORES DE
Tabla de Vector de INTERRUPCIÓN
Interrupciones

Reservado
Tabla del Vector 000084 TABLA DE VECTORES
ESPACIO Alternativo ALTERNATIVOS
0000FE DE INTERRUPCIÓN
DE Programa de Memoria 000100
FLASH
PROGRAMA 8K instrucciones
003FFE
Reservado 004000
Se lee como 0
7FFBFE
7FFC00
Memoria de Datos
EEPROM
(1Kbyte)

7FFFFE
800000

Reservado

8005BE
ESPACIO Reservado 8005C0
(32 instrucciones) 8005FE
DE 800600
Reservado
CONFIGURACIÓN F7FFFE
Registros de configuración F80000
de dispositivos
F8000E
F80010
Reservado FEFFFE
Reservado FF0000
FFFFFE

33 35
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

5. MÓDULOS DE LOS dsPIC30F

5.1 Interrupciones

Los dsPIC30F permiten que en determinados eventos se interrumpa la ejecución del programa, al
saltar a una rutina con una función determinada a la que se denomina ISR, rutina de servicio de
interrupción. Las interrupciones pueden ser originadas por diferentes fuentes: interrupciones por
trampas, interrupción por los periféricos o interrupciones externas.

Para las interrupciones se utiliza una tabla de vectores de interrupción, la cual se encuentra en la
memoria de programa desde la dirección 0x000004 hasta 0x00007E como se muestra en la Figura
5.1. La tabla de vectores (IVT), contiene 62 vectores que consisten en 8 vectores trampa, y 54
fuentes de interrupción, de forma que cada fuente que origina una interrupción tenga su propio
vector llamado vector por defecto. El ancho de la dirección del vector es de 24 bits.

Cada fuente de interrupción tiene designada una dirección para su vector por defecto, las
direcciones se pueden observar en la tabla 5.1, en esta localidad de memoria se almacena la
dirección de la rutina que se debe ejecutar llamada, ISR. Las etiquetas tienen que tener el mismo
nombre del vector de interrupción, el cual se encuentra en las librerías del dispositivo con el que se
trabaja. En la tabla 5.1 se observan también las etiquetas para los vectores alternativos (AIVT).

Cuando se ejecuta una fuente de interrupción, se origina una petición de interrupción (IRQ), que se
demuestra colocándose un alto en las banderas de los registros IFSx, siempre y cuando estén
habilitados los bits de los registros IECx. Cuando la CPU responde a una interrupción, se accede al
vector por defecto de la fuente de interrupción, el cual corresponde a la dirección de programa
donde se encuentra la etiqueta correspondiente a la Rutina de Servicio de Interrupción (ISR). Para
salir de la interrupción se utiliza la instrucción RETFIE.

Las interrupciones se habilitan o deshabilitan en el bit NSTDIS del registro INTCON1, si este bit se
encuentra en bajo las interrupciones están habilitadas y si se encuentra en alto están
deshabilitadas.

36 34
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Figura 5.1 Localidades de los Vectores de Interrupción

RESET-GOTO Instrucción 0x000000


RESET-GOTO Dirección 0x000002
Reservado 0x000004
Vector trampa por fallas en el oscilador
Vector trampa por errores de dirección
Tabla de Vector trampa por errores de pila
Vectores Vector trampa por errores aritméticos
por defecto Reservado
Reservado
Reservado
Interrupción Vector 0 0x000014
Interrupción Vector 1
----------------------
---------------------- 0x00007E
Interrupción Vector 52 0x000080
Interrupción Vector 53 0x000082
Reservado 0x000084
Tabla de
Reservado
Vectores
Reservado
Alternativos
Vector trampa por errores de pila
Vector trampa por errores aritméticos
Reservado 0x000094
Reservado
Reservado
Interrupción Vector 0
Interrupción Vector 1
---------------------- 0x0000FE
----------------------
Interrupción Vector 52
Interrupción Vector 53

Tabla 5.1 Vectores de Interrupción

Número Dirección Dirección Fuente de Nombre del Vector de


de de IVT de AIVT la Trampa Interrupcion (Etiqueta
Vector para ISR)
0 0X000004 0X000084 Reservado __ReservedTrap0
1 0X000006 0X000086 Fallas en el oscilador __OscillatorFail
2 0X000008 0X000088 Error de Direcciones __AddressError
3 0X00000A 0X00008A Error de Pila __StackError
4 0X00000C 0X00008C Error Aritmético __MathError
5 0X00000E 0X00008E Reservado __ReservedTrap5
6 0X000010 0X000090 Reservado __ReservedTrap6
7 0X000012 0X000092 Reservado __ReservedTrap7
8 0X000014 0X000094 Interrupción Externa 0, INT0 __INT0Interrupt
9 0X000016 0X000096 Canal 1 de Input Capture, IC1 __IC1Interrupt
10 0X000018 0X000098 Canal 1 de Output Compare, OC1 __OC1Interrupt

35 37
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

11 0X00001A 0X00009A Timer1,T1 __T1Interrupt


12 0X00001C 0X00009C Canal 2 de Input Capture, IC2 __IC2Interrupt
13 0X00001E 0X00009E Canal 2 de Output Compare, OC2 __OC2Interrupt
14 0X000020 0X0000A0 Timer2, T2 __T2Interrupt
15 0X000022 0X0000A2 Timer3, T3 __T3Interrupt
16 0X000024 0X0000A4 SPI1 __SPI1Interrupt
17 0X000026 0X0000A6 Receptor de UART1, U1RX __U1RXInterrupt
18 0X000028 0X0000A8 Transmisor de UART1, U1TX __U1TXInterrupt
19 0X00002A 0X0000AA Conversión completa ADC __ADCInterrupt
20 0X00002C 0X0000AC Escritura completa en NVM __NVMInterrupt
21 0X00002E 0X0000AE Transferencia completa I2C __SI2CInterrupt
22 0X000030 0X0000B0 Colisión en el bus I2C __MI2CInterrupt
23 0X000032 0X0000B2 Notificación de cambio de entrada __CNInterrupt
24 0X000034 0X0000B4 Interrupción Externa 1, INT1 __INT1Interrupt
25 0X000036 0X0000B6 Canal 7 de Input Capture, IC7 __IC7Interrupt
26 0X000038 0X0000B8 Canal 8 de Input Capture, IC8 __IC8Interrupt
27 0X00003A 0X0000BA Canal 3 de Output Compare, OC3 __OC3Interrupt
28 0X00003C 0X0000BC Canal 4 de Output Compare, OC4 __OC4Interrupt
29 0X00003E 0X0000BE Timer4, T4 __T4Interrupt
30 0X000040 0X0000C0 Timer5, T5 __T5Interrupt
31 0X000042 0X0000C2 Interrupción Externa 2, INT2 __INT2Interrupt
32 0X000044 0X0000C4 Receptor de UART2, U2RX __U2RXInterrupt
33 0X000046 0X0000C6 Transmisor de UART2, U12TX __U2TXInterrupt
34 0X000048 0X0000C8 SPI1 __SPI2Interrupt
35 0X00004A 0X0000CA CAN1 __C1Interrupt
36 0X00004C 0X0000CC Canal 3 de Input Capture, IC3 __IC3Interrupt
37 0X00004E 0X0000CE Canal 4 de Input Capture, IC4 __IC4Interrupt
38 0X000050 0X0000D0 Canal 5 de Input Capture, IC5 __IC5Interrupt
39 0X000052 0X0000D2 Canal 6 de Input Capture, IC6 __IC6Interrupt
40 0X000054 0X0000D4 Canal 5 de Output Compare, OC5 __OC5Interrupt
41 0X000056 0X0000D6 Canal 6 de Output Compare, OC6 __OC6Interrupt
42 0X000058 0X0000D8 Canal 7 de Output Compare, OC7 __OC7Interrupt
43 0X00005A 0X0000DA Canal 8 de Output Compare, OC8 __OC8Interrupt
44 0X00005C 0X0000DC Interrupción Externa 3, INT3 __INT3Interrupt
45 0X00005E 0X0000DE Interrupción Externa 4, INT4 __INT4Interrupt
46 0X000060 0X0000E0 CAN2 __C2Interrupt
47 0X000062 0X0000E2 Periodo Match en PWM, PWM __PWMInterrupt
48 0X000064 0X0000E4 Comparación del contador de posición, __QEIInterrupt
QEI
49 0X000066 0X0000E6 Transferencia Codec completa, DCI __DCIInterrupt
50 0X000068 0X0000E8 Detección de bajo voltaje, LVD __LVDInterrupt
51 0X00006A 0X0000EA FAULTA __FLTAInterrupt
52 0X00006C 0X0000EC FAULTB __FLTBInterrupt
53 0X00006E- 0X0000EE- Reservado ---
0X00007E 0X0000FE

38 36
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Deshabilitar interrupciones. La instrucción DISI permite deshabilitar las interrupciones en


alguna parte del programa, en esta instrucción se especifica cuántos ciclos de máquina van a durar
deshabilitadas las interrupciones, el número máximo es de 16384. Cuando una instrucción DISI se
habilita se coloca en alto el bit DISI del registro INTCON2.

 Ejemplo :

DISI #100
; A partir de esta instrucción todas las interrupciones son
; deshabilitadas. En el registro DISICNT se almacena el valor decimal de
; 100
; que significa 100 ciclos de instrucción en los cuales el programa no puede
; ser interrumpido
MOV #0XFFFF,W0
REPEAT W0 ; mientras se realiza el lazo de repetición pueden ocurrir
MOV #1,W2 ; interrupciones por alguna fuente, sin embargo éstas no
; tienen efecto, después de los100 ciclos, el programa sale
; del lazo de
; repetición y se va a la rutina de las interrupciones que no
; pudieron ser ejecutadas

Interrupciones Externas. El dsPIC30F trabaja con máximo 5 entradas de interrupción externa,


utilizando los pines llamados INT0-INT4, el número de entradas depende del dispositivo. En el
registro INTCON2 se determina si la interrupción se lleva a cabo por una detección de flanco
positivo o flanco negativo.

Registros de Control y del Estado de Interrupciones. Los registros asociados a las


interrupciones son:

 Registro INTCON1: En este registro se habilitan las interrupciones y se tienen bits para
indicar si han ocurrido las diferentes trampas.

 Registro INTCON2: En este registro se tienen los bits para determinar en qué flanco
trabajan cada una de las interrupciones externas, un bit para indicar si la instrucción DISI
está habilitada y un bit para habilitar la tabla de vectores alternativos.

 Registro del estado de las banderas de interrupción, IFSx: La forma de indicar


que ha ocurrido una interrupción es colocando automáticamente la bandera de la fuente de
la interrupción en alto, la bandera se encuentra en los registros IFSx, los cuales son 3
registros que contienen las banderas de todas las fuentes de interrupción. Cuando se entra
a la rutina de servicio de interrupción, las banderas deben ser clareadas por software, para
disponerlas a una nueva interrupción.

 Registro de Control para habilitar las interrupciones, IECx: Las interrupciones de


cada una de las fuentes deben ser habilitadas en alguno de los registros IECx, al colocar
los bits de las fuentes en alto tanto de la interrupción externa como de las fuentes de los
periféricos se habilitan las interrupciones.

 Registros para el nivel de prioridad de la CPU: En los bits IPL<2:0> del registro SR
concatenados con el bit IPL3 del registro CORCON, se indica el nivel de prioridad en la
CPU. Cada vez que ocurre una interrupción, en estos bits se coloca el nivel de prioridad de
la fuente de interrupción, y al salirse de la rutina ISR se vuelve a almacenar en estos bits
el nivel de prioridad que se tenía antes de la interrupción.

37 39
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

INTCON1, Registro 1 de Control de Interrupciones

NSTDIS --- --- --- --- OVATE OVBTE COVTE

bit 15 bit 8

--- --- --- MATHERR ADDRERR STKERR OSCFATIL ---

bit 7 bit 0
Bit 15: NSTDIS: Bit habilitador de las interrupciones mientras se está en una ISR.
1: Interrupciones deshabilitadas.
0: Interrupciones habilitadas.

Bit 14-11:Sin implementar: Se lee como cero.

Bit 10: OVATE: Bit habiltador de una trampa por overflow en el acumulador A.
1: Ha ocurrido una trampa por overflow en el Acumulador A.
0: No ha ocurrido trampa.

Bit 9: OVBTE: Bit habiltador de una trampa por overflow en el acumulador B.


1: Ha ocurrido una trampa por overflow en el Acumulador B.
0: No ha ocurrido trampa.

Bit 8: COVTEB: Bit habilitador de una trampa por un overflow catastrófico.


1: Ha ocurrido una trampa por overflow catastrófico en el Acumulador A ó B.
0: No ha ocurrido trampa.

Bit 7-5: Sin implementar: Se lee como cero.

Bit 4: MATHERR: Bit indicador de un error aritmético.


1: Ha ocurrido una trampa por overflow.
0: No ha ocurrido trampa por overflow.

Bit 3: ADDRERR: Bit indicador de una trampa por errores en las direcciones.
1: Ha ocurrido una trampa por errores en las direcciones.
0: No ha ocurrido trampa por errores en las direcciones.

Bit 2: STKERR<2:0>: Bit indicador de una trampa por un error en la pila.


1: Ha ocurrido una trampa por errores en la pila.
0: No ha ocurrido trampa por errores en la pila.

Bit 1: OSCFATIL<2:0>: Bit indicador de una trampa por fallas en el oscilador.


1: Ha ocurrido una trampa por errores en el oscilador.
0: No ha ocurrido trampa por errores en el oscilador.

Bit 0: Sin implementar: Se lee como cero.

40 38
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

INTCON2, Registro 2 de Control de Interrupciones

ALTIVT DISI --- --- --- --- --- ---

bit 15 bit 8

--- --- --- INT4EP INT3EP INT2EP INT1EP INT0EP

bit 7 bit 0
Bit 15: ALTIVT: Bit habilitador de la tabla de vectores alternativo de interrupciones.
1: Se utiliza la tabla de vectores alternativos.
0: Se utiliza la tabla de vectores por defecto.

Bit 14: DISI: Bit indicador del estado de la instrucción DISI.


1: La instrucción DISI está activada.
0: La instrucción DISI no está activada.

Bit 13-5: Sin implementar: Se lee como cero.

Bit 4: INT4EP: Bit selector del flanco que se detecta en la interrupción externa 4.
1: Interrupción en un flanco negativo.
0: Interrupción en un flanco positivo.

Bit 3: INT3EP: Bit selector del flanco que se detecta en la interrupción externa 3.
1: Interrupción en un flanco negativo.
0: Interrupción en un flanco positivo.

Bit 2: INT2EP: Bit selector del flanco que se detecta en la interrupción externa 2.
1: Interrupción en un flanco negativo.
0: Interrupción en un flanco positivo.

Bit 1: INT1EP: Bit selector del flanco que se detecta en la interrupción externa 1.
1: Interrupción en un flanco negativo.
0: Interrupción en un flanco positivo.

Bit 0: INT0EP: Bit selector del flanco que se detecta en la interrupción externa 0.
1: Interrupción en un flanco negativo.
0: Interrupción en un flanco positivo.

39 41
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

IFS0, Registro 0 del Estado de Banderas para Interrupciones

CNIF BCLIF I2CIF NVMIF ADIF U1TXIF U1RXIF SPI1IF

bit 15 bit 8
T3IF T2IF OC2IF IC2IF T1IF OC1IF IC1IF INT0IF

bit 7 bit 0

Bit 15: CNIF: Bit que indica el estado de la bandera en una notificación de cambio de
entrada.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 14: BCLIF: Bit que indica el estado de la bandera de colisión del Bus I2C.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 13: I2CIF: Bit que indica el estado de la interrupción de una transferencia
completa en el bus I2C.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 12: NVMIF: Bit que indica el estado de la interrupción cuando se realiza la
escritura completa en memoria no volátil.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 11: ADIF: Bit que indica el estado de la interrupción cuando se lleva a
cabo una conversión análogo-digital.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 10: U1TXIF: Bit que indica el estado de la interrupción por transmisión
UART1.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 9: U1RXIF: Bit que indica el estado de la interrupción por recepción


UART1.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 8: SPI1IF: Bit que indica el estado de la interrupción por SPI1.


1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

42 40
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Bit 7: T3IF: Bit que indica el estado de la interrupción por timer 3.


1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 6: T2IF: Bit que indica el estado de la interrupción por timer 2.


1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 5: OC2IF: Bit que indica el estado de la interrupción por output


compare en el canal 2.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 4: IC2IF: Bit que indica el estado de la interrupción por input capture
en el canal 2.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 3: T1IF: Bit que indica el estado de la interrupción por timer 1.


1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 2: OC1IF: Bit que indica el estado de la interrupción por output


compare en el canal 1.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 1: IC1IF: Bit que indica el estado de la interrupción por input capture
en el canal 1.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 0: INT0IF: Bit que indica el estado de la interrupción externa 0.


1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

41 43
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

IFS1, Registro 1 del Estado de Banderas para Interrupciones

IC6IF IC5IF IC4IF IC3IF C1IF SPI2IF U2TXIF U2RXIF

bit 15 bit 8
INT2IF T5IF T4IF OC4IF OC3IF IC8IF IC7IF INT1IF

bit 7 bit 0

Bit 15: IC6IF: Bit que indica el estado de la interrupción por input capture
en el canal 6.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 14: IC5IF: Bit que indica el estado de la interrupción por input capture
en el canal 5.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 13: IC4IF: Bit que indica el estado de la interrupción por input capture
en el canal 4.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 12: IC3IF: Bit que indica el estado de la interrupción por input capture
en el canal 3.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 11: C1IF: Bit que indica el estado de la interrupción por CAN1.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 10: SPI2IF: Bit que indica el estado de la interrupción por SPI2.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 9: U2TXIF: Bit que indica el estado de la interrupción por transmisión


UART2.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 8: U2RXIF: Bit que indica el estado de la interrupción por recepción


UART2.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

44 42
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Bit 7: INT2IF: Bit que indica el estado de la interrupción externa 2.


1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 6: T5IF: Bit que indica el estado de la interrupción por Timer 5.


1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 5: T4IF: Bit que indica el estado de la interrupción por Timer 4.


1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 4: OC4IF: Bit que indica el estado de la interrupción por output


compare en el canal 4.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 3: OC3IF: Bit que indica el estado de la interrupción por output


compare en el canal 3.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 2: IC8IF: Bit que indica el estado de la interrupción por input capture
en el canal 8.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 1: IC7IF: Bit que indica el estado de la interrupción por input capture
en el canal 7.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 0: INT1IF: Bit que indica el estado de la interrupción externa 1.


1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

43 45
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

IFS2, Registro 2 del Estado de Banderas para Interrupciones

---- ---- ---- FLTBIF FLTAIF LVDIF DCIIF QEIIF

bit 15 bit 8
PWMIF C2IF INT4IF INT3IF OC8IF OC7IF OC6IF OC5IF

bit 7 bit 0

Bit 15-13: Sin implementar: Se lee como cero.

Bit 12: FLTBIF: Bit que indica el estado de la interrupción por FAULT B.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 11: FLTAIF: Bit que indica el estado de la interrupción por FAULT A.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 10: LVDIF: Bit que indica el estado de la interrupción por detección de
bajo voltaje de programación.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 9: DCIIF: Bit que indica el estado de la interrupción por DCI (Interface
por convertidor de datos) .
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 8: QEIIF: Bit que indica el estado de la interrupción por QEI (Interface
por convertidor de datos).
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 7: PWMIF: Bit que indica el estado de la interrupción por PWM,


módulo de control de ancho de pulso.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 6: C2IF: Bit que indica el estado de la interrupción por CAN2.


1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 5: INT4IF: Bit que indica el estado de la interrupción externa 4.


1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

46 44
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Bit 4: INT3IF: Bit que indica el estado de la interrupción externa 3.


1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 3: OC8IF: Bit que indica el estado de la interrupción por output


compare en el canal 8.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 2: OC7IF: Bit que indica el estado de la interrupción por output


compare en el canal 7.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 1: OC6IF: Bit que indica el estado de la interrupción por output


compare en el canal 6.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

Bit 0: OC5IF: Bit que indica el estado de la interrupción por output


compare en el canal 5.
1: Ha ocurrido interrupción.
0: No ha ocurrido interrupción.

IEC0, Registro 0 de Control para Habilitar Interrupciones

CNIE BCLIE I2CIE NVMIE ADIE U1TXIE U1RXIE SPI1IE

bit 15 bit 8
T3IE T2IE OC2IE IC2IE T1IE OC1IE IC1IE INT0IE

bit 7 bit 0

Bit 15: CNIE: Bit que indica el estado de la interrupción por notificación de cambio en la
entrada.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 14: BCLIE: Bit que indica el estado de la interrupción por colisión del Bus I2C.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 13: I2CIE: Bit que indica el estado de la interrupción de una transferencia
completa en el bus I2C.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

45 47
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Bit 12: NVMIE: Bit que indica el estado de la interrupción cuando se realiza
la escritura completa en memoria no volátil.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 11: ADIE: Bit que indica el estado de la interrupción cuando se lleva a
cabo una conversión análogo-digital.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 10: U1TXIE: Bit que indica el estado de la interrupción por transmisión
UART1.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 9: U1RXIE: Bit que indica el estado de la interrupción por recepción


UART1.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 8: SPI1IE: Bit que indica el estado de la interrupción por SPI1.


1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 7: T3IE: Bit que indica el estado de la interrupción por timer 3.


1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 6: T2IE: Bit que indica el estado de la interrupción por timer 2.


1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 5: OC2IE: Bit que indica el estado de la interrupción por output


compare en el canal 2.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 4: IC2IE: Bit que indica el estado de la interrupción por input capture
en el canal 2.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 3: T1IE: Bit que indica el estado de la interrupción por timer 1.


1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 2: OC1IE: Bit que indica el estado de la interrupción por output


compare en el canal 1.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

48 46
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Bit 1: IC1IE: Bit que indica el estado de la interrupción por input capture
en el canal 1.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 0: INT0IE: Bit que indica el estado de la interrupción externa 0.


1: Habilitar interrupción.
0: Deshabilitar interrupción.

IEC1, Registro 1 de Control para Habilitar Interrupciones

IC6IE IC5IE IC4IE IC3IE C1IE SPI2IE U2TXIE U2RXIE

bit 15 bit 8

INT2IE T5IE T4IE OC4IE OC3IE IC8IE IC7IE INT1IE

bit 7 bit 0

Bit 15: IC6IE: Bit que indica el estado de la interrupción por input capture
en el canal 6.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 14: IC5IE: Bit que indica el estado de la interrupción por input capture
en el canal 5.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 13: IC4IE: Bit que indica el estado de la interrupción por input capture
en el canal 4.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 12: IC3IE: Bit que indica el estado de la interrupción por input capture
en el canal 3.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 11: C1IE: Bit que indica el estado de la interrupción por CAN1.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

47 49
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Bit 10: SPI2IE: Bit que indica el estado de la interrupción por SPI2.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 9: U2TXIE: Bit que indica el estado de la interrupción por transmisión


UART2.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 8: U2RXIE: Bit que indica el estado de la interrupción por recepción


UART2.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 7: INT2IE: Bit que indica el estado de la interrupción externa 2.


1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 6: T5IE: Bit que indica el estado de la interrupción por Timer5.


1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 5: T4IE: Bit que indica el estado de la interrupción por Timer4.


1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 4: OC4IE: Bit que indica el estado de la interrupción por output


compare en el canal 4.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 3: OC3IE: Bit que indica el estado de la interrupción por output


compare en el canal 3.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 2: IC8IE: Bit que indica el estado de la interrupción por input capture
en el canal 8.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 1: IC7IE: Bit que indica el estado de la interrupción por input capture
en el canal 7.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 0: INT1IE: Bit que indica el estado de la interrupción externa 1.


1: Habilitar interrupción.
0: Deshabilitar interrupción.

50 48
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

IEC2, Registro 2 de Control para Habilitar Interrupciones

---- ---- ---- FLTBIE FLTAIE LVDIE DCIIE QEIIE

bit 15 bit 8

PWMIE C2IE INT4IE INT3IE OC8IE OC7IE OC6IE OC5IE

bit 7 bit 0

Bit 15-13: Sin implementar: Se lee como cero.

Bit 12: FLTBIE: Bit que indica el estado de la interrupción por FAULT B.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 11: FLTAIE: Bit que indica el estado de la interrupción por FAULT A.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 10: LVDIE: Bit que indica el estado de la interrupción por detección de
bajo voltaje de programación.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 9: DCIIE: Bit que indica el estado de la interrupción por DCI (Interface
por convertidor de datos) .
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 8: QEIIF: Bit que indica el estado de la interrupción por QEI (contador de posición).
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 7: PWMIE: Bit que indica el estado de la interrupción por PWM, módulo
de control de ancho de pulso.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 6: C2IE: Bit que indica el estado de la interrupción por CAN2.


1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 5: INT4IE: Bit que indica el estado de la interrupción externa 4.


1: Habilitar interrupción.
0: Deshabilitar interrupción.

49 51
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Bit 4: INT3IE: Bit que indica el estado de la interrupción externa 3.


1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 3: OC8IE: Bit que indica el estado de la interrupción por output


compare en el canal 8.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 2: OC7IE: Bit que indica el estado de la interrupción por output


compare en el canal 7.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 1: OC6IE: Bit que indica el estado de la interrupción por output


compare en el canal 6.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

Bit 0: OC5IE: Bit que indica el estado de la interrupción por output


compare en el canal 5.
1: Habilitar interrupción.
0: Deshabilitar interrupción.

5.2 Puertos I/O

Los puertos de los dsPIC30F se utilizan para el control de periféricos o para un propósito en
general. El número de puertos y sus correspondientes pines, al igual que los periféricos que
controlan dependen del dispositivo que se trabaje. Los pines de cada puerto se configuran como
entradas o salidas según la función que van a cumplir, por esta razón se llaman puertos I/O
(puertos de entrada o salida).

Los puertos I/O tienen asociados tres registros: TRISx, PORTx, LATx. Donde x corresponde al
nombre del puerto.

 Registros TRISx: En este registro se configuran los pines de los puertos como entradas
o salidas. Si se coloca un alto en el bit que le corresponde a un pin, es porque recibirá una
entrada, pero si de coloca un bajo es porque el pin se toma como salida.

 Registros PORTx: En este registro se encuentra el valor que tiene el puerto,


corresponda a entradas o salidas. Por software sólo se pueden modificar los valores de los
pines que se trabajan como salidas.

 Registros LATx: En este registro sólo se encuentran los valores de los pines que
trabajan como salidas en el puerto, es decir en este registro no se leen los valores que
reciben los pines del puerto configurados como entrada.

Manejo de periféricos con Puertos I/O. Cuando los pines I/O se utilizan para una función
específica de los periféricos, no es posible trabajarlos para un propósito general, de forma que los
pines de salida y entrada son controlados por el módulo del periférico que se esté manejando.

52 50
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Cada pin tiene asociado varios periféricos, donde la denominación del pin es: PERA/PERB/PIO,
los dos primeros corresponden a periféricos y el tercero para propósito general; si todos los
periféricos que controla un pin se habilitan al mismo tiempo, sólo se ejecuta las acciones
correspondientes al periférico de mayor prioridad, el cual corresponde al primero que se coloca en
la designación del pin, esto quiere decir PERA.

Ejemplo: Se tiene un pin AN3/IC5/RB3, primero se da prioridad a la entrada análoga, luego a una
input capture en el canal 5 y la última prioridad la tiene el pin para propósito general.

5.3 Timers

Los dispositivos dsPIC30F pueden tener hasta 5 timers que trabajan con 16 bits, el número de
timers depende del dispositivo. Cada timer tiene asociado los siguientes registros de 16 bits:

 TMRx: Registro para realizar el respectivo conteo.


 PRx: Registro que almacena el periodo del timer.
 TxCON: Registro de control del timer.

x designa qué timer se está utilizando y puede ser: timer 1, timer 2, timer 3, timer 4 y timer 5.

Los timers pueden ocasionar interrupciones y los bits de los registros de interrupciones asociados
con el timer son:

 TxIE: Bit habilitador de la interrupción.


 TxIF: Bandera que indica que ha ocurrido una interrupción.

Estos bits se encuentran en los registros de interrupción según el timer que se utiliza.

Los timers se pueden clasificar en tres tipos: Timers tipo A, timers tipo B y timers tipo C.

 Timer Tipo A

El timer tipo A corresponde al timer 1, todos los dispositivos dsPIC30F


tienen este timer, el cual tiene las siguientes características:

 Puede ser utilizado cuando el dispositivo trabaja con el oscilador LP de 32 KHz.


 Puede trabajar en forma asíncrona cuando el reloj proviene de una fuente externa.
Este modo se utiliza cuando el reloj interno está deshabilitado.

 Timer Tipo B

El timer 2 y el timer 4 son timers tipo B, este tipo de timer tiene la siguiente característica:

 Un timer tipo B puede ser concatenado con un timer tipo C con el fin de formar un
timer de 32 bits.

 Timer Tipo C

El timer 3 y el timer 5 son timers tipo C, este tipo de timer tiene las siguientes
características:

51 53
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

 Un Timer tipo C puede ser concatenado con un timer tipo B para formar un timer
de 32 bits.
 Tiene la habilidad de trabajar como trigger para una conversión análogo-digital, es
decir cuando ocurre un desbordamiento en este timer, finaliza el proceso de
muestreo y empieza la conversión.

Cada timer debe configurar el registro de control TxCON. Los bits de este registro varían de
acuerdo a las características del tipo de timer.

TxCON, Registro de Control para el Timer Tipo A

TON --- TSIDL --- --- --- --- ---

bit 15 bit 8

--- TGATE TCKPS<1:0> --- TSYNC TCS ---

bit 7 bit 0

Bit 15 : TON: Bit de control de habilitación del timer.


1: Comienza a trabajar el timer.
0: El timer deja de trabajar.

Bit 14: Sin implementar: Se lee como cero.

Bit 13 : TSIDL: Bit para seleccionar la forma de trabajar el timer en modo IDLE.
1: El timer deja de trabajar cuando se entra al modo IDLE.
0: El timer continua trabajando en modo IDLE.

Bit 12-7: Sin implementar: Se lee como cero.

Bit 6 : TGATE: Bit habilitador del acumulador Timer Gated.


1: Habilitar el acumulador timer gated.
0: Deshabilitar el acumulador timer gated.

Bit 5-4 : TCKPS: Bits selectores del factor prescaler.


11: valor prescaler de 1:256.
10: valor prescaler de 1:64.
01: valor prescaler de 1:8.
00: valor prescaler de 1:1.

Bit 3: Sin implementar: Se lee como cero.

Bit 2: TSYNC: Bit selector de la sincronización del reloj externo del timer.
Cuando TCS=1
1: La entrada del reloj externa está sincronizada.

54 52
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

0: La entrada del reloj externa no está sincronizada.


Cuando TCS=0
Este bit es ignorado.

Bit 1: TCS: Bit selector de la fuente del reloj.


1: Reloj externo desde el pin TxCK.
0: Reloj interno (FOSC/4).

Bit 0: Sin implementar: Se lee como cero.

TxCON, Registro de Control para el Timer Tipo B


TON --- TSIDL --- --- --- --- ---

bit 15 bit 8

--- TGATE TCKPS<1:0> T32 --- TCS ---

bit 7 bit 0

Bit 15 : TON: Bit de control de habilitación del timer.


Cuando T32 = 1
1: Comienza a trabajar el timer con 32 bits (Timer C: Timer B).
0: El timer con 32 bits deja de trabajar.
Cuando T32 = 0
1: Comienza a trabajar el timer con 16 bits.
0: El timer con 16 bits deja de trabajar.

Bit 14: Sin implementar: Se lee como cero.

Bit 13 : TSIDL: Bit para seleccionar la forma de trabajar el timer en modo IDLE.
1: El timer deja de trabajar cuando se entra al modo IDLE.
0: El timer continúa trabajando en modo IDLE.

Bit 12-7: Sin implementar: Se lee como cero.

Bit 6 : TGATE: Bit habilitador del acumulador Timer Gated.


1: Habilitar el acumulador timer gated.
0: Deshabilitar el acumulador timer gated.

Bit 5-4 : TCKPS: Bits selectores del factor prescaler.


11: valor prescaler de 1:256.
10: valor prescaler de 1:64.
01: valor prescaler de 1:8.
00: valor prescaler de 1:1.

53 55
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Bit 3: T32: Bit selector del timer de 32 bits.


1: El timer tipo C y tipo B forman un timer de 32 bits.
0: Cada timer trabaja con 16 bits.

Bit 2: Sin implementar: Se lee como cero.

Bit 1: TCS: Bit selector de la fuente del reloj.


1: Reloj externo desde el pin TxCK.
0: Reloj interno (FOSC/4).

Bit 0: Sin implementar: Se lee como cero.

TxCON, Registro de Control para el Timer Tipo C

TON --- TSIDL --- --- --- --- ---

bit 15 bit 8

--- TGATE TCKPS<1:0> --- --- TCS ---

bit 7 bit 0

Bit 15 : TON: Bit de control de habilitación del timer.


1: Comienza a trabajar el timer.
0: El timer deja de trabajar.

Bit 14: Sin implementar: Se lee como cero.

Bit 13 : TSIDL: Bit para seleccionar la forma de trabajar el timer en modo IDLE.
1: El timer deja de trabajar cuando se entra al modo IDLE.
0: El timer continua trabajando en modo IDLE.

Bit 12-7: Sin implementar: Se lee como cero.

Bit 6 : TGATE: Bit habilitador del acumulador Timer Gated.


1: Habilitar el acumulador timer gated.
0: Deshabilitar el acumulador timer gated.

Bit 5-4 : TCKPS: Bits selectores del factor prescaler.


11: valor prescaler de 1:256.
10: valor prescaler de 1:64.
01: valor prescaler de 1:8.
00: valor prescaler de 1:1.

Bit 3-2: Sin implementar: Se lee como cero.

56 54
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Bit 1: TCS: Bit selector de la fuente del reloj.


1: Reloj externo desde el pin TxCK.
0: Reloj interno (FOSC/4).

Bit 0: Sin implementar: Se lee como cero.

Cuando se utiliza la entrada del reloj interna, FOSC/4, ó un reloj externo, se tiene la posibilidad de
determinar un prescaler de 1:1, 1:8, 1:64 o 1:256, el cual determina cuántos ciclos de máquina se
necesitan para que el timer se incremente. El prescaler se configura con los bits TCKPS del
registro TxCON.

Modos de Operación. Cada timer puede operar de los siguientes modos:

 Timer síncrono: En este modo el reloj del timer es el reloj interno del dispositivo, de
forma que el timer se incrementa cada determinado número de ciclos de instrucción, según
el prescaler. Para trabajar en este modo se dispone el valor lógico bajo en el bit TCS del
registro TxCON.

 Modo síncrono con entrada de reloj externo: Cuando el bit TCS del registro
TxCON se disponen en alto, la fuente del reloj del timer es un reloj externo, de forma que el
timer se incrementa cada vez que haya un flanco de subida en la entrada del reloj externo,
la cual corresponde al pin TxCK.

 Modo asíncrono con entrada de reloj externo: En el timer tipo A se puede trabajar
en modo asíncrono cuando se utiliza el reloj externo, esto quiere decir que el timer
incrementa su valor de forma asíncrona, comparado con el reloj interno del dispositivo.
Para trabajar en este modo se dispone en bajo el bit TSYNC del registro TxCON. Cuando
el dispositivo trabaja en modo SLEEP el modo asíncrono es el más adecuado, ya que el
reloj del sistema está deshabilitado.

 Modo de acumulador Timer Gated: El modo de acumulador Timer Gated consiste en


incrementar el timer cuando el pin TxCK se encuentre en alto y el conteo termina hasta que
el valor de éste sea igual al periodo almacenado en PRx o hasta que el mismo pin TxCK
pase a estado bajo. Para habilitar este modo se coloca en 1 el bit TGATE del registro
TxCON.

Interrupción por timer. Cuando el timer realiza su correspondiente conteo se puede originar
una interrupción, la cual se habilita con el bit TxIE, entonces el bit TxIF pasa a alto. Esto ocurre
cuando el TMRx tenga el mismo valor configurado en el registro del periodo PRx, lo que se
considera como periodo match; si no se configura el valor en el registro PRx, en este registro se
almacena el máximo valor que puede tener su timer asociado, el cual es 0xFFFF.

En el siguiente ejemplo se puede ver cómo se debe configurar un timer, en este caso de tipo B,
timer 2, para generar una interrupción cuando el valor del timer sea igual al almacenado en su
correspondiente registro de periodo PR2.

55 57
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

 Ejemplo:

.GLOBAL __T2Interrupt ; se configura el nombre del vector de la interrupción

CLR TMR2 ; se clarea el timer para que comience su conteo en 0


MOV #0X1056,W2
MOV W2,PR2 ; en el registro PR2 se almacena el valor del periodo
BCLR IPC1,#T3IP0 ; se determina la prioridad, en este caso es 2
BSET IPC1,#T3IP1
BCLR IPC1,#T3IP2
BCLR IFS0,#T2IF ; se asegura que la bandera del timer se encuentre en 0
BSET IEC0,#T2IE ; se habilita la interrupción por timer 2
MOV #0x8000,W2 ; se coloca en alto el bit TON del timer para que comience
MOV W2,T2CON ; su conteo
GOTO Principal ; se va a una rutina del programa

__T2Interrupt: ; rutina ISR de interrupción para el timer 2


BCLR IFS0,#T2IF ; la bandera del timer se coloca en 0, para que se pueda
; generar otra interrupción
RETFIE ; se sale de la rutina ISR y se continua ejecutando la
; instrucción que se tenía antes de la interrupción

Configuración de un timer con 32 bits. Se puede tener un timer que trabaje con 32 bits
combinando un timer tipo B con un timer tipo C, donde el valor del timer tipo C corresponde a la
palabra más significativa, mientras que el valor del timer tipo B es la palabra menos significativa.

La configuración para trabajar con un timer de 32 bits se realiza en el registro de control TxCON del
timer tipo B y para configurar las interrupciones se utiliza el timer tipo C.

En el siguiente ejemplo se puede ver cómo se configura un timer tipo B, timer 2, y un tipo C, timer
3, para trabajar con un timer de 32 bits.

 Ejemplo:

CLR TMR2 ; se clarea el timer 2 para iniciar el conteo en 0, este timer


; representa la palabra menos significativa
CLR TMR3 ; se clarea el timer 3 para iniciar el conteo en 0, este timer
; representa la palabra más significativa
MOV #0XF546,W0 ; en el registro PR2 se almacena el valor de la palabra
MOV W0,PR2 ; menos significativa del periodo del timer de 32 bits
MOV #0X1281,W0 ; en el registro PR3 se almacena el valor de la palabra
MOV W0,PR3 ; más significativa del periodo del timer de 32 bits
BCLR IFS0,#T3IF ; se asegura de que la bandera del timer 3 se encuentre en 0
BSET IEC0,#T3IE ; se habilita la interrupción por timer3
MOV #0x8008,W0 ; se dispone en 1 el bit T32 para trabajar con timer de 32
MOV W0,T2CON ; bits y el bit TON también se coloca en 1 para empezar
; el conteo en los dos timers

Cuando los dos registros, TMR2 y TMR3 se incrementan y los valores que ellos tienen coinciden
con los valores almacenados en PR2 y PR3, se origina una interrupción por el timer 3, que es el
timer tipo C, inmediatamente los registros TMR2 y TMR3 son reiniciados en 0.

58 56
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

5.4 Conversor Analógico-Digital

El conversor analógico a digital permite la conversión de una entrada análoga en una


representación digital, los dsPIC30F trabajan con 10 bits o 12 bits, lo cual depende del dispositivo.
El conversor A/D tiene la posibilidad de trabajar máximo con 16 entradas, AN0-AN15, el número de
entradas análogas depende del dispositivo.

Registros del conversor

El módulo análogo digital tiene asociado los siguientes registros de 16 bits:

 Registro de Control 1 de la conversión A/D (ADCON1).


 Registro de Control 2 de la conversión A/D (ADCON2).
 Registro de Control 3 de la conversión A/D (ADCON3).
 Registro Selector de entrada de analógica digital (ADCHS).
 Registro de configuración de puerto de las entradas para el conversor (ADPCFG).
 Registro para la selección de entrada scan en el convertidor A/D (ADCSSL) .

ADCON1, Registro 1 de control del conversor Analógico-Digital

ADON --- ADSIDL --- --- --- FORM<1:0>

bit 15 bit 8

SSRC<2:0> --- SIMSAM ASAM SAMP DONE

bit 7 bit 0

Bit 15: ADON: Bit indicador de la operación de conversión.


1: El conversor análogo está operando.
0: El conversor análogo no está operando.

Bit 14: Sin implementar: Se lee como cero.

Bit 13 : ADSIDL: Bit para seleccionar la forma de trabajar el conversor A/D en modo
IDLE.
1: El conversor A/D deja de trabajar cuando se entra al modo IDLE.
0: El conversor A/D continúa trabajando en modo IDLE.

Bit 12-10: Sin implementar: Se lee como cero.

Bit 9-8: FORM<1:0>: Bits selectores del formato del dato del resultado de la conversión.
11: Fraccional con signo (Dato de salida = sddd dddd dd00 0000).
10: Fraccional sin signo (Dato de salida = dddd dddd dd00 0000).
01: Enteros con signo (Dato de salida = ssss sssd dddd dddd).
00: Enteros sin signo (Dato de salida = 0000 00dd dddd dddd).

57 59
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Bit7-5: SSRC<2:0>: Bits selectores de muestreo y conversión.


111: El contador interno finaliza el muestreo y comienza la conversión.
110: Reservado.
101: Reservado.
100: Reservado.
011: El control PWM finaliza el muestreo y comienza la conversión.
010: Por detección de un periodo match en el timer 3 se finaliza el muestreo y
comienza la conversión.
001: Transición en el pin INT0 finaliza el muestreo y comienza conversión.
000: Al colocar el bit SAMP en 0 se finaliza el muestreo y comienza conversión.

Bit 4: Sin implementar: Se lee como cero.

Bit 3 : SIMSAM: Bit selector de muestras simultáneas .


1: Se muestrea simultáneamente CH0, CH1, CH2 y CH3; cuando CHPS=1x.
Se muestrea simultáneamente CH0, CH1; cuando CHPS=01.
0: Muestrea individualmente cada canal y lo hace en secuencia.

Bit 2 : ASAM: Bit selector del momento en que se realiza el muestreo.


1: Se muestrea después de que se haya terminado la última conversión.
0: Se muestrea cuando el bit SAMP se coloca en 1.

Bit 1 : SAMP: Bit habilitador del muestreo para la conversión A/D.


1: Se va a realizar una muestra.
0: Finalizó una muestra.

Bit 0 : DONE: Bit que indica el estado de la conversión.


1: La conversión ha sido completada.
0: La conversión no ha sido completada; si se coloca en 0 por software no tiene
efecto si una conversión está en progreso.

ADCON2, Registro 2 de control del conversor Analógico-Digital

VCFG<2:0> --- --- CSCNA --- ---

bit 15 bit 8

BUFS --- SMPI<3:0> BUFM ALTS

bit 7 bit 0

Bit 15-13: VCFG<2:0>: Bits selectores del voltaje de referencia.


000: VREFH = AVDD y VREFL= AV.
001: VREFH = VREF+ de un pin externo y VREFL= AVSS.
010: VREFH = AVDD y VREFL= VREF- de un pin externo.
011: VREFH = VREF+ de un pin externo y VREFL= VREF- de un pin externo.
1xx: VREFH = AVDD y VREFL= AV.

60 58
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Bit 12: Reservado: Se puede escribir 0.

Bit 11: Sin implementar: Se lee como cero.

Bit 10: CSCNA: Bit habilitador del scan para las entradas del CH0 usando el multiplexor A.
1: Se realiza scan para las entradas.
0: No se realiza scan para las entradas.

Bit 9-8: Sin implementar: Se lee como cero.

Bit 7 : BUFS: Bit que indica cómo se almacena en los buffers (solamente tiene efecto
cuando BUFM=1).
1: Se acceden a los datos del los buffers ADCBUF(7...0) .
0: Se acceden a los datos del los buffers ADCBUF(15...8) .

Bit 6: Sin implementar: Se lee como cero.

Bit 5-2: SMPI<3:0>: Bits selectores de número de conversiones antes de originar una
Interrupción.
1111: Se interrumpe cuando se toman 16 muestras y se realiza la conversión.
1110: Se interrumpe cuando se toman 15 muestras y se realiza la conversión.
1101: Se interrumpe cuando se toman 14 muestras y se realiza la conversión.
.................................................................................................................... .......
0001: Se interrumpe cuando se toman 2 muestras y se realiza la conversión.
0000: Se interrumpe cuando se toma 1 muestra y se realiza la conversión.

Bit 1: BUFM: Bit selector de los buffers.


1: Se trabaja como si fueran dos conjuntos de buffers ADCBUF(15...8),
ADCBUF(7...0).
0: Se trabaja como un conjunto de buffers ADCBUF(15...0).

Bit 0: ALTS: Bit selector para trabajar muestras simultáneas.


1: Se trabajan alternativamente muestras de un multiplexor A y de un
multiplexor B.
0: Se trabajan sólo con muestras de un multiplexor A.

59 61
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

ADCON3, Registro 3 de control del conversor Analógico-Digital

--- --- --- SAMC<4:0>

bit 15 bit 8

ADRC --- ADCS<5:0>

bit 7 bit 0

Bit 15-13: Sin implementar: Se lee como cero.

Bit 12-8: SAMC<4:0>: Bits selectores del tiempo de muestreo (cuando se realiza auto
muestreo).
11111: 31 TAD.
11110: 30 TAD.
-----------------------------------------------------------------------------------------------
00001: 1 TAD.
00000: 0 TAD (solamente es posible cuando se utiliza más de un canal).

Bit 7 : ADRC: Bit selector de la fuente del reloj para la conversión.


1: Se utiliza para la conversión el reloj interno RC.
0: Se utiliza para la conversión el mismo reloj del sistema.

Bit 6: Sin implementar: Se lee como cero.

Bit 5-0: ADCS<5:0>: Bits selectores del reloj para la conversión (no se tiene en cuenta
para el reloj RC).
111111: TCY/2 • (ADCS<5:0> + 1) = 32 *TCY.
011111: 16 *TCY.
001111: 8 *TCY.
000111: 4*TCY.
000011: 2*TCY.
000001: TCY.
000000: TCY/2.

62 60
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

ADCHS, Registro selector de las entradas de los canales del conversor

CH123NB<1:0> CH123SB CH0NB CH0SB<3:0>

bit 15 bit 8

CH123NA<1:0> CH123SA CH0NA CH0SA<3:0>

bit 7 bit 0

Bit 15-14: CH123NB<1:0>: Selección de la entrada positiva al Canal 1, Canal 2 y Canal 3


en el Multiplexor B.
11: La entrada negativa al Canal 1 es AN9, la entrada negativa al Canal 2 es
AN10, la entrada negativa al Canal 3 es AN11.
10: La entrada negativa al Canal 1 es AN6, la entrada negativa al Canal 2 es
AN7, la entrada negativa al Canal 3 es AN8.
00: La entrada negativa al Canal 1, Canal 2 y el Canal 3 es el VREF-
AN7, la entrada negativa al Canal 3 es AN11.

Bit 13: CH123SB: Selección de la entrada positiva al Canal 1, Canal 2 y Canal 3 en el


Multiplexor B.
1: La entrada positiva al Canal 1 es AN3, la entrada negativa al Canal 2 es
AN4, la entrada negativa al Canal 3 es AN5.
0: La entrada negativa al Canal 1 es AN0, la entrada negativa al Canal 2 es
AN1, la entrada negativa al Canal 3 es AN2.

Bit 12: CH0NB: Bit selector de la entrada negativa para el Canal 0 en el Multiplexor B.
1: La entrada negativa al Canal 0 es AN1.
0: La entrada negativa al Canal 0 es el VREF-.

Bit 11-80: CH0SB <3:0>: Bit selector de la entrada positiva para el Canal 0 en el Multiplexor B.
1111: Se ingresa la entrada AN15 al Canal 15.
1110: Se ingresa la entrada AN15 al Canal 14.
----------------------------------------------------------------------------------------
0001: Se ingresa la entrada AN15 al Canal 1.
0000: Se ingresa la entrada AN15 al Canal 0.

Bit 7-6: CH123NA<3:0>: Selección de la entrada positiva al Canal 1, Canal 2 y Canal 3


en el Multiplexor A.
11: La entrada negativa al Canal 1 es AN9, la entrada negativa al Canal 2 es
AN10, la entrada negativa al Canal 3 es AN11.
10: La entrada negativa al Canal 1 es AN6, la entrada negativa al Canal 2 es
AN7, la entrada negativa al Canal 3 es AN8.
00: La entrada negativa al Canal 1, Canal 2 y el Canal 3 es el VREF-
AN7, la entrada negativa al Canal 3 es AN11.

61 63
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Bit 5: CH123SA: Selección de la entrada positiva al Canal 1, Canal 2 y Canal 3 en el


Multiplexor A.
1: La entrada positiva al Canal 1 es AN3, la entrada negativa al Canal 2 es
AN4, la entrada negativa al Canal 3 es AN5.
0: La entrada negativa al Canal 1 es AN0, la entrada negativa al Canal 2 es
AN1, la entrada negativa al Canal 3 es AN2.

Bit 4: CH0NA: Bit selector de la entrada negativa para el Canal 0 en el Multiplexor A.


1: La entrada negativa al Canal 0 es AN1.
0: La entrada negativa al Canal 0 es el VREF-.

Bit 3-0: CH0SA<3:0>: Bit selector de la entrada positiva para el Canal 0 en el Multiplexor A.
1111: Se ingresa la entrada AN15 al Canal 15.
1110: Se ingresa la entrada AN14 al Canal 14.
----------------------------------------------------------------------------------------
0001: Se ingresa la entrada AN1 al Canal 1.
0000: Se ingresa la entrada AN0 al Canal 0.

ADPCFG, Configuración de los puertos como analógicos o digitales

PCFG15 PCFG14 PCFG13 PCFG12 PCFG11 PCFG10 PCFG9 PCFG8

bit 15 bit 8

PCFG7 PCFG6 PCFG5 PCFG4 PCFG3 PCFG2 PCFG1 PCFG0

bit 7 bit 0

Bit 15-0: PCFG<15:0>: Configuración de los pines como entradas analógicas o digitales.
1: Se configura la entrada como modo digital.
0: Se configura la entrada como modo analógica.

64 62
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

ADCSSL, Registro para realizar scan en las entradas analógicas

CSSL15 CSSL 14 CSSL 13 CSSL 12 CSSL 11 CSSL 10 CSSL 9 CSSL 8

bit 15 bit 8

CSSL 7 CSSL 6 CSSL 5 CSSL 4 CSSL 3 CSSL 2 CSSL 1 CSSL 0

bit 7 bit 0

Bit 15-0: CSSL<15:0>: Bits selectores para las entradas a las que se les hará scan.
1: Se selecciona ANx para realizar scan (donde x corresponde a la posición del bit).
0: No se realiza scan.

Para habilitar el módulo del conversor Analógico-Digital, se coloca en 1 el bit ADON del registro
ADCON1. Cuando se está llevando a cabo una conversión el bit DONE del registro ADCON1 se
encuentra en 0, cuando éste se coloca en 1 indica que se ha acabado el proceso de conversión.

Proceso de conversión y muestreo. Para realizar la conversión analógica a digital, primero


se toma la muestra de la señal en un determinado tiempo y luego se realiza la respectiva
conversión. En la Figura 5.2 se muestra cómo se distribuye el tiempo total de una conversión.

Para realizar una conversión se requieren 12 periodos de reloj, donde cada periodo de reloj se
llama TAD, de forma que se requieren 12 TAD. Las conversiones tienen la posibilidad de trabajar con
el reloj interno del dispositivo RC o con el sistema de reloj que se haya escogido. El reloj interno se
recomienda cuando se desea realizar conversión encontrándose el dispositivo en modo SLEEP,
para configurar el reloj interno se coloca un 1 en el bit ADRC del registro ACON2. En el caso que
se escoja el sistema de reloj colocando un 0 en este bit, es posible variar el valor del T AD con el fin
de obtener una mayor o menor frecuencia de muestreo, para esto se utilizan los bits ADCS<5:0>
del registro ADCON3; estos bits no tienen efecto cuando se utiliza RC porque la frecuencia de
muestreo es siempre la misma, casi siempre se cuenta con TAD=300ns.

Cuando se utilizan los bits ADCS, el TAD se calcula dependiendo del valor binario que tengan estos
bits, para esto se utiliza la siguiente fórmula:
TAD= (TCY(ADCS+1))/2

Figura 5.2 Tiempo de Muestreo y Conversión

Tiempo total para la Conversión A/D

Tiempo de Muestreo Tiempo de Conversión

El amplificador toma la El convertidor toma la muestra


muestra de la señal analógica análoga y la convierte en digital
y la almacena y la almacena en los buffers

63 65
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Ejemplo: Si los bits ADCS tienen el valor binario de 7, entonces TAD= (TCY(7+1))/2, = 4TCY, donde el
TCY corresponde al tiempo que dura un ciclo de máquina.

Antes de realizar la conversión se debe realizar el muestreo de la señal análoga, y el tiempo de


muestreo varía según la siguiente forma:

TSMP= TAD * SAMC<4:0

Los bits SAMC se encuentran en el registro ADCON3.


Entonces el tiempo total que dura una conversión es:

T= TSMP + TAD

El muestreo se puede realizar de dos formas: automático o manual.

Muestreo manual: Para realizar el muestreo de un dato de la señal analógica se coloca en 1 el


bit SAMP del registro ADCON1, este bit se coloca en 0 automáticamente cuando el muestreo se
termina y para volver a muestrear otro dato es necesario volver a colocar en 1 este bit.

Muestreo automático: Si el bit ASAM del registro ADCON1 se coloca en 1, cada muestreo de
los datos de la señal analógica se realiza al finalizar cada conversión.

La conversión se lleva a cabo de varias formas: automática, manual o la ocasionada por algún
evento en especial.

Conversión manual: Cuando los bits SSRC<2:0> del registro ADCON1 se colocan en 000 se
finaliza el muestreo y comienza la conversión cuando se coloca en 0 el bit SAMP del registro
ADCON1<1>.

Conversión automática: Cuando los bits SSRC<2:0> del registro ADCON1 se colocan en 111,
en este modo la conversión comienza cuando el muestreo finaliza.

Conversión por algún evento: Es posible que el muestreo se finalice para comenzar una
conversión en algún evento al detectar un flanco de bajada o subida en el pin INT0, o cuando
ocurre un periodo match en el timer 3, si se trabaja como un timer de 32 bits, trabajando en
conjunto con el timer 2, otro evento también sucede cuando se trabaja el módulo PWM. La
configuración para estos eventos también se realiza en los bits SSRC<2:0>.

En la figura 5.3 se observa un ejemplo de cómo se realiza el muestreo manual, y el inicio de una
conversión en forma automática. Se puede ver que cuando se quiere muestrear una señal se debe
colocar en 1 el bit SAMP, cuando se termina el muestreo automáticamente este bit se coloca en 0,
después comienza la conversión y en el momento de terminar el bit DONE del registro ADCON1 se
coloca en 1 y el resultado de la conversión se almacena en algún buffer.

El fabricante recomienda que el tiempo de muestreo total de la señal sea mayor a 167 ns, porque
este es el tiempo mínimo con que trabajan correctamente los dispositivos dsPIC30F.

66 64
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Figura 5.3 Ejemplo de un muestreo manual y conversión automática

Tiempo de muestreo Tiempo de


Conversión

ADCLK

SAMP

DONE
BSF ADCON1,SAMP

El resultado se
almacena en un BUFFER

Voltaje de referencia. Los voltajes de referencia que utiliza el conversor Analógico-Digital se


seleccionan con los bits VCFG<2:0> del registro ADCON2. Hay un VREFH voltaje de referencia alto
que tiene la posibilidad de ser AVDD ó un VREF+ y hay un VREFL voltaje de referencia bajo que tiene la
posibilidad de ser AVSS ó un VREF-. En el caso de escoger un voltaje de referencia externo, VREF+ y
VREF-., se deben utilizar los pines AN0 y AN1 del dispotivo respectivamente.

Entradas analógicas. Los dispositivos dsPIC30F tienen la opción de trabajar hasta con 16
entradas analógicas, el número de entradas depende del dispositivo que se utiliza.

En los dsPIC30F las entradas analógicas se manejan en el puerto B, siendo necesario configurar si
los pines del puerto se van a trabajar como entradas análogas o entradas/salidas digitales. En el
registro ADPCFG<n> donde n depende del número de la entrada analógica, se coloca un 0 si se va
trabajar con entradas analógicas y 1 para entradas/salidas digitales.

Canales del conversor. Para el conversor A/D de 10 bits, las entradas analógicas se conectan
a través de multiplexores a cuatro amplificadores, que corresponden a los canales del conversor
CH0-CH3, de esta forma se puede ingresar señales a cada canal y se tiene la posibilidad de
muestrear las señales al mismo tiempo.

Para el Conversor A/D de 12 bits, sólo se tiene el canal CH0, es decir las señales ingresan a un
solo amplificador. En el registro ADCHS de este conversor, sólo se configura la entrada análoga
que va ir al CH0.

El canal 0 es el único en el que se pueden ingresar todas las entradas análogas-digitales; en los
bits CH0SA<3:0> se escoge cuál entrada analógica positiva va a ser muestreada en el canal 0, que
puede ser desde AN0 hasta AN15. El bit CHONA del registro ADCHS, selecciona a VREF- o el pin
AN1 como la entrada negativa del canal 0. Si se quiere tener en cuenta sólo la entrada positiva, la
entrada negativa se lleva a tierra.

65 67
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

El bit ALTS del registro ADCON, permite seleccionar si sólo se trabaja con el multiplexor A, o con
los multiplexores A y B de forma alternativa. La configuración de las entradas negativas y positivas
para los canales de cada uno de los multiplexores también se configura en el registro ADCHS.

Cuando se trabajan varios canales es importante tener en cuenta los tiempos de muestreo y de
conversión de cada uno. Los canales se pueden muestrear al mismo tiempo o uno por uno,
dependiendo de la configuración del bit SIMSAM del registro ADCON1. En los bits CHPS<1:0> del
registro ADCON2 se selecciona si se quiere muestrear al mismo tiempo, sólo el CH0 ó el CH1, o si
se quieren muestrear los cuatro canales.

Solamente el Canal 0 tiene la posibilidad de realizar un scan a varias entradas, esto quiere decir
realizar alternativamente la conversión de señales provenientes de diferentes entradas análogas.
El scan se habilita en el bit CSCNA del registro ADCON2, las entradas análogas que realizarán
scan se configuran en el registro ADCSSL.

Buffer para la conversión analógica a digital. Cuando se realiza el muestreo de los canales
y la respectiva conversión, los resultados de la conversión A/D se almacenan en los registros
BUFFER. Son 16 buffers ADCBUF(15...0), los cuales se utilizan dependiendo de la configuración
de los canales y los multiplexores.

Interrupciones para el conversor Analógico-Digital. En los bits SMPI<3:0> del registro


ADCON2 se configura el número de conversiones que se pueden llevar a cabo antes de originar
una interrupción. El número máximo es de 16, ya que hay 16 buffers, de forma que al generar la
interrupción, se puede acceder a los datos que se encuentran en los buffers en orden
ADCBUF(0...15); es decir, el primer resultado de la conversión se almacena en el buffer ADCBUF0,
el siguiente en ADCBUF1 y así sucesivamente.

Formato del conversor Analógico-Digital. El resultado de una conversión se puede entregar


en cuatro formatos diferentes que se configuran en los bits FORM<1:0> del registro ADCON1.

Formato entero sin signo: El resultado se almacena en los bits más significativos, es decir
para el convertidor de 10 bits el resultado se almacena desde el bit 15 hasta el bit 6 y para el
convertidor de 12 bits el resultado se almacena desde el bit15 hasta el bit 4, sin signo, es decir no
se niega el bit más significativo. Para configurarlo se emplea 00 en los bits FORM.

El dato de salida para el convertidor de 10 bits se representa:

dddd dddd dd00 0000.

El rango para el convertidor de 10 bits: -64 a -32768 y 32704 a 0.


El dato de salida para el convertidor de 12 bits se representa:

dddd dddd dddd 0000.

El rango para el convertidor de 12 bits: -16 a -32768 y 32752 a 0.

Formato entero con signo: El resultado se almacena en los bits más significativos, es decir
para el convertidor de 10 bits el resultado se almacena desde el bit 15 hasta el bit 6 y para el
convertidor de 12 bits el resultado se almacena desde el bit 15 hasta el bit 4. Al trabajar con signo
quiere decir que el bit más significativo es el bit negado, en este caso es el bit 15. Para configurarlo
se coloca 01 en los bits FORM.

68 66
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

El dato de salida para el convertidor de 10 bits se representa:

sddd dddd dd00 0000.

El rango para el convertidor de 10 bits: -32768 a 32704.

El dato de salida para el convertidor de 12 bits se representa: sddd dddd dddd 0000.
El rango para el convertidor de 12 bits: -32768 a 32752.

Formato fraccional sin signo: El resultado se almacena en los bits menos significativos, es
decir para el convertidor de 10 bits el resultado se almacena desde el bit 9 hasta el bit 0 y para el
convertidor de 12 bits el resultado se almacena desde el bit 11 hasta el bit 0, sin signo. Para
configurarlo se coloca 10 en los bits FORM.

El dato de salida para el convertidor de 10 bits se representa: 0000 00dd dddd dddd.
El rango para el convertidor de 10 bits: -0.0019 a –1 y 1 a 0.998046875.

El dato de salida para el convertidor de 12 bits se representa: 0000 dddd dddd dddd.
El rango para el convertidor de 12 bits: -0.00048 a –1 y 1 a 0.999511718.

Formato fraccional con signo: El resultado se almacena en los bits menos significativos, es
decir para el conversor de 10 bits el resultado se almacena desde el bit 9 hasta el bit 0 y para el
convertidor de 12 bits el resultado se almacena desde el bit 11 hasta el bit 0. Al trabajar con signo,
quiere decir que el bit más significativo es el bit negado. Para configurarlo se coloca 11 en los bits
FORM.

El dato de salida para el convertidor de 10 bits se representa: ssss sssd dddd dddd.
El rango para el convertidor de 10 bits: -1 a 0.998046875.

El dato de salida para el convertidor de 12 bits se representa: ssss sddd dddd dddd.
El rango para el convertidor de 12 bits: -1 a 0.999511718.

5.5 Memoria Flash Y Memoria EEPROM

En la Memoria Flash y en la Memoria EEPROM, se pueden leer y escribir datos utilizando las
instrucciones table.

Organización de la Memoria Flash. La Memoria de Programa Flash está organizada en filas y


paneles, cada fila esta conformada por 32 instrucciones ó 96 bytes (cada instrucción se representa
por 24 bits ó 3 bytes) y el tamaño de panel depende del número de filas, el cual a su vez depende
del rango de direcciones de la Memoria que maneja el dispositivo con el que se trabaja. En la
memoria Flash se puede borrar al mismo tiempo una fila completa y se pueden programar cuatro
instrucciones al mismo tiempo.

Cada panel tiene latches que permiten escribir los 4 datos para ser programados aunque no se
puedan ver en la Memoria de Programa, para escribir se utiliza la instrucción table y se realiza
antes de la operación de programación. Como se van a escribir datos de 24 bits se utilizan las
instrucciones TBLWTL y TBLWTH, entonces teniendo un registro de trabajo que servirá como
puntero se almacena primero la palabra menos significativa que apunta a esa dirección, e
incrementando esa dirección en dos se apunta a donde se encuentra la palabra más significativa.

67 69
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Para programar, primero se debe realizar el proceso de borrado. Para empezar alguno de estos
dos procesos se coloca en alto el bit WR del registro NVMCON, y se tiene que esperar a la
terminación del proceso al ponerse en bajo este bit ó que se presente una interrupción. Para
habilitar una interrupción se coloca 1 en el bit NVMIE del registro IEC0 y cuando ocurre la
interrupción se coloca en alto la bandera NVMIF del registro IIFS0.

Organización de la Memoria EEPROM. La Memoria de Datos EEPROM está organizada en


filas conformadas por 16 palabras. Se puede programar y borrar una palabra ó una fila completa.
Como se almacenan datos de 16 bits sólo se utiliza la instrucción TBLWTL. Antes de programar se
escriben los datos en las direcciones que apunta el registro de trabajo donde se encuentra la
dirección efectiva de la Memoria de Datos EEPROM. Cuando se programa las 16 palabras se
tienen que escribir los 16 datos incrementando la dirección del puntero.

Para realizar la programación en la Memoria EEPROM se utiliza un procedimiento parecido al


utilizado en la Memoria Flash, primero se borra y luego se programa, en este caso si se va
programar la fila completa también se debe borrar la fila completa. Para empezar a programar o
borrar se coloca en 1 el bit WR del registro NVMCON, y cuando termina el correspondiente
proceso se coloca en 0 el bit y se origina una interrupción colocándose en alto la bandera NVMIF.

Registros de control. Para poder programar en la Memoria Flash y en la Memoria EEPROM se


utilizan los siguientes registros:

 Registro NVMCON.
 Registro NVMADR.
 Registro NVMKEY.

Registro NVMCON

Es el registro que controla las operaciones de programar y borrar la Memoria Flash y la Memoria
EEPROM. En la Tabla 5.2 se encuentra el valor que se debe configurar en el registro NVMCON
según el proceso que se quiere realizar.

Tabla 5.2 Configuración del registro NVMCON

Memoria Operación Tamaño del dato NVMCON


Memoria Borrar 1 fila (32 instrucciones) 0x4041
FLASH Programar 4 instrucciones 0x4001
Memoria Borrar 1 palabra 0x4044
EEPROM 1 fila (16 palabras) 0x4045
Programar 1 palabra 0x4004
1 fila (16 palabras) 0x4005
Registros de Escritura 1 registro de configuración 0x4008
Configuración

70 68
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

NVMCON, Registro de Control de la Memoria No Volátil

WR WREN WRERR --- --- --- --- ---

bit 15 bit 8

PROGOP<7:0>

bit 7 bit 0
Bit 15: WR: Bit de Control para la escritura (sea para programar o Borrar).
1: Empezar el proceso de programación o borrado de la Memoria Flash o
la Memoria EEPROM.
0: Ciclo de escritura para programar o borrar ha terminado (No se puede
clarear por software).

Bit 14: WREN: Bit para habilitar la escritura (sea para programar o para Borrar).
1: Habilitar el proceso de programación o borrado de la Memoria Flash o
la Memoria EEPROM.
0: No es posible programar ni borrar.

Bit 13: WRERR: Bandera indicadora 4de un Error al trabajar con la Memoria FLASH
1: Ha terminado la operación de escritura sin haberse completado, lo cual
puede ocurrir por un reset ocasionado por MCLR o por el contador
Watchdog-Timer.
0: La operación ha finalizado satisfactoriamente.

Bit 12-8: Sin implementar: Se lee como cero.

Bit 7-0: PROGOP<7:0>: Bits para la configuración de la operación que se desea realizar.
Proceso de Borrar
0x41: Borra 1 fila (32 instrucciones) de la Memoria de Programa FLASH.
0x44: Borra 1 palabra de la Memoria de Datos EEPROM.
0x45: Borra 1 fila (conformada por 32 palabras) de la Memoria EEPROM.
Proceso de Programación
0x01: Programa 4 instrucciones de una fila de la Memoria de Programa FLASH.
0x04: Programa 1 palabra de la Memoria de Datos EEPROM.
0x05: Programa 1 fila (conformada por 32 palabras) de la Memoria EEPROM.
0x08: Programa 1 palabra en los registros de configuración para programar.

Registro NVMADR.

En este registro se almacena la dirección efectiva <15:0> que se accede con instrucciones Table.
Los restantes 8 bits más significativos se acceden utilizando el registro de página TBLPAG,
formando así la dirección donde se va a borrar o a programar un dato sea en la Memoria Flash o

69 71
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

en la Memoria EEPROM. En la figura 5.4 se observa cómo se concatenan los registros para
conformar la dirección a la que se va acceder.

Figura 5.4 Direccionamiento de la Memoria No Volátil

24 bits que conforma la dirección de la Memoria No Volátil

Registro W, almacena EA

Registro NVMADR, almacena EA

Registro TBLPAG Wn<0>, selecciona


el Byte

8 bits 16 bits

TBLPAG<7>, selecciona si se
usa Espacio de Programa
o espacio de configuración

NVMADR, Registro de Direcciones de la Memoria No Volátil

NVMADR <15:8>

bit 15 bit 8

NVMADR <7:0>

bit 7 bit 0
Bit 15-0: NVMADR<15:0>: Almacena los 16 bits menos significativos de dirección efectiva de la
memoria no volátil, sea Memoria de Programa o Memoria de datos, a la que se quiere acceder.

Registro NVMKEY.

Este registro se utiliza para prevenir problemas cuando se borra o se escribe en la Memoria Flash
o en la Memoria EEPROM. Antes de comenzar a programar o borrar se escriben los siguientes
valores en el registro NVMKEY:

72 70
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

 Se escribe el valor de 0x55 en el registro NVMKEY.


 Se escribe el valor de 0xAA en el registro NVMKEY.

Después de esto se escribe la instrucción NOP.

NVMKEY, Registro Key de la Memoria No Volátil

--- --- --- --- --- --- --- ---

bit 15 bit 8

NVMKEY <7:0>

bit 7 bit 0
Bit 15-8: Sin implementar: Se lee como cero.

Bit 7-0: NVMKEY<7:0>: Bits para escribir claves que permitan realizar un proceso de borrado
y programación correctamente.

1. En el siguiente ejemplo se pueden ver los pasos para Borrar y Programar la


Memoria Flash.

; se comienza con el proceso de borrado de una fila


MOV #0X4041,W0
MOV W0,NVMCON ; se configura el registro para borrar una fila en la
; Memoria Flash
MOV #tblpage(fib_data),W0 ; se accede a una dirección de la Memoria Flash
MOV w0,TBLPAG ; se almacena los 8 bits más significativos en TBLPAG
MOV #tbloffset(fib_data),W0
MOV w0,NVMADR ; se almacena los 16 bits menos significativos en NVMADR
PUSH SR
MOV #0X00E0,W0 ; se deshabilitan las interrupciones colocando 111 en
IOR SR ; los bits IPL, para no interrumpir el proceso de borrado
MOV #0X55,W0 ; se almacenan los valores correspondientes en el
MOV #0XAA,W1 ; registro NVMKEY para evitar problemas de escritura
MOV W0,NVMKEY
MOV W1,NVMKEY
NOP
BSET NVMCON ; comienza el proceso de borrar colocando un 1 en WR
conti:
BTSC NVMCON,#WR ; se pregunta si ya terminó el proceso
goto conti_

71 73
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

NOP
NOP
POP SR ; se habilitan las interrupciones
; se realiza la escritura de las 4 instrucciones que se quieren
; programar
MOV #0X4001,W0
MOV W0,NVMCON ; se configura el registro para programar 4 instrucciones
MOV #tblpage(fib_data),W0
MOV w0,TBLPAG
MOV #tbloffset(fib_data),W0
MOV #0X080A,W1 ; se almacena la palabra menos significativa que se
; conforma la instrucción que se quiere programar
MOV #0X0822,W2 ; se almacena la 8 bits menos significativos que conforman la
; instrucción que se quiere programar
TBLWTL W1,[W0]
TBLWTH W2,[W0++]
; esta misma rutina se realiza para almacenar las otras 3
; instrucciones
PUSH SR
MOV #0X00E0,W0 ; también se deshabilitan interrupciones
IOR SR
MOV #0X55,W0
MOV #0XAA,W1
MOV W0,NVMKEY
MOV W1,NVMKEY ;
NOP
BSET NVMCON,#WR ; comienza el proceso de programar colocando un 1 en
; el bit WR
conti_:
BTSC NVMCON,#WR ;se pregunta si terminó de programar las 4 instrucciones
goto conti_
POP SR

2. En el siguiente ejemplo se pueden ver los pasos para Borrar y Programar en la


Memoria EEPROM.

; se comienza con el proceso de borrar una palabra


MOV #0X4044,W0
MOV W0,NVMCON ; se configura el registro para borrar una palabra en la
; Memoria EEPROM
MOV #tblpage(_mydata),W0 ; se accede a una dirección de la Memoria EEPROM
MOV W0,TBLPAG ; se almacena los 8 bits más significativos en TBLPAG
MOV #tbloffset(_mydata),W0
MOV W0,NVMADR ; almacena los 16 bits menos significativos en NVMADR
PUSH SR
MOV #0X00E0,W0 ; se deshabilitan todas las interrupción colocando 111
IOR SR ; los bits IPL, para no interrumpir el proceso de borrado
MOV #0X55,W0 ; se almacenan los valores correspondientes en W0
MOV #0XAA,W1 ; NVMKEY para evitar problemas de escritura
MOV W0,NVMKEY
MOV W1,NVMKEY
NOP

74 72
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

BSET NVMCON,#WR ; comienza el proceso de borrar colocando un 1 en WR


conti:
BTSC NVMCON,#WR ; se pregunta si ya terminó el proceso
goto conti_
NOP
NOP
POP SR ; se habilitan las interrupciones
; se realiza la escritura de una palabra
MOV #0X4004,W0
MOV W0,NVMCON ; se configura el registro para programar 4 instrucciones
MOV #tblpage(fib_data),W0
MOV W0,TBLPAG
MOV #tbloffset(fib_data),W0
MOV #0X0922,W1 ; se accede a la palabra que se quiere almacenar en la Memoria
TBLWTL W1,[W0]
PUSH SR
MOV #0X00E0,W0 ; también se deshabilitan interrupciones
IOR SR
MOV #0X55,W0
MOV #0XAA,W1
MOV W0,NVMKEY
MOV W1,NVMKEY
NOP
BSET NVMCON,#WR ; comienza el proceso de programar colocando un 1 en
; el bit WR
conti_:
BTSC NVMCON,#WR ; se pregunta si terminó de programar las 4 instrucciones
GOTO conti_
POP SR
MOV #tblpage(_mydata),W0 ; después de terminar se puede acceder al dato
MOV W0,TBLPAG
MOV #tbloffset(_mydata),W0
TBLRDL [W0],W4 ; se pueden leer los datos desde la memoria de datos,
MOV W4,PORTB ; también se pueden acceder a los valores con PSV
CICLO:
GOTO CICLO

73 75
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

6. HERRAMIENTAS DE DISEÑO

6.1 Software de Programación

El MPLAB ASM30 es una herramienta de software utilizada para los dispositivos dsPIC30F, la cual
permite convertir el conjunto de instrucciones del lenguaje ensamblador (código fuente), a un
conjunto de instrucciones que el procesador interpreta como código máquina. El MPLAB ASM30 es
un lenguaje usado en el software MPLAB IDE.

Los archivos de entrada diseñados en MPLAB ASM30 son llamados archivos fuente y consisten en
el conjunto de instrucciones, directivas y comentarios que conforman el programa de un dsPIC30F,
los cuales deben tener la extensión .s

El código fuente del ensamblador está conformado por declaraciones y espacios en blanco. Cada
declaración tiene el siguiente formato:

[Etiqueta] [Comandos] [Operando] [ ;<Comentarios>]

INICIO : MOV #6,W0 ; Almacena valor decimal 6 en w0

Etiquetas: Son nombres opcionales que deben comenzar con alguna letra o guión y pueden tener
letras, dígitos y guiones, los cuales son utilizados como símbolos para referirse a direcciones de
memorias y registros.

Comandos: Pueden ser mnemónicos de los códigos de operación (opcode) o directivas del
ensamblador.

Mnemónicos: Está conformado por el conjunto de instrucciones del dsPIC por ejemplo
MOV, SUB, MAC, las cuales se traducen directamente a lenguaje de máquina.

Directivas: Son comandos que aparecen en el código fuente pero no se trasladan


directamente dentro del código máquina, son usadas para el control de las operaciones del
ensamblador, se encargan de tratar los archivos de entrada y salida.

Operandos: Los operandos le dan información a un opcode (que son la representación de una
instrucción) o a las directivas. Si se requieren varios operandos en la misma instrucción estos
deben estar separados por comas. Cada instrucción de máquina puede tomar desde 0 a 8. Los
operandos consisten en literales y registros file.

Literales

Son valores que tienen que ser precedidos del símbolo #, estos valores pueden ser
hexadecimal, octal, binario o formato decimal. Ejemplo:
#5, valor decimal.
#0x0678, valor hexadecimal.

Registros File

Se distinguen de los valores literales porque no van precedidos del símbolo #, permiten
acceder o modificar los datos de una dirección directamente utilizando WREG. Ejemplo:

76 74
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Mov 0x1456,WREG
Mov 14,WREG

Comentarios: Son espacios opcionales que deben ser precedidos por „;‟ y se consideran también
comentarios las líneas en blanco por eso no se consideran líneas de programa.

MOV #5,W2 ; el número 5 lo almacena en el registro de trabajo W2

En la Memoria de programa es posible almacenar datos, lo cual se puede realizar en diversos


formatos, para esto se escribe una etiqueta, seguida por la directiva que indica el formato y
después los valores. Entre los formatos se tiene:

Formato decimal: Para un valor decimal después del signo # se coloca el valor decimal.
Ejemplo:

MOV #1234,W2

Para almacenar en la memoria de programa la directiva que se utiliza es .byte o .word y se escribe
el valor decimal. Ejemplo:

fib_data:
.byte 5,6,15,2,254,36
fib_data:
.word 56578,23456,12345,5678

Formato binario: Para un dato binario se escribe „0b‟ ó „0B‟ seguido del valor en binario. Cuando
se utiliza como valores literales para un instrucción van precedidos de la símbolo #. Ejemplo:

MOV #0B10000111111110,W2

Para almacenar en la memoria de programa la directiva que se utiliza es .byte o .word y se escribe
el valor en binario antecedido por 0b. Ejemplo:

fib_data:
.byte 0b01001010
fib_data:
.word 0b0100101011000100

Formato hexadecimal: Para un valor hexadecimal después del signo # se coloca „0x‟ ó „0X‟
seguido por el valor en hexadecimal que permite tener los siguientes dígitos
„0123456789abcdefABCDEF‟. Ejemplo :

MOV #0x5678,W3

Para almacenar en la memoria de programa la directiva que se utiliza es .byte o .word y se escribe
el valor en hexadecimal antecedido por 0x. Ejemplo:

fib_data:
.byte 0x8B, 0x5A
fib_data:
.word 0x2C3F, 0x15DA

75 77
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Formato de punto fijo: El número de punto fijo se representa en el formato Q-15, lo que
significa que 15 bits son usados para representar la parte fraccional de un número, donde el bit
más significativo es el bit de signo, el punto y la magnitud de 15 bits.

El número más pequeño de este formato es -1 y se representa con 0x8000 (1.000 0000 0000
0000), y el número mas grande es cercano a 1 ( siendo exactamente 0.99996948) y se representa
por 0x7FFF (0.111 1111 1111 1111).

Para almacenar en la memoria de programa la directiva que se utiliza es .fixed y se escribe el valor
con punto decimal, puede ser negativo o positivo.

fib_data:
.fixed -1,0.5,0789,09999

6.2 Conjunto de Instrucciones

En la siguiente tabla se muestra el significado de cada una de las variables que se utilizan en las
instrucciones:

Símbolo Descripción
# Antecede un literal, puede ser hexadecimal, decimal o binario
Acc Se llama así a alguno de los dos acumuladores A ó B
AWB Se llama así al acumulador Write Back
bit4 Se llama a alguno de los bits que van desde el bit 0 hasta el bit 15
Expr Se le llama a una etiqueta
F Es un registro File ó un registro de función especial
lit1 Es un valor literal que se representa en el rango 0:1
lit4 Es un valor literal que se representa en el rango 0:15
lit5 Es un valor literal que se representa en el rango 0:31
lit8 Es un valor literal que se representa en el rango 0:255
lit10 Es un valor literal que se representa en el rango 0:1023
lit14 Es un valor literal que se representa en el rango 0:16383
lit16 Es un valor literal que se representa en el rango 0:65535
lit23 Es un valor literal que se representa en el rango 0:8388607
Slit4 Es un valor literal con signo que se representa en el rango -8:7
Slit6 Es un valor literal con signo que se representa en el rango -16:16
Slit10 Es un valor literal con signo que se representa en el rango -512:511
Slit16 Es un valor literal con signo que se representa en el rango -32768:32767
Wb Es un registro de trabajo base, es decir las operaciones modifican el valor almacenado
en este registro
Wd Es un registro de trabajo destino, donde se almacenan los resultados de las
operaciones, puede trabajarse como direccionamiento directo o indirecto
Wm,Wn Son registros de trabajo donde Wm representa el dividendo y Wn el divisor
Wm*Wm Multiplicación entre dos registros de trabajo provenientes de la misma fuente
Wm*Wn Multiplicación entre dos registros de trabajo provenientes de d fuentes
Wn Registro de trabajo que funciona como fuente o como destino, con direccionamiento
directo
Wnd Registro de trabajo que funciona como destino, con direccionamiento directo
Wns Registro de trabajo que funciona como fuente, con direccionamiento directo
WREG Registro de trabajo W0
Ws Registro de trabajo que funciona como fuente en direccionamiento directo o indirecto

78 76
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Wx Registro de trabajo fuente que sirve como puntero para direcciones en la Memoria de
datos X en el bus pre-fetch
Wxd Registro de trabajo destino donde se almacena el valor que apunta Wx
Wy Registro de trabajo fuente que sirve como puntero para direcciones en la Memoria de
datos Y en el bus pre-fetch
Wyd Registro de trabajo destino donde se almacena el valor que apunta Wy

Instrucciones mov

Sintaxis Descripción
EXCH Wns,Wnd Se realiza swap (intercambio de bits) a Wns y Wnd
MOV F,WREG Se mueve el valor almacenado en un registro F a WREG
MOV WREG,F Se mueve el valor almacenado en WREG a un registro F
MOV F,Wnd Se mueve el valor almacenado en un registro F a Wnd
MOV Wns,F Se mueve el valor almacenado en Wns a un registro F
MOV.b #lit8,Wnd Se mueve un literal de 8 bits a Wnd
MOV #lit16,Wnd Se mueve un literal de 16 bits a Wnd
MOV Wns, [wd+Slit10] Se mueve el valor que almacena la dirección que apunta el
registro Ws más un literal de 10-bits con signo a Wnd
MOV [ws+Slit10],Wnd Se mueve el valor almacenado en Wns a la dirección que
apunta el registro Ws más un literal de 10-bits con signo
MOV Ws,Wd Se mueve el valor almacenado en Ws a Wd
MOV.D Ws,Wnd Se mueve el valor almacenado en Ws a Wnd:Wnd+1, porque
se está almacenando valores de 32 bits
MOV.D Wns,Wd Se mueve el valor almacenado en Wns:Wns+1 a Wd: porque
se está almacenando valores de 32 bits
SWAP Wn Se realiza un swap a un registro Wn
TBLRDH Ws,Wd Permite leer los 8 bits más significativos de un dato de 24 bits
(conformado por TBLPAG y Ws) y almacena en Wd
TBLRDL Ws,Wd Permite leer los 16 bit menos significativos de un dato de 24
bits (conformado por TBLPAG y Ws) y almacena en Wd
TBLWTH Ws,Wd Permite escribir en Wd los 8 bits más significativos de un dato
de 24 bits (conformado por TBLPAG y Ws)
TBLWTL Ws,Wd Permite escribir en Wd los 16 bits menos significativos de un
dato de 24 bits (conformado por TBLPAG y Ws)

Instrucciones math

Sintaxis Descripción
ADD F,WREG WREG=F+WREG
ADD #lit10,Wn Wn=lit10+Wn
ADD Wb,#lit5,Wd Wd=Wb+lit5
ADD Wb,Ws,Wd Wd=Wb+Ws
ADDC F,WREG WREG=F+WREG+ Carry
ADDC #10,Wn Wn=lit10+Wn+ Carry
ADDC Wb,#lit5,Wd Wd=Wb+lit5+ Carry
ADDC Wb,Ws,Wd Wd=Wb+Ws + Carry
DAW.B Wn Se realiza un redondeo decimal el byte menos significativo de una palabra
DEC F,WREG WREG=F-1
DEC Ws,Wd Wd=Ws-1
DEC2 F,WREG WREG=F-2

77 79
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

DEC2 Ws,Wd Wd=Ws-2


DIV.S Wm,Wn Se divide dos valores enteros de 16 bits con signo, donde el dividendo es
Wm y el divisor es Wn
DIV.SD Wm,Wn Se divide dos valores enteros con signo, donde el dividendo es de 32 bits y
el divisor es de 16 bits
DIV.U Wm,Wn Se divide dos valores enteros de 16 bits sin signo, donde el dividendo es
Wm y el divisor es Wn
DIV.UD Wm,Wn Se divide dos valores enteros sin signo, donde el dividendo es de 32 bits y
el divisor es de 16 bits
DIVF Wm,Wn Se divide dos valores fraccionales de 16 bits con signo, donde el dividendo
es Wm y el divisor es Wn
INC F,WREG WREG=F+1
INC Ws,Wd Wd=Ws+1
INC2 F,WREG WREG=F+2
INC2 Ws,Wd Wd=Ws+2
MUL F W3:W2=F*WREG ; la palabra más significativa se almacena en W3 y la
menos significativo en W2
MUL.SS Wb,Ws,Wnd Wnd+1,Wnd=Wb (con signo)*Ws (con signo)
MUL.SU Wb,Ws,Wnd Wnd+1,Wnd=Wb (con signo)*Ws (sin signo)
MUL.SU Wb,#lit5,Wnd Wnd+1,Wnd=Wb (con signo)*lit5 (sin signo)
MUL.US Wb,Ws,Wnd Wnd+1,Wnd=Wb (sin signo)*Ws (con signo)
MUL.UU Wb,Ws,Wnd Wnd+1,Wnd=Wb (sin signo)*Ws (sin signo)
MUL.UU Wb,#lit5,Wnd Wnd+1,Wnd=Wb (sin signo)*lit5 (sin signo)
SE Ws,Wnd Wnd= Se realiza signo extendido a Ws
SUB F,WREG WREG=F-WREG
SUB #lit10,Wn Wn=Wn -lit10
SUB Wb,#lit5,Wd Wd=Wb-lit5
SUB Wb,Ws,Wd Wd=Wb-Ws
SUBB F,WREG WREG=F-WREG-C
SUBB #lit10,Wn Wn=Wn -lit10-C
SUBB Wb,#lit5,Wd Wd=Wb-lit5-C
SUBB Wb,Ws,Wd Wd=Wb-Ws-C
SUBBR F,WREG WREG=WREG-F- C
SUBBR Wb,#lit5,Wd Wd=lit5-Wb-C
SUBBR Wb,Ws,Wd Wd=Ws-Wb-C
SUBR F,WREG WREG=WREG-F
SUBR Wb,#lit5,Wd Wd=lit5-Wb
SUBR Wb,Ws,Wd Wd=Ws-Wb
ZE Ws,Wnd Wnd= Se realiza cero extendido a Ws

Instrucciones lógicas

Sintaxis Descripción
AND F,WREG WREG=F AND WREG
AND #lit10,Wn Wn=lit10 AND Wn
AND Wb,#lit5,Wd Wd=Wb AND lit5
AND Wb,Ws,Wd Wd=Wb AND Ws
CLR F F=0x0000
CLR WREG WREG=0x0000
CLR Wd Wd=0x0000
COM F,WREG WREG=F negado, donde los 1 se convierten en 0 y viceversa

80 78
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

COM Ws,Wd Wd=Ws negado


IOR F,WREG WREG=F IOR WREG
IOR #LIT10,Wn Wn=lit10 IOR Wn
IOR Wb,#LIT5,Wd Wd=Wb IOR lit5
IOR Wb,Ws,Wd Wd=Wb IOR Ws
NEG F,WREG WREG=F negado +1
NEG Ws,Wd Wd=Ws negado+1
SETM F F=0Xffff
SETM WREG WREG=0Xffff
SETM Wd Wd=0Xffff
XOR F,WREG WREG=F XOR WREG
XOR #lit10,Wn Wn=lit10 XOR Wn
XOR Wb,#lit5,Wd Wd=Wb XOR lit5
XOR Wb,Ws,Wd Wd=Wb XOR Ws

Instrucciones de rotación y corrimiento

Sintaxis Descripción
ASR F,WREG WREG=F con corrimiento aritmético a la derecha de un bit
ASR Ws,Wd Wd=Ws con corrimiento aritmético a la derecha de un bit
ASR Wb,#lit4,Wnd Wnd=Wb con corrimiento aritmético a la derecha de bits igual al valor de lit4
ASR Wb,Wns,Wnd Wnd=Wb con corrimiento aritmético a la derecha de bits igual al valor de Ws
LSR F,WREG WREG=F con corrimiento lógico a la derecha de un bit
LSR Ws,Wd Wd=Ws con corrimiento lógico a la derecha de un bit
LSR Wb,#lit4,Wnd Wnd=Wb con corrimiento lógico a la derecha de bits igual al valor de lit4
LSR Wb,Wns,Wnd Wnd=Wb con corrimiento lógico a la derecha de bits igual al valor de Ws
RLC F,WREG WREG=F con rotación a la izquierda teniendo en cuenta el Carry
RLC Ws,Wd Wd=Ws con rotación a la izquierda teniendo en cuenta el Carry
RLNC F,WREG WREG=F con rotación a la izquierda sin tener en cuenta el Carry
RLNC Ws,Wd Wd=Ws con rotación a la izquierda sin tener en cuenta el Carry
RRC F,WREG WREG=F con rotación a la derecha teniendo en cuenta el Carry
RRC Ws,Wd Wd=Ws con rotación a la derecha teniendo en cuenta el Carry
RRNC F,WREG WREG=F con rotación a la derecha sin tener en cuenta el Carry
RRNC Ws,Wd Wd=Ws con rotación a la derecha sin tener en cuenta el Carry
SL F,WREG WREG=F con corrimiento a la izquierda de un bit
SL Ws,Wd Wd=Ws con corrimiento a la izquierda de un bit
SL Wb,#lit4,Wnd Wnd=Wb con corrimiento a la izquierda de bits igual al valor de lit4
SL Wb,Wns,Wnd Wnd=Wb con corrimiento a la izquierda de bits igual al valor de Ws

Instrucciones bit

Sintaxis Descripción
BCLR F,#bit4 Se coloca en 0 algún bit del registro F
BCLR Ws,#bit4 Se coloca en 0 algún bit del registro Ws
BSET F,#bit4 Se coloca en 1 algún bit del registro F
BSET Ws,#bit4 Se coloca en 1 algún bit del registro Ws
BSW.C Ws,Wb El valor del bit Carry (RegistroSR<0>) se almacena en el bit, que
corresponda al valor de Wb , del registro Ws
BSW.Z Ws,Wb El valor del bit Z (RegistroSR<1>) se almacena en el bit, que
corresponda al valor de Wb , del registro Ws
BTG F,#bit4 Se genera un toggle (si esta en 1 se coloca en 0, o si esta en 0 se

79 81
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

coloca en 1) en algún bit del registro F


BTG Ws,#bit4 Se genera un toggle (si esta en 1 se coloca en 0, o si esta en 0 se
coloca en 1) en algún bit del registro Ws
BTST.C Ws,#bit4 Si el bit por el que se pregunta es 1 el bit Carry (RegistroSR<0>) se
coloca en 1
BTST.Z Ws,#bit4 Si el bit por el que se pregunta es 0 el bit Z (RegistroSR<1>) se
coloca en 1
BTST.C Ws,Wb Se pregunta por el bit correspondiente al valor almacenado en WB, si
es 1 el bit Carry se coloca en 1
BTST.Z Ws,Wb Se pregunta por el bit correspondiente al valor almacenado en WB, si
es 0 el bit Z se coloca en 1
BTSTS F,#bit4 Se pregunta por algún bit de un registro F, si es 0 se coloca en 1
BTSTS.C Ws, #bit4 Si el bit por el que se pregunta es 1 el bit Carry (RegistroSR<0>) se
coloca en 1 y el bit por el que se pregunta si está en 0 se coloca en 1
BTSTS.Z Ws,#bit4 Si el bit por el que se pregunta es 0 el bit Z (RegistroSR<1>) se
coloca en 1 y el bit por el que se pregunta si está en 0 se coloca en 1
FBCL Ws,Wnd Encuentra el número de bits que se deben escalar en el registro Ws
para obtener el máximo rango y se almacena en Wnd
FF1L Ws,Wnd Almacena en Wnd el número de posiciones que se tienen que contar
desde el bit más significativo hacia la izquierda para encontrar el
primer 1 en el registro Ws
FF1R Ws,Wnd Almacena en Wnd el número de posiciones que se tienen que contar
desde el bit menos significativo hacia la derecha para encontrar el
primer 1 en el registro Ws

Instrucciones de comparación y salto

Sintaxis Descripción
BTSC F,#bit4 Si un bit de F es 0, se salta la siguiente instrucción
BTSC Ws,#bit4 Si un bit de Ws es 0, se salta la siguiente instrucción
BTSS F,#bit4 Si un bit de F es 1, se salta la siguiente instrucción
BTSS Ws,#bit4 Si un bit de Ws es 1, se salta la siguiente instrucción
CP F Compara F-WREG
CP Wb,#lit5 Compara Wb-lit5
CP Wb,Ws Compara Wb-Ws
CP0 F Compara F-0x0000
CP0 Ws Compara Ws-0x0000
CPB F Compara con Borrow (F-WREG-C)
CPB Wb,#lit5 Compara con Borrow (Wb-lit5-C)
CPB Wb,Ws Compara con Borrow (Wb-Ws-C)
CPSEQ Wb,Wn Compara Wb con Wn, teniendo en cuenta el signo, y salta a la
siguiente instrucción si los dos son iguales
CPSGT Wb,Wn Compara Wb con Wn, teniendo en cuenta el signo, y salta a la
siguiente instrucción si Wb es mayor que Wn
CPSLT Wb,Wn Compara Wb con Wn, teniendo en cuenta el signo, y salta a la
siguiente instrucción si Wb es menor que Wn
CPSNE Wb,Wn Compara Wb con Wn, teniendo en cuenta el signo, y salta a la
siguiente instrucción si Wb no es igual a Wn

82 80
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

Instrucciones de flujo de programa

Sintaxis Descripción
BRA Expr Se va a lo que indique Expr (rutina, dirección sin ninguna) condición
BRA Wn Salta un número de instrucciones según el valor de Wn
BRA C, Expr Se va a lo que indique Expr si hay Carry en el resultado de la operación
anterior
BRA GE, Expr Se va a lo que indique Expr si en una comparación anterior es mayor o igual
BRA GEU, Expr Se va a lo que indique Expr si en una comparación anterior es mayor o igual
sin tener en cuenta el signo de los datos
BRA GT, Expr Se va a lo que indique Expr si en una comparación anterior es mayor
BRA GTU, Expr Se va a lo que indique Expr si en una comparación anterior es mayor sin tener
en cuenta el signo de los datos
BRA LE, Expr Se va a lo que indique Expr si en una comparación anterior es menor o igual
BRA LEU, Expr Se va a lo que indique Expr si en una comparación anterior es menor o igual
sin tener en cuenta el signo de los datos
BRA LT, Expr Se va a lo que indique Expr si en una comparación anterior es menor
BRA LTU, Expr Se va a lo que indique Expr si en una comparación anterior es menor sin tener
en cuenta el signo de los datos
BRA N, Expr Se va a lo que indique Expr si hay resultado negativo en la operación anterior
BRA NC, Expr Se va a lo que indique Expr si no hay Carry en el resultado de la operación
anterior
BRA NN, Expr Se va a lo que indique Expr si no hay un resultado negativo en la operación
anterior
BRA NOV, Expr Se va a lo que indique Expr si no ocurrió overflow en resultado de la
operación anterior
BRA NZ, Expr Se va a lo que indique Expr si el resultado de la operación anterior no es igual
a0
BRA OA, Expr Se va a lo que indique Expr si ocurrió overflow en el acumulador A por la
operación anterior
BRA OB, Expr Se va a lo que indique Expr si ocurrió overflow en el acumulador B por la
operación anterior
BRA OV, Expr Se va a lo que indique Expr si ocurrió overflow en resultado de la operación
anterior
BRA SA, Expr Se va a lo que indique Expr si el acumulador A se satura por la operación
anterior
BRA SB, Expr Se va a lo que indique Expr si el acumulador B se satura por la operación
anterior
BRA Z, Expr Se va a lo que indique Expr si el resultado de la operación anterior es igual a 0
CALL Expr Realiza el llamado a una subrutina
CALL Wn Realiza un llamado indirecto a una subrutna, de forma que se accede a una
dirección igual a la dirección actual más el valor almacenado en Wn
DO #lit14,Expr Se realiza el lazo DO de una rutina el número representado por lit14 + 1
DO Wn,Expr Se realiza el lazo DO de una rutina el número almacenado en Wn + 1
GOTO Expr Se va a lo que indique Expr, una dirección o una rutina
GOTO Wn Se va indirectamente a una dirección
RCALL Expr Realiza el llamado relativo a una subrutina donde sólo se toma en cuenta 32 k
de programa
RCALL Wn Realiza un llamado relativo indirecto a una subrutna
REPEAT #lit14 Se realiza un lazo repeat el número de veces presentado por lit14 + 1
REPEAT Wn Se realiza un lazo repeat el número de veces presentado por W + 1
RETFIE Se retorna desde una interrupción

81 83
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

RETLW #lit10,Wn Se retorna con lit10 en Wn


RETURN Se retorna desde una subrutina

Instrucciones para la pila

Sintaxis Descripción
POP F Se vuelve a almacenar el valor que tenía el registro F antes de un PUSH
POP Wd Se vuelve a almacenar el valor que tenía el registro Wd antes de un PUSH
POP.D Wnd Se vuelve almacenar el valor que tenía los registros Wnd: Wnd+1 antes de un
PUSH
POP.S Los valores almacenados en los registros shadow se almacenan de donde
fueron accedidos (W0-W3, TBLPAG, PSVPAG, y los bits N, OV, Z, C, DC
del registro SR)
PUSH F Se almacena en la pila según la dirección del puntero W15 el valor almacenado
en el registro F
PUSH Ws Se almacena en la pila según la dirección del puntero W15 el valor almacenado
en el registro Ws
PUSH.D Wns Se almacena en la pila según la dirección del puntero W15 el valor almacenado
en los registros Wns:Wns+1
PUSH.S Se almacena los valores de ciertos registros (W0-W3, TBLPAG, PSVPAG, y
los bits N, OV, Z, C, DC del registro SR) en registros shadow

Instrucciones de control

Sintaxis Descripción
CLRWDT Se coloca en 0 el Watchdog Timer
DISI #lit14 Deshabilitar interrupción por el número (lit14+1) de ciclos de
instrucción
NOP No se realiza ninguna operación
NOPR No se realiza ninguna operación
PWRSAV Coloca al dispositivo en modo SLEEP o modo IDLE
RESET Ocurre un Reset, el programa comienza desde el inicio

Instrucciones DSP

Sintaxis Descripción
ADD Acc Sumar acumuladores
ADD Ws,#slit4,Acc Adiciona 16 bits con signo, a Acc
CLR Acc,Wx,Wxd,Wy,Wyd,AWB Coloca en 0 el Acumulador, y almacena el valor
que apunta la dirección almacenada en Wx al
registro Wxd, almacena el valor que apunta la
dirección almacenada en Wy al registro Wyd, y
se almacena el valor del acumulador que no se
está utilizando a AWB (el cual es W13)
ED Wm*Wm,Acc,,Wx, ,Wy,Wxd Se realiza la resta entre dos valores, se eleva al
cuadrado y se almacena en el acumulador
EDAC Wm*Wm,Acc,,Wx, ,Wy,Wxd Se realiza la resta entre dos valores, se eleva al
cuadrado y se suma al valor que se encuentre en
el acumulador
LAC Ws,#slit4,Acc Se carga el valor del registro Ws en el
acumulador con corrimiento si es negativo slit4

84 82
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

es hacia la izquierda si es positivo hacia la


derecha
MAC Wm*Wn,Acc,,Wx ,Wxd,Wy,Wyd,AWB Multiplica el valor de dos registros de trabajo
(que suelen ser Wxd, Wyd) y suma el resultado al
que se encuentre en el acumulador, almacena el
valor que apunta la dirección almacenada en Wx
al registro Wxd, almacena el valor que apunta la
dirección almacenada en Wy al registro Wyd, y
se almacena el valor del acumulador que no se
está utilizando a AWB (el cual es W13)
MAC Wm*Wm,Acc,,Wx ,Wxd,Wy,Wyd Multiplica el valor de un registros de trabajo con
el mismo y suma el resultado al que se encuentre
en el acumulador, almacena el valor que apunta
la dirección almacenada en Wx al registro Wxd,
almacena el valor que apunta la dirección
almacenada en Wy al registro Wyd,
MOVSAC Acc,Wx,Wxd,Wy,Wyd,AWB Almacena el valor que apunta la dirección
almacenada en Wx al registro Wxd, almacena el
valor que apunta la dirección almacenada en Wy
al registro Wyd, y se almacena el valor del
acumulador que no se está utilizando a AWB (el
cual es W13)

MPY Wm*Wn,Acc,,Wx ,Wxd,Wy,Wyd Multiplica el valor de dos registros de trabajo


(que suelen ser Wxd, Wyd) y almacena el
resultado en el acumulador almacena el valor que
apunta la dirección almacenada en Wx al registro
Wxd, almacena el valor que apunta la dirección
almacenada en Wy al registro Wyd,
MPY Wm*Wm,Acc,,Wx ,Wxd,Wy,Wyd Multiplica el valor de un registros de trabajo con
el mismo y almacena el resultado en el
acumulador, almacena el valor que apunta la
dirección almacenada en Wx al registro Wxd,
almacena el valor que apunta la dirección
almacenada en Wy al registro Wyd,
MPY.N Wm*Wn,Acc,,Wx ,Wxd,Wy,Wyd Multiplica el valor de dos registros de trabajo
(que suelen ser Wxd, Wyd) y almacena el
resultado negado en el acumulador , almacena el
valor que apunta la dirección almacenada en Wx
al registro Wxd, almacena el valor que apunta la
dirección almacenada en Wy al registro Wyd,
MSC Wm*Wn,Acc,,Wx ,Wxd,Wy,Wyd,AWB Multiplica el valor de dos registros de trabajo
(que suelen ser Wxd, Wyd) y el valor del
acumulador se lo resta al resultado de la
multiplicación y esta resta se almacena en el
acumulador, almacena el valor que apunta la
dirección almacenada en Wx al registro Wxd,
almacena el valor que apunta la dirección
almacenada en Wy al registro Wyd, y se
almacena el valor del acumulador que no se está
utilizando a AWB (el cual es W13)
NEG Acc Niega el valor del acumulador
SAC Acc,#slit4,Wd Carga el valor del acumulador a un registro con

83 85
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

desplazamiento, si slit4 es negativo se desplaza a


la izquierda si es positivo a la derecha
SAC.R Acc,#slit4,Wd Carga el valor del acumulador a un registro con
desplazamiento y redondeo
SFTAC Acc,#slit6 Realiza corrimiento a los acumuladores de un
determinado número de bits, si este número es
negativo el corrimiento es hacia la izquierda, si es
positivo es hacia la derecha
SFTAC Acc,Wn Realiza corrimiento a los acumuladores del
número de bits que se almacena en Wn
SUB Acc Se resta el valor del acumulador del otro
acumulador

86 84
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

7. EJEMPLOS DE APLICACIÓN

EJEMPLO 7.1

4 Mhz
P0

MCLR L0
RB2 RF0
RB0 L1
P1
RC13 L2
d
RB3 s L3
P RD0 L4
P2 I RF1 L5
RF2
C
RB4 3 L6
P3 0 RF3 L7
RF4
F L8
RB5 3 RF5
0 RB1 L9
P4 1
RC14 4 RD1 L10

Figura 7.1. Diseño esquemático del ejemplo 7.1

RB0

Realizar el montaje del hardware usando resistencias de 1 KΩ y una alimentación de 5


voltios.

DELAY 1: Retardo de 1 segundo diseñado por bucles.


DELAY 2: Retardo de 3.5 segundos diseñado con el TIMER 2.
DELAY 3: Retardo de 2.5 segundos diseñado con el TIMER 3.
DELAY 4: Retardo de 10 segundos diseñado con el TIMER 1.
DELAY 5: Retardo de 4.5 segundos diseñado por bucles.

85 87
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

CONFIGURA PUERTOS Y REGISTROS

* INICIALIZA PUERTOS Y REGISTROS

ROTA UN LED ENCENDIDO (LOS DEMAS APAGADOS), DESDE L0 HASTA L9 CON DELAY 1

SI
¿RC14=0?

MANTIENE L10 ENCENDIDO POR


DELAY 2

MANTIENE L10 ENCENDIDO POR DELAY 3

DURANTE DELAY 4 Y EN TODO INSTANTE LOS LEDS L0 HASTA L4 MUESTRAN EL ESTADO


LOGICO CORRESPONDIENTE DESDE P0 HASTA P4 RESPECTIVAMENTE, DE TAL FORMA QUE SI SE
MODIFICAN DURANTE LOS 10 SEGUNDOS DE ESA FORMA SE VERAN EN LOS ESTADOS LOGICOS
INDICADORES, ES DECIR, EN LOS LEDS.

ENCIENDE ALTERNADAMENTE EL GRUPO DE LEDS DESDE L0 HASTA L5 CON EL GRUPO DE


LEDS DESDE L6 HASTA L10 DIEZ VECES (ENCENDER UN GRUPO Y LUEGO EL OTRO UNO A LA
VEZ) USANDO PARA ELLO DELAY 1.

SI
¿RC14=1?

USANDO
PARA
MANTIENE TODOS LOS LEDS
LLO ENCENDIDOS POR DELAY 5.
DELAY 1.
ENCIENDE Y APAGA SIMULTANEAMENTE L0 Y L10 (ESTO ES
UNA ACCION) DIEZ VECES USANDO DELAY 1.

SI
¿RC14=0?

USANDO
PARA NO
LLO
DELAY 1.
¿RB2=RB3?
SI .

*Los puertos y registros se inicializan en bajo.

Figura 7.2. Diagrama de flujo del ejemplo 7.1

88 86
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.1 BSET TRISB,#03


BSET TRISB,#04
BSET TRISB,#05
.INCLUDE "P30F3014.inc" BSET TRISC,#14
.EQU VALOR1,100 MOV #0X8030,W0
.EQU VALOR2,200 MOV W0,T1CON
.EQU VALOR3,17 MOV W0,T2CON
.EQU VALOR4,100 MOV W0,T3CON
.EQU VALOR5,200 CLR PORTF
.EQU VALOR6,74 CLR PORTB
.EQU VALOR7,10 CLR PORTD
.TEXT CLR PORTC
.GLOBAL __reset PASO1: BSET PORTF,#00
CALL DELAY1
__reset: MOV #0x0800,W15 BCLR PORTF,#00
MOV #0x08FE,W0 BSET PORTB,#00
MOV W0,SPLIM CALL DELAY1
GOTO INICIO BCLR PORTB,#00
BSET PORTC,#13
DELAY1: MOV #VALOR3,W3 CALL DELAY1
TRES: MOV #VALOR2,W2 BCLR PORTC,#13
DOS: MOV #VALOR1,W1 BSET PORTD,#00
UNO: DEC W1,W1 CALL DELAY1
BRA NZ,UNO BCLR PORTD,#00
DEC W2,W2 BSET PORTF,#01
BRA NZ,DOS CALL DELAY1
DEC W3,W3 BCLR PORTF,#01
BRA NZ,TRES NOP
RETURN BSET PORTF,#02
CALL DELAY1
DELAY2: MOV #13671 ,W0 BCLR PORTF,#02
CP TMR2 NOP
BRA NZ,DELAY2 BSET PORTF,#03
RETURN CALL DELAY1
BCLR PORTF,#03
DELAY3: MOV #9765,W0 NOP
CP TMR3 BSET PORTF,#04
BRA NZ,DELAY3 CALL DELAY1
RETURN BCLR PORTF,#04
NOP
DELAY5: MOV #VALOR6,W3 BSET PORTF,#05
TRESS: MOV #VALOR5,W2 CALL DELAY1
DOSS: MOV #VALOR4,W1 BCLR PORTF,#05
UNOO: DEC W1,W1 BSET PORTB,#01
BRA NZ,UNOO CALL DELAY1
DEC W2,W2 BCLR PORTB,#01
BRA NZ,DOSS BTSS PORTC,#14
DEC W3,W3 GOTO PASO3
BRA NZ,TRESS GOTO PASO2
RETURN
PASO3: BSET PORTD,#01
INICIO: MOV #0x003F,W0 CLR TMR2
MOV W0,ADPCFG CALL DELAY2
CLR TRISF BCLR PORTD,#01
BCLR TRISD,#00 CLR TMR1
BCLR TRISB,#00 GOTO PREGUNTA
BCLR TRISB,#01
BCLR TRISC,#13 PASO2: BSET PORTD,#01
BCLR TRISD,#01 CLR TMR3
BSET TRISB,#02 CALL DELAY3

87 89
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

BCLR PORTD,#01 BCLR PORTD,#01


CLR TMR1 ALTERNOO: MOV W10,W10
PREGUNTA: MOV #39062,W0 DEC W10,W10
CP TMR1 BRA NZ,ALTERNO2
BRA NZ,SCANEO SIGUIENTE: BTSC PORTC,#14
GOTO REINICIO GOTO PASO1
SIGUE: MOV #0XFFFF,W0
SCANEO: NOP MOV W0,PORTF
BTSC PORTB,#02 BSET PORTB,#00
GOTO ALTO1 NOP
BCLR PORTF,#00 BSET PORTB,#01
LED1: BTSC PORTB,#03 BSET PORTC,#13
GOTO ALTO2 BSET PORTD,#00
BCLR PORTB,#00 NOP
LED2: BTSC PORTB,#04 BSET PORTD,#01
GOTO ALTO3 CALL DELAY5
BCLR PORTC,#13 CLR PORTF
LED3: BTSC PORTB,#05 BCLR PORTB,#00
GOTO ALTO4 NOP
BCLR PORTD,#00 BCLR PORTB,#01
LED4: BTSC PORTC,#14 BCLR PORTC,#13
GOTO ALTO5 BCLR PORTD,#00
BCLR PORTF,#01 NOP
GOTO PREGUNTA BCLR PORTD,#01
MOV #VALOR7,W4
REINICIO: CLR PORTF BCLR PORTF,#00
CLR PORTB BCLR PORTD,#01
CLR PORTC SIMULTANEO: BSET PORTF,#00
CLR PORTD BSET PORTD,#01
MOV #VALOR7,W10 CALL DELAY1
ALTERNO2: BSET PORTF,#00 BCLR PORTF,#00
BSET PORTB,#00 BCLR PORTD,#01
BSET PORTC,#13 CALL DELAY1
BSET PORTD,#00 BSET PORTF,#00
BSET PORTF,#01 BSET PORTD,#01
NOP CALL DELAY1
BSET PORTF,#02 BCLR PORTF,#00
CALL DELAY1 BCLR PORTD,#01
BCLR PORTF,#00 CALL DELAY1
BCLR PORTB,#00 BSET PORTF,#00
BCLR PORTC,#13 BSET PORTD,#01
BCLR PORTD,#00 CALL DELAY1
BCLR PORTF,#01 BCLR PORTF,#00
NOP BCLR PORTD,#01
BCLR PORTF,#02 CALL DELAY1
NOP BSET PORTF,#00
BSET PORTF,#03 BSET PORTD,#01
NOP CALL DELAY1
BSET PORTF,#04 BCLR PORTF,#00
NOP BCLR PORTD,#01
BSET PORTF,#05 CALL DELAY1
BSET PORTB,#01 BSET PORTF,#00
BSET PORTD,#01 BSET PORTD,#01
CALL DELAY1 CALL DELAY1
BCLR PORTF,#03 BCLR PORTF,#00
NOP BCLR PORTD,#01
BCLR PORTF,#04 CALL DELAY1
NOP BSET PORTF,#00
BCLR PORTF,#05 BSET PORTD,#01
BCLR PORTB,#01 CALL DELAY1

90 88
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

BCLR PORTF,#00
BCLR PORTD,#01
CALL DELAY1
BSET PORTF,#00
BSET PORTD,#01
CALL DELAY1
BCLR PORTF,#00
BCLR PORTD,#01
CALL DELAY1
BSET PORTD,#01
BSET PORTF,#00
CALL DELAY1
BCLR PORTF,#00
BCLR PORTD,#01
CALL DELAY1
BSET PORTF,#00
BSET PORTD,#01
CALL DELAY1
BCLR PORTF,#00
BCLR PORTD,#01
CALL DELAY1
BSET PORTF,#00
BSET PORTD,#01
CALL DELAY1
BCLR PORTF,#00
BCLR PORTD,#01
CALL DELAY1
ULTIMA: BTSC PORTC,#14
GOTO COMP15
GOTO PASO1

COMP15: BTSC PORTB,#02


GOTO PREGUNTA1
BTSC PORTB,#03
GOTO PASO1
GOTO COMP15

PREGUNTA1: BTSC PORTB,#03


GOTO COMP15
GOTO PASO1

ALTO1: BSET PORTF,#00


GOTO LED1

ALTO2: BSET PORTB,#00


GOTO LED2

ALTO3: BSET PORTC,#13


GOTO LED3

ALTO4: BSET PORTD,#00


GOTO LED4

ALTO5: BSET PORTF,#01


GOTO PREGUNTA

.END

89 91
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.2

4 Mhz
P0

MCLR L0
RC13 RC14
L1
P1 d RD1
s RF3 L2
RD0 P
L3
I RF4
P2 C RF5 L4
3 RB0 L5
RF0 0 L6
P3 F RB1
L7
3 RB2
RF1 0 RB3 L8
1 RF2 L9
4

Figura 7.3. Diseño esquemático del ejemplo 7.2

RB0

Realizar el montaje del hardware usando resistencias de 1 KΩ y una alimentación de 5


voltios.

DELAY 1: Retardo de 1 segundo diseñado por bucles.


DELAY 2: Retardo de 5 segundos diseñado con el TIMER 1.
DELAY 3: Retardo de 12 segundos diseñado con el TIMER 2.
DELAY 4: Retardo de 7.2 segundos diseñado con el TIMER 3.

92 90
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

CONFIGURA PUERTOS Y REGISTROS

* INICIALIZA PUERTOS Y REGISTROS

PRENDE Y APAGA TODOS LOS LEDS DIEZ VECES CON DELAY 1 (DIEZ
VECES APAGADO Y DIEZ VECES ENCENDIDO)

SI MANTIENE L4 Y L5 ENCENDIDOS
¿RC13=0?
POR DELAY 2.

ENCIENDE L0 Y L9 POR DELAY 2 E INICIALIZA LA


TEMPORIZACION DELAY3

SI NO
¿RD0=RF0?
¿TERMINÓ DELAY 3?

MANTIENE ENCENDIDOS TODOS LOS LEDS POR DELAY 2.

ROTA UN LED ENCENDIDO DESDE L0 SI


¿RF1=1?
HASTA L9 CON DELAY 1.

ROTA UN LED ENCENDIDO DESDE L9 HASTA L0 CON DELAY 1.

SI
ENCIENDE DESDE L5 HASTA L9 TODO ¿RD0=1?
EL GRUPO POR DELAY 4.

ENCIENDE DESDE L0 HASTA L4 TODO EL


GRUPO POR DELAY 4.

TOMA LOS LEDS DESDE L0 HASTA L4 PARA REALIZAR UN INCREMENTO BINARIO DESDE 00000
HASTA 11111 CON DELAY 1 ENTRE CADA INCREMENTO, SIENDO L0 EL BIT MENOS SIGNIFICATIVO.

SI
¿RD0=1?
.

*Los puertos se inicializan en bajo

Figura 7.4. Diagrama de flujo del ejemplo 7.2

91 93
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.2 MOV #0XFFFF,W0


MOV W0,PORTB
BSET PORTF,#02
.INCLUDE "P30F3014.INC" NOP
.EQU VALOR1,0X70 BSET PORTF,#03
.EQU VALOR2,0X25 NOP
.EQU VALOR3,0X50 BSET PORTF,#04
.TEXT NOP
.GLOBAL __reset BSET PORTF,#05
CALL DELAY1
__reset: MOV #0X800,W15 BCLR PORTC,#14
MOV #0X8FE,W0 BCLR PORTD,#01
MOV W0,SPLIM CLR PORTB
GOTO INICIO BCLR PORTF,#02
NOP
DELAY1: MOV #VALOR3,W3 BCLR PORTF,#03
TRES: MOV #VALOR2,W2 NOP
DOS: MOV #VALOR1,W1 BCLR PORTF,#04
UNO: DEC W1,W1 NOP
BRA NZ,UNO BCLR PORTF,#05
DEC W2,W2 CALL DELAY1
BRA NZ,DOS DEC W11,W11
DEC W3,W3 BRA NZ,PREND
BRA NZ,TRES BTSS PORTC,#13
RETURN GOTO MANTENER
SGDO: BSET PORTC,#14
DELAY2: MOV #19531,W0 BSET PORTF,#02
CP TMR1 CLR TMR1
BRA NZ,DELAY2 CALL DELAY2
RETURN CLR TMR2
BCLR PORTC,#14
DELAY3: MOV #46875,W0 BCLR PORTF,#02
CP TMR2 OTRA: MOV PORTD,W0
BRA Z,TODOS AND #0B0001,W0
GOTO OTRA MOV PORTF,W1
AND #0B0001,W1
DELAY4: MOV #28125,W0 CP W0,W1
CP TMR3 BRA Z,DELAY3
BRA NZ,DELAY4 TODOS: BSET PORTC,#14
RETURN BSET PORTD,#01
MOV #0XFFFF,W0
INICIO: MOV #0X3F,W0 MOV W0,PORTB
MOV W0,ADPCFG BSET PORTF,#02
CLR TRISB NOP
MOV #0X2000,W0 BSET PORTF,#03
MOV W0,TRISC NOP
MOV #0X0001,W0 BSET PORTF,#04
MOV W0,TRISD NOP
MOV #0X0003,W0 BSET PORTF,#05
MOV W0,TRISF CLR TMR1
MOV #0XA,W11 CALL DELAY2
MOV #0X8030,W0 BCLR PORTC,#14
MOV W0,T1CON BCLR PORTD,#01
MOV W0,T2CON CLR PORTB
MOV W0,T3CON BCLR PORTF,#02
BCLR PORTC,#13 NOP
BCLR PORTD,#00 BCLR PORTF,#03
CLR PORTF NOP
PREND: BSET PORTC,#14 BCLR PORTF,#04
BSET PORTD,#01 NOP

94 92
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

BCLR PORTF,#05 BCLR PORTF,#05


ROTASUBE: BTSS PORTF,#01 NOP
GOTO ROTABAJA BSET PORTF,#04
BSET PORTC,#14 CALL DELAY1
CALL DELAY1 BCLR PORTF,#04
BCLR PORTC,#14 NOP
BSET PORTD,#01 BSET PORTF,#03
CALL DELAY1 CALL DELAY1
BCLR PORTD,#01 BCLR PORTF,#03
BSET PORTF,#03 BSET PORTD,#01
CALL DELAY1 CALL DELAY1
BCLR PORTF,#03 BCLR PORTD,#01
NOP BSET PORTC,#14
BSET PORTF,#04 CALL DELAY1
CALL DELAY1 BCLR PORTC,#14
BCLR PORTF,#04 SIGUE: BTSS PORTD,#00
NOP GOTO MENORES
BSET PORTF,#05 MOV #0XFFFF,W0
CALL DELAY1 MOV W0,PORTB
BCLR PORTF,#05 BSET PORTF,#02
BSET PORTB,#00 CLR TMR3
CALL DELAY1 CALL DELAY4
BCLR PORTB,#00 CLR PORTB
NOP BCLR PORTF,#02
BSET PORTB,#01 GOTO ULTIMO
CALL DELAY1
BCLR PORTB,#01 MENORES: BSET PORTC,#14
NOP BSET PORTD,#01
BSET PORTB,#02 BSET PORTF,#03
CALL DELAY1 NOP
BCLR PORTB,#02 BSET PORTF,#04
NOP NOP
BSET PORTB,#03 BSET PORTF,#05
CALL DELAY1 CLR TMR3
BCLR PORTB,#03 CALL DELAY4
BSET PORTF,#02 BCLR PORTC,#14
CALL DELAY1 BCLR PORTD,#01
BCLR PORTF,#02 BCLR PORTF,#03
GOTO SIGUE NOP
BCLR PORTF,#04
ROTABAJA: BSET PORTF,#02 NOP
CALL DELAY1 BCLR PORTF,#05
BCLR PORTF,#02 GOTO ULTIMO
BSET PORTB,#03
CALL DELAY1 MANTENER: BSET PORTF,#05
BCLR PORTB,#03 BSET PORTB,#00
NOP CLR TMR1
BSET PORTB,#02 CALL DELAY2
CALL DELAY1 BCLR PORTF,#05
BCLR PORTB,#02 BCLR PORTB,#00
NOP MOV #0XA,W11
BSET PORTB,#01 GOTO PREND
CALL DELAY1
BCLR PORTB,#01 ULTIMO: CALL DELAY1
NOP BSET PORTC,#14
BSET PORTB,#00 CALL DELAY1
CALL DELAY1 BCLR PORTC,#14
BCLR PORTB,#00 BSET PORTD,#01
BSET PORTF,#05 CALL DELAY1
CALL DELAY1 BSET PORTC,#14

93 95
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

CALL DELAY1 BSET PORTC,#14


BCLR PORTC,#14 CALL DELAY1
BCLR PORTD,#01 BCLR PORTC,#14
BSET PORTF,#03 BCLR PORTD,#01
CALL DELAY1 BCLR PORTF,#03
BSET PORTC,#14 NOP
CALL DELAY1 BSET PORTF,#04
BCLR PORTC,#14 CALL DELAY1
BSET PORTD,#01 BSET PORTC,#14
CALL DELAY1 CALL DELAY1
BSET PORTC,#14 BCLR PORTC,#14
CALL DELAY1 BSET PORTD,#01
BCLR PORTC,#14 CALL DELAY1
BCLR PORTD,#01 BSET PORTC,#14
BCLR PORTF,#03 CALL DELAY1
NOP BCLR PORTC,#14
BSET PORTF,#04 BCLR PORTD,#01
CALL DELAY1 BSET PORTF,#03
BSET PORTC,#14 CALL DELAY1
CALL DELAY1 BSET PORTC,#14
BCLR PORTC,#14 CALL DELAY1
BSET PORTD,#01 BCLR PORTC,#14
CALL DELAY1 BSET PORTD,#01
BSET PORTC,#14 CALL DELAY1
CALL DELAY1 BSET PORTC,#14
BCLR PORTC,#14 CALL DELAY1
BCLR PORTD,#01 BCLR PORTC,#14
BSET PORTF,#03 BCLR PORTD,#01
CALL DELAY1 BCLR PORTF,#03
BSET PORTC,#14 NOP
CALL DELAY1 BCLR PORTF,#04
BCLR PORTC,#14 NOP
BSET PORTD,#01 BCLR PORTF,#05
CALL DELAY1 LAULTIMA: BTSC PORTD,#00
BSET PORTC,#14 GOTO LAULTIMA
CALL DELAY1 MOV #0XA,W11
BCLR PORTC,#14 GOTO PREND
BCLR PORTD,#01
BCLR PORTF,#03 .END
NOP
BCLR PORTF,#04
NOP
BSET PORTF,#05
CALL DELAY1
BSET PORTC,#14
CALL DELAY1
BCLR PORTC,#14
BSET PORTD,#01
CALL DELAY1
BSET PORTC,#14
CALL DELAY1
BCLR PORTC,#14
BCLR PORTD,#01
BSET PORTF,#03
CALL DELAY1
BSET PORTC,#14
CALL DELAY1
BCLR PORTC,#14
BSET PORTD,#01
CALL DELAY1

96 94
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.3

4 Mhz
P1 P8
MCLR
RB0 RB1
P2 P7
d
RB2 s RB3
P3 P
I P6
RC13
C RF0
L1 3 L8
RB4 RC14
L2 0 L7
RF1 RF4
L3 F
RB5 3 RD0 L6
P5 0
1
RD1 4
P4 RF3 RF5 RF2

L4 L5

Figura 7.5. Diseño esquemático del ejemplo 7.3

Realizar el montaje del hardware usando resistencias de 1 KΩ y una alimentación de 5


voltios.

DELAY 1: Temporización de 3.84 segundos diseñada con el TIMER 1.


DELAY 2: Temporización de 1 segundo diseñada con el TIMER 1.
DELAY 3: Temporización de 2.5 segundos diseñada con el TIMER 2.
DELAY 4: Temporización de 1.5 segundos diseñada con el TIMER 3.

Para el proceso 2:

*Oscila con delay 1 (cambia su valor lógico cada delay 1)


**Oscila con delay 2.

Para el proceso 3:

*Oscila con delay 4.

95 97
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

/MCLR L1/ P1 L2/ (P2 P3) L3/ P3 L1/ P1 L2/ (P2 P3)

MCLR P1 P2 P3 P1
0 1 2 3 4 5

( P2 V P3)
P3 L1 / P2 L3/ P1
P2 L3/ P2 L2/ P3

P3 P2 P1
9 8 7 6

/MCLR L5/ (P5 DELAY 1) *L4/ P4 L4/ P4


/ DELAY 1 **L5/ P5

MCLR DELAY 1 P5 P4 P5
0 1 2 3 5
4

/ P5
DELAY 1 P4

DELAY 1 / DELAY 1 L5/ P4


(L4 L5)/ DELAY 1 L4/ DELAY 1
6

DELAY 1 P5
DELAY 1 P4
10 9 8 7

/MCLR
(L6 L7)/ DELAY 3 L8/ DELAY 3 (L8 L6)/ DELAY 3 (L8 L7)/ DELAY 3 (L8 L7 L6)/ (DELAY 3 P6)

*L7/ P7
1 MCLR DELAY 3 DELAY 3 DELAY 3 DELAY 3
1 2 3 4 5 P6

L7/ DELAY 3 L6/ DELAY 3 6


/F
P8
DELAY 3 DELAY 3

DELAY 3 DELAY 3 P7
9 8 7

F= (DELAY3 P8)

Figura 7.6. Diagrama de transición de estados del Ejemplo 7.3

98 96
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.3 GOTO E9_P1

SCAN2: BTSC RIEP2,#1


.INCLUDE "P30F3014.INC" GOTO E1_P2
.EQU RIEP1,#0X0800 BTSC RIEP2,#2
.EQU RIEP2,#0X0802 GOTO E2_P2
.EQU RIEP3,#0X0804 BTSC RIEP2,#3
.TEXT GOTO E3_P2
.GLOBAL __reset BTSC RIEP2,#4
GOTO E4_P2
__reset: MOV #0X0806,W15 BTSC RIEP2,#5
MOV #0X08FE,W0 GOTO E5_P2
MOV W0,SPLIM BTSC RIEP2,#6
GOTO INICIO GOTO E6_P2
BTSC RIEP2,#7
INICIO: MOV #0X3F,W0 GOTO E7_P2
MOV W0,ADPCFG BTSC RIEP2,#8
MOV #0X000F,W0 GOTO E8_P2
MOV W0,TRISB BTSC RIEP2,#9
MOV #0X200,W0 GOTO E9_P2
MOV W0,TRISC GOTO E10_P2
MOV #0B10,W0
MOV W0,TRISD SCAN3: BTSC RIEP3,#1
MOV #0X0005,W0 GOTO E1_P3
MOV W0,TRISF BTSC RIEP3,#2
MOV #0X8020,W0 GOTO E2_P3
MOV W0,T1CON BTSC RIEP3,#3
MOV W0,T2CON GOTO E3_P3
MOV W0,T3CON BTSC RIEP3,#4
CLR PORTB GOTO E4_P3
CLR PORTC BTSC RIEP3,#5
CLR PORTD GOTO E5_P3
CLR PORTF BTSC RIEP3,#6
CLR RIEP1 GOTO E6_P3
CLR RIEP2 BTSC RIEP3,#7
CLR RIEP3 GOTO E7_P3
CLR TMR1 BTSC RIEP3,#8
CLR TMR2 GOTO E8_P3
BSET PORTB,#04 GOTO E9_P3
BSET RIEP1,#01
BSET RIEP2,#01 E1_P1: BTSC PORTB,#00
BSET PORTD,#00 GOTO SCAN2
BSET PORTF,#04 T1_2_P1: BCLR PORTB,#04
BSET RIEP3,#01 BSET PORTF,#01
SCAN1: BTSC RIEP1,#1 BCLR RIEP1,#1
GOTO E1_P1 NOP
BTSC RIEP1,#2 BSET RIEP1,#2
GOTO E2_P1 GOTO SCAN2
BTSC RIEP1,#3
GOTO E3_P1 E2_P1: BTSS PORTB,#02
BTSC RIEP1,#4 GOTO T2_3_P1
GOTO E4_P1 BTSC PORTC,#13
BTSC RIEP1,#5 GOTO SCAN2
GOTO E5_P1 GOTO T2_7_P1
BTSC RIEP1,#6
GOTO E6_P1 T2_3_P1: BCLR PORTF,#01
BTSC RIEP1,#7 BSET PORTB,#05
GOTO E7_P1 BCLR RIEP1,#2
BTSC RIEP1,#8 NOP
GOTO E8_P1 BSET RIEP1,#3

97 99
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

GOTO SCAN2 T8_9_P1: BCLR PORTF,#01


BSET PORTB,#05
T2_7_P1: BCLR PORTF,#01 BCLR RIEP1,#8
BSET PORTB,#04 NOP
BCLR RIEP1,#2 BSET RIEP1,#9
NOP GOTO SCAN2
BSET RIEP1,#7
GOTO SCAN2 E9_P1: BTSC PORTB,#02
GOTO SCAN2
E3_P1: BTSC PORTC,#13 T9_1_P1: BCLR PORTB,#05
GOTO SCAN2 NOP
T3_4_P1: BCLR PORTB,#05 BSET PORTB,#04
NOP BCLR RIEP1,#9
BSET PORTB,#04 NOP
BCLR RIEP1,#3 BSET RIEP1,#1
NOP GOTO SCAN2
BSET RIEP1,#4
GOTO SCAN2 E1_P2: MOV #60000,W0
CP TMR1
E4_P1: BTSC PORTB,#00 BRA Z,T1_2_P2
GOTO SCAN2 GOTO SCAN3
T4_5_P1: BCLR PORTB,#04
BSET PORTF,#01 T1_2_P2: CLR TMR1
BCLR RIEP1,#4 BSET PORTF,#02
NOP BCLR RIEP2,#1
BSET RIEP1,#5 NOP
GOTO SCAN2 BSET RIEP2,#2
GOTO SCAN3
E5_P1: BTSS PORTB,#02
GOTO T5_6_P1 E2_P2: BTSS PORTD,#01
BTSC PORTC,#13 GOTO T2_3_P2
GOTO SCAN2 PREGUNTA1: MOV #60000,W0
T5_6_P1: BCLR PORTF,#01 CP TMR1
BSET PORTB,#05 BRA Z,T2_9_P2
BCLR RIEP1,#5 GOTO SCAN3
NOP
BSET RIEP1,#6 T2_3_P2: BCLR PORTF,#02
GOTO SCAN2 NOP
BSET PORTF,#05
E6_P1: BTSC PORTB,#00 CLR TMR1
GOTO SCAN2 BCLR RIEP2,#2
T6_7_P1: BCLR PORTB,#05 NOP
NOP BSET RIEP2,#3
BSET PORTB,#04 GOTO SCAN3
BCLR RIEP1,#6
NOP T2_9_P2: CLR TMR1
BSET RIEP1,#7 BCLR PORTF,#02
GOTO SCAN2 NOP
BSET PORTF,#05
E7_P1: BTSC PORTB,#02 BCLR RIEP2,#2
GOTO SCAN2 NOP
T7_8_P1: BCLR PORTB,#04 BSET RIEP2,#9
BSET PORTF,#01 GOTO SCAN3
BCLR RIEP1,#7
NOP E3_P2: BTSC PORTF,#03
BSET RIEP1,#8 GOTO PREG2
GOTO SCAN2 T3_4_P2: BCLR PORTF,#05
NOP
E8_P1: BTSC PORTC,#13 BSET PORTF,#02
GOTO SCAN2 CLR TMR1

100 98
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

BCLR RIEP2,#3 T7_8_P2: BCLR PORTF,#02


NOP BCLR RIEP2,#7
BSET RIEP2,#4 NOP
GOTO SCAN3 BSET RIEP2,#8
CLR TMR1
PREG2: MOV #60000,W0 GOTO SCAN3
CP TMR1
BRA Z,PREG3 E8_P2: MOV #60000,W0
GOTO SCAN3 CP TMR1
BRA Z,T8_9_P2
PREG3: CLR TMR1 GOTO SCAN3
BTSC PORTF,#05
GOTO CLAREARL4 T8_9_P2: BSET PORTF,#05
BSET PORTF,#05 BCLR RIEP2,#8
GOTO SCAN3 NOP
CLAREARL4: BCLR PORTF,#05 BSET RIEP2,#9
GOTO SCAN3 CLR TMR1
GOTO SCAN3
E4_P2: BTSC PORTD,#01
GOTO PREG4 E9_P2: MOV #60000,W0
T4_5_P2: BCLR PORTF,#02 CP TMR1
NOP BRA Z,T9_10_P2
BSET PORTF,#05 GOTO SCAN3
BCLR RIEP2,#4
NOP T9_10_P2: CLR TMR1
BSET RIEP2,#5 BSET PORTF,#02
GOTO SCAN3 BCLR RIEP2,#9
NOP
PREG4: MOV #15625,W0 BSET RIEP2,#10
CP TMR1 GOTO SCAN3
BRA Z,PREG5
GOTO SCAN3 E10_P2: MOV #60000,W0
CP TMR1
PREG5: CLR TMR1 BRA Z,T10_1_P2
BTSC PORTF,#02 GOTO SCAN3
GOTO CLAREARL5
BSET PORTF,#02 T10_1_P2: BCLR PORTF,#05
GOTO SCAN3 NOP
BCLR PORTF,#02
CLAREARL5: BCLR PORTF,#02 BCLR RIEP2,#10
GOTO SCAN3 NOP
BSET RIEP2,#1
E5_P2: BTSC PORTF,#03 GOTO SCAN3
GOTO SCAN3
T5_6_P2: BCLR PORTF,#05 E1_P3: MOV #39062,W0
BCLR RIEP2,#5 CP TMR2
NOP BRA Z,T1_2_P3
BSET RIEP2,#6 GOTO SCAN1
GOTO SCAN3
T1_2_P3: CLR TMR2
E6_P2: BTSC PORTD,#01 BCLR PORTD,#00
GOTO SCAN3 BCLR PORTF,#04
T6_7_P2: BSET PORTF,#02 BSET PORTC,#14
BCLR RIEP2,#6 BCLR RIEP3,#1
NOP NOP
BSET RIEP2,#7 BSET RIEP3,#2
GOTO SCAN3 GOTO SCAN1

E7_P2: BTSC PORTF,#03 E2_P3: MOV #39062,W0


GOTO SCAN3 CP TMR2

99 101
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

BRA Z,T2_3_P3
GOTO SCAN1 E6_P3: BTSS PORTB,#03
GOTO T6_7_P3
T2_3_P3: CLR TMR2 GOTO PREG7
BSET PORTD,#00
BCLR RIEP3,#2 T6_7_P3: CLR TMR2
NOP BCLR PORTF,#04
BSET RIEP3,#3 BCLR RIEP3,#6
GOTO SCAN1 NOP
BSET RIEP3,#7
E3_P3: MOV #39062,W0 GOTO SCAN1
CP TMR2
BRA Z,T3_4_P3 PREG7: MOV #23438,W0
GOTO SCAN1 CP TMR3
BRA Z,PREG8
T3_4_P3: CLR TMR2 GOTO SCAN1
BCLR PORTD,#00
BSET PORTF,#04 PREG8: CLR TMR3
BCLR RIEP3,#3 BTSC PORTF,#04
NOP GOTO CLAREARL7
BSET RIEP3,#4 BSET PORTF,#04
GOTO SCAN1 GOTO SCAN1

E4_P3: MOV #39062,W0 CLAREARL7: BCLR PORTF,#04


CP TMR2 GOTO SCAN1
BRA Z,T4_5_P3
GOTO SCAN1 E7_P3: MOV #39062,W0
CP TMR2
T4_5_P3: CLR TMR2 BRA Z,T7_8_P3
BSET PORTD,#00 BTSC PORTB,#01
BCLR RIEP3,#4 GOTO SCAN1
NOP T7_5_P3: CLR TMR2
BSET RIEP3,#5 BSET PORTD,#00
GOTO SCAN1 BSET PORTF,#04
BSET PORTC,#14
E5_P3: BTSS PORTF,#00 BCLR RIEP3,#7
GOTO T5_6_P3 NOP
GOTO PREG6 BSET RIEP3,#5
GOTO SCAN1
T5_6_P3: CLR TMR3
BCLR PORTD,#00 T7_8_P3: CLR TMR2
BCLR PORTC,#14 BSET PORTD,#00
BCLR RIEP3,#5 BCLR RIEP3,#7
NOP NOP
BSET RIEP3,#6 BSET RIEP3,#8
GOTO SCAN1 GOTO SCAN1

PREG6: MOV #39062,W0 E8_P3: MOV #39062,W0


CP TMR2 CP TMR2
BRA Z,T5_7_P3 BRA Z,T8_9_P3
GOTO SCAN1 GOTO SCAN1

T5_7_P3: CLR TMR2 T8_9_P3: CLR TMR2


BCLR PORTD,#00 BCLR PORTD,#00
BCLR PORTF,#04 BSET PORTF,#04
BCLR PORTC,#14 BCLR RIEP3,#8
BCLR RIEP3,#5 NOP
NOP BSET RIEP3,#9
BSET RIEP3,#7 GOTO SCAN1
GOTO SCAN1

102 100
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

E9_P3: MOV #39062,W0


CP TMR2
BRA Z,T9_1_P3
GOTO SCAN1

T9_1_P3: CLR TMR2


BSET PORTD,#00
BCLR RIEP3,#9
NOP
BSET RIEP3,#1
GOTO SCAN1

.END

101 103
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.4

4 Mhz
P1 P8
MCLR
RB0 RD1
P2 d P7
RB1 s RD0
P
P3 I P6
RB2 C RC14
L1 3 L8
RB3 0 RC13
L2 RB4 L7
F RF5
L3
RB5 3 L6
RF4
0
P5 1
RF1 4

P4 RF0 RF2 RF3

L4 L5

Figura 7.7. Diseño esquemático del ejemplo 7.4

Realizar el montaje del hardware usando resistencias de 1 KΩ y una alimentación de 5


voltios.

DELAY 1: Temporización de 1 segundo diseñada con el TIMER 1.


DELAY 2: Temporización de 1.5 segundos diseñada con el TIMER 1.
DELAY 3: Temporización de 2.7 segundos diseñada con el TIMER 1.
DELAY 4: Temporización de 3.3 segundos diseñada con el TIMER 1.
DELAY 5: Temporización de 4.2 segundos diseñada con el TIMER 1.
DELAY 6: Temporización de 2.4 segundos diseñada con el TIMER 2.
DELAY 7: Temporización de 0.5 segundos diseñada con el TIMER 3.

Para el proceso 1:

*Oscila con delay 6 (cambia su valor lógico cada delay 6)


**Cambian alternadamente cada delay 7.

104 102
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

/MCLR *L1/ (P1V P2) *L2/ (P3 V P1) *L3/ P2 **( L1 L2)/ P3 **(L1 L3)/ P1

MCLR P1 P2 P3 P1 P2 P3
0 1 2 3 4 5

**(L1 L2 L3)/ P3 **(L2 L3)/ P2 P1


P3

P2
7 6

/MCLR L4/ (DELAY 2 P4) L5/ (DELAY 2 P5) L4/ (DELAY 3 P4)
L4/ (DELAY 1 P4) L5/ (P5 DELAY 1)

MCLR DELAY 1 V P4 DELAY 1 V P5 DELAY 2 V P4 DELAY 2 V P5


0 1 2 3 4 5

DELAY 3 V P4 L5/ (DELAY 3 P5)

DELAY 5 V P4
L5/ (DELAY 5 P4) L4/ (DELAY 5 P4) L5/ (DELAY 4 P5) L4/ (DELAY 4 P4)
6

DELAY 4 V P4 DELAY 3 V P5
DELAY 5 V P4 DELAY 4 V P5
10 9 8 7

/MCLR (L7 L6)/ (P6 P7)


/ P6 L6/ P7 L7/ P8 L8/ (P6 V P8)

1 MCLR P6 P7 P8 P6 V P7
1 2 3 4 5

(L8 L7 L6)/ P7 (L8 L7)/ (P6 V P8) (L8 L6)/ P7

P6 P8
P7
P6 P8 P7
8 7 6

Figura 7.8. Diagrama de transición de estados del Ejemplo 7.4

103 105
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.4 BTSC RIEP1,#07


GOTO E07_P1
FALLA: BSET PORTB,#03
.INCLUDE "P30F3014.INC" NOP
.EQU RIEP1,0X0800 BSET PORTB,#04
.EQU RIEP2,0X0802 NOP
.EQU RIEP22,0X0806 BSET PORTB,#05
.EQU RIEP3,0X0804 GOTO SCAN2
.EQU RIEP32,0X0808
.TEXT SCAN2: BTSC RIEP2,#01
.GLOBAL __reset GOTO E01_P2
BTSC RIEP2,#02
__reset: MOV #0X080A,W15 GOTO E02_P2
MOV #0X08FE,W0 BTSC RIEP2,#03
MOV W0,SPLIM GOTO E03_P2
GOTO INICIO BTSC RIEP2,#04
GOTO E04_P2
INICIO: MOV #0X003F,W0 BTSC RIEP2,#05
MOV W0,ADPCFG GOTO E05_P2
MOV #0X0007,W0 BTSC RIEP2,#06
MOV W0,TRISB GOTO E06_P2
MOV #0X0003,W0 BTSC RIEP2,#07
MOV W0,TRISF GOTO E07_P2
MOV #0X4000,W0 BTSC RIEP22,#00
MOV W0,TRISC GOTO E08_P2
MOV #0X0003,W0 BTSC RIEP22,#01
MOV W0,TRISD GOTO E09_P2
MOV #0X8020,W0 GOTO E10_P2
MOV W0,T2CON
MOV W0,T3CON SCAN3: BTSC RIEP3,#01
MOV #0X8030,W0 GOTO E01_P3
MOV W0,T1CON BTSC RIEP3,#02
CLR PORTB GOTO E02_P3
CLR PORTF BTSC RIEP3,#03
CLR PORTC GOTO E03_P3
CLR PORTD BTSC RIEP3,#04
CLR RIEP1 GOTO E04_P3
CLR RIEP2 BTSC RIEP3,#05
CLR RIEP22 GOTO E05_P3
CLR RIEP3 BTSC RIEP3,#06
CLR RIEP32 GOTO E06_P3
BSET PORTB,#03 BTSC RIEP3,#07
BSET RIEP1,#01 GOTO E07_P3
CLR TMR2 GOTO E08_P3
BSET PORTF,#02
BSET RIEP2,#01 E01_P1: BTSC PORTB,#00
CLR TMR1 GOTO PREG1_P1
BSET RIEP3,#01 BTSS PORTB,#01
SCAN1: BTSC RIEP1,#01 GOTO T_1_2_P1
GOTO E01_P1 GOTO PREG1_P1
BTSC RIEP1,#02
GOTO E02_P1 T_1_2_P1: BCLR PORTB, #03
BTSC RIEP1,#03 NOP
GOTO E03_P1 BSET PORTB,#04
BTSC RIEP1,#04 BCLR RIEP1,#01
GOTO E04_P1 NOP
BTSC RIEP1,#05 BSET RIEP1,#02
GOTO E05_P1 CLR TMR2
BTSC RIEP1,#06 GOTO SCAN2
GOTO E06_P1

106 104
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

PREG1_P1: MOV #37500,W0 GOTO SCAN2


CP TMR2
BRA NZ,SCAN2 SETEOL3: BSET PORTB,#05
CLR TMR2 GOTO SCAN2
BTSS PORTB,#03
GOTO SETEOL1 E04_P1: BTSS PORTB,#02
BCLR PORTB,#03 GOTO T_4_5_P1
CLR TMR2 GOTO PREG4_P1
GOTO SCAN2
T_4_5_P1: BCLR PORTB,#04
SETEOL1: BSET PORTB,#03 NOP
GOTO SCAN2 BSET PORTB,#03
BCLR RIEP1,#04
E02_P1: BTSC PORTB,#00 NOP
GOTO PREG2_P1 BSET RIEP1,#05
BTSC PORTB,#02 CLR TMR3
GOTO T_2_3_P1 GOTO SCAN2
GOTO PREG2_P1
PREG4_P1: MOV #7813,W0
T_2_3_P1: BCLR PORTB,#04 CP TMR3
NOP BRA NZ,SCAN2
BSET PORTB,#05 CLR TMR3
BCLR RIEP1,#02 BTSC PORTB,#03
NOP GOTO OFFL1ONL2
BSET RIEP1,#03 BCLR PORTB,#04
CLR TMR2 NOP
GOTO SCAN2 BSET PORTB,#03
GOTO SCAN2
PREG2_P1: MOV #37500,W0
CP TMR2 OFFL1ONL2: BCLR PORTB,#03
BRA NZ,SCAN2 NOP
CLR TMR2 BSET PORTB,#04
BTSS PORTB,#04 GOTO SCAN2
GOTO SETEOL2
BCLR PORTB,#04 E05_P1: BTSS PORTB,#00
GOTO SCAN2 GOTO T_5_6_P1
GOTO PREG5_P1
SETEOL2: BSET PORTB,#04
GOTO SCAN2 T_5_6_P1: BCLR PORTB,#03
NOP
E03_P1: BTSS PORTB,#01 BCLR PORTB,#05
GOTO T_3_4_P1 NOP
GOTO PREG3_P1 BSET PORTB,#04
BCLR RIEP1,#05
T_3_4_P1: BCLR PORTB,#05 NOP
NOP BSET RIEP1,#06
BSET PORTB,#03 CLR TMR3
BCLR RIEP1,#03 GOTO SCAN2
NOP
BSET RIEP1,#04 PREG5_P1: MOV #7813,W0
CLR TMR3 CP TMR3
GOTO SCAN2 BRA NZ,SCAN2
CLR TMR3
PREG3_P1: MOV #37500,W0 BTSC PORTB,#03
CP TMR2 GOTO OFFL1ONL3
BRA NZ,SCAN2 BCLR PORTB,#05
CLR TMR2 NOP
BTSS PORTB,#05 BSET PORTB,#03
GOTO SETEOL3 GOTO SCAN2
BCLR PORTB,#05

105 107
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

OFFL1ONL3: BCLR PORTB,#03 NOP


NOP BSET PORTB,#03
BSET PORTB,#05 GOTO SCAN2
GOTO SCAN2
CLAREOL1: BCLR PORTB,#03
E06_P1: BTSS PORTB,#01 NOP
GOTO T_6_7_P1 BSET PORTB,#04
GOTO PREG6_P1 GOTO SCAN2

T_6_7_P1: BCLR PORTB,#01 CLAREOL2: BCLR PORTB,#04


NOP NOP
BCLR PORTB,#02 BSET PORTB,#05
NOP GOTO SCAN2
BSET PORTB,#00
BCLR RIEP1,#06 E01_P2: BTSS PORTF,#00
NOP GOTO T_1_2_P2
BSET RIEP1,#07 MOV #3907,W0
CLR TMR3 CP TMR1
GOTO SCAN2 BRA NZ, SCAN3
CLR TMR1
PREG6_P1: MOV #7813,W0 T_1_2_P2: BCLR PORTF,#02
CP TMR3 NOP
BRA NZ,SCAN2 BSET PORTF,#03
CLR TMR3 BCLR RIEP2,#01
BTSC PORTB,#04 NOP
GOTO OFFL2ONL3 BSET RIEP2,#02
BCLR PORTB,#05 GOTO SCAN3
NOP
BSET PORTB,#04 E02_P2: BTSS PORTF,#01
GOTO SCAN2 GOTO T_2_3_P2
MOV #3907,W0
OFFL2ONL3: BCLR PORTB,#04 CP TMR1
NOP BRA NZ,SCAN3
BSET PORTB,#05 CLR TMR1
GOTO SCAN2 T_2_3_P2: BCLR PORTF,#03
NOP
E07_P1: BTSS PORTB,#02 BSET PORTF,#02
GOTO T_7_1_P1 BCLR RIEP2,#02
GOTO PREG7_P1 NOP
BSET RIEP2,#03
T_7_1_P1: BCLR PORTB,#04 GOTO SCAN3
NOP
BCLR PORTB,#05 E03_P2: BTSS PORTF,#00
NOP GOTO T_3_4_P2
BSET PORTB,#03 MOV #5860,W0
BCLR RIEP1,#07 CP TMR1
NOP BRA NZ,SCAN3
BSET RIEP1,#01 CLR TMR1
CLR TMR2 T_3_4_P2: BCLR PORTF,#02
GOTO SCAN2 NOP
BSET PORTF,#03
PREG7_P1: MOV #7813,W0 BCLR RIEP2,#03
CP TMR3 NOP
BRA NZ,SCAN2 BSET RIEP2,#04
CLR TMR3 GOTO SCAN3
BTSC PORTB,#03
GOTO CLAREOL1 E04_P2: BTSS PORTF,#01
BTSC PORTB,#04 GOTO T_4_5_P2
GOTO CLAREOL2 MOV #5860,W0
BCLR PORTB,#05 CP TMR1

108 106
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

BRA NZ,SCAN3 BSET PORTF,#02


CLR TMR1 BCLR RIEP22,#00
T_4_5_P2: BCLR PORTF,#03 NOP
NOP BSET RIEP22,#01
BSET PORTF,#02 GOTO SCAN3
BCLR RIEP2,#04
NOP E09_P2: BTSS PORTF,#00
BSET RIEP2,#05 GOTO T_9_10_P2
GOTO SCAN3 MOV #16407,W0
CP TMR1
E05_P2: BTSS PORTF,#00 BRA NZ,SCAN3
GOTO T_5_6_P2 CLR TMR1
MOV #10547,W0 T_9_10_P2: BCLR PORTF,#02
CP TMR1 NOP
BRA NZ,SCAN3 BSET PORTF,#03
CLR TMR1 BCLR RIEP22,#01
T_5_6_P2: BCLR PORTF,#02 NOP
NOP BSET RIEP22,#02
BSET PORTF,#03 GOTO SCAN3
BCLR RIEP2,#05
NOP E10_P2: BTSS PORTF,#01
BSET RIEP2,#06 GOTO T_10_1_P2
GOTO SCAN3 MOV #16407,W0
CP TMR1
E06_P2: BTSS PORTF,#01 BRA NZ,SCAN3
GOTO T_6_7_P2 CLR TMR1
MOV #10547,W0 T_10_1_P2: BCLR PORTF,#03
CP TMR1 NOP
BRA NZ,SCAN3 BSET PORTF,#02
CLR TMR1 BCLR RIEP22,#02
T_6_7_P2: BCLR PORTF,#03 NOP
NOP BSET RIEP2,#01
BSET PORTF,#02 GOTO SCAN3
BCLR RIEP2,#06
NOP E01_P3: BTSS PORTC,#14
BSET RIEP2,#07 GOTO T_1_2_P3
GOTO SCAN3 GOTO SCAN1

E07_P2: BTSS PORTF,#00 T_1_2_P3: BSET PORTF,#04


GOTO T_7_8_P2 BCLR RIEP3,#01
MOV #12891,W0 NOP
CP TMR1 BSET RIEP3,#02
BRA NZ,SCAN3 GOTO SCAN1
CLR TMR1
T_7_8_P2: BCLR PORTF,#02 E02_P3: BTSS PORTD,#00
NOP GOTO T_2_3_P3
BSET PORTF,#03 GOTO SCAN1
BCLR RIEP2,#07
NOP T_2_3_P3: BCLR PORTF,#04
BSET RIEP22,#00 NOP
GOTO SCAN3 BSET PORTF,#05
BCLR RIEP3,#02
E08_P2: BTSS PORTF,#01 NOP
GOTO T_8_9_P2 BSET RIEP3,#03
MOV #12891,W0 GOTO SCAN1
CP TMR1
BRA NZ,SCAN3 E03_P3: BTSS PORTD,#01
CLR TMR1 GOTO T_3_4_P3
T_8_9_P2: BCLR PORTF,#03 GOTO SCAN1
NOP

107 109
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

T_3_4_P3: BSET PORTF,#04 BCLR PORTC,#13


BCLR RIEP3,#03 BCLR RIEP32,#00
NOP NOP
BSET RIEP3,#04 BSET RIEP3,#01
GOTO SCAN1 GOTO SCAN1

E04_P3: BTSS PORTC,#14 .END


GOTO T_4_5_P3
BTSS PORTD,#00
GOTO T_4_5_P3
GOTO SCAN1

T_4_5_P3: BCLR PORTF,#05


NOP
BCLR PORTF,#04
BSET PORTC,#13
BCLR RIEP3,#04
NOP
BSET RIEP3,#05
GOTO SCAN1

E05_P3: BTSC PORTC,#14


GOTO SCAN1
BTSC PORTD,#01
GOTO SCAN1
T_5_6_P3: BSET PORTF,#04
BCLR RIEP3,#05
NOP
BSET RIEP3,#06
GOTO SCAN1

E06_P3: BTSS PORTD,#00


GOTO T_6_7_P3
GOTO SCAN1

T_6_7_P3: BCLR PORTF,#04


NOP
BSET PORTF,#05
BCLR RIEP3,#06
NOP
BSET RIEP3,#07
GOTO SCAN1

E07_P3: BTSC PORTC,#14


GOTO SCAN1
BTSC PORTD,#01
GOTO SCAN1
T_7_8_P3: BSET PORTF,#04
BCLR RIEP3,#07
NOP
BSET RIEP32,#00
GOTO SCAN1

E08_P3: BTSS PORTD,#00


GOTO T_8_1_P3
GOTO SCAN1

T_8_1_P3: BCLR PORTF,#04


NOP
BCLR PORTF,#05

110 108
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.5

4 Mhz
P1

RF0 MCLR
RBO
d RB1
s RB2
P2 P RB3
RF1 I RB4
C
RB5
3
0 RB6
F RB7
3 RS E R/ W
0
RC13
1
4 RC14

RF2

L1

Figura 7.9. Diseño esquemático del ejemplo 7.5

Al energizar el sistema, en la línea superior aparece UPB (centrado) y en la línea inferior


BUCARAMANGA (también centrado), luego de cinco segundos desaparece el mensaje de
la línea superior (quedando el inferior) para ser reemplazado por un reloj de tiempo real
con formato HH:MM:SS e inicializado en 00:00:00.

 Si en cualquier momento se pulsa P2 (se debe tener cuidado con el rebote) el


flanco de bajado causa el cambio del mensaje de la línea inferior (independiente
del mensaje actual de la línea superior del LCD), si estaba centrado el mensaje
COLOMBIA se modifica por el mensaje también centrado BUCARAMANGA o al
contrario.
 Si en cualquier momento se pulsa P1 (se debe tener cuidado con el rebote) el
flanco de bajada causa que el reloj que estaba andando se detenga, o si estaba
detenido (congelado en un valor), continúe desde ese valor.
 El LED L1 cambia su valor lógico cada segundo independiente si el reloj
visualizado en el LCD está o no detenido.
 Al decir que en cualquier momento se pulsa P2 quiere decir que puede ser,
además, dentro de la temporización de los cinco segundos mencionados.

109 111
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.5 CALL ASCII


MOV #'R',W0
CALL ASCII
.INCLUDE "P30F3014.INC" MOV #'A',W0
.EQU RIEP1,0X0800 CALL ASCII
.EQU RIEP2,0X0802 MOV #'M',W0
.EQU RIEP3,0X0804 CALL ASCII
.EQU VALOR1,8 MOV #'A',W0
.EQU VALOR2,9 CALL ASCII
.EQU VALOR3,10 MOV #'N',W0
.TEXT CALL ASCII
.GLOBAL __reset MOV #'G',W0
CALL ASCII
__reset: MOV #0X0806,W15 MOV #'A',W0
MOV #0X08FE,W0 CALL ASCII
MOV W0,SPLIM RETURN
GOTO INICIO
COLOMBIA: MOV #0X00C3,W0
RETARDO1: MOV #VALOR3,W9 CALL COMANDO
TRES: MOV #VALOR2,W8 MOV #' ',W0
DOS: MOV #VALOR1,W7 CALL ASCII
UNO: DEC W7,W7 MOV #'C',W0
BRA NZ,UNO CALL ASCII
DEC W8,W8 MOV #'O',W0
BRA NZ,DOS CALL ASCII
DEC W9,W9 MOV #'L',W0
BRA NZ,TRES CALL ASCII
RETURN MOV #'O',W0
CALL ASCII
TABLA: BRA W0 MOV #'M',W0
RETLW #'0',W0 CALL ASCII
RETLW #'1',W0 MOV #'B',W0
RETLW #'2',W0 CALL ASCII
RETLW #'3',W0 MOV #'I',W0
RETLW #'4',W0 CALL ASCII
RETLW #'5',W0 MOV #'A',W0
RETLW #'6',W0 CALL ASCII
RETLW #'7',W0 MOV #' ',W0
RETLW #'8',W0 CALL ASCII
RETLW #'9',W0 MOV #' ',W0
CALL ASCII
UPB: MOV #0X0084,W0 MOV #' ',W0
CALL COMANDO CALL ASCII
MOV #'U',W0 RETURN
CALL ASCII
MOV #'P',W0 COMANDO: BCLR PORTC,#13
CALL ASCII GOTO VALIDAR
MOV #'B',W0
CALL ASCII ASCII: BSET PORTC,#13
RETURN VALIDAR: MOV W0,PORTB
BCLR PORTC,#14
BUCARA: MOV #0X00C3,W0 CALL RETARDO1
CALL COMANDO BSET PORTC,#14
MOV #'B',W0 RETURN
CALL ASCII
MOV #'U',W0 INICIO: MOV #0XFF,W0
CALL ASCII MOV W0,ADPCFG
MOV #'C',W0 CLR TRISB
CALL ASCII CLR TRISC
MOV #'A',W0 MOV #0B011,W0

112 110
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

MOV W0,TRISF GOTO CLAR_L1


MOV #0X8030,W0 SETEAR_L1: BSET PORTF,#02
MOV W0,T1CON CLR TMR1
MOV W0,T2CON GOTO SCAN1
CLR TMR1
BSET PORTC,#14 CLAR_L1: BCLR PORTF,#02
NOP CLR TMR1
BCLR PORTC,#13 GOTO SCAN1
MOV #0X0001,W0
CALL COMANDO TEMP1: MOV #19531,W0
MOV #0X0003,W0 CP TMR2
CALL COMANDO BRA N,SCAN2
MOV #0X0006,W0 CLR TMR2
CALL COMANDO CALL CEROS
MOV #0X000C,W0 BCLR RIEP1,#1
CALL COMANDO NOP
MOV #0X001F,W0 BSET RIEP1,#2
CALL COMANDO CLR TMR2
MOV #0X003B,W0 GOTO SCAN2
CALL COMANDO
MOV #0X0001,W0 CEROS: MOV #0X0084,W0
CALL COMANDO CALL COMANDO
CLR PORTB MOV #'0', W0
CLR TMR1 CALL ASCII
CLR TMR2 MOV #'0', W0
CLR W1 CALL ASCII
CLR W2 MOV #':', W0
CLR W3 CALL ASCII
CLR W4 MOV #'0', W0
CLR W5 CALL ASCII
CLR W6 MOV #'0', W0
CLR RIEP1 CALL ASCII
CLR RIEP2 MOV #':', W0
CLR RIEP3 CALL ASCII
CALL UPB MOV #'0', W0
CALL BUCARA CALL ASCII
BSET PORTF,#01 MOV #'0', W0
BSET RIEP1,#1 CALL ASCII
BSET RIEP2,#1 RETURN
BSET RIEP3,#1
CLR TMR1 CRONO: BTSC PORTF,#00
CLR TMR2 GOTO LLAMADA
SCAN1: BTSC RIEP1,#1 BTSC RIEP1,#4
GOTO TEMP1 GOTO PROS2
BTSC RIEP1,#2 BSET RIEP1,#0
GOTO CRONO NOP
BTSC RIEP1,#3 BCLR RIEP1,#2
GOTO PAUSA NOP
BSET RIEP1,#3
SCAN2: BTSC RIEP2,#1 GOTO SCAN2
GOTO BUCARA1
BTSC RIEP2,#2 LLAMADA: BCLR RIEP1,#4
GOTO COLOMBIA1 CALL CONTEO
LED: BTSC RIEP3,#1 GOTO SCAN2
GOTO LED1
LED1: MOV #4000,W0 PROS: BCLR RIEP1,#0
CP TMR1 GOTO SCAN2
BRA N,SCAN1
CLR TMR1 PROS2: CALL CONTEO
OSCILAR: BTSC PORTF,#02 GOTO SCAN2

111 113
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

BRA Z,CONTMI2
PAUSA: BTSC PORTF,#00 MOV W3,W0
GOTO PROS CALL TABLA
BTSC RIEP1,#0 CALL ASCII
GOTO SCAN2 RETURN
CALL CONTEO
BSET RIEP1,#2 CONTMI2: CLR TMR2
NOP MOV #00,W3
BCLR RIEP1,#3 MOV #0X0088,W0
NOP CALL COMANDO
BSET RIEP1,#4 MOV W3,W0
GOTO SCAN2 CALL TABLA
CALL ASCII
CONTEO: MOV #4000,W0 MOV #0X0087,W0
CP TMR2 CALL COMANDO
BRA NN,CONTSE1 INC W4,W4
RETURN MOV #06,W0
CP W4,W0
CONTSE1: CLR TMR2 BRA Z,CONTHO1
MOV #0X008B,W0 MOV W4,W0
CALL COMANDO CALL TABLA
INC W1,W1 CALL ASCII
MOV #10,W0 RETURN
CP W1,W0
BRA Z,CONTSE2 CONTHO1: CLR TMR2
MOV W1,W0 MOV #00,W4
CALL TABLA MOV #0X87,W0
CALL ASCII CALL COMANDO
RETURN MOV W4,W0
CALL TABLA
CONTSE2: CLR TMR2 CALL ASCII
MOV #00,W1 MOV #0X85,W0
MOV #0X008B,W0 CALL COMANDO
CALL COMANDO INC W5,W5
MOV W1,W0 MOV #03,W0
CALL TABLA CP W5,W0
CALL ASCII BRA Z,IGUALES
MOV #0X008A,W0 NIGUAL: MOV W5,W0
CALL COMANDO CALL TABLA
INC W2,W2 CALL ASCII
MOV #06,W0 MOV #10,W0
CP W2,W0 CP W5,W0
BRA Z,CONTMI1 BRA Z,CONTHO2
MOV W2,W0 RETURN
CALL TABLA
CALL ASCII IGUALES: MOV #01,W0
RETURN CP W6,W0
BRA NZ,NIGUAL
CONTMI1: CLR TMR2 CLR W1
MOV #00,W2 CLR W2
MOV #0X008A,W0 CLR W3
CALL COMANDO CLR W4
MOV W2,W0 CLR W5
CALL TABLA CLR W6
CALL ASCII CLR TMR2
MOV #0X0088,W0 CALL CEROS
CALL COMANDO RETURN
INC W3,W3
MOV #10,W0 CONTHO2: CLR TMR2
CP W3,W0 CLR W5

114 112
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

MOV #0X0085,W0
CALL COMANDO
MOV W5,W0
CALL TABLA
CALL ASCII
MOV #0X0084,W0
CALL COMANDO
MOV #01,W6
MOV W6,W0
CALL TABLA
CALL ASCII
RETURN

BUCARA1: BTSC PORTF,#01


GOTO LED
CALL COLOMBIA
BTSS PORTF,#01
GOTO LED
BCLR RIEP2,#1
NOP
BSET RIEP2,#2
GOTO LED

COLOMBIA1: BTSC PORTF,#01


GOTO LED
CALL BUCARA
BTSS PORTF,#01
GOTO LED
BCLR RIEP2,#2
NOP
BSET RIEP2,#1
GOTO LED

.END

113 115
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.6

4 Mhz
P1

RC13 MCLR
RB0
d RB1
s RB2
P2 P RB3
RC14 I RB4
C
RB5
3
0 RB6
L1
RF2 F RB7
L2 RS E R/ W
RF3 3
L3
RF4 0 RF0
1
RF1
4

RF5

L4

Figura 7.10. Diseño esquemático del ejemplo 7.6

Realizar el montaje del hardware usando resistencias de 1 KΩ y una alimentación de 5


voltios.

 L4 cambia su valor lógico cada segundo.


 P1 incrementa el valor lógico visualizado en L3, L2 y L1 (conteo cíclico).
 El valor binario cíclico de L3, L2 y L1 se muestra en la primera línea del LCD en las
mismas tres localidades DD RAM desde 000 hasta 111 cíclicamente tal como se
esté mostrando en todo instante en los tres LEDS.
 Al energizarse el sistema en la línea inferior del LCD se muestra el mensaje
UNIVERSIDAD.
 Cada vez que se pulse P2 cambia el mensaje de la línea inferior del LCD para
mostrarse cíclicamente en su orden UNIVERSIDAD luego PONTIFICIA y luego
BOLIVARIANA.
 P1 y P2 funcionan con flanco descendente, por lo tanto, se debe tener cuidado con
los rebotes físicos del pulsador.
 Las actividades descritas como requerimientos funcionan de manera
independientes.

116 114
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.6 CLR PORTB


CLR PORTC
CLR PORTF
.INCLUDE "P30F3014.INC" CLR W3
.EQU RIEP2,0X0800 CLR W2
.EQU RIEP3,0X0802 CLR W1
.TEXT CLR W7
.GLOBAL __reset CLR TMR1
MOV #0X0001,W3
__reset: MOV #0X0804,W15 CALL COMANDO
MOV #0X08FE,W0 MOV #0X0003,W3
MOV W0,SPLIM CALL COMANDO
GOTO INICIO MOV #0X0004,W3
CALL COMANDO
COMANDO: BCLR PORTF,#00 MOV #0X000C,W3
GOTO VALIDAR CALL COMANDO
MOV #0X001F,W3
LETRAS : BSET PORTF,#00 CALL COMANDO
VALIDAR: MOV W3,PORTB MOV #0X003B,W3
BCLR PORTF,#01 CALL COMANDO
CLR TMR1 MOV #0X0001,W3
CALL DELAY1 CALL COMANDO
BSET PORTF,#01 MOV #0X00C2,W3
RETURN CALL COMANDO
MOV #'U',W3
DELAY1: MOV #50,W0 CALL LETRAS
CP TMR1 MOV #'N',W3
BRA NZ,DELAY1 CALL LETRAS
RETURN MOV #'I',W3
CALL LETRAS
DELAY2: MOV #15625,W0 MOV #'V',W3
CP TMR2 CALL LETRAS
BRA NN,CAMBIO MOV #'E',W3
RETURN CALL LETRAS
MOV #'R',W3
DELAY3: MOV #4000,W0 CALL LETRAS
CALL DELAY2 MOV #'S',W3
CP TMR3 CALL LETRAS
BRA NZ,DELAY3 MOV #'I',W3
RETURN CALL LETRAS
MOV #'D',W3
CAMBIO: CLR TMR2 CALL LETRAS
BTSC PORTF,#05 MOV #'A',W3
GOTO CLAREAR1 CALL LETRAS
BSET PORTF,#05 MOV #'D',W3
RETURN CALL LETRAS
CLR TMR2
CLAREAR1: BCLR PORTF,#05 CLR W7
RETURN BSET RIEP3,#1
INICIAR: CLR W5
INICIO: MOV #0X3F,W0 BSET RIEP2,#01
MOV W0,ADPCFG CALL CERO1
CLR TRISB BCLR PORTF,#02
CLR TRISF NOP
MOV #0XFFFF,W0 BCLR PORTF,#03
MOV W0,TRISC NOP
MOV #0X8020,W0 BCLR PORTF,#04
MOV W0,T1CON SCAN1: GOTO E01_P1
MOV W0,T2CON
MOV W0,T3CON SCAN2: BTSC RIEP2,#01

115 117
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

GOTO E01_P2 BSET RIEP2,#01


GOTO E02_P2 CALL DELAY2
GOTO SCAN3
SCAN3: BTSC RIEP3,#1
GOTO E01_P3 SETEAR0: BSET PORTF,#2
GOTO E02_P3 GOTO CLA1

E01_P1: CALL DELAY2 SETEAR1: BSET PORTF,#3


GOTO SCAN2 GOTO CLA2

E01_P2: BTSC PORTC,#13 SETEAR2: BSET PORTF,#4


GOTO SCAN3 GOTO CLA3
T_1_2_P2: BCLR RIEP2,#01
NOP E01_P3: BTSC PORTC,#14
BSET RIEP2,#02 GOTO SCAN1
INC W5,W5 T_1_2_P3: MOV #3,W0
BCLR PORTF,#02 BCLR RIEP3,#1
NOP NOP
BCLR PORTF,#03 BSET RIEP3,#2
NOP INC W7,W7
BCLR PORTF,#04 CALL DELAY2
BTSC W5,#0 MOV #1,W8
GOTO SETEAR0 CP W7,W8
BCLR PORTF,#02 BRA Z,PONTI
CLA1: BTSC W5,#1 MOV #2,W9
GOTO SETEAR1 CP W7,W9
BCLR PORTF,#03 BRA Z,BOL
CLA2: BTSC W5,#2 MOV #3,W10
GOTO SETEAR2 CP W7,W10
BCLR PORTF,#04 BRA Z,UNI
CLA3: CALL DELAY2 GOTO SCAN1
MOV #1,W8
CP W5,W8 E02_P3: BTSS PORTC,#14
BRA Z,UNO GOTO SCAN1
MOV #2,W9 T_2_1_P3: CALL REBOTE3
CP W5,W9 BCLR RIEP3,#02
BRA Z,DOS NOP
MOV #3,W10 BSET RIEP3,#01
CP W5,W10 CALL DELAY2
BRA Z,TRES GOTO SCAN1
MOV #4,W11
CP W5,W11 REBOTE1: MOV #50,W0
BRA Z,CUATRO REBOT2: BTSC PORTC,#13
MOV #5,W12 GOTO DCREMENT
CP W5,W12 GOTO SCAN3
BRA Z,CINCO
MOV #6,W13 DCREMENT: DEC W0,W0
CP W5,W13 BRA NZ,REBOT2
BRA Z,SEIS RETURN
MOV #7,W14
CP W5,W14 REBOTE3: MOV #50,W0
BRA Z,SIETE REBOT4: BTSC PORTC,#14
MOV #8,W0 GOTO DCREMNT1
CP W5,W0 GOTO SCAN1
BRA Z,CERO
E02_P2: BTSS PORTC,#13 DCREMNT1: DEC W0,W0
GOTO SCAN3 BRA NZ,REBOT4
T_2_1_P2: CALL REBOTE1 RETURN
BCLR RIEP2,#02
NOP COMANDOS: MOV #0X0003,W3

118 116
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

CALL COMANDO CALL DELAY2


MOV #0X0004,W3 CALL LETRAS
CALL COMANDO GOTO SCAN3
MOV #0X000C,W3
CALL COMANDO TRES: CALL COMANDOS
MOV #0X001F,W3 MOV #'1',W3
CALL COMANDO CALL DELAY2
MOV #0X003B,W3 CALL LETRAS
CALL COMANDO MOV #'1',W3
MOV #0X0088,W3 CALL DELAY2
CALL COMANDO CALL LETRAS
RETURN MOV #'0',W3
CALL DELAY2
CERO: CALL DELAY2 CALL LETRAS
CALL COMANDOS GOTO SCAN3
MOV #'0',W3
CALL LETRAS CUATRO: CALL COMANDOS
CALL DELAY2 MOV #'0',W3
MOV #'0',W3 CALL DELAY2
CALL LETRAS CALL LETRAS
CALL DELAY2 MOV #'0',W3
MOV #'0',W3 CALL DELAY2
CALL LETRAS CALL LETRAS
CALL DELAY2 MOV #'1',W3
CLR W5 CALL DELAY2
GOTO SCAN3 CALL LETRAS
GOTO SCAN3
CERO1: CALL DELAY2
CALL COMANDOS CINCO: CALL COMANDOS
MOV #'0',W3 MOV #'1',W3
CALL LETRAS CALL DELAY2
CALL DELAY2 CALL LETRAS
MOV #'0',W3 MOV #'0',W3
CALL LETRAS CALL DELAY2
CALL DELAY2 CALL LETRAS
MOV #'0',W3 MOV #'1',W3
CALL LETRAS CALL DELAY2
CALL DELAY2 CALL LETRAS
RETURN GOTO SCAN3

UNO: CALL COMANDOS SEIS: CALL COMANDOS


MOV #'1',W3 MOV #'0',W3
CALL DELAY2 CALL DELAY2
CALL LETRAS CALL LETRAS
MOV #'0',W3 MOV #'1',W3
CALL DELAY2 CALL DELAY2
CALL LETRAS CALL LETRAS
MOV #'0',W3 MOV #'1',W3
CALL DELAY2 CALL DELAY2
CALL LETRAS CALL LETRAS
GOTO SCAN3 GOTO SCAN3

DOS: CALL COMANDOS SIETE: CALL COMANDOS


MOV #'0',W3 MOV #'1',W3
CALL DELAY2 CALL DELAY2
CALL LETRAS CALL LETRAS
MOV #'1',W3 MOV #'1',W3
CALL DELAY2 CALL DELAY2
CALL LETRAS CALL LETRAS
MOV #'0',W3 MOV #'1',W3

117 119
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

CALL DELAY2 MOV #'O',W3


CALL LETRAS CALL LETRAS
GOTO SCAN3 MOV #'N',W3
CALL LETRAS
COMAND: MOV #0X0003,W3 MOV #'T',W3
CALL COMANDO CALL LETRAS
MOV #0X0006,W3 MOV #'I',W3
CALL COMANDO CALL LETRAS
MOV #0X000C,W3 MOV #'F',W3
CALL COMANDO CALL LETRAS
MOV #0X001F,W3 MOV #'I',W3
CALL COMANDO CALL LETRAS
MOV #0X003B,W3 MOV #'C',W3
CALL COMANDO CALL LETRAS
MOV #0X00C2,W3 MOV #'I',W3
CALL COMANDO CALL LETRAS
RETURN MOV #'A',W3
CALL LETRAS
UNI: CALL DELAY2 MOV #' ',W3
CALL COMAND CALL LETRAS
MOV #'U',W3 GOTO SCAN1
CALL DELAY2
CALL LETRAS BOL: CALL COMAND
MOV #'N',W3 MOV #'B',W3
CALL DELAY2 CALL LETRAS
CALL LETRAS MOV #'O',W3
MOV #'I',W3 CALL LETRAS
CALL DELAY2 MOV #'L',W3
CALL LETRAS CALL LETRAS
MOV #'V',W3 MOV #'I',W3
CALL DELAY2 CALL LETRAS
CALL LETRAS MOV #'V',W3
MOV #'E',W3 CALL LETRAS
CALL DELAY2 MOV #'A',W3
CALL LETRAS CALL LETRAS
MOV #'R',W3 MOV #'R',W3
CALL DELAY2 CALL LETRAS
CALL LETRAS MOV #'I',W3
MOV #'S',W3 CALL LETRAS
CALL DELAY2 MOV #'A',W3
CALL LETRAS CALL LETRAS
MOV #'I',W3 MOV #'N',W3
CALL DELAY2 CALL LETRAS
CALL LETRAS MOV #'A',W3
MOV #'D',W3 CALL LETRAS
CALL DELAY2 GOTO SCAN1
CALL LETRAS
MOV #'A',W3 TABLA: BRA W5
CALL DELAY2 GOTO CERO
CALL LETRAS GOTO UNO
MOV #'D',W3 GOTO DOS
CALL DELAY2 GOTO TRES
CALL LETRAS GOTO CUATRO
CALL DELAY2 GOTO CINCO
CLR W7 GOTO SEIS
GOTO SCAN1 GOTO SIETE

PONTI: CALL COMAND TABLA1: BRA W7


MOV #'P',W3 GOTO UNI
CALL LETRAS GOTO PONTI

120 118
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

GOTO BOL

CLAREARW7: CLR W7
BCLR RIEP3,#1
NOP
BSET RIEP3,#2
GOTO T_1_2_P3

.END

119 121
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.7

4 Mhz
P1

RA11 MCLR
RC13
d RC14
s RF0
P RF1
I RF2
C
RF3
3
MSB 0 RF4
RB3 F
RB2 3
RB1 0 RF5
LSB 1
RB0
4

Figura 7.11. Diseño esquemático del ejemplo 7.7

Realizar el montaje del hardware usando resistencias de 1 KΩ y una alimentación de 5


voltios.

 Al energizarse el sistema los LEDS inician apagados y los display en 00.


 La multiplexación se realiza con la interrupción TIMER 2.
 El valor binario de los LEDS se incrementa cíclicamente cada 0.5 segundos
usando la interrupción TIMER 3.
 Cada flanco descendente en RA11 incrementa el valor mostrado en los display,
desde 00 hasta 24 cíclicamente. Se asume que cada vez que se pulsa P1 ocurrirá
sólo un flanco descendente; por lo tanto se debe tener cuidado con el ”ruido” del
pulsador.
 P1 usa su respectiva interrupción.

122 120
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.7 DISPLAY_2: BCLR PORTB,#00


CLR PORTC
BCLR PORTF,#00
.INCLUDE "P30F3014.INC" NOP
.GLOBAL __INT0Interrupt BCLR PORTF,#01
.GLOBAL __T2Interrupt NOP
.GLOBAL __T3Interrupt BCLR PORTF,#02
.TEXT NOP
.GLOBAL __reset BCLR PORTF,#03
NOP
__reset: MOV #0X0800,W15 BCLR PORTF,#04
MOV #0X08FE,W0 MOV W9,W0
MOV W0,SPLIM CALL TABLA
GOTO INICIO BTSC W0,#00
BSET PORTC,#13
TABLA: BRA W0 BTSC W0,#01
RETLW #0X003F,W0 BSET PORTC,#14
RETLW #0X0006,W0 BTSC W0,#02
RETLW #0X005B,W0 BSET PORTF,#00
RETLW #0X004F,W0 BTSC W0,#03
RETLW #0X0066,W0 BSET PORTF,#01
RETLW #0X006D,W0 BTSC W0,#04
RETLW #0X007D,W0 BSET PORTF,#02
RETLW #0X0027,W0 BTSC W0,#05
RETLW #0X007F,W0 BSET PORTF,#03
RETLW #0X0067,W0 BTSC W0,#06
BSET PORTF,#04
__T2Interrupt: BTSS PORTF,#05 NOP
GOTO DISPLAY_2 BSET PORTF,#05
BCLR PORTF,#05 BCLR IFS0,#T2IF
CLR PORTC RETFIE
BCLR PORTF,#00
NOP __INT0Interrupt: INC W8,W8
BCLR PORTF,#01 MOV #10,W0
NOP CP W8,W0
BCLR PORTF,#02 BRA Z,INC_D1
NOP MOV #2,W0
BCLR PORTF,#03 CP W9,W0
NOP BRA Z,CONTEO
BCLR PORTF,#04 SALIDA: BCLR IFS0,#INT0IF
MOV W8,W0 BCLR IEC0,#INT0IE
CALL TABLA RETFIE
BTSC W0,#00
BSET PORTC,#13 INC_D1: CLR W8
BTSC W0,#01 INC W9,W9
BSET PORTC,#14 GOTO SALIDA
BTSC W0,#02
BSET PORTF,#00 CONTEO: MOV #5,W0
BTSC W0,#03 CP W8,W0
BSET PORTF,#01 BRA Z,EST_INI
BTSC W0,#04 GOTO SALIDA
BSET PORTF,#02
BTSC W0,#05 EST_INI: CLR W8
BSET PORTF,#03 CLR W9
BTSC W0,#06 GOTO SALIDA
BSET PORTF,#04
BSET PORTB,#00 __T3Interrupt: INC W7,W7
BCLR IFS0,#T2IF BCLR PORTB,#01
RETFIE NOP
BCLR PORTB,#02

121 123
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

NOP OTRA: BTSC IEC0,#INT0IE


BCLR PORTB,#03 GOTO OTRA
BTSC W7,#00 OTRA1: MOV #5000,W0
BSET PORTB,#01 OTRA2: BTSC PORTA,#11
BTSC W7,#01 GOTO DCRMNTAR
BSET PORTB,#02 GOTO OTRA1
BTSC W7,#02
BSET PORTB,#03 DCRMNTAR: DEC W0,W0
BCLR IFS0,#T3IF BRA NZ,OTRA2
RETFIE BCLR IFS0,#INT0IF
BSET IEC0,#INT0IE
INICIO: MOV #0X03F,W0 GOTO OTRA
MOV W0,ADPCFG
MOV #0XFFFF,W0 .END
MOV W0,TRISA
CLR TRISB
CLR TRISC
MOV #0X0100,W0
MOV W0,TRISF
MOV #0X8020,W0
MOV W0,T2CON
MOV W0,T3CON
BCLR CORCON,#IPL3
BCLR SR,#IPL2
BSET SR,#IPL1
BSET SR,#IPL0
BCLR IFS0,#INT0IF
BCLR IFS0,#T2IF
BCLR IFS0,#T3IF
BSET IEC0,#INT0IE
BSET IEC0,#T2IE
BSET IEC0,#T3IE
MOV #7813,W0
MOV W0,PR3
MOV #47,W0
MOV W0,PR2
BSET INTCON2,#INT0EP
CLR TMR3
CLR W7
BCLR PORTB,#01
NOP
BCLR PORTB,#02
NOP
BCLR PORTB,#03
CLR TMR2
CLR PORTC
BCLR PORTF,#00
NOP
BCLR PORTF,#01
NOP
BCLR PORTF,#02
NOP
BCLR PORTF,#03
NOP
BCLR PORTF,#04
CLR W8
CLR W9
BCLR PORTB,#00
BSET PORTF,#05

124 122
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.8

4 Mhz
P1
DISPLAY 1 DISPLAY 2
RD8 MCLR
RB0
d RB1
P2 s RB2
RD9 P RB3
I RB4
C
3 RB5
0 RB6
L1
RF6 F
3
0
RF1
1
4 RF2

Figura 7.12. Diseño esquemático del ejemplo 7.8

Realizar el montaje del hardware usando resistencias de 1 KΩ y una alimentación de 5


voltios.

 Al energizarse el sistema L1 inicia apagado y los display en 00.


 La multiplexación se realiza con la interrupción TIMER 1.
 L1 cambia su valor lógico cada 2 segundos usando la interrupción de TIMER 2.
 Cada flanco descendente en RD0 incrementa el valor en el display 1, para lo cual
se debe tener en cuenta el posible “ruido” del pulsador, ya que cada pulsación se
asume que será sólo un flanco.
 Cada flanco descendente en RD1 incrementa el valor en el display 2, para lo cual
se debe tener en cuenta el posible “ruido” del pulsador, ya que cada pulsación se
asume que será sólo un flanco.
 P1 y P2 son independientes y usan su respectiva interrupción.

123 125
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.8 __T1Interrupt: PUSH.S


BTSS PORTF,#01
GOTO SETEAR1
.INCLUDE "P30F3014.INC" BCLR PORTF,#01
.EQU RIEP2,0x0800 CALL TABLA2
.EQU RIEP3,0x0802 MOV W0,PORTB
.GLOBAL __INT1Interrupt BCLR PORTF,#00
.GlOBAL __INT2Interrupt BTSC W0,#06
.GLOBAL __T1Interrupt BSET PORTF,#00
.GLOBAL __T2Interrupt NOP
.TEXT BSET PORTF,#02
.GLOBAL __reset SALIR1: BCLR IFS0,#T1IF
POP.S
__reset: MOV #0X0804,W15 RETFIE
MOV #0X08FE,W0
MOV W0,SPLIM SETEAR1: BCLR PORTF,#02
GOTO INICIO CALL TABLA1
MOV W0,PORTB
SCAN2: BTSC RIEP2,#01 BSET PORTF,#01
GOTO E01_P2 GOTO SALIR1
GOTO E02_P2
__T2Interrupt: PUSH.S
SCAN3: BTSC RIEP3,#1 BTSS PORTF,#6
GOTO E01_P3 GOTO SETEAR2
GOTO E02_P3 BCLR PORTF,#6
SALIR2: BCLR IFS0,#T2IF
E01_P2: BTSC PORTD,#00 POP.S
GOTO SCAN3 RETFIE
BCLR IEC1,#INT1IE
T_1_2_P2: BCLR RIEP2,#01 SETEAR2: BSET PORTF,#6
NOP GOTO SALIR2
BSET RIEP2,#02
GOTO SCAN3 __INT1Interrupt: PUSH.S
INC W4,W4
E02_P2: BTSC PORTD,#00 MOV #10,W0
GOTO SCAN3 CP W0,W4
GOTO REBOTE BRA Z,CLRERW1
SALIR3: BCLR IFS1,#INT1IF
T_2_1_P2: BCLR RIEP2,#02 POP.S
NOP RETFIE
BSET RIEP2,#01
GOTO SCAN3 CLRERW1: CLR W4
GOTO SALIR3
E01_P3: BTSC PORTD,#01
GOTO SCAN2 __INT2Interrupt: PUSH.S
T_1_2_P3: BCLR IEC1,#INT2IE INC W5,W5
BCLR RIEP3,#01 MOV #10,W0
NOP CP W0,W5
BSET RIEP3,#02 BRA Z,CLRERW2
GOTO SCAN2 SALIR4: BCLR IFS1,#INT2IF
POP.S
E02_P3: BTSC PORTD,#01 RETFIE
GOTO SCAN2
GOTO REBOTE2 CLRERW2: CLR W5
GOTO SALIR4
T_2_1_P3: BCLR RIEP3,#02
NOP DELAY1: MOV #500,W0
BSET RIEP3,#01 CP TMR3
GOTO SCAN2 BCLR IFS1,#INT1IF
BRA N,DELAY1

126 124
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

RETURN BCLR CORCON,#IPL3


BCLR SR,#IPL2
REBOTE: MOV #50,W8 BSET SR,#IPL1
REBOTE1: BTSC PORTD,#00 BSET SR,#IPL0
GOTO SCAN3 BCLR IFS1,#INT1IF
DCRMNTAR: DEC W8,W8 BCLR IFS1,#INT2IF
BRA Z,HABILITAR BCLR IFS0,#T1IF
GOTO REBOTE1 BCLR IFS0,#T2IF
BSET IEC1,#INT1IE
REBOTE2: MOV #50,W9 BSET IEC1,#INT2IE
REBOTE3: BTSC PORTD,#01 BSET IEC0,#T1IE
GOTO SCAN2 BSET IEC0,#T2IE
DECREMEN: DEC W9,W9 BSET INTCON2,#INT1EP
BRA Z,HBILITAR1 BSET INTCON2,#INT2EP
GOTO REBOTE3 CLR TMR1
CLR TMR2
HABILITAR: BSET IEC1,#INT1IE CLR PORTB
GOTO T_2_1_P2 CLR W1
CLR W2
HBILITAR1: BSET IEC1,#INT2IE CLR W4
GOTO T_2_1_P3 CLR W5
MOV #0X0005,W0
TABLA1: BRA W4 MOV W0,PORTF
RETLW #0X003F,W0 BSET RIEP3,#1
RETLW #0X0006,W0 NOP
RETLW #0X005B,W0 BSET RIEP2,#1
RETLW #0X004F,W0 GOTO SCAN2
RETLW #0X0066,W0
RETLW #0X006D,W0 .END
RETLW #0X007D,W0
RETLW #0X0007,W0
RETLW #0X007F,W0
RETLW #0X0067,W0

TABLA2: BRA W5
RETLW #0X003F,W0
RETLW #0X0006,W0
RETLW #0X005B,W0
RETLW #0X004F,W0
RETLW #0X0066,W0
RETLW #0X006D,W0
RETLW #0X007D,W0
RETLW #0X0007,W0
RETLW #0X007F,W0
RETLW #0X0067,W0

INICIO: MOV #0X00FF,W0


MOV W0,ADPCFG
CLR TRISB
CLR TRISF
MOV #0XFFFF,W0
MOV W0,TRISD
MOV #0X8020,W0
MOV W0,T1CON
MOV W0,T2CON
MOV W0,T3CON
MOV #31250,W0
MOV W0,PR2
MOV #50,W0
MOV W0,PR1

125 127
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.9

4 Mhz
P1

RF0 MCLR
P2
RF1 d
s
P3 P RF3 M1
RF2 I
C
3
0
MSB
RB0 F
3 RF4 M2
RB1 0
RB2 1
LSB
4

Figura 7.13. Diseño esquemático del ejemplo 7.9

Realizar el montaje del hardware usando resistencias de 1 KΩ y una alimentación de 5


voltios.

 A M1 y M2 en todo instante se les suministra frecuencia.


 El valor lógico presente en RF0 determina a cual servomotor se le efectuará algún
cambio de ángulo. 0:M1 1:M2.
 Un flanco descendente en RF1 incrementa la posición angular 5 grados.
 Un flanco descendente en RF2 decrementa la posición angular 5 grados.
 Los tres LEDS hacen un incremento binario cíclico cada 2 segundos.
 El valor angular inicial para los servomotores es de cero grados.
 Se debe prever que P2 y P3 pueden tener “ruido” ya que se asume que una
pulsación conlleva un sólo flanco descendente.

128 126
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.9 SCAN2: BTSC RIEP2,#01


;Este ejemplo emplea un PLLx8 GOTO E01_P2
BTSC RIEP2,#02
.INCLUDE "P30F3014.INC" GOTO E02_P2
.EQU RIEP1,0X0800 GOTO E03_P2
.EQU RIEP2,0X0802
.GLOBAL __T1Interrupt INICIO: MOV #0X003F,W0
.GLOBAL __T2Interrupt MOV W0,ADPCFG
.TEXT CLR TRISB
.GLOBAL __reset MOV #0X0007,W0
MOV W0,TRISF
__reset: MOV #0X0804,W15 MOV #0X8010,W0
MOV #0X08FE,W0 MOV W0,T1CON
MOV W0,SPLIM MOV #0X8030,W0
GOTO INICIO MOV W0,T2CON
MOV #50,W0
__T1Interrupt: PUSH.S MOV W0,PR1
INC W6,W6 MOV #62510,W0
CP W6,W4 MOV W0,PR2
BRA NN,CLRER1 CLR TMR1
VOLV1: CP W5,W6 CLR TMR2
BRA N,CLRER2 BCLR CORCON,#IPL3
EXIT1: MOV #460,W0 BCLR SR,#IPL2
CP W0,W6 BSET SR,#IPL1
BRA N,STEROUT BSET SR,#IPL0
BCLR IFS0,#T1IF BCLR IFS0,#T1IF
POP.S BSET IEC0,#T1IE
RETFIE BCLR IFS0,#T2IF
BSET IEC0,#T2IE
CLRER1: BCLR PORTF,#03 CLR TMR1
GOTO VOLV1 CLR TMR2
CLR PORTB
CLRER2: BCLR PORTF,#04 CLR RIEP1
GOTO EXIT1 CLR RIEP2
CLR W5
STEROUT: BSET PORTF,#03 CLR W4
NOP CLR W10
BSET PORTF,#04 CLR W11
CLR W6 MOV #30,W4
GOTO EXIT1 MOV #30,W5
BSET PORTF,#03
__T2Interrupt: PUSH.S NOP
INC W8,W8 BSET PORTF,#04
CLR PORTB BSET RIEP1,#01
BTSC W8,#00 BSET RIEP2,#01
BSET PORTB,#02 GOTO SCAN1
BTSC W8,#01
BSET PORTB,#01 E01_P1: BTSC PORTF,#01
BTSC W8,#02 GOTO SCAN2
BSET PORTB,#00 T_1_2_P1: BCLR RIEP1,#01
BCLR IFS0,#T2IF NOP
POP.S BSET RIEP1,#02
RETFIE GOTO SCAN2

SCAN1: BTSC RIEP1,#01 E03_P1: BTSS PORTF,#01


GOTO E01_P1 GOTO SCAN2
BTSC RIEP1,#02 T_2_3_P1: CALL REBOTE1
GOTO E02_P1 BCLR RIEP1,#03
GOTO E03_P1 NOP
BSET RIEP1,#01

127 129
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

GOTO SCAN2 MOV #12,W11


CP W4,W10
E02_P1: BTSC PORTF,#00 BRA N,REC1W4
GOTO MTRARRIB1 GOTO T_3_1_P2
GOTO MTRARRIB2
REC1W4: MOV W11,W4
T_3_1_P1: BCLR RIEP1,#02 GOTO T_3_1_P2
NOP
BSET RIEP1,#03 MTRABAJ2: DEC W5,W5
GOTO SCAN2 CLR W10
CLR W11
MTRARRIB1: INC W4,W4 MOV #13,W10
MOV #49,W10 MOV #12,W11
MOV #48,W11 CP W5,W10
CP W4,W10 BRA N,REC1W5
BRA NN,RCTFIW4 GOTO T_3_1_P2
GOTO T_3_1_P1
REC1W5: MOV W11,W5
RCTFIW4: MOV W11,W4 GOTO T_3_1_P2
GOTO T_3_1_P1
REBOTE1: MOV #15000,W0
MTRARRIB2: INC W5,W5 REBOT2: BTSC PORTF,#1
MOV #49,W10 GOTO DCREMENT
MOV #48,W11 GOTO SCAN2
CP W5,W10
BRA NN,RCTFIW5 DCREMENT: DEC W0,W0
GOTO T_3_1_P1 BRA NZ,REBOT2
RETURN
RECTIFIW5: MOV W11,W5
GOTO T_3_1_P1 REBOTE3: MOV #15000,W0
REBOTE: BTSC PORTF,#02
E01_P2: BTSC PORTF,#02 GOTO DCRMENT1
GOTO SCAN1 GOTO SCAN1

T_1_2_P2: BCLR RIEP2,#01 DCRMENT1: DEC W0,W0


NOP BRA NZ,REBOT4
BSET RIEP2,#02 RETURN
GOTO SCAN1
.END
E03_P2: BTSS PORTF,#02
GOTO SCAN1
T_2_3_P2: CALL REBOTE3
BCLR RIEP2,#03
NOP
BSET RIEP2,#01
GOTO SCAN1

E02_P2: BTSC PORTF,#00


GOTO MTRABAJ1
GOTO MTRABAJ2

T_3_1_P2: BCLR RIEP2,#02


NOP
BSET RIEP2,#03
GOTO SCAN1

MTRABAJ1: DEC W4,W4


CLR W10
CLR W11
MOV #13,W10

130 128
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.10

4 Mhz
P1

MCLR
RF0
d
s
P2 P RB0 M1
RF1 I
C
3
0
F
3 RB1 M2
0
1
4

Figura 7.14. Diseño esquemático del ejemplo 7.10

Realizar el montaje del hardware usando resistencias de 1 KΩ y una alimentación de 5


voltios.

 A M1 y M2 en todo instante se les suministra frecuencia.


 Los servomotores inician en una posición angular M1= -90º y M2= 90º.
 Cada tres segundos se hace una variación de 10 grados para M1 desde -90º hasta
llegar a 90º y para M2 desde 90º hasta llegar a 90º; es decir, inicialmente M1
emplea tres segundos en -90º y luego pasa a -80º y así sucesivamente. M2 lo
hace de manera similar pero en sentido contrario. Al llegar M1 a 90º y M2 a -90º y
permanecer allí durante los tres segundos se reinicia el proceso posicionándose
nuevamente M1 en -90º y M2 en 90º.
 Si en cualquier momento del proceso se detecta un flanco descendente en RF0,
independiente del ángulo actual; M1 se posiciona en 50º y M2 en -50º reiniciando
la temporización, pero manteniéndose en este valor por los tres segundos.
 Si en cualquier momento se detecta un flanco descendente en RF1 se hace un
procedimiento similar al anterior pero con posicionamiento para M1 en -50º y M2
en 50º.

129 131
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.10 BSET PORTB,#01


;Este ejemplo emplea un PLLx16 CLR TMR1
CLR TMR2
.INCLUDE "P30F3014.INC" CLR W7
.EQU VALOR1,81 CLR RIEP
.EQU VALOR2,200 MOV #6,W1
.EQU VALOR3,200 MOV #24,W2
.EQU RIEP,0X0800 OTRA: MOV W1,W4
.GLOBAL __T1Interrupt MOV W2,W5
.TEXT CALL DELAY_3S
.GLOBAL __reset INC W1,W1
DEC W2,W2
__reset: MOV #0X0802,W15 MOV #25,W0
MOV #0X08FE,W0 CP W1,W0
MOV W0,SPLIM BRA Z,INCR_M1
GOTO INICIO OTRA1: MOV #5,W0
CP W2,W0
__T1Interrupt: PUSH.S BRA Z,INCR_M2
INC W7,W7 GOTO OTRA
CP W4,W7
BRA Z,MTOR_M1 INCR_M1: MOV #6,W1
SIGA: CP W5,W7 GOTO OTRA1
BRAZ, MTOR_M2
MOV #230,W0 INCR_M2: MOV #24,W2
CP W0,W7 GOTO OTRA
BRA Z,CLAREAR
SALIR: BCLR IFS0,#T1IF DELAY_3S: MOV #VALOR3,W10
POP.S TRES: MOV #VALOR2,W9
RETFIE DOS: MOV #VALOR1,W8
UNO: DEC W8,W8
MTOR_M1: BCLR PORTB,#00 BRA NZ,PREGU1
GOTO SIGA DEC W9,W9
BRA NZ,DOS
MTOR_M2: BCLR PORTB,#01 DEC W10,W10
GOTO SALIR BRA NZ,TRES
RETURN
CLAREAR: CLR W7
BSET PORTB,#00 PREGU1: BTSC RIEP,#00
NOP GOTO HABILITAR1
BSET PORTB,#01 BTSC PORTF,#00
GOTO SALIR GOTO PREGU2
BSET RIEP,#00
INICIO: MOV #0X3F,W0 MOV #19,W1
MOV W0,ADPCFG MOV #11,W2
CLR TRISB RETURN
MOV #0XFFFF,W0
MOV W0,TRISF PREGU2: BTSC RIEP,#01
MOV #0X8020,W0 GOTO HABILITAR2
MOV W0,T1CON BTSC PORTF,#01
MOV W0,T2CON GOTO UNO
BCLR IFS0,#T1IF BSET RIEP,#01
BSET IEC0,#T1IE MOV #10,W1
BCLR CORCON,#IPL3 MOV #20,W2
BCLR SR,#IPL2 RETURN
BSET SR,#IPL1
BSET SR,#IPL0 HABILITAR1: BTSS PORTF,#00
MOV #24,W0 GOTO PREGU2
MOV W0,PR1 BCLR RIEP,#00
BSET PORTB,#00 GOTO PREGU2
NOP

132 130
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

HABILITAR2: BTSS PORTF,#01


GOTO UNO
BCLR RIEP,#01
GOTO UNO

.END

131 133
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.11

4 Mhz

MCLR

RD8 d RB0
MAX s RB1
232 P RB2
RD3 I RB3
C RB4
3 RB5
0 RB6
MSB RB7
RF2 F
3 RD1 E RS R/ W
RF1 0 RD0
RF0 1
LSB 4
RD9

Figura 7.15. Diseño esquemático del ejemplo 7.11

 La velocidad de transmisión es de 2400bps.


 Al recibir una cadena de caracteres válida que empiece y termine con „1‟ ésta será
incrementada en uno y mostrada en la primera línea del LCD. Ej: para 1DANA1 se
mostrará EBOB, para 123451 se mostrará 3456 sobrescribiendo el mensaje que
estaba antes.
 Al recibir una cadena de caracteres válida que empiece y termine con „2‟ ésta será
incrementada en dos y mostrada en la segunda línea del LCD. Ej: para 2ANAM2
se mostrará CPCO, para 234562 se mostrará 5678 sobrescribiendo el mensaje
que se mostraba anteriormente.
 El mensaje de la otra línea no desaparecerá al modificarse el mensaje de la línea
superior o viceversa.
 Los LEDS muestran en todo momento un conteo binario cíclico ascendente con
incremento cada 1.92 segundos (diseñado por interrupción).
 Al recibir en el dsPIC una cadena de caracteres valida que inicie y termine con „3‟
esta cadena será regresada al computador para ser visualizados los cuatro
símbolos ASCII en la pantalla del computador.
 Un valor lógico bajo en RD9 toma los valores binarios en ese instante de los LEDS
y son enviados al computador en forma de símbolos ASCII. Ej: para cuando estén
todos los LEDS encendidos y en ese instante se lea un valor lógico bajo en RD9,
en el computador se visualizará 111.
 Una cadena de caracteres válida es de cuatro símbolos ASCII.
 Se usa comtest en el computador.
 Para la realización de pruebas se usan cadenas de caracteres no válidas.

134 132
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.11 TX1: RRC W7,W7


BCLR PORTD,#03
BTSC SR,#C
.INCLUDE "P30F3014.INC" BSET PORTD,#03
.EQU VALOR2,4 CALL DUNBIT
.EQU VALOR3,13 DEC W8,W8
.EQU VALOR4,8 BRA NZ,TX1
.EQU VALOR5,15 BSET PORTD,#03
.EQU VALOR6,80 CALL DUNBIT
.EQU VALOR7,50 RETURN
.EQU BANDERA,0X0800
.GLOBAL __T1Interrupt RX: CALL DUNBIT
.TEXT CALL MEDIOBIT
.GLOBAL __reset MOV #8,W8
CLR W6
__reset: MOV #0X0802,W15 RX1: BCLR SR,#C
MOV #0X08FE,W0 BTSC PORTD,#8
MOV W0,SPLIM BSET SR,#C
GOTO INICIO RRC W6,W6
CALL DUNBIT
DUNBIT: MOV #VALOR5,W9 DEC W8,W8
TRES: MOV #VALOR4,W10 BRA NZ,RX1
DOS: DEC W10,W10 SWAP W6
BRA NZ,DOS RETURN
DEC W9,W9
BRA NZ,TRES __T1Interrupt: PUSH.S
RETURN BCLR IFS0,#T1IF
MOV #1,W0
DELAY: MOV #VALOR7,W9 MOV W0,BANDERA
TRESB: MOV #VALOR6,W10 INC W11,W11
DOSB: DEC W10,W10 CP W11,#8
BRA NZ,DOSB BRA NZ,BIENL
DEC W9,W9 CLR W11
BRA NZ,TRESB BIENL: POP.S
RETURN RETFIE

MEDIOBIT: MOV #VALOR3,W9 INICIO: MOV #0XFFFF,W0


TRESA: MOV #VALOR2,W10 MOV W0,ADPCFG
DOSA: DEC W10,W10 MOV W0,TRISC
BRA NZ,DOSA MOV #0X0000,W0
DEC W9,W9 MOV W0,TRISB
BRA NZ,TRESA MOV W0,TRISF
NOP MOV #0XFFF4,W0
NOP MOV W0,TRISD
NOP BCLR CORCON,#IPL3
RETURN BCLR SR,#IPL2
BSET SR,#IPL1
COMANDO: BCLR PORTD,#00 BSET SR,#IPL0
GOTO ASCII1 MOV #0X8030,W0
MOV W0,T1CON
ASCII: BSET PORTD,#00 MOV #7500,W0
ASCII1: MOV W0,PORTB MOV W0,PR1
BCLR PORTD,#01 BCLR IFS0,#T1IF
CALL DELAY BSET IEC0,#T1IE
BSET PORTD,#01 CLR TMR1
RETURN CLR PORTB
CLR W0
TX: BCLR PORTD,#03 CLR W1
CALL DUNBIT CLR W2
MOV #8,W8 CLR W3

133 135
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

CLR W4
CLR W5 DATO1A: BTSC PORTD,#8
CLR W6 GOTO DATO1A
CLR W7 CALL RX
CLR W8 MOV W6,W1
CLR W9 DATO2A: BTSC PORTD,#8
CLR W10 GOTO DATO2A
CLR W11 CALL RX
CLR W12 MOV W6,W2
CLR W13 DATO3A: BTSC PORTD,#8
CLR W14 GOTO DATO3A
CLR BANDERA CALL RX
MOV #0X0001,W0 MOV W6,W3
CALL COMANDO DATO4A: BTSC PORTD,#8
MOV #0X0003,W0 GOTO DATO4A
CALL COMANDO CALL RX
MOV #0X0006,W0 MOV W6,W4
CALL COMANDO DATO5A: BTSC PORTD,#8
MOV #0X000C,W0 GOTO DATO5A
CALL COMANDO CALL RX
MOV #0X001F,W0 MOV #'1',W0
CALL COMANDO CP W6,W0
MOV #0X003B,W0 BRA NZ,INICIA
CALL COMANDO INC W1,W1
MOV #0X0001,W0 INC W2,W2
CALL COMANDO INC W3,W3
MOV #0X00C1,W0 INC W4,W4
CALL COMANDO MOV #0X0086,W0
BSET PORTD,#03 CALL COMANDO
BSET PORTD,#02 MOV W1,W0
MOV #01,W14 CALL ASCII
MOV #01,W10 MOV W2,W0
BSET PORTD,#03 CALL ASCII
INICIA: BTSS PORTD,#8 MOV W3,W0
GOTO ENVIAN1 CALL ASCII
BTSS PORTD,#02 MOV W4,W0
GOTO REBOTE CALL ASCII
CLR W5 GOTO INICIA
SIGUER: MOV BANDERA,W1
CP W1,#01 DATO1B: BTSC PORTD,#8
BRA Z,CONTEO GOTO DATO1B
GOTO INICIA CALL RX
MOV W6,W1
REBOTE: MOV #1,W0 DATO2B: BTSC PORTD,#8
CP W0,W5 GOTO DATO2B
BRA Z,SIGUER CALL RX
MOV #1,W5 MOV W6,W2
GOTO ENVIA DATO3B: BTSC PORTD,#8
GOTO DATO3B
ENVIAN1: CALL RX CALL RX
MOV #'1',W0 MOV W6,W3
CP W6,W0 DATO4B: BTSC PORTD,#8
BRA Z,DATO1A GOTO DATO4B
MOV #'2',W0 CALL RX
CP W6,W0 MOV W6,W4
BRA Z,DATO1B DATO5B: BTSC PORTD,#8
MOV #'3',W0 GOTO DATO5B
CP W6,W0 CALL RX
BRA Z,DATO1C MOV #'2',W0
GOTO INICIA CP W6,W0

136 134
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

BRA NZ,INICIA BRA Z,CINCOZ


ADD #2,W1 CP W11,#6
ADD #2,W2 BRA Z,SEISZ
ADD #2,W3 GOTO SIETEZ
ADD #2,W4
MOD #0X00C6,W0 CEROZ: MOV #'0',W7
CALL COMANDO CALL TX
MOV W1,W0 MOV #'0',W7
CALL ASCII CALL TX
MOV W2,W0 MOV #'0',W7
CALL ASCII CALL TX
MOV W3,W0 GOTO INICIA
CALL ASCII
MOV W4,W0 UNOZ: MOV #'0',W7
CALL ASCII CALL TX
GOTO INICIA MOV #'0',W7
CALL TX
DATO1C: BTSC PORTD,#8 MOV #'1',W7
GOTO DATO1C CALL TX
CALL RX GOTO INICIA
MOV W6,W1
DATO2C: BTSC PORTD,#8 DOSZ: MOV #'0',W7
GOTO DATO2C CALL TX
CALL RX MOV #'1',W7
MOV W6,W2 CALL TX
DATO3C: BTSC PORTD,#8 MOV #'0',W7
GOTO DATO3C CALL TX
CALL RX GOTO INICIA
MOV W6,W3
DATO4C: BTSC PORTD,#8 TRESZ: MOV #'0',W7
GOTO DATO4C CALL TX
CALL RX MOV #'1',W7
MOV W6,W4 CALL TX
DATO5C: BTSC PORTD,#8 MOV #'1',W7
GOTO DATO5C CALL TX
CALL RX GOTO INICIA
MOV #'3',W0
CP W6,W0 CUATROZ: MOV #'1',W7
BRA NZ,INICIA CALL TX
MOV W1,W7 MOV #'0',W7
CALL TX CALL TX
MOV W2,W7 MOV #'0',W7
CALL TX CALL TX
MOV W3,W7 GOTO INICIA
CALL TX
MOV W4,W7 CINCOZ: MOV #'1',W7
CALL TX CALL TX
GOTO INICIA MOV #'0',W7
CALL TX
ENVIA: CP W11,#0 MOV #'1',W7
BRA Z,CEROZ CALL TX
CP W11,#1 GOTO INICIA
BRA Z,UNOZ
CP W11,#2 SEISZ: MOV #'1',W7
BRA Z,DOSZ CALL TX
CP W11,#3 MOV #'1',W7
BRA Z,TRESZ CALL TX
CP W11,#4 MOV #'0',W7
BRA Z,CUATROZ CALL TX
CP W11,#5 GOTO INICIA

135 137
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

SIETEZ: MOV #'1',W7


CALL TX
MOV #'1',W7
CALL TX
MOV #'1',W7
CALL TX
GOTO INICIA

CONTEO: CP W11,#0
BRA Z,CEROX
CP W11,#1
BRA Z,UNOX
CP W11,#2
BRA Z,DOSX
CP W11,#3
BRA Z,TRESX
CP W11,#4
BRA Z,CUATROX
CP W11,#5
BRA Z,CINCOX
CP W11,#6
BRA Z,SEISX
GOTO SIETEX

CEROX: CLR PORTF


GOTO INICIA

UNOX: MOV #0X0001,W0


MOV W0,PORTF
GOTO INICIA

DOSX: MOV #0X0002,W0


MOV W0,PORTF
GOTO INICIA

TRESX: MOV #0X0003,W0


MOV W0,PORTF
GOTO INICIA

CUATROX: MOV #0X0004,W0


MOV W0,PORTF
GOTO INICIA

CINCOX: MOV #0X0005,W0


MOV W0,PORTF
GOTO INICIA

SEISX: MOV #0X0006,W0


MOV W0,PORTF
GOTO INICIA

SIETEX: MOV #0X0007,W0


MOV W0,PORTF
GOTO INICIA

.END

138 136
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.12

4 Mhz
P1

RA11 MCLR
RB0
P1 d RB1
RD9 s RB2
P RB3
I RB4
C
RB5
3
MSB 0 RB6
RF2 F
RF6 3
RF3 0 RB7
LSB 1
RB8
4
RB9
RB10

Figura 7.16. Diseño esquemático del ejemplo 7.12

 Los display muestran un contador ascendente cíclico desde 00:00 hasta 99:99,
con incremento cada segundo.
 Los LEDS presentan un conteo binario descendente cíclico que inicia en 111, con
decremento cada 1.5 segundos. Esta temporización está diseñada por bucles
usando W1, W2 y W3.
 Un flanco descendente en RA11 (por interrupción) hace visualizar en los display el
mensaje UPB durante 4.5 segundos al final de los cuales se continua el conteo
que se tenia antes en los cuatro display. El conteo binario en los tres LEDS debe
continuar normalmente durante estos 4.5 segundos que se visualizó el mensaje.
 Un flanco ascendente en RD9 (por interrupción) hace visualizar en los display el
mensaje BGA durante 4.5 segundos al final de los cuales se continuará con el
conteo que se tenía antes de la interrupción. El conteo binario en los tres LEDS
debe continuar normalmente durante este período de tiempo.

137 139
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.12 MOV W6,W12


MOV W7,W14
MOV #8,W7
.INCLUDE "P30F3014.INC" MOV #14,W6
.EQU VALOR1,80 MOV #13,W5
.EQU VALOR2,50 MOV #10,W4
.EQU VALOR3,123 MOV #1,W13
.GLOBAL __INT0Interrupt BCLR IFS1,#INT2IF
.GLOBAL __INT2Interrupt BCLR IEC0,#INT0IE
.GLOBAL __T1Interrupt BCLR IEC1,#INT2IE
.GLOBAL __T2Interrupt RETFIE
.TEXT
.GLOBAL __reset __T1Interrupt: PUSH.S
BCLR IFS0,#INT0IF
__reset: MOV #0X0800,W15 BCLR IFS1,#INT2IF
MOV #0X08FE,W0 CP W13,#1
MOV W0,SPLIM BRA NZ,INCR
GOTO INICIO CLR PR1
MOV #3906,W0
TABLA: BRA W0 MOV W0,PR1
RETLW #0X0040,W0 MOV W9,W4
RETLW #0X0079,W0 MOV W11,W5
RETLW #0X0024,W0 MOV W12,W6
RETLW #0X0030,W0 MOV W14,W7
RETLW #0X0019,W0 CLR W9
RETLW #0X0012,W0 CLR W11
RETLW #0X0003,W0 CLR W12
RETLW #0X0078,W0 CLR W14
RETLW #0X0000,W0 BSET IEC0,#INT0IE
RETLW #0X0018,W0 BSET IEC1,#INT2IE
RETLW #0X007F,W0 CLR W13
RETLW #0X0041,W0 GOTO SALIR1
RETLW #0X000C,W0
RETLW #0X0008,W0 INCR: INC W4,W4
RETLW #0X0002,W0 MOV #0X0A,W0
CP W4,W0
__INT0Interrupt: CLR TMR1 BRA NZ,SALIR1
CLR PR1 CLR W4
MOV #17578,W0 INC W5,W5
MOV W0,PR1 MOV #0X0A,W0
MOV W4,W9 CP W5,W0
MOV W5,W11 BRA NZ,SALIR1
MOV W6,W12 CLR W5
MOV W7,W14 INC W6,W6
MOV #11,W7 MOV #0X0A,W0
MOV #12,W6 CP W6,W0
MOV #8,W5 BRA NZ,SALIR1
MOV #10,W4 CLR W6
MOV #1,W13 INC W7,W7
BCLR IFS0,#INT0IF MOV #0X0A,W0
BCLR IEC0,#INT0IE CP W7,W0
BCLR IEC1,#INT2IE BRA NZ,SALIR1
RETFIE CLR W7
SALIR1: BCLR IFS0,#T1IF
__INT2Interrupt: CLR TMR1 POP.S
CLR PR1 RETFIE
MOV #17578,W0
MOV W0,PR1 __T2Interrupt: PUSH.S
MOV W4,W9 BTSC PORTB,#10
MOV W5,W11 GOTO PRENDER5

140 138
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

BTSC PORTB,#9 MOV W0,PR1


GOTO PRENDER6 MOV #30,W0
BTSC PORTB,#8 MOV W0,PR2
GOTO PRENDER7 CLR TMR1
BTSC PORTB,#7 CLR TMR2
GOTO PRENDER4 CLR PORTB
PRENDER5: BCLR PORTB,#10 CLR PORTF
MOV W5,W0 CLR W4
CALL TABLA CLR W5
MOV W0,PORTB CLR W6
NOP CLR W7
BSET PORTB,#9 CLR W9
GOTO SALIR CLR W10
PRENDER6: BCLR PORTB,#9 CLR W11
MOV W6,W0 BSET PORTB,#10
CALL TABLA NOP
MOV W0,PORTB BCLR PORTB,#7
NOP NOP
BSET PORTB,#8 BCLR PORTB,#9
GOTO SALIR NOP
PRENDER7: BCLR PORTB,#8 BCLR PORTB,#8
MOV W7,W0 BSET INTCON2,#INT0EP
CALL TABLA BCLR INTCON2,#INT2EP
MOV W0,PORTB INICIO1: MOV #0B111,W8
NOP BSET PORTF,#2
BSET PORTB,#7 NOP
GOTO SALIR BSET PORTF,#6
NOP
PRENDER4: BCLR PORTB,#7 BSET PORTF,#3
MOV W4,W0 PROGRAMA: MOV #VALOR3,W3
CALL TABLA TRES: MOV #VALOR2,W2
MOV W0,PORTB DOS: MOV #VALOR1,W1
NOP UNO: DEC W1,W1
BSET PORTB,#10 BRA NZ,UNO
SALIR: BCLR IFS0,#T2IF DEC W2,W2
POP.S BRA NZ,DOS
RETFIE DEC W3,W3
BRA NZ,TRES
INICIO: MOV #0XFFFF,W0 DEC W8,W8
MOV W0,ADPCFG MOV #0,W0
MOV W0,TRISA CP W8,W0
MOV W0,TRISD BRA N,INICIO1
CLR TRISB BTSC W8,#0
CLR TRISF GOTO SETEAR
MOV #0X8030,W0 BCLR PORTF,#3
MOV W0,T1CON OTRA: BTSC W8,#1
MOV W0,T2CON GOTO SETEAR1
BCLR IFS0,#T2IF BCLR PORTF,#6
BCLR IFS0,#INT0IF OTRA1: BTSC W8,#2
BCLR IFS0,#T1IF GOTO SETEAR2
BCLR IFS1,#INT2IF BCLR PORTF,#2
BSET IEC0,#INT0IE GOTO PROGRAMA
BSET IEC0,#T1IE SETEAR: BSET PORTF,#3
BSET IEC0,#T2IE GOTO OTRA
BSET IEC1,#INT2IE SETEAR1: BSET PORTF,#6
BSET SR,#IPL0 GOTO OTRA1
BSET SR,#IPL1 SETEAR2: BSET PORTF,#2
BCLR SR,#IPL2 GOTO PROGRAMA
BCLR CORCON,#IPL3
MOV #3906,W0 .END

139 141
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.13

4 Mhz
P1

RD8 MCLR
RB0
P1 d RB1
RD9 s RB2
P RB3
I RB4
C
RB5
3
MSB 0 RB6
RF0 F
RF1 3
RF2 0 RB7
LSB 1
RB8
4
RB9
RB10

Figura 7.17. Diseño esquemático del ejemplo 7.13

 Al energizar el sistema los cuatro display muestran el mensaje HOLA.


 En todo instante y desde el inicio los tres LEDS muestran un conteo
descendente desde 111 cíclicamente con decremento cada 1.5 segundos. Esta
temporización está diseñada por bucles usando W1, W2 y W3.
 Un flanco ascendente en RD8 cambia lo mostrado en los cuatro display a
07:12. A partir de ese valor se inicia un contador cíclico en formato 00:00 a
99:99 con incremento cada segundo. Para ello se usa la interrupción
correspondiente, esta interrupción puede ser activada en cualquier momento.
 Un flanco descendente en RD9 cambia lo mostrado en los cuatro display a
12:07. A partir de ese valor se inicia un contador cíclico en formato 00:00 a
99:99 con incremento cada segundo. Para ello se usa la interrupción
correspondiente, esta interrupción puede ser activada en cualquier momento.

142 140
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.13 CLR W7


SALIR1: BCLR IFS0,#T1IF
POP.S
.INCLUDE "P30F3014.INC" RETFIE
.GLOBAL __T1Interrupt
.GLOBAL __T2Interrupt __T2Interrupt: PUSH.S
.GLOBAL __INT1Interrupt BTSC W13,#00
.GLOBAL __INT2Interrupt GOTO DISP_0
.TEXT BTSC W13,#01
.GLOBAL __reset GOTO DISP_1
BTSC W13,#02
__reset: MOV #0X0800,W15 GOTO DISP_2
MOV #0X08FE,W0 BTSC W13,#03
MOV W0,SPLIM GOTO DISP_3
GOTO INICIO SALIR2: BCLR IFS0,#T2IF
POP.S
BUCLE: MOV #200,W3 RETFIE
TRES: MOV #100,W2
DOS: MOV #25,W1 DISP_0: CALL DISPLAY0
UNO: DEC W1,W1 MOV W0,PORTB
BRA NZ,UNO NOP
DEC W2,W2 BSET PORTB,#10
BRA NZ,DOS BCLR W13,#00
DEC W3,W3 BSET W13,#01
BRA NZ,TRES GOTO SALIR2
RETURN
DISP_1: CALL DISPLAY1
__T1Interrupt: PUSH.S MOV W0,PORTB
INC W4,W4 BCLR W13,#01
MOV #10,W0 BSET W13,#02
CP W4,W0 GOTO SALIR2
BRA Z,CLR_W4
GOTO SALIR1 DISP_2: CALL DISPLAY2
MOV W0,PORTB
CLR_W4: CLR W4 BCLR W13,#02
INC W5,W5 BSET W13,#03
MOV #10,W0 GOTO SALIR2
CP W5,W0
BRA Z,CLR_W5 DISP_3: CALL DISPLAY3
GOTO SALIR1 MOV W0,PORTB
BCLR W13,#03
CLR_W5: CLR W5 BSET W13,#00
INC W6,W6 GOTO SALIR2
MOV #10,W0
CP W6,W0 DISPLAY0: BRA W4
BRA Z,CLR_W6 RETLW #0X003F,W0
GOTO SALIR1 RETLW #0X0006,W0
RETLW #0X005B,W0
CLR_W6: CLR W6 RETLW #0X004F,W0
INC W7,W7 RETLW #0X0066,W0
MOV #10,W0 RETLW #0X006D,W0
CP W7,W0 RETLW #0X007D,W0
BRA Z,CLR_W7 RETLW #0X0007,W0
GOTO SALIR1 RETLW #0X007F,W0
RETLW #0X0067,W0
CLR_W7: CLR W4 RETLW #0X0077,W0
CLR W5
CLR W6 DISPLAY1: BRA W5

141 143
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

RETLW #0X023F,W0
RETLW #0X0206,W0 INICIO: MOV #0XFFFF,W0
RETLW #0X025B,W0 MOV W0,ADPCFG
RETLW #0X024F,W0 MOV W0,TRISD
RETLW #0X0266,W0 CLR TRISB
RETLW #0X026D,W0 CLR TRISF
RETLW #0X027D,W0 MOV #0X8020,W0
RETLW #0X0207,W0 MOV W0,T1CON
RETLW #0X027F,W0 MOV W0,T2CON
MOV #15625,W0
RETLW #0X0267,W0 MOV W0,PR1
RETLW #0X0238,W0 MOV #15,W0
MOV W0,PR2
DISPLAY2: BRA W6 BCLR INTCON2,#INT1EP
RETLW #0X013F,W0 BCLR INTCON2,#INT2EP
RETLW #0X0106,W0 BSET SR,#IPL0
RETLW #0X015B,W0 BSET SR,#IPL1
RETLW #0X014F,W0 BCLR SR,#IPL2
RETLW #0X0166,W0 BCLR CORCON,#IPL3
RETLW #0X016D,W0 BCLR IEC0,#T1IE
RETLW #0X017D,W0 BSET IEC0,#T2IE
RETLW #0X0107,W0 BSET IEC1,#INT1IE
RETLW #0X017F,W0 BSET IEC1,#INT2IE
RETLW #0X0167,W0 BCLR IFS1,#INT1IF
RETLW #0X013F,W0 BCLR IFS1,#INT2IF
BCLR IFS0,#T1IF
DISPLAY3: BRA W7 BCLR IFS0,#T2IF
RETLW #0X00BF,W0 CLR PORTB
RETLW #0X0086,W0 CLR PORTF
RETLW #0X00DB,W0 CLR TMR1
RETLW #0X00CF,W0 CLR TMR2
RETLW #0X00E6,W0 CLR TMR3
RETLW #0X00ED,W0 MOV #10,W0
RETLW #0X00FD,W0 MOV W0,W4
RETLW #0X0087,W0 MOV W0,W5
RETLW #0X00FF,W0 MOV W0,W6
RETLW #0X00E7,W0 MOV W0,W7
RETLW #0X00F6,W0 CLR W13
CLR W14
__INT1Interrupt: PUSH.S BSET W13,#00
MOV #02,W4 INICIAR: MOV #07,W14
MOV #01,W5 MOV W14,PORTF
MOV #07,W6 OTRA: MOV W14,PORTF
MOV #00,W7 CALL BUCLE
BSET IEC0,#T1IE MOV #00,W0
BCLR IFS0,#T1IF CP W14,W0
BCLR IFS1,#INT1IF BRA Z,INICIAR
POP.S DEC W14,W14
RETFIE GOTO OTRA

__INT2Interrupt: PUSH.S .END


MOV #07,W4
MOV #00,W5
MOV #02,W6
MOV #01,W7
BSET IEC0,#T1IE
BCLR IFS0,#T1IF
BCLR IFS1,#INT2IF
POP.S
RETFIE

144 142
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.14

4 Mhz

MCLR
RA11 RB0
d RB1
s RB2
P RB3
I RB4
C
RB5
3
0 RB6
RD3 F RB7
3 RF0 RS E
R/W
0 RF1
1
4 RD8
RD9
RC14 RC13
0 0 0 0 FORMATO DE
D4 D3 D2 D1 CONTADOR

Figura 7.18. Diseño esquemático del ejemplo 7.14

 En la parte central de la primera fila del LCD se muestra un contador


descendente en formato 9999 a 0000 visualizado en todo momento con
decremento cada segundo.
 Un flanco descendente en RC14 modifica el valor lógico de RC13: si el LED
estaba apagado lo enciende y viceversa. Se debe tener en cuenta el rebote del
pulsador.
 aplicando interrupciones, al detectarse un flanco descendente en RD8 el valor
D2 es incrementado (si estaba en 9 pasa a 0), al detectarse un flanco
ascendente en RD9 el valor D4 es decrementado (si estaba en 0 pasa a 9). Se
debe tener en cuenta el rebote del pulsador.
 Para el servomotor S1, por RA11 se entregará frecuencia en todo momento y
esta frecuencia corresponderá en grados positivos al valor D4 multiplicado por
10. Ej: Para 7 será 70 grados.
 Para el servomotor S2, por RD3 se entregará frecuencia en todo momento y
esta frecuencia corresponderá en grados negativos al valor D2 multiplicado por
10. Ej: Para 3 será -30 grados.
 En la segunda línea del display se mostrarán en todo momento los nombres de
los integrantes del grupo.
 Una subrutina de interrupción son pocas líneas que pueden configurar una
actividad que se realiza como rutina en el programa principal.

143 145
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.14 ALTOS2: CLR W14


;Este ejemplo emplea un PLLx16 BTSC ESTADO2,#0
GOTO MIRA2
.INCLUDE "P30F3014.INC" INC W10,W10
.EQU VALOR1,#55 MOV #5,W0
.EQU VALOR2,#100 CP W0,W10
.EQU VALOR3,#4 BRA NZ,MIRA2
.EQU DIG1,#0X0800 BTSC COSA,#0
.EQU DIG2,#0X0802 GOTO UNA_1
.EQU DIG3,#0X0804 DEC W7,W7
.EQU DIG4,#0X0806 MOV #0,W0
.EQU ESTADO,#0X0808 CP W0,W7
.EQU ESTADO1,#0X080A BRA NZ,SALIR9
.EQU ESTADO2,#0X080C MOV #0,W7
.EQU COSA,#0X080E BSET COSA,#00
.GLOBAL __T1Interrupt GOTO SALIR9
.GLOBAL __T2Interrupt
.GLOBAL __INT1Interrupt BAJOS2: CLR W10
.GLOBAL __INT2Interrupt BTSS ESTADO2,#0
.TEXT GOTO MIRA2
.GLOBAL __reset INC W14,W14
MOV #5,W0
__reset: MOV #0X0810,W15 CP W0,W14
MOV #0X08FE,W0 BRA NZ,MIRA2
MOV W0,SPLIM BCLR ESTADO2,#0
GOTO INICIO SALIR9: BCLR IFS1,#INT2IF
POP.S
__INT1Interrupt: PUSH.S RETFIE
MIRA1: BTSC PORTD,#8
GOTO ALTOS1 UNA_1: CLR W7
BAJOS1: CLR W14 MOV #9,W7
BTSC ESTADO1,#0 BCLR COSA,#0
GOTO MIRA1 GOTO SALIR9
INC W10,W10
MOV #5,W0 __T1Interrupt: PUSH.S
CP W0,W10 INC W11,W11
BRA NZ,MIRA1 MOV W12,W0
INC W5,W5 CP W11,W0
MOV #10,W0 BRA Z,CLRM1
CP W0,W5 SEGUNDA: MOV W13,W0
BRA NZ,SALIR8 CP W11,W0
CLR W5 BRA Z,CLRM2
GOTO SALIR8 TERCERA: MOV #230,W0
CP W11,W0
ALTOS1: CLR W10 BRA Z,SETM1M2
BTSS ESTADO1,#0 SALIR2: BCLR IFS0,#T1IF
GOTO MIRA1 POP.S
INC W14,W14 RETFIE
MOV #5,W0
CP W0,W14 CLRM1: BCLR PORTA,#11
BRA NZ,MIRA1 GOTO SEGUNDA
BCLR ESTADO1,#0
SALIR8: BCLR IFS1,#INT1IF CLRM2: BCLR PORTD,#3
POP.S GOTO TERCERA
RETFIE
SETM1M2: BSET PORTA,#11
__INT2Interrupt: PUSH.S CLR W11
MIRA2: BTSS PORTD,#8 BSET PORTD,#3
GOTO BAJOS2 GOTO SALIR2

146 144
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

__T2Interrupt: PUSH.S DELAYLCD: MOV #VALOR3,W3


REPETIR: DEC W4,W4 TRES: MOV #VALOR2,W2
MOV #0X0A,W0 DOS: MOV #VALOR1,W1
CP W0,W4 UNO: DEC W1,W1
BRA GEU,SALIR1 BRA NZ,UNO
MOV #9,W4 DEC W2,W2
DEC W5,W5 BRA NZ,DOS
MOV #0X0A,W0 DEC W3,W3
CP W0,W5 BRA NZ,TRES
BRA GEU,SALIR1 RETURN
MOV #9,W5
DEC W6,W6 INICIO: MOV #0XFFFF,W0
MOV #0X0A,W0 MOV W0,ADPCFG
CP W0,W6 CLR TRISA
BRA GEU,SALIR1 MOV #0X0300,W0
MOV #9,W6 MOV W0,TRISD
DEC W7,W7 CLR TRISB
MOV #0X0A,W0 MOV #0X0004,W0
CP W0,W7 MOV W0,TRISF
BRA GEU,SALIR1 MOV #0X4000,W0
MOV #9,W7 MOV W0,TRISC
SALIR1: CLR TMR2 MOV #0X8010,W0
BCLR IFS0,#T2IF MOV W0,T1CON
POP.S MOV #0X8030,W0
RETFIE MOV W0,T2CON
BCLR IFS0,#T1IF
TABLA: BRA W0 BSET IEC0,#T1IE
RETLW #15,W0 BCLR IFS0,#T2IF
RETLW #16,W0 BSET IEC0,#T2IE
RETLW #17,W0 BCLR IFS1,#INT1IF
RETLW #18,W0 BSET IEC1,#INT1IE
RETLW #19,W0 BCLR IFS1,#INT2IF
RETLW #20,W0 BSET IEC1,#INT2IE
RETLW #21,W0 BSET INTCON2,#INT1EP
RETLW #22,W0 MOV #199,W0
RETLW #23,W0 BCLR INTCON2,#INT2EP
RETLW #24,W0 MOV W0,PR1
MOV #62500,W0
TABLA1: BRA W0 MOV W0,PR2
RETLW #15,W0 BSET SR,#IPL0
RETLW #14,W0 BSET SR,#IPL1
RETLW #13,W0 BCLR SR,#IPL2
RETLW #12,W0 BCLR CORCON,#IPL3
RETLW #11,W0 CLR TMR1
RETLW #10,W0 CLR TMR2
RETLW #9,W0 CLR W8
RETLW #8,W0 CLR W9
RETLW #7,W0 CLR W14
RETLW #6,W0 CLR W10
BSET PORTF,#1
COMANDO: BCLR PORTF,#0 NOP
GOTO ENVIAR BCLR ESTADO,#0
BCLR ESTADO1,#0
C_ASCII: BSET PORTF,#0 BCLR ESTADO2,#0
ENVIAR: MOV W0,PORTB BCLR COSA,#0
ACA: BCLR PORTF,#1 MOV #9,W0
CALL DELAYLCD MOV W0,W4
BSET PORTF,#1 MOV W0,W5
RETURN MOV W0,W6
MOV W0,W7

145 147
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

MOV #0X0001,W0 MOV W7,W0


CALL COMANDO CALL TABLA
MOV #0X0003,W0 MOV W0,W12
CALL COMANDO MOV W5,W0
MOV #0X0006,W0 CALL TABLA1
CALL COMANDO MOV W0,W13
MOV #0X000C,W0 MOV #0X0088,W0
CALL COMANDO CALL COMANDO
MOV #0X001F,W0 MOV DIG4,W0
CALL COMANDO CALL C_ASCII
MOV #0X003B,W0 MOV DIG3,W0
CALL COMANDO CALL C_ASCII
MOV #0X0001,W0 MOV DIG2,W0
CALL COMANDO CALL C_ASCII
MOV #0X00C2,W0 MOV DIG1,W0
CALL COMANDO CALL C_ASCII
MOV #'Y',W0 ANTIREBOTE: BTSC PORTC,#14
CALL C_ASCII GOTO ALTOS
MOV #'A',W0 BAJOS: CLR W9
CALL C_ASCII BTSC ESTADO,#0
MOV #'M',W0 GOTO LCD
CALL C_ASCII INC W8,W8
MOV #'I',W0 MOV #5,W0
CALL C_ASCII CP W0,W8
MOV #'R',W0 BRA NZ,LCD
CALL C_ASCII BTG PORTF,#5
MOV #' ',W0 NOP
CALL C_ASCII BSET ESTADO,#0
MOV #'C',W0 GOTO LCD
CALL C_ASCII
MOV #' ',W0 ALTOS: CLR W8
CALL C_ASCII BTSS ESTADO,#0
MOV #' ',W0 GOTO LCD
CALL C_ASCII INC W9,W9
MOV #'R',W0 MOV #5,W0
CALL C_ASCII CP W0,W9
MOV #'O',W0 BRA NZ,LCD
CALL C_ASCII BCLR ESTADO,#0
MOV #'S',W0 GOTO LCD
CALL C_ASCII
MOV #'S',W0 .END
CALL C_ASCII
MOV #'Y',W0
CALL C_ASCII
MOV #' ',W0
CALL C_ASCII
MOV #'L',W0
CALL C_ASCII
LCD: MOV W4,W0
ADD #0X30,W0
MOV W0,DIG1
MOV W5,W0
ADD #0X30,W0
MOV W0,DIG2
MOV W6,W0
ADD #0X30,W0
MOV W0,DIG3
MOV W7,W0
ADD #0X30,W0
MOV W0,DIG4

148 146
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.15

4 Mhz

MCLR
S1 RC14 RB0
d RB1
s RB2
P RB3
I RB4
C
RB5
S2 RC13 3 RB6
0
F RB7
3 RF2 RS E
R/W
0 RF3 MSB
1
RD9 RD8
4
RA11 RD3
RF0 RF1
LSB

Figura 7.19. Diseño esquemático del ejemplo 7.15

 RA11 y RD9 se activan por interrupción.


 En la parte central de la segunda línea del LCD se visualiza un reloj de tiempo
real en formato 00:00 hasta 59:59. este reloj se muestra y se actualiza en todo
momento incrementándose cada segundo.
 Un flanco descendente en RA11 hace incrementar los minutos, se debe tener
en cuenta el rebote del pulsador.
 Un flanco ascendente en RD9 hace incrementar los segundos, se debe tener
en cuenta el rebote del pulsador.
 Un flanco descendente en RF0 incrementa el valor binario mostrado en los tres
LEDS.
 S1 recibe frecuencia en todo momento desde RC14 y corresponde al ángulo
positivo del valor binario de los LEDS multiplicado por 10. Ej: Para el valor
binario 011 corresponde a 30 grados.
 S2 recibe frecuencia en todo momento desde RC13 y corresponde al ángulo
negativo del valor binario de los LEDS multiplicado por 10. Ej: Para el valor
binario 100 corresponde a -40 grados.
 El mensaje de nombre(s) a apellido(s) o de apellido(s) a nombre(s), según el
que se esté visualizando en ese momento cambia cada vez que los segundos
llegan a 07.
 Una subrutina de interrupción son pocas líneas que pueden configurar una
actividad que se realiza como rutina en el programa principal.

147 149
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA, Viviana; dsPIC de Microchip

EJEMPLO 7.15 RETLW #23,W12


RETLW #24,W12

.INCLUDE"P30F3014.inc" TABLA3: BRA W13


.GLOBAL __INT0Interrupt RETLW #15,W13
.GLOBAL __INT2Interrupt RETLW #14,W13
.GLOBAL __T1Interrupt RETLW #13,W13
.GLOBAL __T2Interrupt RETLW #12,W13
.TEXT RETLW #11,W13
.GLOBAL __reset RETLW #10,W13
RETLW #9,W13
__reset: MOV #0x0800,W15 RETLW #8,W13
MOV #0x08FE,W0 RETLW #7,W13
MOV W0,SPLIM RETLW #6,W13
GOTO INICIO
GRUPOS: BCLR W10,#0X01
DELAY: MOV #200,W0 BTSC W9,#00
CP TMR3 GOTO NOMBRES
BRA NZ,DELAY APELLIDOS: MOV #0X0080,W0
RETURN CALL COMANDO
MOV #'A',W0
MDELAY: MOV #100,W0 CALL ASCII
CP TMR3 MOV #'N',W0
BRA NZ,MDELAY CALL ASCII
RETURN MOV #'T',W0
CALL ASCII
COMANDO: BCLR PORTF,#02 MOV #'O',W0
GOTO ENVIA CALL ASCII
MOV #'L',W0
ASCII: BSET PORTF,#02 CALL ASCII
ENVIA: MOV W0,PORTB MOV #'I',W0
BCLR PORTF,#03 CALL ASCII
CLR TMR3 MOV #'N',W0
CALL DELAY CALL ASCII
BSET PORTF,#03 MOV #'E',W0
RETURN CALL ASCII
MOV #'Z',W0
TABLA: BRA W0 CALL ASCII
RETLW #'0',W0 MOV #' ',W0
RETLW #'1',W0 CALL ASCII
RETLW #'2',W0 MOV #'O',W0
RETLW #'3',W0 CALL ASCII
RETLW #'4',W0 MOV #'T',W0
RETLW #'5',W0 CALL ASCII
RETLW #'6',W0 MOV #'E',W0
RETLW #'7',W0 CALL ASCII
RETLW #'8',W0 MOV #'R',W0
RETLW #'9',W0 CALL ASCII
MOV #'O',W0
TABLA2: BRA W12 CALL ASCII
RETLW #15,W12 RETURN
RETLW #16,W12
RETLW #17,W12 NOMBRES: MOV #0X0080,W0
RETLW #18,W12 CALL COMANDO
RETLW #19,W12 MOV #'E',W0
RETLW #20,W12 CALL ASCII
RETLW #21,W12 MOV #'D',W0
RETLW #22,W12 CALL ASCII

150 148
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA Viviana dsPIC de Microchip

MOV #'E',W0 BRA NZ,PREG


CALL ASCII CLR W7
MOV #'R',W0 INC W8,W8
CALL ASCII MOV #0X6,W0
MOV #' ',W0 CP W8,W0
CALL ASCII BRA NZ,PREG
MOV #'M',W0 CLR W8
CALL ASCII PREG: MOV #7,W0
MOV #'O',W0 CP W5,W0
CALL ASCII BRA Z,PREG1
MOV #'N',W0 GOTO SALIR
CALL ASCII
MOV #'I',W0 PREG1: MOV #0,W0
CALL ASCII CP W6,W0
MOV #'C',W0 BRA Z,SETEAR
CALL ASCII GOTO SALIR
MOV #'A',W0
CALL ASCII SETEAR: BTG W9,#00
MOV #' ',W0 BSET W10,#0x01
CALL ASCII GOTO SALIR
MOV #' ',W0
CALL ASCII SALIR: BCLR IFS0,#T1IF
MOV #' ',W0 POP.S
CALL ASCII RETFIE
MOV #' ',W0
CALL ASCII __T2Interrupt: PUSH.S
RETURN INC W11,W11
MOV W3,W12
SACAR: MOV #0X00C4,W0 MOV W3,W13
CALL COMANDO CALL TABLA2
MOV W8,W0 CALL TABLA3
CALL TABLA PRIMERA: CP W11,W12
CALL ASCII BRA Z,CLR_M1
MOV W7,W0 SEGUNDA: CP W11,W13
CALL TABLA BRA Z,CLR_M2
CALL ASCII TERCERO: MOV #230,W0
MOV #':',W0 CP W11,W0
CALL ASCII BRA Z,S_M1_M2
MOV W6,W0 GOTO SALIR1
CALL TABLA
CALL ASCII CLR_M1: BCLR PORTC,#14
MOV W5,W0 GOTO SEGUNDA
CALL TABLA
CALL ASCII CLR_M2: BCLR PORTC,#13
RETURN GOTO SALIR1

__T1Interrupt: PUSH.S S_M1_M2: BSET PORTC,#14


INC W5,W5 CLR W11
MOV #0X0A,W0 BSET PORTC,#13
CP W5,W0 SALIR1: BCLR IFS0,#T2IF
BRA NZ,PREG POP.S
CLR W5 RETFIE
INC W6,W6
MOV #0X6,W0 INT0Interrupt: PUSH.S
CP W6,W0 INC W7,W7
BRA NZ,PREG MOV #0X0A,W0
CLR W6 CP W7,W0
INC W7,W7 BRA NZ,SALIR2
MOV #0X0A,W0 CLR W7
CP W7,W0 INC W8,W8

149 151
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA Viviana dsPIC de Microchip

MOV #0X6,W0 BSET IEC0,#T2IE


CP W8,W0 BSET SR,#IPL0
BRA NZ,SALIR2 BSET SR,#IPL1
CLR W8 BCLR SR,#IPL2
SALIR2: BCLR IFS0,#INT0IF BCLR CORCON,#IPL3
POP.S CLR TMR1
RETFIE CLR TMR2
CLR TMR3
__INT2Interrupt: PUSH.S CLR PORTB
INC W5,W5 CLR PORTC
MOV #0X0A,W0 CLR PORTD
CP W5,W0 CLR PORTF
BRA NZ,SALIR3 CLR W1
CLR W5 CLR W2
INC W6,W6 CLR W3
MOV #6,W0 CLR W4
CP W6,W0 CLR W5
BRA NZ,SALIR3 CLR W6
CLR W6 CLR W7
INC W7,W7 CLR W8
MOV #0X0A,W0 CLR W9
CP W7,W0 CLR W10
BRA NZ,SALIR3 CLR W11
CLR W7 CLR W12
INC W8,W8 CLR W13
MOV #6,W0 CLR W14
CP W8,W0 BSET W10,#0X01
BRA NZ,SALIR3 BCLR W9,#00
CLR W8 BSET W9,#02
SALIR3: BCLR IFS1,#INT2IF BSET PORTF,#3
POP.S MOV #0X0001,W0
RETFIE CALL COMANDO
MOV #0X0003,W0
INICIO: MOV #0XFFFF,W0 CALL COMANDO
MOV W0,ADPCFG MOV #0X0006,W0
BSET TRISA,#11 CALL COMANDO
CLR TRISB MOV #0X000C,W0
CLR TRISC CALL COMANDO
CLR TRISD MOV #0X001F,W0
CLR TRISF CALL COMANDO
BSET TRISD,#9 MOV #0X003B,W0
BSET TRISF,#0 CALL COMANDO
MOV #0X8030,W0 MOV #0X0001,W0
MOV W0,T1CON CALL COMANDO
MOV W0,T3CON PROGRAMA: BTSC PORTF,#0
MOV #0X8010,W0 GOTO CONT_ALT
MOV W0,T2CON CONT_BAJ: BTSC W9,#02
MOV #62500,W0 GOTO FINAL
MOV W0,PR1 CLR W1
MOV #199,W0 INC W2,W2
MOV W0,PR2 MOV #2,W0
BSET INTCON2,#INT0EP CP W2,W0
BCLR INTCON2,#INT2EP BRA NZ,FINAL
BCLR IFS0,#INT0IF BSET W9,#02
BCLR IFS1,#INT2IF INC W3,W3
BCLR IFS0,#T1IF INC_LEDS: MOV #0x8,W0
BCLR IFS0,#T2IF CP W3,W0
BSET IEC0,#INT0IE BRA Z,CLR_W3
BSET IEC1,#INT2IE ENC_LEDS1: BTSS W3,#00
BSET IEC0,#T1IE GOTO APG_LEDS1

152 150
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA Viviana dsPIC de Microchip

BSET PORTF,#01
ENC_LEDS2: BTSS W3,#01
GOTO APG_LEDS2
BSET PORTD,#03
ENC_LEDS3: BTSS W3,#02
GOTO APG_LEDS3
BSET PORTD,#8
GOTO PROGRAMA

APG_LEDS1: BCLR PORTF,#01


GOTO ENC_LEDS2

APG_LEDS2: BCLR PORTD,#03


GOTO ENC_LEDS3

APG_LEDS3: BCLR PORTD,#8


GOTO PROGRAMA

CLR_W3: CLR W3
GOTO ENC_LEDS1

FINAL: CALL SACAR


BTSC W10,#01
CALL GRUPOS
GOTO PROGRAMA

CONT_ALT: BTSS W9,#02


GOTO FINAL
CLR W2
INC W1,W1
MOV #2,W0
CP W1,W0
BRA NZ,FINAL
BCLR W9,#02
GOTO FINAL

.END

151 153
HERNÁNDEZ CAPACHO, Carlos Gerardo; MAESTRE CARRILLO, Laura Clarena; AFANADOR PEÑA Viviana dsPIC de Microchip

8. BIBLIOGRAFÍA

[1] HERNÁNDEZ CAPACHO, Carlos Gerardo. CLAROS, Reynaldo. MAESTRE, Laura.


Microcontroladores de Microchip. Editado por la Universidad Pontificia Bolivariana Seccional
Bucaramanga. Colombia. 2004.

[2] dsPIC30F Family Reference Manual. Microchip. Estados Unidos. 2003.

[3] dsPIC30F2010 Data Sheet. Microchip. Estados Unidos. 2003.

[4] dsPIC30F3014 Data Sheet. Estados Unidos. 2003.

[5] dsPIC30F Programmer‟s Reference Manual. Microchip. Estados Unidos. 2003.

[6] dsPIC30F Data Sheet General Purpose and Sensor Families. Microchip. Estados Unidos. 2003.

[7] dsPIC30F Digital Signal Controller. Microchip. Estados Unidos. 2003.

[8] dsPIC30F Data Sheet Motor Control and Power Conversion Family. Microchip. Estados Unidos.
2003.

[9] MPLAB® ASM30, MPLAB® LINK30 AND UTILITIES USER‟S GUIDE. Microchip. Estados
Unidos. 2003.

154 152

View publication stats

También podría gustarte