You are on page 1of 36

!"#$%&$'( *+ ,'-."'%."&.

!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(


6'$73%'* *+ 8&+0$&'(9 :;4,!








PROCESAMIENTO DIGITAL DE SEALES


PRCTICAS DE LABORATORIO CON
dsPIC33F
Ver 1.0


M.C. GILBERTO SANTILLN TOVAR
DR. DANIEL U. CAMPOS DELGADO


FACULTAD DE CIENCIAS
UASLP


Abril/2013

!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!



!"#$%#&'"

INTRODUCCIN ............................................................................................................ 1
CARACTERSTICAS GENERALES DEL dsPIC33FJ128GP802 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< =
;>?:@AB8A:>; 1B, *(!@8CC6DE=FG!FH= <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C
CREAR NUEVO PROYECTO EN MPLAB IDE <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< I
SISTEMA MNIMO DE CONEXIN <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< F
PROGRAMACIN DE dsPIC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< F
Programador MINIPROG+ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< F
PICkit 2 v2.61 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< J
RESULTADOS <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< EH
BIBLIOGRAFA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< EE
PRCTICA 1.- Puertos de Entrada/Salida. .................................................................... 12
PRCTICA 2.- El Temporizador ................................................................................... 15
PRCTICA 3.- Interrupciones ....................................................................................... 18
PRCTICA 4.- El ADC ................................................................................................. 22
PRCTICA 5.- CONVERSION EN SERIE ADC DAC ............................................ 28


!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

E


INTRODUCCIN
Los DSC (Controladores Digitales de Seales) son dispositivos dotados de recursos
fsicos y lgicos necesarios para el tratamiento digital de seales. La empresa Microchip
ha unido las caractersticas esenciales de un microcontrolador y un procesador digital de
seales (DSP, por sus siglas en ingls) en un dispositivo llamado dsPIC, el cual combina
las funciones tpicas de los microcontroladores con las del procesamiento digital de
seales. Los DSC se utilizan en una amplia gama de aplicaciones, en las cuales
podemos encontrar: telecomunicaciones, procesamiento de seales, control de motores,
convertidores de energa, instrumentacin biomdica, etc.
Existen dos familias de DSC por parte de Microchip, las series dsPIC30F y dsPIC33F.
El diseo de cada una de las prcticas de este manual se basa en el
dsPIC33FJ128GP802, el cual es un dispositivo de 16 bits que posee convertidores A/D
y D/A integrados, los cuales sern vitales para las tareas de procesamiento digital. En
las secciones subsecuentes se listarn sus caractersticas generales, y el esquema
mnimo de conexin.
Las prcticas siguientes se componen de dos partes: (i) la construccin del hardware, y
(ii) la implementacin del software. Para el hardware, se describe el material a utilizar y
los esquemas de conexin en cada prctica, y para el desarrollo del software, se
implementan los programas que estn codificados en lenguaje C. Con este fin, se
emplean los programas MPLAB IDE v8.89, Compilador c30 y PICkit2, todas estas
herramientas de software necesarias para la programacin del dsPIC33F. Todos estos
programas los facilita libremente el fabricante, las cuales aparecen en la bibliografa
para ser descargados desde la pgina de Microchip. En la siguiente seccin se describe
la creacin, compilacin y programacin del dsPIC.
Dada la similitud entre los microcontroladores PIC y los Controladores digitales de
seales dsPIC, en cuanto a arquitectura y conjunto de instrucciones, los estudiantes que
hayan tenido algn acercamiento con los PIC, se les facilitar la programacin de estos
nuevos dispositivos.

!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

=


CARACTERSTICAS GENERALES DEL dsPIC33FJ128GP802

A continuacin se listan las principales caractersticas del dsPIC33FJ128GP802:
! Arquitectura Harvard.
! Ncleo de 16 bits.
! Circuito integrado de 28 pines
! Operacin de 3.0 3.6 Volts.
! Operacin de hasta 40 MIPS.
! Memoria de programa de 128kb.
! 5 Temporizadores de 16 bits.
! Puertos con 21 entradas/salidas.
! 10/12 bits ADC con 1.1 Msps/500 ksps.
! 16 bits DAC (Audio).
! Comunicacin USART.
! Comunicacin I
2
C.
! Interrupciones externas.
! Rango de temperatura de -40C a 85C.
! Optimizado para programar en lenguaje C.



Para conocer todas las especificaciones tcnicas se recomienda ver la hoja de datos
proporcionada por el fabricante, la cual se puede ser descargada desde el sitio oficial de
Microchip (ver bibliografa).

!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

C

dsPIC33FJ32GP302/304, dsPIC33FJ64GPX02/X04, AND dsPIC33FJ128GPX02/X04
DS70292D-page 16 Preliminary 2009 Microchip Technology Inc.
FIGURE 1-1: dsPIC33FJ32GP302/304, dsPIC33FJ64GPX02/X04, AND dsPIC33FJ128GPX02/
X04 BLOCK DIAGRAM
16
OSC1/CLKI
OSC2/CLKO
VDD, VSS
Timing
Generation
MCLR
Power-up
Timer
Oscillator
Start-up Timer
Power-on
Reset
Watchdog
Timer
Brown-out
Reset
Precision
Reference
Band Gap
FRC/LPRC
Oscillators
Regulator
Voltage
VCAP/VDDCORE
IC1, 2, 7, 8
I2C1
PORTA
Note: Not all pins or features are implemented on all device pinout configurations. See pinout diagrams for the specific pins and features pres-
ent on each device.
Instruction
Decode and
Control
PCH PCL
16
Program Counter
16-bit ALU
23
23
24
23
Instruction Reg
PCU
16 x 16
W Register Array
ROM Latch
16
EA MUX
16
16
8
Interrupt
Controller
PSV and Table
Data Access
Control Block
Stack
Control
Logic
Loop
Control
Logic
Data Latch
Address
Latch
Address Latch
Program Memory
Data Latch






L
i
t
e
r
a
l

D
a
t
a
16 16
16

16
Data Latch
Address
Latch
16
X RAM Y RAM
16
Y Data Bus
X Data Bus
DSP Engine
Divide Support
16
Control Signals
to Various Blocks
ADC1
Timers
PORTB
Address Generator Units
1-5
CNx
UART1, 2
OC/
PWM1-4
DCI
Remappable
Pins
DMA
RAM
DMA
Controller
PORTC
SPI1, 2
ECAN1
DAC1
Comparator
2 Ch.
RTCC
PMP/
EPSP

)*+,&$%!$,*) '%- ./0&!112345670685






!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

I


CREAR NUEVO PROYECTO EN MPLAB IDE
MPLAB IDE es un software propio de Microchip, el cual permite seleccionar los
distintos DSC soportados para su programacin. Una vez instalados el software
MPLAB IDE, Compilador C30 y PICkit 2, se listan a continuacin los pasos para la
creacin de un nuevo proyecto, compilacin del proyecto (creacin del archivo .HEX) y
programacin del dsPIC.
" En el men principal del programa MPLAB IDE, ir a al submen Project !
Project Wizard.







" Seleccionar el modelo del dispositivo que se va a emplear y dar clic en
Siguiente >.







" Seleccionar el compilador y la ruta del toolsuite (generalmente localizada en
C:\Archivos de programa\Microchip\MPLAB C30\bin\pic30-gcc.exe)
!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

K








" Se elige el nombre del proyecto y la ruta donde se guardaran los archivos. En
este ejemplo se llamar P1.








" Se muestran las carpetas y los archivos del nuevo proyecto, y seleccionar
Siguiente >.








!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

L

" La ltima ventana nos muestra el modelo de dsPIC que se utilizar, compilador
y la ruta donde se guardaran los archivos del proyecto.








" Una vez finalizado la creacin del nuevo proyecto, se crea un nuevo archivo.
(File ! New).







" En esta nueva ventana se escribir el cdigo de nuestro programa, el cual coloca
en un valor alto los bits 0 y 1 del puerto A. El cdigo se describe a continuacin:
#include <p33FJ128GP802.h> // Define el modelo del dsPIC

// CONFIGURACION DE BITS

_FBS ( RBS_NO_RAM & BSS_NO_FLASH & BWRP_WRPROTECT_OFF );
_FSS ( RSS_NO_RAM & SSS_NO_FLASH & SWRP_WRPROTECT_OFF );
_FGS ( GSS_OFF & GWRP_OFF );
_FOSCSEL ( IESO_OFF & FNOSC_PRIPLL );
_FOSC ( FCKSM_CSDCMD & IOL1WAY_OFF & OSCIOFNC_OFF & POSCMD_XT );
_FPOR ( ALTI2C_OFF & FPWRT_PWR128 );
_FICD ( JTAGEN_OFF & ICS_PGD1 );

// PROGRAMA PRINCIPAL

int main(void){

TRISA=0X0000; // Configura el puerto A como salida.
// 0-Salidas; 1-Entradas
LATAbits.LATA0=1; //Encendemos los bits 0 y 1 del puerto A
!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

M

LATAbits.LATA1=1;
}
" Guardamos el nuevo archivo con la extensin .c







" En el men Project, se escoge Add files to Project y selecciona el archivo
previamente guardado con la extensin .c.

" Enseguida seleccionar el icono Build All, lo cual permite compilar el programa
y si no existen errores en el mismo, se despliega el aviso BUILD
SUCCEEDED

" Despus de compilar, se habr creado el archivo .HEX, el cual se descarga al
dsPIC a travs de la comunicacin PICkit 2/MINIPROG+.

!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

F


SISTEMA MNIMO DE CONEXIN
Para trabajar con el dsPIC33FJ128GP802, se requiere una conexin mnima antes de
iniciar cualquier proyecto. En la figura 1, se muestra el esquema de conexin de cada
uno de los pines necesarios para la programacin del dispositivo. La mayora de los
pines son multiplexados, por lo que durante la programacin los pines conectados a
ICSP+ se emplean para la descarga del programa. Una vez que se realiz la
programacin, stos pines tendrn la funcin que se les asign en el programa.








Figura 1. Esquema mnimo de conexin.
PROGRAMACIN DE dsPIC
Una vez realizado el esquema mnimo de conexin, se proceder a grabar el dispositivo,
lo cual se realiza a travs de la conexin entre el software PICkit 2 y el programador
universal MINIPROG+, ya que a travs de estas herramientas se grabar en el dsPIC el
programa realizado (archivo .HEX).
Programador MINIPROG+
El programador MINIPROG+ (Figura 2), soporta diversas series de dispositivos PIC y
dsPIC para su programacin. Para la serie dsPIC33F la programacin se realiza a travs
del puerto ICSP+.




Figura 2. Programador MINIPROG+.
!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

J

Un esquema general de la conexin del programador a travs de ICSP+ (In Circuit
Serial Programming) se muestra en las figura 3.






Figura 3. Esquema de Conexin ICSP+
El dsPIC33FJ128GP802, tiene 3 canales para ser programado, por lo que se deben
identificar los pines correspondientes para realizar la conexin adecuada con el
programador. En la figura 4 se muestra el esquema de conexin utilizando el canal 1
(PGEDx, PGECx).






Figura 4. Conexin ICSP+!dsPIC33FJ128GP802.

Nota: Retirar el voltaje de alimentacin del dsPIC cuando se vaya a programar el
dispositivo, ya que se puede dejar la conexin mnima al momento de programar el
circuito mediante el ICSP+.

PICkit 2 v2.61

Con el software PICkit 2, podemos programar el dsPIC, conectando a travs del puerto
USB el programador MINIPROG+. En las siguientes imgenes se muestra el
procedimiento para cargar el programa al dsPIC.
!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

EH

Una vez conectado el puerto ICSP+ a los pines correspondientes del dsPIC, se ejecutar
el programa PICkit 2. Si se realiza correctamente la conexin entre programador y
dsPIC, nos mostrar la siguiente imagen.







Adems de mostrar las caractersticas del dispositivo, aparecen las opciones de leer,
borrar y programar el dispositivo, cabe mencionar que el software automticamente
asigna el valor de voltaje de programacin, que como se ha mencionado anteriormente
ser de 3.3 Volts. En el men File ! Import Hex File, se selecciona el archivo .HEX
que se gener al compilar el programa. Una vez seleccionado el programa se ejecuta la
opcin write para que sea cargado el programa al dsPIC.






Si la programacin fue realizada con xito nos mostrar Programming Successful, y
enseguida se proceder a desconectar la interfaz ICSP+ del dsPIC.

RESULTADOS
Para verificar los resultados de este ejemplo, se conectarn diodos emisores de luz
(LED) en los bits 0 y 1 del puerto A (pin 2 y 3). El resultado obtenido se puede
visualizar en la figura 5.

!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

EE






Figura 5. Bits 0 y 1 del Puerto A en 1 lgico.

BIBLIOGRAFA
A continuacin se listan los enlaces de donde se pueden descargar de manera gratuita
los diversos programas y manuales necesarios para la programacin del
dsPIC33FJ128GP802.
MPLAB IDE v8.89
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocNa
me=en023073
Compilador C30 versin estudiante
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocNa
me=en536656
Pickit2 v2.61
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocNa
me=en023805
Datasheet dsPIC33FJ128GP802
http://ww1.microchip.com/downloads/en/devicedoc/70292d.pdf
Manual De Compilador C30
http://ww1.microchip.com/downloads/en/devicedoc/c30_users_guide_51284f.pdf

Manual de PICkit 2
http://ww1.microchip.com/downloads/en/DeviceDoc/51553B.pdf


!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

E=


PRCTICA 1.- Puertos de Entrada/Salida.

OBJETIVO: configurar los puertos como entradas o salidas, y de acuerdo a un pin de
entrada, decidir el estado lgico de un pin de salida.
MATERIAL
1 dsPIC33FJ128GP802.
1 Push-button.
1 Resistencia de 1 k".
1 Diodo emisor de luz (LED).
1 Resistencia de 10 k".
1 Cristal de 20MHz.
2 Capacitores de 30#F (cermicos).
1 Capacitor de 4.7 $F (tantalio de preferencia).
1 Protoboard.
1 Fuente de CD de 3.3Volts
ACTIVIDADES
1. Crear un nuevo proyecto en MPLAB IDE, con el cdigo de programa
proporcionado, compilarlo y programar el dsPIC.
2. Realizar la conexin proporcionada en la figura 6.
3. Verificar los resultados

DESCRIPCIN DEL PROGRAMA

El programa consiste en leer el bit 0 del puerto A, cuando est a 0 lgico, estarn
activados los bits 11 y 12 del puerto B, de lo contrario, los bits 11 y 12 tendrn un 0
lgico.

#include <p33FJ128GP802.h> // Incluir librera del dsPIC a utilizar

// * * * * BITS DE CONFIGURACION * * * * * * *
_FGS ( GSS_OFF & GWRP_OFF );
_FOSCSEL ( IESO_OFF & FNOSC_PRIPLL );
_FOSC ( FCKSM_CSDCMD & IOL1WAY_OFF & OSCIOFNC_OFF & POSCMD_XT );
_FPOR ( ALTI2C_OFF & FPWRT_PWR128 );
_FICD ( JTAGEN_OFF & ICS_PGD1 );
// * * * * * * * P R O G R A M A * * * * * * * * *
int main(void){
TRISA=0XFFFF; // Configuracin de los puertos
TRISB=0X0000; // Puerto A como entradas y B como salidas
AD1PCFGL=0XFFFF; // Configuracin de las entradas digitales
while(1) {
if(PORTAbits.RA0==0){ // Si bit 0 del puerto A=0
LATBbits.LATB11=1; // Pone a '1' bits 11 y 12
LATBbits.LATB12=1; // del puerto B
}
else {LATBbits.LATB11=0; // Si bit 0 de puerto A=1
!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

EC

LATBbits.LATB12=0; // Pone a '0' bits 11 y 12 del puerto B
} }
}
Al sistema mnimo de conexin del dsPIC, se deben agregar los componentes mostrados
en la figura 6.





Figura 6. Esquema de conexin para la prctica 1.

RESULTADOS
Las figura 7 nos muestra la conexin completa para la realizacin de esta prctica.





Figura 7. Conexin de componentes para la prctica 1.
En la figura 8 se muestran activos los leds, debido a que en la entrada se presenta un
0 lgico. En esta prctica se utilizaron los pines RA0, RB11 y RB12, pero podemos
configurar cualquiera de las 21 entradas/salidas que posee el dsPIC.






Figura 8. Estados habilitados RB11 y RB12 al estar RA0 en 0.
!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

EI


BIBLIOGRAFA
Enseguida se presentan enlaces donde el estudiante puede encontrar diversos
ejemplos de aplicaciones para entradas/salidas del dsPIC.

1. http://www.microchip.com/TechDoc.aspx?type=CodeExamples
2. http://ww1.microchip.com/downloads/en/DeviceDoc/70193c.pdf
3. http://isa.uniovi.es/~fernando/Programa_II_EUITI_archivos/Practica%20tablero%20P
uertos%20ES.pdf
4. http://www.ate.uniovi.es/8693/documentos/LECC7ce.pdf
5. http://ww1.microchip.com/downloads/en/DeviceDoc/70190C.pdf
6. http://www.mikroe.com/chapters/view/4/

















!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

EK



PRCTICA 2.- El Temporizador

OBJETIVO: configurar el temporizador para generar tiempos muertos o retardos.
INTRODUCCIN
Un temporizador es un dispositivo configurable, que permite medir el tiempo. Una vez
que ha transcurrido el lapso de tiempo deseado, se emite una alarma, la cual indica que
ha terminado el tiempo programado. Para la configuracin del temporizador es
necesario definir F
CY
(Frecuencia de Instruccin), la cual est definida por:
!
!"
!
!
!"#
!

donde F
OSC
representa la frecuencia de oscilacin, la cual est determinada por el
oscilador externo del dsPIC, y que estara dada por !
!"#
! !"!"#. Por lo que
utilizando un reloj externo de 20 MHz, el dsPIC puede realizar 10 millones de
instrucciones por segundo.
Para generar el retardo, se utilizar el Timer 0, el cual es de 16 bits, esto significa que
puede realizar una cuenta desde 0 hasta 65,535 (!
!"
!!!. En el registro T1CON, se
puede utilizar un divisor de frecuencia (Prescaler), el cual se configura con un valor de
prescaler de 256.
Para la prctica, se calcular un retardo de 20 ms:
!
!"#
! !" !"#
!
!"
!
!" !"#
!
! !" !"#
Prescaler: 256
! !
!"
! !"!!"#!!!"
Por lo que podemos calcular el valor deseado del temporizador de la siguiente manera:
!!!!! !" !!!!!"! !"#!!
!" !" ! ! ! !"#! !"
El valor de 781.25, se cargar en el temporizador, para qu una vez que haya llegado a
este valor se emitir una alarma.
Para la configuracin de la frecuencia de oscilacin, se dividi mediante el prescaler,
pero cabe hacer mencin que existe dentro del dsPIC un multiplicador (PLL) que
tambin permite incrementar la frecuencia de oscilacin.

!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

EL

MATERIAL
1 dsPIC33FJ128GP802.
1 Resistencia de 10 k".
1 Cristal de 20MHz.
2 Capacitores de 30#F (cermicos).
1 Capacitor de 4.7 $F (tantalio de preferencia).
1 Protoboard.
1 Osciloscopio
1 Fuente de CD de 3.3Volts
ACTIVIDADES
1. Armar el sistema mnimo del dsPIC.
2. Cargar al dsPIC el programa proporcionado en la prctica.
3. Visualizar en osciloscopio la salida (RB13).
4. Realizar el clculo para generar una onda cuadrada con frecuencia de 25
Hz (periodo de 40 ms # 20 ms en estado alto y 20 ms en estado bajo).

DESCRIPCIN DEL PROGRAMA
El cdigo de programa que a continuacin se presenta, nos permite generar un cambio
de estado 0 1 lgico en la salida. Este cambio estar determinado por el valor que sea
cargado en el registro del temporizador, con lo que podemos obtener una salida que est
cambiando su nivel a determinado tiempo.

#include <p33FJ128GP802.h> // Incluir libreria del pic a utilizar

// * * * * BITS DE CONFIGURACION * * * * * * *
_FBS ( RBS_NO_RAM & BSS_NO_FLASH & BWRP_WRPROTECT_OFF );
_FSS ( RSS_NO_RAM & SSS_NO_FLASH & SWRP_WRPROTECT_OFF );
_FGS ( GSS_OFF & GWRP_OFF );
_FOSCSEL ( IESO_OFF & FNOSC_PRI );
_FOSC ( FCKSM_CSDCMD & IOL1WAY_OFF & OSCIOFNC_OFF & POSCMD_XT );
_FPOR ( ALTI2C_OFF & FPWRT_PWR128 );
_FICD ( JTAGEN_OFF & ICS_PGD1 );

void retardo_ms (void); // Definen las funciones
int main (void);

// * * * P R O G R A M A * * *
int main(void) {
TRISB=0B1101111111111111; // Configura bit13 del puerto B como salida
while(1){
LATB=0B0010000000000000; // Pone a '1' bit13
retardo_ms(); // Llama funcin de retardo
LATB=0X0000; // Pone a '0' bit13
retardo_ms(); // Llama funcin de retardo
}
}
//**** Funcin Retardo ****************
void retardo_ms( void ){ // Funcin de retardo
T1CON = 0; // Resetear el timer
TMR1 = 0;
!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

EM

IPC0bits.T1IP = 1; // Interrupcin con prioridad 1
PR1 = 781.25; // Valor en el registro (retardo de 20ms)
IFS0bits.T1IF = 0; // Interrupcin cuando llega a 0
IEC0bits.T1IE = 0;
T1CON = 0X8030; // Prescaler 1:256
while(IFS0bits.T1IF==0);
}
RESULTADOS
En la figura 9, se puede visualizar la salida del dsPIC (RB13) y la generacin del tiempo
muerto en el osciloscopio, el cual se defini de 20 ms para la parte alta de la onda
cuadrada (3.3 V), y otros 20 ms para la parte baja (0 V).









Figura 9. Retardo de 20 ms generado con dsPIC

BIBLIOGRAFA
En los siguientes enlaces, se presenta teora, prctica y configuracin de los
temporizadores. Cabe mencionar que el dsPIC33FJ128GP802 tiene 5 temporizadores de
16 bits.
1. http://galeon.com/leo-tronics/TutorialTimer0.pdf
2. ftp://193.170.235.123/Lernbehelfe/PIC%20Handb%FCcher/dsPIC33F_Reference_Man
ual/9_Watch_Dog_Timer.pdf
3. http://www.mikroe.com/chapters/view/52/chapter-4-timers/#ch4.1.1
4. http://www.todopic.com.ar/foros/index.php?topic=15200.0


!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

EF



PRCTICA 3.- Interrupciones

OBJETIVO: Comprender el concepto de interrupciones y su nivel de prioridad.
INTRODUCCIN
Una interrupcin es una seal interna o externa recibida por el dsPIC, la cual indica que
se debe "interrumpir" el curso de ejecucin actual (suspensin temporal) y pasar a
ejecutar una subrutina. Una vez finalizada la subrutina de interrupcin, se contina con
la ejecucin del programa principal.
Cuando existen varias peticiones de interrupcin a la vez, se establece un nivel de
prioridad para cada una de ellas. El dsPIC de acuerdo al nivel de interrupcin, ejecutar
cada una de ellas, atendiendo primero a la de mayor nivel de prioridad hasta atender
cada una de las peticiones de interrupcin. Una vez completadas las interrupciones,
regresar a la lnea del programa donde se encontraba antes del llamado de la
interrupcin.
MATERIAL
1 dsPIC33FJ128GP802.
1 Resistencia de 10 k".
1 Resistencia de 1 k".
1 Cristal de 20MHz.
2 Capacitores de 30#F (cermicos).
1 Capacitor de 4.7 $F (tantalio de preferencia).
1 Diodo LED de 5mm.
1 Diodo LED de 10 mm.
1 Push-button.
1 Protoboard.
1 Fuente de CD de 3.3Volts

ACTIVIDADES
1. Al sistema mnimo, agregar las conexiones mostradas en la figura 10.
2. Cargar al dsPIC el programa proporcionado en la prctica.
3. Visualizar la salida del programa sin ejecutar la interrupcin.
4. Visualizar la salida del programa al ejecutar INT0.


DIAGRAMA ESQUEMTICO

Para la realizacin de la prctica, al sistema mnimo de conexiones del dsPIC agregar
los siguientes componentes:

!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

EJ











Figura 10. Conexin para la prctica 3

DESCRIPCIN DEL PROGRAMA
El siguiente programa realiza dos procesos. El proceso principal consiste en generar una
secuencia alterno de estados lgicos (encendido/apagado del led de 5 mm) cada 1.2
segundos (1,200 ms); una vez que se habilita la interrupcin (accionamiento del Push-
Button), se proceder a ejecutar otro proceso que consiste en el encendido del led de 10
mm durante 6 segundos (6,000 ms). Una vez concluida la rutina de interrupcin, se
regresar al proceso principal.

#include <p33fj128gp802.h>
#define fcy 16000000

// * * * * BITS DE CONFIGURACION * * * * * * *
_FBS ( RBS_NO_RAM & BSS_NO_FLASH & BWRP_WRPROTECT_OFF );
_FSS ( RSS_NO_RAM & SSS_NO_FLASH & SWRP_WRPROTECT_OFF );
_FGS ( GSS_OFF & GWRP_OFF );
_FOSCSEL ( IESO_OFF & FNOSC_PRIPLL );
_FOSC ( FCKSM_CSDCMD & IOL1WAY_OFF & OSCIOFNC_OFF & POSCMD_XT );
_FPOR ( ALTI2C_OFF & FPWRT_PWR128 );
_FICD ( JTAGEN_OFF & ICS_PGD1 );

int main(void); // Declaracin de funciones
void retardo_ms( unsigned int ms );
void interrupcion(void);

// / / / / / / PROGRAMA PRINCIPAL / / / / / / / / / / /

int main(void){
while(1){ // Ciclo del programa
TRISB=0x5FFF; // bit 13 y 15 como salida
LATBbits.LATB13=1; // '1' bit 13
retardo_ms(1200);
LATBbits.LATB13=0; // '0' bit 13
retardo_ms(1200);
interrupcion();
}
}
void __attribute__((__interrupt__)) _INT0Interrupt(void){ //Proceso de interrupcin

LATBbits.LATB15=1; // '1' en RB15
retardo_ms(2000);
retardo_ms(2000); // Retardo
retardo_ms(2000);
3+* EH //
3+* K//
!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

=H

LATBbits.LATB15=0; // '0' en RD3
IFS0bits.INT0IF = 0; // Salida de la funcin
}
void interrupcion( void ) { // Configuracin de la interrupcin

INTCON2bits.INT0EP = 1;
IPC0bits.INT0IP = 4;
IEC0bits.INT0IE = 1; // Habilita Interrupcin
}
void retardo_ms( unsigned int ms ){
unsigned int periodo=0;
T1CON =0;
TMR1 = 0; // Timer comienza en 0
IPC0bits.T1IP =1;
periodo= (( fcy/256)*ms)/1000;
PR1= periodo; // Tiempo en el registro del timer
IFS0bits.T1IF=0; // Limpia bandera del timer
IEC0bits.T1IE=0; // Deshabilita timer
T1CON=0x8030; // configura TICON
while(IFS0bits.T1IF==0);
}

RESULTADOS
En la figura 11, se puede observar las conexiones necesarias para la realizacin de la
prctica. Los leds nos permitirn visualizar la ejecucin del programa principal (led de
5mm, RB13) y cuando se ejecute la interrupcin se visualizar mediante el led de
10mm, conectado a RB15.




Figura 11. Conexin en protoboard para la prctica 3.
La figura 12 nos muestra la ejecucin del programa principal, el cual consiste en un
encendido/apagado del led de 5mm cada 1.2 seg.





Figura 12. Muestra de la ejecucin del programa principal.
!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

=E


Mientras tanto, la figura 13 muestra la ejecucin de la subrutina de interrupcin
(encendido del led de 10mm, RB15). Una vez que se concluye la subrutina, se regresa a
la ejecucin del programa principal.






Figura 13. Activacin de la interrupcin mediante un push-button.

BIBLIOGRAFA
Para ms aplicaciones, niveles de interrupcin y ejemplos de programacin, se
proporciona la siguiente lista de pginas electrnicas donde el estudiante podr
consultar los ejemplos.
1. http://ww1.microchip.com/downloads/en/DeviceDoc/70189c.pdf
2. http://ww1.microchip.com/downloads/en/DeviceDoc/70214C.pdf
3. http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2573
4. http://batchloaf.wordpress.com/2012/04/12/simple-timer-1-interrupt-example-for-the-
dspic30f4011/







!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

==


PRCTICA 4.- El ADC

OBJETIVO: realizar la conversin de seales analgicas en seales digitales,
utilizando el ADC interno del dsPIC, con resolucin de 10 y 12 bits.
INTRODUCCIN
El convertidor Analgico/Digital (ADC), es un circuito que toma valores analgicos de
tensin y los convierte en una palabra binaria. Los valores que definen los lmites de las
tensiones a medir se denominan voltajes de referencia, y se representan por V
REF-
(el
mnimo) y V
REF+
(el mximo). La resolucin del convertidor queda determinada por la
cantidad de bits que representan el resultado de la conversin. El dsPIC33FJ128GP802
tiene dos convertidores analgico/digital, uno con resolucin de 10 bits y el otro de 12
bits.
Un ADC de n bits puede representar hasta 2
n
valores digitales, de modo que a la entrada
analgica igual a V
REF-
se le asignar el valor 0 digital, y la entrada igual a V
REF+
le
asignar el valor 2
n
1 digital. Entre V
REF-
y V
REF+
se pueden presentar un nmero
infinitos de valores analgicos, pero con n bits, solo se pueden formar 2
n
valores
discretos diferentes. Por lo tanto habr valores analgicos que no podrn ser
representados con exactitud (error de cuantizacin).
La diferencia entre dos valores analgicos correspondientes a dos valores digitales
consecutivos se define como la resolucin de voltaje del ADC.

!"#$%&'($) !"# !"# !
!
!"#!
!!
!"#!
!
!
!!


Para la realizacin de esta prctica se considera el ADC con resolucin de 12 bits,
donde !
!"#!
! ! !"#$% y !
!"#!
! !!! !"#$%, por lo que la resolucin del ADC ser de
0.805 mV. Si se considera el ADC de 10 bits, se tendra una resolucin de 3.22 mV.
MATERIAL
1 dsPIC33FJ128GP802.
1 Resistencia de 10 k".
1 Cristal de 20MHz.
2 Capacitores de 30#F (cermicos).
1 Capacitor de 4.7 $F (tantalio de preferencia).
12 Diodos LED.
1 Protoboard.
2 Fuente variable de CD de 3.3Volts

ACTIVIDADES
1. Al sistema mnimo, agregar las conexiones mostradas en la figura 14.
!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

=C

2. Cargar al dsPIC el programa proporcionado en la prctica.
3. Variar el nivel de CD desde 0 Volts en la entrada (RA0), pero sin
sobrepasar los 3.3 Volts.
4. Comprobar nivel de CD en la fuente con la salida digital.


DIAGRAMA ESQUEMTICO

Para la realizacin de la prctica, al sistema mnimo de conexiones del dsPIC agregar
los siguientes componentes:




















Figura 14. Esquema de conexin para la prctica 4.


DESCRIPCIN DEL PROGRAMA
El programa lee una entrada analgica de 0 3.3 Volts en CD (V
REF+
), la cual es
convertida en seal digital con resolucin de 12 bits mediante el ADC interno del
dsPIC. Una vez realizada la conversin, el dato es enviado al puerto B donde se puede
visualizar de manera digital a travs de los leds.
#include <p33FJ128GP802.h>

// * * * * BITS DE CONFIGURACION * * * * * * *
_FBS ( RBS_NO_RAM & BSS_NO_FLASH & BWRP_WRPROTECT_OFF );
_FSS ( RSS_NO_RAM & SSS_NO_FLASH & SWRP_WRPROTECT_OFF );
_FGS ( GSS_OFF & GWRP_OFF );
_FOSCSEL ( IESO_OFF & FNOSC_PRIPLL );
_FOSC ( FCKSM_CSDCMD & IOL1WAY_OFF & OSCIOFNC_OFF & POSCMD_XT );
_FPOR ( ALTI2C_OFF & FPWRT_PWR128 );
_FICD ( JTAGEN_OFF & ICS_PGD1 );

#define fcy 16000000
!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

=I

int main(void); // Declaracin de funciones
void retardo_ms( unsigned int ms );
void adc (void);

// / / / / / / PROGRAMA PRINCIPAL / / / / / / / / / / /

int main(void){
TRISB=0X0000; // Puerto B como salida
adc(); // Llama funcin adc
AD1CON1bits.ADON = 1; // Habilita ADC

while(1){
AD1CON1bits.SAMP = 1; // Bit para habilitar muestreo
retardo_ms(3); // Tiempo para realizar el muestreo
AD1CON1bits.SAMP = 0; // Retiene dato

while(!AD1CON1bits.DONE); //Se ha realizado la conversin?
PORTB=ADC1BUF0; // Datos se guardan en ADC1BUF0 y se enva al puerto B
}
}
// / / / / / / CONFIGURACION DEL ADC / / / / / / / / /
void adc (void){

TRISA = 0x0001; // Entrada analgica RA0
AD1PCFGL = 0x0000; // Todas entradas analgicas
AD1CON1bits.AD12B=1; // 1=12 bits resolucin y muestreo secuencial
// de los canales; 0= 10 bits ADC
AD1CON1bits.ASAM=0; // El muestreo inicia cuando bit SAMP=1
AD1CON1bits.SSRC=0; // Termina el muestreo e inicia la conversin

AD1CHS0bits.CH0NA =0; // La entrada negativa ser Vss
AD1CHS0bits.CH0SA =0; // Entrada positiva ser AN0

AD1CON2bits.CSCNA =0; // Muestreo secuencial (scan) deshabilitado
AD1CON2bits.VCFG =0; // Referencia para la conversin: Referencia
//positiva=AVdd, Negativa=AVss

AD1CON2bits.BUFM =0; // Configurado como buffer de 16 palabras
AD1CON2bits.SMPI =0; // Despus de la conversin se genera la interrupcin
AD1CON2bits.ALTS =0; // Solo muestra un Canal

AD1CON3bits.ADRC =0; // Reloj del ADC es derivado del sistema
AD1CON3bits.ADCS =21; // Tiempo de conversin.
}
void retardo_ms( unsigned int ms ){
unsigned int periodo=0;
T1CON =0;
TMR1 = 0; // Reset Timer
IPC0bits.T1IP =1;
periodo=((fcy/256)*ms)/1000;
PR1= periodo; // Tiempo en el registro del timer
IFS0bits.T1IF=0; // Limpia bandera del timer
IEC0bits.T1IE=0; // Deshabilita timer
T1CON=0x8030; // configura TICON = 0100000000110000
while(IFS0bits.T1IF==0);

}

!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

=K


RESULTADOS
En la figura 14, se muestra el esquema completo de conexin con una entrada analgica
de 0 volts.










Figura 14. Conexin en protoboard para la prctica 4.
La figura 15 muestra el valor digitalizado cuando se tiene una entrada analgica de 0.5
Volts, cabe mencionar que el bit menos significativo est en el lado izquierda de la
figura.









Figura 15. Conversin para una entrada analgica de 0.5 Volts.
!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

=L

Finalmente, la figura 16 muestra una entrada analgica de 1.6 Volts en RA0, y la figura
17 cuando se tienen la mxima entrada aceptada en RA0 (3.3 Volts).









Figura 16. Conversin digital de una entrada analgica de 1.6 Volts







.




Figura 17. Conversin digital de una entrada analgica de 3.3 Volts



!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

=M


BIBLIOGRAFA
En los siguientes enlaces se presenta la teora y prcticas acerca de la conversin
analgica/digital. Como tema importante se describe el Criterio de Nyquist que es
fundamental para la digitalizacin de seales.
1. http://redwood.berkeley.edu/bruno/npb261/aliasing.pdf
2. http://www.princeton.edu/~achaney/tmve/wiki100k/docs/Nyquist%E2%80%93Shannon
_sampling_theorem.html
3. http://www.cursomicros.com/avr/conversor-adc/conversor-adc-del-
avr.html#resolucion-voltajes-referencia
4. http://isa.uniovi.es/~fernando/Programa_II_EUITI_archivos/Practica%20tablero%20C
onversorAD.pdf
5. http://www.ucontrol.com.ar/forosmf/programacion-en-c/conversor-ad-dspic30f/?wap2
6. http://www.microchip.com/TechDoc.aspx?type=CodeExamples














!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

=F


PRCTICA 5.- CONVERSION EN SERIE ADC DAC

OBJETIVO: realizar la conversin analgica/digital de una seal y enseguida
digital/analgica, al conectar en serie los procesos ADC DAC, y de esta manera
comprobar el criterio de Nyquist.
INTRODUCCION
En el proceso de conversin Analgica/Digital Digital/Analgica de una seal, se
deben considerar dos aspectos muy importantes: el muestreo y la cuantizacin de la
seal. Durante estos procesos, se toman muestras y se cuantizan de acuerdo a la
resolucin del convertidor, por lo que estas operaciones nos pueden restringir la
informacin que se transmite de forma digital.
La consideracin fundamental en el muestreo depende de que tan rpido o durante
que intervalo de tiempo se pueda extraer informacin de la seal, tal que ms adelante
sea posible reconstruir la seal sin tener prdidas de su comportamiento dinmico. En la
figura 18 se muestra de manera general como se realiza el muestreo de una seal.

Figura 18. Muestreo de una seal x(t) cada T seg.
TEOREMA DE NYQUIST
El teorema de Nyquist establece que la reconstruccin de una seal x(t) a partir de sus
muestras x[k], es posible si la seal es muestreada al doble de su ancho de banda (al
menos). Por ejemplo, Si la frecuencia ms alta contenida en la seal analgica !!!! es
!
!"#
, entonces para recuperar la seal !!!! debemos de muestrear a una tasa F
s
que
cumpla !
!
! !!
!"#
.
Cuando la frecuencia de muestreo no cumple el criterio de Nyquist, se produce el
fenmeno conocido como aliasing o traslape, a travs del cual una seal de alta
frecuencia es interpretada como una seal de baja frecuencia.
x(t)
t
0
T=Tiempo de muestreo
x[0]
x(T)=x[1]
x(2T)=x[2]
x[3]
x[4]
x[-1]
x[-2]
!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

=J


Figura 19. Seales muestredas que describen el fenmeno de traslape: x
1
(t) # 3 Hz, x
2
(t) # 13 Hz, y
F
s
=10 Hz.
MATERIAL
1 dsPIC33FJ128GP802.
1 Resistencia de 10 k".
1 Cristal de 20MHz.
2 Capacitores de 30#F (cermicos).
1 Capacitor de 4.7 $F (tantalio de preferencia).
1 Protoboard.
1 Generador de funciones.
1 Osciloscopio.
1 Fuente variable de CD de 3.3Volts.

ACTIVIDADES
1. Al sistema mnimo, agregar las conexiones mostradas en la figura 20.
2. Cargar al dsPIC el programa proporcionado en la prctica.
3. Configurar la seal de entrada por medio del generador de funciones,
para establecer una seal senoidal positiva con amplitud de 3V
pp
(0.15
Volts a 3.15 Volts) y f = 1KHz. Esta seal se introduce en la entrada
analgica del dsPIC (AN4).
4. En el osciloscopio visualizar la seal de entrada, as como la salida
(DAC1RP).
5. Visualizar la salida cuando se realiza un barrido de frecuencia en la seal
de entrada desde 100 Hz hasta 1MHz.
6. Conclusiones.


DIAGRAMA ESQUEMTICO

Para la realizacin de la prctica, al sistema mnimo de conexiones del dsPIC agregar
los siguientes componentes:
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
1
0.8
0.6
0.4
0.2
0
0.2
0.4
0.6
0.8
1
tiempo (seg)
T=0.1 seg
Fs=10 Hz
x
1
(t)
x
2
(t)
x[k]
!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

CH
















Figura 20. Esquema de conexin para la prctica 4.


DESCRIPCIN DEL PROGRAMA
El siguiente programa realiza la conversin de una seal analgica, e inmediatamente la
reconstruye mediante un proceso secuencial Analgico/Digital Digital/Analgico, es
decir, la misma entrada se debe visualizar a la salida del dsPIC. Mediante ste proceso
se podr comprobar el teorema de Nyquist, ya que si no se cumple el criterio de
muestreo, se tendr una perdida de informacin, la cual se ver reflejada en la salida
como una seal de menor frecuencia, cuando la frecuencia de la entrada exceda la mitad
de la tasa de muestreo.
#include "p33fj128gp802.h"
#include "dsp.h"
#include "..\h\adcdacDrv.h"

_FOSCSEL(FNOSC_FRC); // Configuracin de oscilador
_FOSC(FCKSM_CSECMD & OSCIOFNC_ON & POSCMD_NONE);
_FWDT(FWDTEN_OFF);

int main (void){

PLLFBD=41; // Configuracin de dsPIC a 40MIPS
CLKDIVbits.PLLPOST=0; // N1=2
CLKDIVbits.PLLPRE=0; // N2=2
OSCTUN=0;
RCONbits.SWDTEN=0; // Deshabilita WatchDog Timer
__builtin_write_OSCCONH(0x01); // Habilita reloj con PLL
__builtin_write_OSCCONL(0x01); // Comienza reloj

while (OSCCONbits.COSC != 0b001); // Espera para cambio de reloj
while(OSCCONbits.LOCK!=1) {};

initAdc(); // Inicializa funciones
initDac();
initDma0();
initTmr3(); // Timer para muestreo de la seal
!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

CE


extern fractional BufferA[NUMSAMP]; // Configura buffer A
extern fractional BufferB[NUMSAMP]; // Configura buffer B
extern unsigned int DmaBuffer; // Habilita DMA
extern int flag; // Bandera de DMA
int i; // Declara variable i

while (1) {
if(flag) {
for(i = 0; i < NUMSAMP; i++){
while(DAC1STATbits.REMPTY != 1); // Espera la conversion D/A.
if(DmaBuffer == 0)
DAC1RDAT = BufferA[i]; // Carga dato al registro
else
DAC1RDAT = BufferB[i]; // Carga dato al registro }
flag = 0;
}
}
return 0;
}
fractional BufferA[NUMSAMP] __attribute__((space(dma))); // Modo de salida al buffer A
fractional BufferB[NUMSAMP] __attribute__((space(dma))); // Modo de salida al buffer

void initAdc(void) // Funcin ADC
{ AD1CON1bits.FORM = 3; // Formato de salida.
AD1CON1bits.SSRC = 2;
AD1CON1bits.ASAM = 1; // ADC convierte despus del muestreo
AD1CON1bits.AD12B = 1; // Resolucin de 12 bits
AD1CON2bits.CHPS = 0; // Canal CH0
AD1CON3bits.ADRC = 0; // reloj del ADC derivado del sistema
AD1CON3bits.ADCS = 3; // Tad=Tcy*(ADCS+1)= (1/40M)*4 = 100ns
// Tc=14*Tad = 1.4us
AD1CON1bits.ADDMABM = 1;
AD1CON2bits.SMPI = 0;
AD1CHS0bits.CH0SA = 4; // Entrada positiva AN4
AD1CHS0bits.CH0NA = 0; // Entrada negative Vref-
AD1PCFGL=0xFFFF; // todas las entradas analgicas
AD1PCFGLbits.PCFG4 = 0; // AN4
IFS0bits.AD1IF = 0; // Habilita ADC
IEC0bits.AD1IE = 0;
AD1CON1bits.ADON = 1;
}
void initDac(void) { // Funcin DAC
ACLKCONbits.SELACLK = 0; // Configuracin de reloj
ACLKCONbits.AOSCMD = 0;
ACLKCONbits.ASRCSEL = 0;
ACLKCONbits.APSTSCLR = 7;
DAC1STATbits.ROEN = 1; // Salida DAC1RP
DAC1DFLT = 0x0000; // Valor de referencia de la conversin
DAC1CONbits.DACFDIV = 5;
DAC1CONbits.FORM = 1; // Formato del dato
DAC1CONbits.AMPON = 0;
DAC1CONbits.DACEN = 1; // Habilita DAC
}
void initTmr3() { // Funcin Timer
TMR3 = 0x0000; // Reset TMR3
PR3 = SAMPPRD; // carga valor al timer
IFS0bits.T3IF = 0;
!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

C=

IEC0bits.T3IE = 0;
T3CONbits.TON = 1; // Habilita Timer 3
}
void initDma0(void){
DMA0CONbits.AMODE = 0; // Configuracin DMA
DMA0CONbits.MODE = 2;
DMA0PAD = (int)&ADC1BUF0;
DMA0CNT = (NUMSAMP-1);
DMA0REQ = 13;
DMA0STA = __builtin_dmaoffset(BufferA);
DMA0STB = __builtin_dmaoffset(BufferB);
IFS0bits.DMA0IF = 0;
IEC0bits.DMA0IE = 1;
DMA0CONbits.CHEN = 1; // Habilita canal DMA
}
unsigned int DmaBuffer = 0;
int flag = 0;
void __attribute__((interrupt, no_auto_psv)) _DMA0Interrupt(void){
DmaBuffer ^= 1;
flag = 1;
IFS0bits.DMA0IF = 0;
}
void __attribute__((interrupt, no_auto_psv)) _DAC1RInterrupt(void)
{
IFS4bits.DAC1RIF = 0;
}

RESULTADOS
En las siguientes figuras se observa el proceso de conversin ADC - DAC cuando se
tiene una entrada senoidal, triangular y cuadrada con frecuencias de 1KHz en las 3
seales. Cul sera la frecuencia de muestreo que se mide experimentalmente al variar
la frecuencia de entrada de 100 Hz a 1 MHz?










Figura 21. Conversin en serie ADC-DAC para una seal senoidal.
4'3&*'
B0%"'*'
!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

CC









.


Figura 21. Conversin en serie ADC-DAC para una seal triangular.











Figura 22. Conversin en serie ADC-DAC para una seal cuadrada.

BIBLIOGRAFA
En los siguientes enlaces se presenta la teora del criterio de Nyquist, ejemplos de
programacin y referencia de los registros utilizados para la realizacin de esta prctica.
1. http://tintoretto.ucsd.edu/jorge/teaching/mae143a/lectures/8sampling.pdf
4'3&*'
B0%"'*'
4'3&*'
B0%"'*'
!"#$%&$'( *+ ,'-."'%."&.
!".$+('/&+0%. 1&2&%'3 *+ 4+5'3+(
6'$73%'* *+ 8&+0$&'(9 :;4,!

CI

2. http://embeddedcodesource.com/developer/microchip_technology/ce154__adc_to_dac_
loopback
3. http://www.dspguide.com/ch3/2.htm
4. http://es.wikipedia.org/wiki/Teorema_de_muestreo_de_Nyquist-Shannon
5. http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824
&appnote=en539328
6. http://www.microchip.com/TechDoc.aspx?type=CodeExamples
7. http://ww1.microchip.com/downloads/en/DeviceDoc/70183D.pdf
8. http://www.element14.com/community/solutions/2622