Sie sind auf Seite 1von 230

UNIVERSIDAD MIGUEL HERNNDEZ DE ELCHE

ESCUELA POLITCNICA SUPERIOR DE ELCHE


INGENIERA INDUSTRIAL

MANEJO DE UNA PANTALLA TCTIL


CON EL PIC32 PARA EL CONTROL DE
DISPOSITIVOS EXTERNOS

PROYECTO FIN DE CARRERA


Enero 2010

AUTOR: Jess Fernndez Gonzlez


DIRECTORA: Mara Asuncin Vicente Ripoll

Escuela Politcnica Superior de Elche

Universidad Miguel Hernndez

VISTO BUENO Y CALIFICACIN DEL PROYECTO


Ttulo proyecto:
MANEJO DE UNA PANTALLA TCTIL CON EL PIC32 PARA EL CONTROL
DE DISPOSITIVOS EXTERNOS.

Proyectante: Jess Fernnez Gonzlez


Directora:

Mara Asuncin Vicente Ripoll

VB directora del proyecto:

Fdo.: Mara Asuncin Vicente Ripoll


Lugar y fecha:

CALIFICACIN NUMRICA

MATRCULA DE HONOR

Mritos justificativos en el caso de conceder Matrcula de Honor:

Conforme presidente:

Conforme secretario:

Conforme vocal:

Fdo.:

Fdo.:

Fdo.:

Lugar y fecha:

Campus de Elche. Avda. del Ferrocarril s/n 03202 ELCHE

NDICE
1. CAPTULO1.INTRODUCCINYOBJETIVOS........................................ 25
1.1 OBJETIVOS

......................................... 25

1.2 ESTRUCTURA

......................................... 26

2. CAPTULO2.ELMICROCONTROLADORPIC32:HARDWARE
YSOFTWARE

........................................ 29

2.1 INTRODUCCIN

......................................... 29

2.1.1 DIFERENCIASENTREUNMICROCONTROLADORYUN
MICROPROCESADOR

2.1.2 APLICACIONESDELOSMICROCONTROLADORES........... 30
2.1.3 MODELOSDEMICROCONTROLADORESDELAMARCA
MICROCHIP

2.2 MICROCONTROLADORPIC32

......................................... 29

......................................... 32
......................................... 33

2.2.1 ELECCIN DEL MICROCONTROLADOR................... 33


2.2.2 CARACTERSTICAS DEL MICROCONTROLADOR
PIC32MXXX

......................................... 34

2.2.3 NCLEOMCU

......................................... 37

2.2.3.1 Estadospipeline

......................................... 38

2.2.3.2 UnidaddeEjecucin...................................... 40

2.2.3.3 MDU:UnidaddeMultiplicacinyDivisin..... 40

2.2.3.4 ShadowRegisterSets..................................... 40

2.2.3.5 RegisterBypassing......................................... 41

2.2.3.6 BITSdeestadodelaALU................................ 42

2.2.3.7 MecanismodeInterrupcionesyexcepciones. 42

NDICE

2.2.4 JUEGODEINSTRUCCIONES ......................................... 43

2.2.4.1 RegistrosdelaCPU......................................... 49

2.2.4.2 Modosdelprocesador.................................... 49

2.2.4.3 RegistrosCP0

......................................... 51

2.2.5 MEMORIADELSISTEMA

......................................... 52

2.2.6 RECURSOSESPECIALES

......................................... 53

2.2.6.1 PerroguardinoWatchdog........................... 53

2.2.6.2 Tecnologadeahorroenergtico................... 53

2.2.6.3 Osciladores

2.2.6.4 Puertosdecomunicacin............................... 54

2.2.6.5 ConversorA/D

......................................... 54

......................................... 56

3. CAPTULO3.HERRAMIENTASSOFTWAREDEDESARROLLO............... 61
3.1 MPLABIDE

......................................... 61

3.1.1 INTRODUCCIN

3.1.2 CARACTERSTICASGENERALES...................................... 62

3.1.3 ESTRUCTURADEUNPROYECTO..................................... 63

3.1.4 CREACINDEUNPROYECTO......................................... 64

3.2 SOFTWAREDEGRABACIN

......................................... 61

......................................... 71

3.2.1 INTRODUCCIN

......................................... 71

3.2.2 SOFTWAREDEGRABACIN ......................................... 71

3.2.3 GRABARENLAEXPLORER16MEDIANTEICD3................ 72

4. CAPTULO4.TARJETADEEVALUACINPARAELPIC32:
STARTERKIT

........................................ 77

4.1 INTRODUCCIN

......................................... 77

4.1.1 CARACTERSTICASGENERALES....................................... 78

4.1.2 ARQUITECTURADELATARJETAPIC32STARTERKIT...... 79

4.2 PROGRAMASUTILIZADOSPARAVERIFICARSTARTERKIT............ 82
4.3 PROGRAMASREALIZADOSPARAELPIC32STARTERKIT.............. 85

NDICE

5. CAPTULO5.SISTEMADEDESARROLLOEXPLORER16........................ 95
5.1 INTRODUCCIN

......................................... 95

5.1.1 CARACTERSTICASGENERALES....................................... 96

5.1.2 ARQUITECTURADELATARJETAEXPLORER16................ 97

5.2 SOFTWAREDEGRABACIN

.........................................109

5.3 EJEMPLOSDEPROGRAMASPARALAEXPLORER16......................110

5.3.1 EJEMPLO1:LEDS

.........................................112

5.3.2 EJEMPLO2:INTERFAZSPI

.........................................114

5.3.3 EJEMPLO3:INTERFAZUART .........................................119

5.3.4 EJEMPLO4:MODULOLCDYPUERTOPARALELO(PMP) 125

5.3.5 EJEMPLO5:PULSADORES

5.3.6 EJEMPLO6:ENTRADASANALGICAS.............................131

.........................................128

6. CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE...............139
6.1 INTRODUCCIN

.........................................139

6.1.1 IMPORTANCIADELASPANTALLASTCILESEN

APLICACIONESEMBEBIDAS .........................................139

6.2 ARQUITECTURAHARDWARE

.........................................140

6.2.1 ARQUITECTURADELAPANTALLATCTIL......................140

6.2.2 FUNCIONAMIENTODEUNAPATALLATCTIL................142

6.2.3 CARACTERSTICASMSIMPORTANTESDELLCD

6.2.4 CONEXIONADODELAPANTALLATCTIL.......................145

GRFICO

6.3 MICROCHIPGRAPHICLIBRARY

.........................................144

.........................................146

6.3.1 ESTRUCTURADELALIBRERAGRFICA..........................146

6.3.2 CARACTERSTICASDELOSWIDGETS(OBJETOS).............147

6.3.3 FUNCIONAMIENTODELALIBRERA................................148

6.3.4 PROGRAMASEJEMPLO

.........................................153

NDICE

7. CAPTULO7.APLICACIONESDESARROLLADAS..................................163
7.1 INTRODUCCIN

.........................................163

7.2 PANTALLATCTIL

.........................................163

7.2.1 ASPECTOSATENERENCUENTAPARAELABORAREL
PROGRAMA

.........................................163

7.2.2 ESTRUCTURADELPROGRAMA.......................................166

7.2.3 FUNCIONAMIENTODELPROGRAMA..............................173

7.3 PANTALLATCTILYACELEROMETRO.........................................177

7.3.1 ASPECTOSATENERENCUENTAPARAELABORAREL
PROGRAMA

.........................................177

7.3.2 ESTRUCTURADELPROGRAMA.......................................179

7.3.3 FUNCIONAMIENTODELPROGRAMA..............................182

8. CAPTULO8.CONCLUSIONESYTRABAJOSFUTUROS.........................191

ANEXOA.DISEODELAMEMORIADELPIC32......................................195
A.1 INTRODUCCIN

A.1.1 REGISTROSDECONTROL

A.2 DISEODELAMEMORIAPIC32

.........................................195
.........................................195
.........................................197

A.2.1 CLCULODELADIRECCINFSICAAVIRTUAL

A.2.2 PARTICIN DELAMEMORIAFLASHDEPROGRAMA.....199

A.2.3 PARTICINDELARAM

YVICEVERSA

.........................................199

.........................................200

ANEXOB.CONSIDERACIONESPRCTICASPARAPROGRAMARELPIC32205
B.1 INTRODUCCIN

.........................................205

B.2 VARIABLES

.........................................205

B.3 INTERRUPCIONES

.........................................209

B.3.1 MDULORTCC

B.3.2 OTRASFUNCIONESTILES .........................................215

B.4 CONFIGURACINDELPIC32

.........................................214

.........................................215

NDICE

ANEXOC.ACELERMETROADXL330

........................................223

C.1 INTRODUCCIN

.........................................223

C.1.1 IMPORTANCIADELOSSENSORESENAPLICACIONES
EMBEBIDAS

C.2 FUNCIONAMIENTODELSENSOR

.........................................223
.........................................224

ACRNIMOS

........................................227

BIBLIOGRAFA

........................................229

NDICE DE FIGURAS

2.1

Estructurabsicadeunmicrocontrolador.

....... 30

2.2

Ejemplosdeaplicacionesdemicrocontroladores.

....... 31

2.3

PIC16F84A,modelodemicrocontroladormuypopularen

ladocenciadePICs.

....... 32

2.4

PIC32MX460512L.

....... 34

2.5

100pinesdelPIC32MX3XXL.

....... 36

2.6

EsquemadelosestadospipelinedelaCPUdelPIC32MX.

....... 39

2.7

EsquemadelosestadospipelinedelaCPUdelPIC32MX
antebloqueohardwareslip.

2.8

2.9

....... 41

EsquemadelosestadospipelinedelaCPUdelPIC32MX
usandoelmecanismobypassing.

....... 42

Formatodelos3tiposdeinstrucciones.

....... 44

2.10 RegistrosdelaCPU.

....... 49

2.11 ModosdeoperacindelaCPU.

....... 50

2.12 RegistrosCP0.

....... 51

2.13 Primeros8bitsdelregistroSTATUS.

....... 52

2.14 DiagramadebloquesdelmduloADCde10bits.

....... 56

NDICE DE FIGURAS

3.1

Procesodeescrituradeunaaplicacin.

....... 61

3.2

PantallainicialdelMPLABIDE.

....... 63

3.3

EstructuradeunproyectoconelMPLABIDE.

....... 64

3.4

Creacindeunproyecto,seleccindeldispositivo.

....... 65

3.5

Creacin de un proyecto, seleccin del compilador y el


linkado.

....... 65

3.6

Creacindeunproyecto,nombrarelproyecto.

....... 66

3.7

Creacindeunproyecto,aadirarchivosalproyecto.

....... 67

3.8

Aadirarchivosalproyectodesdeelmenprincipal.

....... 67

3.9

Resumendelasopcionesdeconfiguracin,configuration
bits.

....... 68

3.10 Construccindelprograma,build.

....... 69

3.11 Programarelmicrocontrolador.

....... 69

3.12 Verificacindelaprogramacineneldispositivo.

....... 70

3.13 Ejecutarelprogramaenmododebugger.

....... 70

3.14 MPLABICD3InCircuitDebugger.

....... 71

4.1

SistemadeevaluacinPIC32StarterKit.

....... 77

4.2

Componentes del sistema de evaluacin PIC32 Starter

Kit.

....... 78

4.3

PIC32StarterKit,Ledsencendidos.

....... 80

4.4

Conector para expansin modular de 120 pins y/o


alimentacindelatarjeta.

4.5

Diagrama de Bloques de la tarjeta de evaluacin PIC32


StarterKit.

4.6

....... 81

....... 81

Cuadro de dilogo para la introduccin de la accin a


realizar,programaStarterkitturorial.c.

....... 83

NDICE DE FIGURAS

4.7

VentanadeSalidadelprogramaStaterKitTutorial.c.

....... 83

4.8

ConfigurationsbitsparaelPIC32StarterKit.

....... 85

4.9

RegistroT1CON,asociadoalTimer1.

....... 86

4.10 VentanadeSalidadelprogramasemforosv2.0.c.

....... 92

5.1

SistemadedesarrolloExplorer16.

....... 95

5.2

ComponentesdelsistemadedesarrolloExplorer16.

....... 97

5.3

a) Zcalo de 100 pins. b) Detalle de la esquina para la

colocacindelPIC.

....... 98

5.4

Selectordelprocesador,PICPIM.

....... 98

5.5

Suministro de energa elctrica mediante fuente de


alimentacin externa conectada a: a) Conector J12. b)
Patillajesituadoenlaparteinferiorizquierdadelaplaca.

....... 99

5.6

LEDspresentesenlatarjetaExplorer16.

....... 99

5.7

Pulsadores presentes el sistema de desarrollo


Explorer16.

5.8

JumperenmodoInterruptor:a)JumperenmodoON.b)
JumperenmodoOFF.

5.9

....... 100

....... 100

JumperJ7enmodomultiplexor:a)Ubicacindeljumper
en la placa Explorer16 b) Detalle de los 3 pines. c)
JumperenelladoF4450.d)JumperenelladoPIC24.

....... 101

5.10 MduloLCDdelaplacaExplorer16.

....... 102

5.11 SensordeTemperaturaTC1047A.

....... 103

5.12 PotencimetroR6de10K.

....... 103

5.13 Conectorparalafamiliadeprogramadores/depuradores
ICD.
5.14 PuertoserieRS232.

....... 103
....... 104

NDICE DE FIGURAS

5.15 ConectorUSB.

....... 104

5.16 MemoriaEEPROM(25LC256)presenteenlaExplorer16.

....... 105

5.17 Relojes: a) Oscilador primario 8MHz y secundario


32.768kHz (cilndrico). b) Oscilador para el PIC18LF4550
20MHz.

....... 105

5.18 Explorer16,PCBparaaadirunaLCDgrfica.

....... 106

5.19 Explorer16, conector para tarjetas de expansin PICtaill


....... 107

Plus.
5.20 Explorer16,conectorPICkit2.

....... 107

5.21 Explorer16,conectorJTAG.

....... 108

5.22 DiagramadeBloquesdelatarjetaExplorer16.

....... 108

5.23 AdaptadorPIC32StarterKit100LPimAdaptor.

....... 109

5.24 MPLABICD3InCircuitDebuggerenfuncionamientoenla
Explorer16.

....... 109

5.25 LEDSencendidos,programaLED.c.

....... 113

5.26 DiagramadebloquesdelainterfazSPI.

....... 114

5.27 RegistroSTATUSdelaEEPROMserie,25LC256.

....... 116

5.28 ConfiguracindelProgramaHyperterminal.

....... 122

5.29 Consola

del

Programa

Hyperterminal,

ejecucin

programaserial.c.
5.30 Consola

del

Programa

....... 123
Hyperterminal,

ejecucin

programaU2Test.c.
5.31 ProgramaLCDtest.cejecutadoenlaExplorer16.

....... 124
....... 127

5.32 Esquema del nuevo carcter a crear en el modulo LCD


(0x00).

....... 128

5.33 ProgramaProgressBar.c ejecutadoenlaExplorer16.

....... 128

5.34 Rebotesocasionadosporlospulsadores.

....... 129

NDICE DE FIGURAS

5.35 Programabuttons.cejecutadoenlaExplorer16.

....... 131

5.36 ProgramaPot.cejecutadoenlaExplorer16.

....... 133

5.37 ProgramaPOTMAN.cejecutadoenlaExplorer16.

....... 135

5.38 ProgramaTemperatura.cejecutadoenlaExplorer16.

....... 135

6.1

EjemplosdeAplicacionesconpantallastctiles.

....... 139

6.2

GraphicsPICtailPlusDaughterBoardv2.

....... 140

6.3

DiagramadeBloquesdelmoduloLCD.

....... 141

6.4

Esquemadefuncionamientodeunpixelenunapantalla
reflectiva.

6.5

....... 143

Esquemadefuncionamientodeunpixelenunapantalla
transmisivaII.

6.8

....... 143

Esquemadefuncionamientodeunpixelenunapantalla
transmisiva.

6.7

....... 142

Esquemadefuncionamientodeunpixelenunapantalla
reflectivaII.

6.6

....... 143

Equipo completo en funcionamiento, sistema de


desarrolloExplorer16,MPLABICD3yGraphicsPICtailPlus

6.9

DaughterBoard.

....... 145

Estructuradelalibreragrficav1.6demicrochip.

....... 147

6.10 Librera grfica, control de los objetos a travs de la


interfazdemensaje.

....... 148

6.11 Librera grfica, estructura GOL_SCHEME aplicada a un


botn.

....... 149

6.12 Libreragrfica,parmetrosparadefinirlasdimensiones

deunbotn.

....... 150

NDICE DE FIGURAS

6.13 Diagrama de flujo bsico del funcionamiento de la


libreragrfica.

....... 152

6.14 Programa Graphics Primitives Layer Demo ejecutado en


lapantallatctil.

....... 153

6.15 Programa AN1136_v1.0.c ejecutado en la pantalla


tctil.

....... 157

6.16 Programa AN1136_v2.0.c ejecutado en la pantalla


tctil.

....... 158

6.17 Programa AN1136Demo.c ejecutado en la pantalla


tctil.

....... 159

7.1

EsquemadelPotencimetroR6delatarjetaExplorer16.

....... 165

7.2

Sensor de temperatura TC1047, Voltaje de salida (Vout)

respectotemperatura.

....... 166

7.3

Pantallaprincipal,ProgramaProyecto_1.c.

....... 173

7.4

Pantalla

Secundaria,

Potentiometer,

Programa

Proyecto_1.c.
7.5

Pantalla Secundaria, Slide Potentiometer, Programa


Proyecto_1.c.

7.6

....... 174

....... 174

Programa Proyecto_1.c a) Pantalla Secundaria, Set


TimeandDate,detallealpresionarelmendesplegable
paraseleccionarelmes.b)Fechayhoraconfiguradatras
pulsar el botn Show. c) Pantalla principal tras
configurarlahoraylafecha.

7.7

....... 175

Pantalla Secundaria, Temperature Sensor, Programa


Proyecto_1.c a) Pantalla cuando la temperatura es
inferior a 24C. b) Temperatura del sensor entre 24C y
25C.c)Temperaturaigualosuperiora26C.

....... 176

NDICE DE FIGURAS

7.8

I/OExpansionBoard.

....... 177

7.9

I/OExpansionBoardconconectorsoldado.

....... 178

7.10 ConexindelacelermetroalaI/OExpansionBoard.

....... 178

7.11 Pantallaprincipal,ProgramaAPP.c

....... 183

7.12 Calibracin del sensor, Programa APP.c a) Primera


posicinacalibrar.b)ResultadosdeCalibracin.

....... 183

7.13 Lecturadevalores,ProgramaAPP.c.

....... 184

7.14 Pantalladisplay,ProgramaAPP.c.

....... 184

7.15 Pantalla shock, Programa APP.c a) Esperando a un


shock en alguno de los ejes. b) Shock producido en el
ejeX.
7.16 Lecturadengulos,ProgramaAPP.c.

....... 185
....... 186

7.17 Juego de la pelota, Programa APP.c a) Mensaje de


bienvenida al juego. b) Instrucciones del juego. c)
Seleccindelniveldedificultad.d)Pantalladeljuego.e)
Mensajefinalconeltiempoenejecucin.

....... 187

8.1

USBPICtailPlusDaughterBoard.

....... 191

8.2

Estructurapropuestaparalacaptacindevideo.

....... 192

A.1

RegistrosSFRsparaconfigurarlamemoriadelPIC32.

....... 195

A.2

Registro BMXPUPBA asociado a la memoria flash de

programa.

....... 196

A.3

DivisindelamemoriadelPIC32,regionesprimarias.

....... 197

A.4

Mapeodelamemoriavirtualalafsica.

....... 198

A.5

Esquemadedireccionesparalaparticindelamemoria
RAM.

....... 201

NDICE DE FIGURAS

B.1

Esquemadelaconfiguracindelrelojdelsistema.

....... 216

C.1

UsodeunacelermetroeneliPhone.

....... 223

C.2

AcelermetroADXL330.

....... 224

C.3

SensibilidaddelsensorADLX330enlostresejes.

....... 224

C.4

Modelofsicodeunsensorcapacitivodiferencial.

....... 225

C.5

Salida del sensor ADXL330 en funcin de la orientacin

delmismo.

....... 225

NDICE DE TABLAS

2.1

ModelosdemicrocontroladoresdelamarcaMicrochip.

2.2

Juego de instrucciones completo presente en la familia

....... 32

PIC32MX3XX/4XX.

....... 48

5.1

JuegodecaracteresdelmduloLCD.

....... 102

5.2

Listadetodoslosprogramasevaluadossobreelsistema
Explorer16.

5.3

....... 111

Programas detallados ejecutados en el sistema de


desarrolloExplorer16.

6.1

....... 112

Caractersticas principales del TFTG240320UTSW92W


TPE.

B.1

....... 144

Comparacin de las variables enteras disponibles en el


MPLABC32.

B.2

....... 205

Comparacindelasvariablesfraccionalesdisponiblesen
elMPLABC32.

B.3

Anlisis

temporal

....... 207
de

las

diferentes

variables,

multiplicacin.

....... 208

B.4

Anlisistemporaldelasdiferentesvariables,divisin.

....... 208

B.5

Anlisis temporal de las diferentes instrucciones de

optimizacindecdigo.

....... 220

Manejo de una pantalla tctil con el PIC32 para el


control de dispositivos externos.

1. INTRODUCCIN Y OBJETIVOS

CAPTULO1.INTRODUCCINYOBJETIVOS

1.1. OBJETIVOS

ElpresenteProyectoFindeCarrerasecentraeneldesarrollodeaplicaciones
prcticasparalaprogramacindemicrocontroladores.Enconcreto,eltrabajohasido
realizadoconmicrocontroladoresPICdegamaalta(familiademicrocontroladoresde
32bits),enparticularconlosmodelosPIC32MX360F512LyelPIC32MX460F512L.

En los ltimos aos han tenido un gran auge los microcontroladores PIC
fabricadosporMicrochipTechnologyInc.LosPIC(PeripheralInterfaceController)son
unafamiliademicrocontroladoresquehatenidogranaceptacinydesarrollograciasa
quesusbuenascaractersticas,bajoprecio,reducidoconsumo,pequeotamao,gran
calidad, fiabilidad y abundancia de informacin, los convierten en muy fciles,
cmodosyrpidosdeutilizar.

Eltrabajorealizadoenesteproyectosepuededividiren4tareasbsicas:

Estudiodelhardwareysoftware(juegodeinstrucciones)delPIC32dada
surecientepuestaenelmercado.

Anlisis de programas ejemplo para la placa PIC32 Starter Kit y


desarrollodelosprimerosprogramasejemploparaelPIC32.

Estudio del sistema de desarrollo Explorer16 y desarrollo de cdigo


fuenteparaestesistema.

Desarrollo de aplicaciones de control mediante el uso de la pantalla


tctilincorporandoposteriormenteunacelermetro.

25

CAPTULO1.INTRODUCCINYOBJETIVOS

1.2. ESTRUCTURA

El proyecto fin de carrera Manejo de una pantalla tctil con el PIC32 para el
control de dispositivos externos se divide en ocho captulos y tres anexos. En este
primercaptuloserealizaunabreveintroduccindetallandolosobjetivosdelproyecto
ydescribiendosuestructura.
En el segundo captulo se realiza una introduccin a la arquitectura de los
microcontroladores en general, y se describe con detalle la familia de los
microcontroladoresPICde32bits.
Eneltercercaptulosepresentanlosdistintosprogramasquesehanutilizadoa
lo largo del proyecto, tanto para la grabacin de los programas en los
microcontroladores,comoparaladepuracinysimulacindelcdigofuente.
Seguidamente, en el cuarto captulo se describe la metodologa realizada
durante la evaluacin del PIC32 Starter Kit, desarrollando los primeros programas
fuenteparaelPIC32.
Posteriormente, en el quinto captulo se analiza el sistema de desarrollo
Explorer16,sepresentasuarquitecturafsicayelsoftwarenecesarioparahacerusode
ella. Adems se presentan una serie de programas ejemplo desarrollados para esta
tarjeta.
Enelcaptulosextoseestudiaelhardwaredelapantallatctilpresenteenla
placa de expansin Graphics PICtail Plus Daughter Board (versin 2) y se analiza el
funcionamientodelalibreraMicrochipGraphicLibraryversin1.6..
Acontinuacin,enelcaptulosptimosedetallanlasaplicacionesdesarrolladas
paralatarjetagrficaGraphicsPICtailPlusDaughterBoard(versin2)usandotanto
elsistemadedesarrolloExplorer16comolatarjetaI/OExpansionBoardalacualse
haincorporadoelacelermetroADXL330.
Finalmente,enelcaptulooctavosehaceunarecopilacindeconclusiones,as
comodelosposiblestrabajosfuturos.
Por ltimo, al final del documento se encuentran los Anexos A, B y C. En el
anexoAsedescribedequmanerasepuedeconfigurarlamemoriadelPIC32.Enel
anexo B se describen distintos aspectos a tener en cuenta a la hora de programar
sobre el PIC32 que no se comentan en profundidad en ninguno de los captulos del
presenteproyecto.MientrasqueelanexoCserealizaunbreveestudiodelhardware
delacelermetroADLX330paraladeteccindemovimientoenelespacio.

26

Manejo de una pantalla tctil con el PIC32 para el


control de dispositivos externos.

2. EL MICROCONTROLADOR PIC32:
HARDWARE Y SOFTWARE

CAPTULO2.ELMICROCONTROLADORPIC32:
HARDWAREYSOFTWARE

2.1. INTRODUCCIN

Hace unos aos, los sistemas de control se implementaban usando


exclusivamentelalgicadecomponentes,loquehacaquefuesendispositivosdegran
tamaoymuypesados.Parafacilitarunavelocidadmsaltaymejorarlaeficienciade
estos dispositivos de control, se trat de reducir su tamao apareciendo as los
microprocesadores. Siguiendo con el proceso de miniaturizacin, el siguiente paso
consistienlafabricacindeuncontroladorqueintegrasetodossuscomponentesen
unsolochip.Aestoseleconoceconelnombredemicrocontrolador.

2.1.1. DIFERENCIAS ENTRE


MICROPROCESADOR

UN

MICROCONTROLADOR

UN

UnmicroprocesadoresuncircuitointegradoquecontienelaUnidadCentralde
Proceso(CPU)deuncomputador,queconstadelaUnidaddeControlydelosbuses
necesarios para comunicarse con los distintos mdulos. Mientras que un
microcontrolador, es un circuito integrado programable que contiene todos los
bloquesnecesariosparacontrolarelfuncionamientodeunatareadeterminada:
ProcesadoroCPU:queinterpretalasinstruccionesdeprograma.
MemoriaRAMparaalmacenarlasvariablesnecesarias.
MemoriaEPROM/PROM/ROMparaelprogramatipo.
PuertosE/Sparacomunicarseconelexterior.
Diversosmdulosparaelcontroldeperifricos.
Generador de impulsos de reloj que sincroniza el funcionamiento de todo el
sistema.

29

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

Figura2.1:Estructurabsicadeunmicrocontrolador.

En la Figura 2.1, se puede ver al microcontrolador embebido dentro de un


encapsulado de circuito integrado, con su procesador, buses, memoria, perifricos y
puertos de entrada/salida. Fuera del encapsulado se ubican otros circuitos para
completar perifricos internos y dispositivos que pueden conectarse a los pines de
entrada/salida.

Unmicrocontroladores,portanto,uncircuitoochipqueincluyeensuinterior
las tres unidades funcionales de un ordenador: CPU, Memoria y Unidades de E/S, es
decir,setratadeuncomputadorcompletoenunsolocircuitointegrado.

2.1.2. APLICACIONES DE LOS MICROCONTROLADORES

Cadavezexistenmsproductosqueincorporanunmicrocontroladorconelfin
deaumentarsustancialmentesusprestaciones,reducirsutamaoycoste,mejorarsu
fiabilidadydisminuirelconsumo.
Losmicrocontroladoresamenudoseencuentranenaplicacionesdomsticasy
enequiposinformticostalescomo:microondas,refrigeradores,lavadoras,televisin,
equiposdemsica,ordenadores,impresoras,mdems,lectoresdediscos,etc.

30

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

Figura2.2:Ejemplosdeaplicacionesdemicrocontroladores.

Los microcontroladores tambin son muy utilizados en robtica, donde la


comunicacin entre controladores es muy importante. Esto hace posible muchas
tareas especficas al distribuir un gran nmero de microcontroladores por todo el
sistema.Lacomunicacinentrecadamicrocontroladoryunocentral,permiteprocesar
lainformacinporunordenadorcentral,otransmitirloaotrosmicrocontroladoresdel
sistema.
Otro ejemplo de aplicacin de los microcontroladores, es la de la utilizacin
para monitorizar y gravar parmetros medioambientales (temperatura, humedad,
precipitaciones, etc.). El pequeo tamao, el bajo consumo de potencia y su
flexibilidad hacen de este dispositivo, una herramienta adecuada para este tipo de
aplicaciones.

31

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

2.1.3. MODELOS DE MICROCONTROLADORES DE LA MARCA MICROCHIP

Diversosfabricantesofrecenampliasgamasdemicrocontroladoresparatodas
lasnecesidades.Nosotrosvamosautilizarmicrocontroladoresdelamarcamicrochip,
alserlamarcaconunmayornmerodemodelosdeestosyporsumayorutilizacin
tantoprofesionalmentecomoporaficionados.
Dentrodelamarcademicrochip,nosencontramosconvariosmodelosdePIC.
Estos se clasifican de acuerdo a la longitud de sus instrucciones dando lugar a 3
grandestiposdePIC.

Clasificacin
GamaBaja

Longituddeinstrucciones
8bits

ModelosdePIC
Pic10,Pic12,Pic16,Pic18
Pic24F,Pic24H,dsPIC30,
GamaMedia
16bits
dsPIC33
GamaAlta
32bits
Pic32
Tabla2.1:ModelosdemicrocontroladoresdelamarcaMicrochip.

Adems,conformeaumentamoslalongituddelasinstruccionesvaaaumentar
la funcionalidad, las prestaciones ofrecidas pero tambin la complejidad de las
instruccionesydesuuso.

Figura2.3:PIC16F84A,modelodemicrocontroladormuypopularenladocenciadePICs.

32

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

2.2. MICROCONTORLADOR PIC32


2.2.1. ELECCIN DEL MICROCONTROLADOR

Existe una gran diversidad de microcontroladores, como se ha podido


comprobar con anterioridad. Dependiendo de la potencia y caractersticas que se
necesiten, se pueden elegir microcontroladores de 8, 16 32 bits. Aunque las
prestacionesdelosmicrocontroladoresde16y32bitssonsuperioresalosde8bits,la
realidadesquelosmicrocontroladoresde8bitsdominanelmercado.Estoesdebidoa
que los microcontroladores de 8 bits son apropiados para la gran mayora de las
aplicaciones,porloquenoesnecesarioemplearmicrocontroladoresmspotentesy
enconsecuenciamscaros.
Sin embargo, los modernos microcontroladores de 32 bits (puestos en el
mercadoafinalesdelao2007)sevanafianzandoenelmercado,siendolasreasde
ms inters el procesamiento de imgenes, las comunicaciones, las aplicaciones
militares,losprocesosindustrialesyelcontroldelosdispositivosdealmacenamiento
masivodedatos.

Alahoradeseleccionarelmicrocontroladorautilizarenundiseoconcretose
hadetenerencuentamultituddefactorescomoladocumentacin,herramientasde
desarrollo disponibles y su precio, la cantidad de fabricantes que lo producen y por
supuesto las caractersticas del microcontrolador (tipo de memoria de programa,
nmerodetemporizadores,interrupciones,etc.).

En el caso particular de este proyecto, la eleccin del microcontrolador vino


influenciadaporsurecientepuestaenelmercadodelmismo,conmotivodeanalizary
estudiar las nuevas posibilidades que nos ofreca el PIC32 respecto a sus anteriores.
Dentro de los microcontroladores de gama alta vamos a utilizar dos modelos de 32
bits,elPIC32MX360F512LyelPIC32MX460F512L.

33

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

Figura2.4:PIC32MX460512L.

2.2.2. CARACTERSTICAS DEL MICROCONTROLADOR PIC32MXXX

El PIC32X360F512L, introduce una nueva lnea de dispositivos de microchip


correspondientes a la familia de microcontroladores de 32 bit RISC (Reduced
Instruction Set Computer). Adems esta familia ofrece la opcin de una nueva
migracin para estas aplicaciones de altas prestaciones las cuales pueden quedarse
pequeasparalasplataformasde16bit.

AcontinuacinsemuestranlascaractersticasgeneralesdelPIC32:

Frecuenciadeoperacin:Dc80MHZ.
Memoriadeprograma:512Kbytes
MemoriadeDatos:32Kbytes
Recursosdeinterrupcin/vectores:95/63
PuertosdeE/S:PuertosA,B,C,D,F,G
o TotalpinsE/S:85

CanalesDMA(DirectmemoryAccess):4
Timers:
o Nmerototal(16bit):5
o 32bit(parejade16bit):2
o Timerdencleode32bit:1
34

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

Canalesdecapturadeentrada:5

Comunicacionesparalelas(PMP/PSP):8bit/16bit

CanalesdesalidaComparadores/PWN
Notificacindecambiodeentradasporinterrupcin:22
Comunicacionesenserie:
o UART:2
o SPI(3cables/4cables):2
o I2C:2
JTAGboundarySCAN
JTAGdebugandprogram
ICSP2wiredebugandprogram:
Instruccintrace
Hardwarebreakpoints:6instructions,2Data
Modulode10bitanalgicodigital(Canalesdeentrada):16
Comparadoresanalgicos:2
InternoLDO
Resets (y retrasos): POR, BOR, MCLR, WDT, SWT(software reset),
CM(configurationBitMismatch)

100pinTQFP

35

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

Figura2.5:100pinesdelPIC32MX3XXL.

Porotraparte,laarquitecturadelPIC32hasidodescompuestaenlossiguientes
bloquesfuncionales:

NcleoMCU
Memoriadelsistema
Perifricos
Integracindelsistema

36

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

2.2.3. NCLEO MCU

ElcorazndelPIC32eselncleoM4KCPUbasadoenlatecnologaMIPS32[1].
LaCPUrealizalasoperacionesbajoelprogramadecontrol.Lasinstruccionessonledas
ycargadasporlaCPU,decodificadasyejecutadassncronamente.Estasinstrucciones
sepuedenalmacenarenlamemoriaflashdeprogramaobienenlamemoriadedatos
RAM.
Esta CPU del PIC32 se basa, por tanto, en una arquitectura de carga
almacenamiento la cual realiza la mayora de operaciones en base a una serie de
registros internos (contiene 32 registros de propsito general de 32 bits). Estas
instrucciones especficas de carga y almacenamiento se utilizan para mover datos
entreestosregistrosinternosascomofueradelPIC.
LascaractersticasprincipalesdelncleoMCUsonlassiguientes:

NcleoRISCMIPS32M4Kde32bits.
ALUdeunsolociclo.
Unidaddeejecucindecargaalmacenamiento.
5estadospipeline.
Busesdedireccionesydatosde32bits.
Archivosderegistrodepropsitogeneralde32bits.
FMTFixedMappingTranslation.
FMDUFastMultiplyDivideUnit.
MIPS32Compatibleinstructionset.
MIPS16eCodeCompressionInstructionSetArchitectureSupport.
Instrucciones de 16 y 32 bits, optimizadas para lenguajes de alto nivel
comoC.
PuertodebugEJTAG
Rendimientohasta1.5DMIPS/MHz
Proteccin del cdigo interno para ayudar a proteger la propiedad
intelectual.

A continuacin vamos a ir describiendo algunas de estas caractersticas as


comolosconceptosmsimportantesdelNcleoMCU.

37

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

2.2.3.1 Estados pipeline

Losestadosdelpipelineson5:

Estadodeinstruccin(I)
Estadodeejecucin(E)
Estadodememoria(M)
Estadodealinear(A)
Estadodereescribir(W)

Estado I: Instruccin Fetch


Durante el estado I una instruccin es cargada y leda desde SRAM y las
instruccionesMIPS16esonconvertidasainstruccionesenMIPS32.

Estado E: Ejecucin
DuranteelestadoE:

Losoperandossonledosycargadosdesdeelarchivoderegistro.
OperandosdelosestadosMyAsondesviadosaesteestado.
La unidad aritmtico lgica (ALU) empieza las operaciones aritmticas o
lgicasparalasinstruccionesregistroaregistro.
La ALU calcula la direccin virtual de los datos para las instrucciones de
cargaryguardaryelMMU(MemoryManagementUnit)realizaeltraslado
deladireccinvirtualalafsica.
LaALUdeterminasiparaunacondicindebifurcacinestaesverdaderay
calculaladireccinobjetivodelaramificacin.
LasinstruccioneslgicasseleccionanunadireccindeinstruccinyelMMU
realizalatraslacindeladireccinvirtualalafsica.
Todaslasoperacionesdedivisinymultiplicacinempiezanenesteestado.

Estado M: Memory Fetch


Duranteesteestado:

TerminanlasoperacionesaritmticasolgicasdelaALU.
Se realiza el acceso a los datos SRAM para las instrucciones de carga y
almacenamiento.
Los clculos de multiplicaciones y divisiones continan en la MDU
(Multiply/DivideUnit).SielclculoterminaantesqueelIU(IntegerUnit)
38

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

mueva la instruccin pasada al estado M, entonces la MDU mantiene el


resultado en un registro temporal hasta que el IU mueve la instruccin al
EstadoA(yconsecuentementesabrquenosereliminado)

Estado A: Alinear
DuranteelestadoA:

Una operacin MUL hace que el resultado est disponible para la


reescritura.ElregistroactualreescritoesejecutadoenelestadoW.
Desde este estado, la carga de datos o el resultado de la MDU estn
disponiblesparasubypassing(comentadoacontinuacin)enelestadoE.

Estado W: Reescribir
Durante el registro W: Para registros a registros o cargar instrucciones, el
resultadosereescribeenelarchivoderegistro.

El ncleo M4k implementa un mecanismo de desviacin (bypassing) que


permitequeelresultadodeunaoperacinseaenviadodirectamentealainstruccin
que lo necesita sin tener que escribir el resultado en el registro y entonces volver a
leerlo.

Figura2.6:EsquemadelosestadospipelinedelaCPUdelPIC32MX.

39

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

2.2.3.2 Unidad de Ejecucin

La unidad de ejecucin del PIC32 es la responsable de llevar a cabo el


procesamiento de la mayora de instrucciones del MIPS. Esta proporciona una
ejecucinparalamayoradeinstruccionesenunsolociclo,mediantelaejecucinen
pipeline (pipelining), donde las complejas operaciones son divididas en pequeas
partesllamadosestados(explicadosanteriormente).

2.2.3.3. MDU: Unidad de Multiplicacin y Divisin

La unidad de multiplicacin y divisin realiza como su nombre indica, las


operaciones de divisin y multiplicacin. La MDU consiste en un multiplicador de
32x16, registros de resultado de acumulacin (HILO) y todos los multiplexores y la
lgicadecontrolrequeridapararealizarestasfunciones.Estaunidadtieneunasaltas
prestacionesyaquesoportalaejecucindeunaoperacindemultiplicacinde16x16
o32x16cadaciclodereloj,yunaoperacindemultiplicacinde32x32serealizacada
dosciclosdereloj.Porotraparte,lasoperacionesdedivisinseimplementanconun
solobitcadacicloderelojmedianteunalgoritmoiterativoyrequiere35ciclosdereloj
en el peor de los casos para que se complete la operacin. Tan pronto como el
algoritmo detecta el signo del dividendo, si el tamao actual es 24, 16 o 8 bits, el
divisorsalta7,15o23delas32iteraciones.
Adems,elM4Kimplementaunainstruccinadicionaldemultiplicacin,MUL,
la cual consiste en que los 32 bits ms bajos del resultado de la multiplicacin se
guardanenelarchivoderegistroenlugardeenelparderegistrosHI/LO.Paraello,se
handiseadodosinstruccionesadicionalesqueseusanparaejecutarlasoperaciones
demultiplicacinysumaascomomultiplicacinyresta,estason:multiplicacinsuma
(MADD/MADDU) y multiplicacinresta (MSUB/MSUBU). La instruccin MADD
multiplica dos nmeros y entonces suma el producto al contenido actual de los
registros HI y LO. Similarmente, la instruccin MSUB multiplica los dos operandos y
entoncesrestaelproductodelosregistrosHIyLO.Estasoperacionessesuelenusar
enalgoritmosdeDigitalSignalProcessor(DSP).

2.2.3.4. Shadow Register Sets

El procesador del PIC32 implementa una copia de los registros de propsito


general para usarlos como interrupciones de alta prioridad. Este banco extra de
registroesconocidocomoshadowregisterset(controladosporlosregistrosubicados
en la CP0) [2]. Cuando ocurre una interrupcin de alta prioridad, el procesador
automticamente conmuta a los shadow register set sin la necesidad de una
intervencindelsoftware.
40

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

Este banco de registros especiales permite reducir eficazmente, tanto la


sobrecargaenelmanejodeinterrupcionescomoeltiempodelatencia.

2.2.3.5. Register Bypassing

UnInterlockobloqueo,ocurrecuandounainstruccinenelestadopipelineno
puede avanzar debido a una dependencia de datos o una condicin externa similar,
porejemplo,cuandounainstruccindependedelresultadodeunainstruccinprevia.
EltipodebloqueohardwareenelprocesadorMIPsesSlips.Estospermitenqueuna
partedelapipelineavancemientrasotrapartedelapipelinepermaneceesttica,se
muestraunejemploenlasiguientefigura:

Figura2.7:EsquemadelosestadospipelinedelaCPUdelPIC32MXantebloqueo
hardwareSlip.

Sin embargo, el procesador del PIC32 implementa un mecanismo llamado


registerbypassingqueayudaareducirestosslipsenlapipelinedurantelaejecucin.
Cuando una instruccin esta en el estado E de la pipeline, el operando debe estar
disponibleparalasiguienteinstruccin.
Elregistrobypassingpermiteunatajoparaconseguirdirectamenteeloperando
desdelapipeline.DetalformaqueunainstruccinenelestadoEpuederecuperarun
operandodeotrainstruccinqueseestejecutandooenelestadoMoenelestadoA
de la pipeline. Mediante la figura que se muestra a continuacin podemos ver las
interdependenciasdescritas:

41

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

Figura2.8:EsquemadelosestadospipelinedelaCPUdelPIC32MXusandoelmecanismo
bypassing.

Evidentementeelusodelbypassingaumentaelrendimientoenelrangodeuna
instruccinporciclorelojparalasoperacionesdelaALU.

2.2.3.6. BITS de estado de la ALU

AdiferenciadelamayoradelosotrosmicrocontroladoresPIC,elPIC32nousa
un registro de Status con flags. Las banderas o flags se usan en la mayora de los
procesadores a ayudar a tomar una decisin para realizar operaciones durante la
ejecucindeunprograma.Estasbanderassebasanen,resultadosdecomparacinde
operacionesobienenoperacionesaritmticas.Detalformaqueelprogramaejecuta
instruccionesbasadasenestosvaloresdelasbanderas.
Sin embargo el PIC32 usa instrucciones que realizan una comparacin y
almacenan una bandera o valor en un registro de propsito general, ejecutndose
entoncesunaramacondicionada,usandoesteregistrodepropsitogeneralqueacta
comounoperando.

2.2.3.7. Mecanismo de interrupciones y excepciones

La familia de procesadores del PIC32 implementa un mecanismo eficiente y


flexibleparaelmanejodelasinterrupcionesyexcepciones.Ambossecomportande
manerasimilaryaquelainstruccinactualcambiatemporalmenteparaejecutarseun
procedimiento especial. La diferencia entre las dos es que las interrupciones son
usualmenteuncomportamientonormalylasexcepcionessonelresultadodeunerror
enlascondiciones,comoporejemplounerrorenelbusalenviarorecibirdatos.

42

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

Cuando ocurre una interrupcin o una excepcin, el procesador realiza los


siguientespasos:

El PC (contador de programa) de la siguiente instruccin a ejecutar se


guardaenelregistrodelcoprocesador.
Lacausadelregistroesactualizadaparaconocerlarazndelaexcepcino
delainterrupcin.
StatusEXLoERLespuestoa1comocausadelmododeejecucinKernel.
DesdelosvaloresdeEBASEySPACINGsecalculaelPC.
ElprocesadorcomienzalaejecucindelprogramadesdeunnuevoPC.

2.2.4. JUEGO DE INSTRUCCIONES

LafamiliadelosmicroprocesadoresPIC32estndiseadosparausarseconun
leguajedeprogramacindealtonivelcomoeselleguajedeprogramacinC.ElPIC32
soporta varios tipos de datos y usa un modo de direccionamiento simple pero
necesario para el lenguaje de alto nivel. De manera que dispone de 32 registros de
propsito general y 2 registros especiales para realizar las operaciones de
multiplicacinydivisin(HiLo).
Existen tres tipos diferentes de formatos para las instrucciones en lenguaje
mquinapresentesenelprocesador.

InstruccionesInmediatasotipoI.
InstruccionesdeSaltootipoJ.
InstruccionesdeRegistrosotipoR.

La mayora de estas instrucciones son ejecutadas en registros. Las


instrucciones de Registros tienen tres operandos: 2 fuentes y un destino. Las
instrucciones inmediatas tienen una fuente y un destino, mientras que las
instruccionesdesaltotienenunainstruccinrelativade26bit,queseusaparacalcular
eldestinodelsalto.

43

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

Figura2.9:Formatodelos3tiposdeinstrucciones.

Acontinuacinmostramosunatablaresumenconlasinstruccionesqueestn
implementadasenlosncleosdelassiguientesfamiliasdemicrocontroladoresde32
bits,PIC32MX3XX/4XX:

44

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

45

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

46

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

47

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

Tabla2.2:JuegodeinstruccionescompletopresenteenlafamiliaPIC32MX3XX/4XX.

Comopodemosobservarexisten124instruccionesdiferentes,porloquedada
su extensin y su dificultad, la familia de los microprocesadores PIC32 suelen
programarse en lenguaje de programacin de alto nivel, accediendo a los registros
especficos usando las funciones proporcionadas por el compilador o asignado
directamentelosunosyloscerosenlasposicionesdeseadas.

48

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

2.2.4.1. Registros de la CPU

TalycomohemoscomentandoanteslosregistrosdelaCPUsonlossiguientes:

32registrosdepropsitogeneralde32bits.
2 registros de propsito general para almacenar el resultado de las
multiplicaciones,divisionesyoperacionesdemultiplicacinacumulativa(HI
yLO).
Yunregistrodepropsitoespecial,contadordeprograma(PC),alcualsolo
le afectan indirectamente ciertas instrucciones, tal y como hemos visto
anteriormente, las interrupciones y excepciones. Este registro no es un
registrovisibleenlaarquitectura.

EnlasiguientefigurasemuestraladistribucindelosregistrosdelaCPU:

Figura2.10:RegistrosdelaCPU.

2.2.4.2. Modos del procesador:

Hay tres maneras distintas de ejecucin de la CPU del PIC32: dos modos de
operacinyunmodoespecial:modoUser,modoKernelymodoDebug.Elprocesador
comienzalaejecucinenelmodoKernelysisequieresepuedepermanecereneste
mododurantelaoperacinnormal.Elmodousuarioesunmodoopcionalquepermite

49

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

al diseador partir el cdigo entre software privilegiado y no privilegiado. Por otra


parte,elmodoDEBUGsoloseusasolomedianteundepurador.
Unadelasprincipalesdiferenciasentrelosdistintosmodosdeoperacinesel
direccionamientodelamemora,detalformaqueelsoftwaresolopermiteelaccesoa
determinadas regiones de esta. Por ejemplo los perifricos no son accesibles en el
modo usuario. La siguiente figura muestra la organizacin de la memoria en cada
modo:

Figura2.11:ModosdeoperacindelaCPU.

Modo Kernel:
Parapoderaccederatodoslosrecursoshardware,elprocesadordebeestaren
este estado. Tal y como podemos ver en la figura anterior, este modo permite el
accesosoftwareatodoelespaciodedireccionesdelprocesadorascomotambina
lasinstruccionesprivilegiadas.
De tal forma que el procesador operar en este modo cuando el bit DM del
registroDEBUGsea0yelregistroSTATUScontengaalgunodelossiguientesvalores:
UM=0;ERL=1;EXL=1.

50

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

Modo User:
Para poder operar en este modo, el registro STATUS debe contener los
siguientesvalores:UM=1;EXL=0;ERL=0.
Mientras se est ejecutando el procesador en este modo, el software se
restringeaunaseriederecursosdelprocesador.Detalforma,queenestemodose
tienenicamenteaccesoalreadememoriaUSEG.

Modo Debug:
Este modo especial del procesador, requiere que para su funcionamiento se
ejecuteunaexcepcindebug.Detalformaqueseaccederatodoslosrecursoscomo
en el modo kernel as como a los recursos hardwares especiales usados en las
aplicacionesdedebug.CuandoseentraenestemodoelbitDMdelregistroDEBUGes
1.ParasalirdeestemodobastaconejecutarlainstruccinDERET.

2.2.4.3. Registros CP0:

ElPIC32usaunregistroespecialcomointerfaceparacomunicarelestatusyla
informacindecontrolentreelsoftwaredelsistemaylaCPU.Estainterfazsellama
coprocesador 0. El software del sistema accede a los registros del CP0 usando las
instruccionesdelcoprocesadorcomoMFC0yMTC0.LosregistrosCP0enelMCUdel
PIC32sonlossiguientes:

Figura2.12:RegistrosCP0.
51

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

Entre los registros ms importantes del coprocesador destaca el registro


STATUS(registro12delCP0,seleccin0).EsteregistroSTATUSesdelecturayescritura
y contiene el modo de operaciones, la habilitacin de interrupciones y el estado del
diagnosticodelprocesador.
o Interrupcioneshabilitadascuando:
IE=1EXL=0ERL=0DM=0
o Modosdeoperacin:
DEBUGcuandoelbitDMes1encualquierotrocasoKernelo
user
ModousercuandoUM=1EXL=0ERL=0
ModokernelcuandoUM=0EXL=1ERL=1
Laposicinqueocupanestosbitsson:

Figura2.13:Primeros8bitsdelregistroSTATUS.

2.2.5. MEMORIA DEL SISTEMA

El PIC32 proporciona 4GB (232) de espacio dedireccionesde memoria virtual


unificada.Todaslasregionesdememoria,incluidaslamemoriadeprograma,memoria
dedatos,SFRsyregistrosdeconfiguracinresidenenesteespaciodedireccionescon
sus respectivas direcciones nicas. Opcionalmente, la memoria de datos y de
programasepuedenpartirenmemoriadeusuarioykernel.Adems,lamemoriade
datospuedeponersecomoejecutable,permitiendoalPIC32ejecutarsedesdeesta.
Caractersticasprincipalesdelaorganizacindelamemoria:

Anchodedatosde32bits.
SeparacindelespaciodedireccionesdelmodoUserykernel
Flexibilidad para poder realizar una particin de la memoria flash de
programa.
Flexibilidad para poder realizar una particin de la memoria RAM para
datosyotroespacioparaprograma.
SeparacindelamemoriaFlashbootparaprotegerelcdigo.
Manejorobustodelasexcepcionesdelbusparainterceptarelcdigofuera
decontrol.
52

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

MapeodelamemoriamediantelaunidadFMT(FixedMappingTranslation)
Regionesdedireccionescacheablesynocacheables.

EnelAnexoAdelpresenteproyecto,sedetallaconmsprecisinlaformaenla
queseseparanlosespaciosdememoriaenmodouserykernel,losregistrosusados
paraconfigurarlamemoriadelmicrocontrolador,ascomolamaneraderealizaruna
particin tanto de la memoria flash de programa como de la memoria RAM y las
consideracionesquehayquetenerencuentaalahoradellevarloacabo.

2.2.6. RECURSOS ESPECIALES

En este apartado se detallan los recursos especiales ms comunes que pueden


poseerlosmicrocontroladores:

2.2.6.1. Perro guardin o Watchdog:

El perro guardin est diseado para inicializar automticamente el


microcontroladorenelcasodequeexistaunmalfuncionamientodelsistema.
Consiste en un temporizador cuyo objetivo es generar automticamente un
reset cuando se desborda y pasa por 0, a menos que se inhabilite en la palabra de
configuracin.Cuandoelperroguardinesthabilitado,sehadedisearelprograma
demaneraquerefresqueoinicialicealperroguardinantesdequeseprovoquedicho
reset. Si elprograma falla o se bloquea, no se refrescaral perro guardin y cuando
completesutemporizacinprovocarunresetalsistema.

2.2.6.2. Tecnologa de ahorro energtico:

Todos los dispositivos de la familia del PIC32 incorporan un rango de


caractersticasquepuedensignificativamentereducirelconsumoelctricodurantesu
funcionamiento.Sedebebsicamenteadoscaractersticas:

Cambio de reloj sobre la marcha: El reloj del dispositivo puede ser


cambiadobajounsoftwarequecontrolealgunodelos4relojesdurantela
operacin.
Instruccionesbasadasenmodosdeahorrodeenerga.Elmicrocontrolador
puedesuspendertodaslasoperaciones,oselectivamenteapagarelncleo
mientrasdejaactivolosperifricos,utilizandounainstruccindelsoftware.

53

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

2.2.6.3. Osciladores:

Toda la familia del PIC32 nos ofrece 4 osciladores diferentes con sus
correspondientes opciones, lo que le permite al usuario un gran rango de posibles
eleccioneseneldesarrollodelasaplicacioneshardware.Estasincluyen:

FRC: Internal oscillator, para velocidades altas de operacin con un


consumobajo,salidanominalde8MHz.

LPRC: Internal lowfrequency and lowpower oscillator. Designado para


velocidades de operacin pequeas con bajo consumo, baja precisin,
32KHZ.

POSC:Externalprimaryoscillator.Hasta20MHZ(XThasta10MHz;HSpara
ms de 10MHz), dependiendo si usamos cristal de cuarzo o un resonador
cermico.

SOSC: External lowfrequency and lowpower, designado para bajas


velocidadesconuncristalexternode32,768Khz.Utilizadoparatemporizar
tiempos exactos. Adems es necesario si se quiere usar el mdulo RTCC
(RealTimeClockandCalendar).

EC:Externalclock,permiteconectaruncircuitoexternoyreemplazarlopor
eloscilador,proporcionandoalmicrocontroladorunaondadelafrecuencia
quequeramos.

Lasealproducidaporcadarelojpuedesermultiplicadaodivididaparaofrecer
unanchorangodefrecuenciasatravsdelcircuitoPLL.Estecircuitoproporcionaun
rango de frecuencias desde 32KHZ hasta la frecuencia mxima especificada por el
PIC3280MHZ,comentadoenmayorprofundidadenelAnexoBdelpresenteproyecto.

2.2.6.4. Puertos de comunicacin:

Lospuertosdecomunicacinsonherramientasquedotanalmicrocontrolador
de la posibilidad de comunicarse con otros dispositivos externos, otros buses de
microprocesadores, buses de sistemas, buses de redes y poder adaptarlos con otros
elementos bajo otras normas y protocolos. En las aplicaciones de los PIC, estas se
reducen a entender los protocolos. En general en el PIC32 existen disponibles dos
tipos,lainterfazdecomunicacinserieasncrona(UART)ylasncrona(SPIyI2C).

54

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

El PIC32 proporciona 7 formas de comunicacin perifricade las cuales 6 son


enserie.Estasltimasson:
2UniversalAsynchronousReceiverandTransmitters(UARTs).
2SPIy2I2C(sncrono).
Ladiferenciaprincipalentreunacomunicacinsncronayotraasncronaesla
necesidaddepasarinformacintemporaldesdeelquetransmitealreceptor.Esdecir,
lacomunicacinsncronanecesitadeunalneadedicadaparaunasealderelojque
proporcioneunasincronizacinentreambosdispositivos.As,elqueoriginalaseal
derelojseledenominamaestroyalotroesclavo.

Interfaz I2C:
Utiliza dos cables, dos pines del microcontrolador: 1 para el reloj (SCL) y otro
paratrasmitirlosdatosdeformabidireccional(SDA).
Requiere10bitsparaconfigurareldispositivoantesdequeseenvecualquier
dato.Estopermitequeconelmismocablesepuedausarhasta1000dispositivos.

Interfaz SPI:
Estainterfazseparalatransmisindedatosendoslneas:unaparalosdatosde
entrada (SDI) y otra para los de salida (SDO), por tanto requiere otro cable pero
permitetransferirdatossimultneamenteenambasdirecciones.
Sin embargo, esta interfaz requiere una lnea fsica adicional (seleccin del
esclavo, SS) para conectar cada dispositivo. La principal ventaja de la interfaz SPI es
que es muy simple y la velocidad puede ser mucho ms alta que con la mayor
velocidaddelbusI2C.

Interfaz UART:
Norequiereunalneadereloj.Existen2lneasdedatos,TXyRX,lascualesse
usanparalaentradaysalidadedatos,ysepuedencolocaradicionalmentedoslneas
quepuedenserusadasparaproporcionarunhardwarehandshake(lneasCTSyRTS).
Lasincronizacinseobtieneaadiendounbitdestartyotrodestopalosdatos.
Generalmenteseusaestainterfazcuandoladistanciafsicaesgrande.
55

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

Interfaz pararela:
El Parallel Master Port (PMP) se ha aadido a la arquitectura del PIC32 para
dotardeunbusdeE/Sflexiblepararealizartareascotidianasdelcontroldeperifricos
externos. El PMP proporciona la habilidad de transferir datos de 8 o 16 bits de una
manerabidireccionalyhasta64Kdeespaciodedirecciones.Ademssepuedeajustar
eltiempoparaadecuarelPMPalavelocidaddelosperifricosconlosquequeremos
interactuar.

2.2.6.5. Conversor A/D:

Como es muy frecuente el trabajo con seales analgicas, stas deben ser
convertidas a digital y por ello muchos microcontroladores incorporan un conversor
A/D, el cual se utiliza para tomar datos de varias entradas diferentes que se
seleccionanmedianteunmultiplexor.
El PIC32 ofrece la posibilidad de convertir la informacin analgica a digital
concretamenteatravsdeunmoduloADCde10bits.

Figura2.14:DiagramadebloquesdelmduloADCde10bits.

56

CAPTULO2.ELMICROCONTROLADORPIC32:HARDWAREYSOFTWARE

Como se puede ver en el esquema de bloques anterior, el mdulo A/D pose


hasta16pinesdeentradasquesepuedenusarpararecibirentradasanalgicas.Estos
pines estn conectados a 2 multiplexores para seleccionar los distintos canales y las
diferentes referencias para cada uno. La salida del convertidor de 10bits se puede
pasaraenterosconsignoosinsignode16o32bits.

Paramsinformacinsobreelmicrocontroladorserecomiendaverlahojade
caractersticas del componente disponible en el CDROM adjunto a la memoria del
presente Proyecto Fin de Carrera [3], el documento PIC32MX Family Reference
Manual[4]obienladireccinwebdelfabricanteMicrochip[5].

57

Manejo de una pantalla tctil con el PIC32 para el


control de dispositivos externos.

3. HERRAMIENTAS SOFTWARE DE
DESARROLLO

CAPTULO3.HERRAMIENTASSOFTWAREDE
DESARROLLO

3.1. MPLAB IDE

3.1.1. INTRODUCCIN

Elprocesodeescrituradeunaaplicacinsedescribeamenudocomounciclo
de desarrollo, ya que es muy difcil que todos los pasos efectuados desde el diseo
hasta la implementacin se realicen correctamente a la primera. La mayora de las
vecesseescribeelcdigo,setesteayluegosemodificaparacrearunaaplicacinque
funcionecorrectamente(verfigura3.1).
MPLAB IDE integra todas estas funciones con el fin de no tener que utilizar
distintasherramientasydiferentesmodosdeoperacin.

Figura3.1:Procesodeescrituradeunaaplicacin.

ElsoftwareMPLABIDEdeMicrochip[6],esunentornodedesarrollointegrado
bajoWindows,quepermiteeditar,ensamblar,linkar,depurarysimularproyectospara
losdistintosdispositivosPICdeMicrochip.
Dicho entorno incorpora todas las herramientas necesarias para larealizacin
decualquierproyecto:
Editordetexto.
Ensamblador.
Linkador.
61

CAPTULO3.HERRAMIENTASSOFTWAREDEDESARROLLO

Simulador.
Mensdeayuda.

Adems de las herramientas incorporadas, se pueden aadir otras como por


ejemplo:
CompiladoresdeC.
Emuladores.
Programadores.
Depuradores.
Portanto,elentornoMPLABesunsoftwarequejuntoconunemuladoryun
programador,formanunconjuntodeherramientasdedesarrollo.

3.1.2. CARACTERSTICAS GENERALES

Este software esta en ingls y est diseado para trabajar bajo el sistema
operativo de Windows en un entorno grfico con ventanas y botones. A lo largo del
presentetrabajovamosatrabajarconlaversindelMPLABIDEv8.33.

Si observamos la pantalla inicial del programa podemos observar tres reas


principales, la ventana de edicin MPLAB IDE (color azul), ventana de salida (color
naranja)yelpaneldenavegacinalaizquierdadelamisma(colorverde).Laventana
deedicineseleditordecdigo,dondevamosaescribirnuestroprograma,mientras
queenlaventanadesalidasemostrarlainformacinyelestadodelaltimaaccin
realizada.

62

CAPTULO3.HERRAMIENTASSOFTWAREDEDESARROLLO

Figura3.2:PantallainicialdelMPLABIDE.

Por otra parte, en el panel de navegacin se pueden ver dos tabulaciones


etiquetadas como Archivos y Smbolos. La etiqueta de archivos nos da acceso al
organizador Project manager, el cual nos permite organizar nuestros archivos para
unproyecto.Esdedestacarquenoesnecesarioincluirelarchivolinkerenlaventana
de nuestro proyecto. Con el PIC32, se usar automticamente para el enlazado un
linker por defecto, sin embargo, en el caso de que se considere oportuno se podr
incluirunoenconcreto.
Adems,unadelascaractersticasdeldepuradorparaelPIC32quenosofrece
el MPLAB IDE, es que posee un puerto de datos para depurar. Esto proporciona al
depuradorlacapacidaddeenviaryrecibirmensajesatravsdeunaconsola,lacualla
vamos a utilizar enalgunas de las aplicacionesdesarrolladas (se muestra un ejemplo
de esta consola en el apartado 2 del captulo 4), mediante el uso de la librera
db_utils.h.

3.1.3. ESTRUCTURA DE UN PROYECTO

Unproyectoesunconjuntodeprogramasqueseintegranenunnicomdulo
con el fin de generar un cdigo ejecutable para un determinado microcontrolador.
Dichos programas pueden estar escritos en diferentes lenguajes de programacin,
comoporejemploensamblador,C,Basic,Pascal.
63

CAPTULO3.HERRAMIENTASSOFTWAREDEDESARROLLO

AcontinuacinsemuestralaestructuradeunproyectocreadoconMPLAB,as
comosusficherosdeentradaysalida:

Figura3.3:EstructuradeunproyectoconelMPLABIDE.

Losficherosfuente(puedenservarios),puedenestarescritosenensamblador
o en C, con extensiones .asm y .c respectivamente, y mediante los programas
ensambladorycompilador,seobtienenlosficherosobjetoconextensin.o.
Todos los ficheros objeto, junto a otros ficheros procedentes de libreras, son
linkados,generandounaseriedeficherosdesalidadeloscualeselmsimportantees
elejecutable.HEXqueserelquesegrabareneldispositivo.

3.1.4. CREACIN DE UN PROYECTO

Un proyecto contiene todos los archivos necesarios para construir una


aplicacin (cdigo fuente, ficheros de cabecera, libreras, etc), as como sus
correspondientesopcionesdeconstruccin.Generalmentehabrunsoloproyectopor
workspace.
Porotraparte,unworskspacecontiene:unoomsproyectos,informacindel
dispositivoseleccionado,laherramientadeprogramacinydepuracinylasopciones
deconfiguracindelMPLABIDE.
Adems, el MPLAB IDE contiene un asistente para ayudar a crear nuevos
proyectos.Detalformaqueelprocesodecreacindeunproyectosepuededividiren
8tareaslascualesvamosairdescribiendopasoapasocontaldecrearunproyecto
paraejecutarloenelStarterKit(Capitulo4),primeratarjetaevaluada:
64

CAPTULO3.HERRAMIENTASSOFTWAREDEDESARROLLO

1.- Seleccin del dispositivo:


Abrimos el MPLAB IDE y lo primero que tenemos que realizar es cerrar
cualquier worksapce que estuviera abierto, para ello realizamos clic en file>Close.
Posteriormente hacemos clic en Project>Project Wizard, para abrir el asistente de
creacindeunproyectonuevo,detalformaquesenosabrirunaventanacomola
quesemuestraacontinuacin:

Figura3.4:Creacindeunproyecto,seleccindeldispositivo.

En el men desplegable seleccionamos el dispositivo, en nuestro caso


PIC32MX360F512LyledamosaNEXT.Entoncessenosabrirotraventana,comola
quemostramosenelsiguientepunto.

2.- Seleccin del Lenguaje de trabajo:

Figura3.5:Creacindeunproyecto,seleccindelcompiladoryellinkado.
65

CAPTULO3.HERRAMIENTASSOFTWAREDEDESARROLLO

Enestaventanatenemosqueseleccionarelcompiladorquevamosausarenel
programaascomoellinker,ambossehandescargadodelapginademicrochip[7].
EnActiveToolsuiteseleccionamosdelalistadesplegableMicrochipPIC32C
CompilerToolsSuite.Laherramientadetrabajoincluyeelensambladoryellinkado
que usaremos. Si la opcin del compilador no est disponible, hay que activar la
casillashowallinstalledtoolsuites.
En el desplegable de contenidos de las herramientas, seleccionamos MPLAB
C32 C Compiler (pic32gcc.exe) y abajo, en Location, hacemos clic en Browse y
seleccionamos la siguiente ruta que contiene el archivo seleccionado antes:
C:\ProgramFiles\Microchip\MPLABC32\bin\pic32gcc.exe.
Por ltimo seleccionamos en el desplegable anterior MPLAB 32 LINK Object
linker (pic20ld.exe) y comprobamos que la ruta es la siguientec:\Program
Files\Microchip\MPLABC32\bin\pic32Id.exe.HacemosclicenNEXTparacontinuar.

3.- Nombrar el proyecto


Senosabrirunapantallacomolaquesemuestraacontinuacin:

Figura3.6:Creacindeunproyecto,nombrarelproyecto.

En esta una nueva ventana seleccionamos la carpeta en la que queremos


guardar nuestro proyecto y le damos un nombre al mismo, por ejemplo
C:\MiProyecto\Luces.HacemosclicenNEXTparacontinuar.

66

CAPTULO3.HERRAMIENTASSOFTWAREDEDESARROLLO

4.-Aadir los archivos a tu proyecto:

Figura3.7:Creacindeunproyecto,aadirarchivosalproyecto.

Silosarchivosen.caunnoloshemoscreadopodremossaltarestapantallay
yalosaadiremosposteriormente.HacemosclicenFinishparaterminarycerramos
la ventana. Al cerrar la ventana, se ha creado en el MPLAB IDE el proyecto y el
workspace, con los siguientes nombres: el workspace Luces.mcw y el archivo del
proyectoLuces.mcp.
HacemosclicenFiles>Newenlabarradelmenparacrearunarchivonuevoen
el que comenzar a escribir nuestro programa. Antes que nada, lo guardamos en
File>SaveAscomoLuces.cenlamismacarpetaenlaquehemoscreadoelproyecto.
Es importante escribir la extensin .c para que el MPLAB lo reconozca como un
fichero fuente. Ahora escribimos el cdigo en c para ejecutar el ejemplo. Una vez
escritoelcdigoaadimoselarchivoLuces.caldirectoriodefuentestalycomose
puedeapreciarenlasiguientefigura:

Figura3.8:Aadirarchivosalproyectodesdeelmenprincipal.
67

CAPTULO3.HERRAMIENTASSOFTWAREDEDESARROLLO

Posteriormente, seleccionamos nuestro depurador, clic en Debugger>Select


Tool>PIC32MX Starter Kit de la barra de men. Antes de seleccionarlo, hay que
asegurarsequenuestroStarterKitestconectadoanuestroPCatravsdelcableUSB.
Una vez lo hayamos conectado, en la ventana de salida del MPLAB, se mostrar un
mensaje en el que nos indicar Starter kit Found, a la vez que el LED naranja de
depuracindelatarjetaseencender.

5.- Confirmar las opciones de configuracin.


HacemosclicenConfigure>ConfigurationBitsparaconfirmarquelasopciones
deconfiguracindenuestromicrocontroladorsonlasquequeramos.Acontinuacin
semuestraunaconfiguracintpicaparaelStarterKit:

Figura3.9:Resumendelasopcionesdeconfiguracin,configurationbits.

6.- Construir el proyecto:


Hacemos clic en Project>Build all en la barra del men y observamos (en la
ventanadesalida)queelprocesotranscurrasinerroreshastaqueaparezcaelmensaje
BUILD SUCCEEDED, momento en el que el programa estar preparado para que lo
probemosenelStarterKit.

68

CAPTULO3.HERRAMIENTASSOFTWAREDEDESARROLLO

Figura3.10:Construccindelprograma,build.

7.- Programar el dispositivo


HacemoscliceneliconodeProgramAllMemoriesenlabarraHerramientasdel
dispositivo,talycomomuestralafigura,contaldeprogramarelmismo:

Figura3.11:Programarelmicrocontrolador.

Una vez pulsado, nos aparecer un mensaje advirtindonos acerca de que


vamos a sobrescribir la memoria, le damos a Yes para continuar. En la ventana de
salida nos fijamos en el progreso y cuando aparezca DONE significar que la
programacindeldispositivohasidocompletada.Estoverificaquelaimagenhasido
cargadaenlamemoriaFlashyestpreparadaparasuejecucin.

69

CAPTULO3.HERRAMIENTASSOFTWAREDEDESARROLLO

Figura3.12:Verificacindelaprogramacineneldispositivo.

8.- Probar el programa:


UnavezprogramadalamemoriadeldispositivohacemosclicenDebugger>Run
enlabarradelmenoeneliconodeRun(colorazul)enelmendeldepuradortaly
como indica la siguiente figura, comenzando el funcionamiento del programa en
nuestroStarterKit.

Figura3.13:Ejecutarelprogramaenmododebugger.

Para parar el programa primero tenemos que hacer clic en Halt (pausa) y
posteriormenteenReset(colorpurpura).

70

CAPTULO3.HERRAMIENTASSOFTWAREDEDESARROLLO

3.2. SOFTWARE DE GRABACIN


3.2.1. INTRODUCCIN

Losmicrocontroladoresengeneral,ylosdelaempresaMicrochipenparticular,
necesitan de un circuito electrnico que permita transferirles el programa realizado
desdeelordenador.Existenmuchasmanerasdeafrontaresteproblema,yengeneral
sesueleutilizaralgunodelospuertosdisponiblesencualquierordenadorparaestefin.
Porello,enelmercadoesposibleconseguirprogramadoresdePICsconconexinpara
puertoUSB,paralelooserie(RS232).

3.2.2. SOFTWARE DE GRABACIN

Para grabar los programas en el PIC32, existen mltiples opciones as como


distintos software. En el presente trabajo se ha utilizado el MPLAB ICD3 InCircuit
Debuggerparalagrabacinydepuracindelcdigo,elcualseconectadirectamentea
laExplorer16(Captulo5)atravsdelconectorreservadoparaello.Detalformaque
este grabador se conecta a la Explorer16 mediante un cable modular y al ordenador
mediante un cable USB. Esta versin del programador ICD3 es hasta 15 veces ms
rpidaquesuversinanterior[8].Adems,nonecesitadeunafuentedealimentacin
externa,yaqueestalarecibedesdeelordenadoratravsdelcableUSB.
Porotraparte,paraqueelordenadorpuedarealizarlasdiferentesopcionesde
grabacin, se necesita tener instalado el programa MPLAB IDE en su versin 8.15a o
superior.EnnuestrocasovamosatrabajarconlaversinMPLABIDEv8.33,talycomo
yahemoscomentadoanteriormente.

MduloICD3
(pastillade
grabacin)

Tarjetade
Test

Conectores
USB

Figura3.14:MPLABICD3InCircuitDebugger.
71

CAPTULO3.HERRAMIENTASSOFTWAREDEDESARROLLO

La pastilla de grabacin dispone tambin de 3 luces indicadoras las cuales


poseenlossiguientessignificados.ElLeddePowersepondrdecolorverdecuando
seconectealordenador,indicandoqueyaestconectadoacorriente.ElLEDactive
se pondr de color azul cuando se le suministre energa o cuando se conecte a la
tarjeta.PorotraparteelLEDStatuspuedetener3configuracionesdistintas:siesta
de color verde, significa que el depurador est operando correctamente o bien que
esteseencuentraenstandby;siesdecolorrojoesquealgunaoperacinhafalladoy
porltimosiesdecolornaranjasignificaqueeldepuradorestocupado.
Adems dispone de una tarjeta de Test, la cual se usa para verificar que el
MPLABICD3funcionacorrectamente.Estatarjetalapodemosverenlafigura3.13,en
elextremoalqueseencuentraconectadoelcablemodular.

3.2.3. GRABAR EN LA EXPLORER16 MEDIANTE ICD3

Enesteapartadovamosadescribirlospasosquehayquerealizaralahorade
depurar o grabar un programa mediante el uso del MPLAB ICD3 bajo el entorno
MPLABIDEv8.33,ademsseindicantodoslosaspectosquehayquetenerencuenta
parallevarloacabo.
Los pasos necesarios para grabar un programa y verificar su funcionamiento
medianteelusodeMPLABICD3IncircuitDebuggersonlossiguientes:

Primero tenemos que asegurarnos que al abrir el programa tengamos


seleccionadonuestrodispositivoenConfigure>SelectDevice.

Nos aseguramos que los bits de configuracin son los correctos,


Configure>Configuration Bits y posteriormente seleccionamos
Debugger>Select Tool>ICD 3, MPLAB ICD3 incircuit debugger, para
depurarelcdigo.

Construimos el programa para crear el archivo de grabacin con la


extensin.HEX,mediantelaopcinBuildAll.Nostenemosqueasegurar
que el interruptor S2 est en PIM, para que funcione correctamente
nuestromicrocontrolador,encasocontrariodarunerror.

Cargamos el programa en la Explorer16 para su depuracin. Para ello


debugger>Program. Una vez realizado ya podemos comprobar el
funcionamientodelprogramadndolearun.Hastaestepuntoesmuy
similarrespectoalaformadedepurarenelStarterKit.
72

CAPTULO3.HERRAMIENTASSOFTWAREDEDESARROLLO

Tambin podemos usar los breakpoints para realizar paradas del


programaenunalneaespecficadecdigo.Estosbreakpointspueden
serdedostipos,hardwareandsoftware.

Asmismo,podemosusarlaherramientastopwatch(seejecutadesdela
ventanadedialogodelosbreakpoints)paradeterminareltiempoentre
distintosbreakpoints,eltiempoquesetardaenejecutardeterminadas
instrucciones.Elstopwatchnosdevuelveenlaventanadedialogode
salida del ICD3 el nmero de ciclos entre las dos instrucciones
seleccionadas. Por lo tanto, para saber el tiempo que tardan en
ejecutarse las instrucciones seleccionadas entre los 2 breakpoints
tendremos que saber a qu frecuencia est trabajando nuestro
microcontrolador.

Una vez depurado el programa, vamos a programarlo en el


microcontrolador. Para ello primero deseleccionamos nuestro
depurador y seleccionamos el programador ICD3 (Si el PIC lo requiere
tendremos que actualizar la ID del dispositivo en configure>ID
Memory).

Porfinalizar,seleccionamoslasopcionesdegrabacinenprogrammer
>Settings y construimos el programa, y para grabarlo finalmente le
damos a programmer>program y ya tendremos grabado el cdigo en
nuestromicrocontrolador.

73

Manejo de una pantalla tctil con el PIC32 para el


control de dispositivos externos.

4. TARJETA DE EVALUACIN PARA


EL PIC32: STARTER KIT

CAPTULO4.TARJETADEEVALUACINPARAEL
PIC32:STARTERKIT

4.1. INTRODUCCIN

Como ya hemos comentado en el captulo anterior, la idea de realizar este


proyecto surgi tras el lanzamiento al mercado del potente microcontrolador PIC32
juntoconunaseriedeherramientasdedesarrolloquefacilitabansuuso.Enconcreto,
elequipodeevaluacinPIC32Starterkit,elcualfacilitamucholainteraccinconeste
novedosomicrocontrolador.EstekitinicialparaelPIC32representaunmtodosimple
ydebajocosteparallevaracabounprimercontactoconlosmicrocontroladoresde32
bits. Adems el kit incluye todo lo necesario para escribir un programa, efectuar el
depuradoyejecutarelcdigoenunmicrocontroladorPIC32.

Figura4.1:SistemadeevaluacinPIC32StarterKit.

Adems,juntoconelkit,seincluyeunCdquecontieneelsoftwarenecesario
para la grabacin y depuracin va USB de los programas ejemplos incluidos en el
mismo y que comentaremos enelapartado 4.2. Por lo que estos programas pueden
servir como base a la hora de elaborar los primeros programas con la familia de
microcontroladoresPIC32.

77

CAPTULO4.TARJETADEEVALUACINPARAELPIC32:STARTERKIT

4.1.1. CARACTERSTICAS GENERALES

A continuacin se enumeran las principales caractersticas del sistema de


evaluacinPIC32StarterKit:

1. Microcontroladorde32bitPIC32MX360F512Lcon512KBdememoriaFlash
y32KBdeRAM.
2. Enlatarjeta,relojde8MHz.
3. MicrocontroladorPIC18LF4550paradepuraryprogramar.
4. ConectividadmedianteUSBparalascomunicacionesdedepuracin.
5. IndicadorLednaranjadedepuracin.
6. Trespulsadores.
7. TresLedsdedistintoscolores,definidosporelusuario.

2
5

3
4

Figura4.2:ComponentesdelsistemadeevaluacinPIC32StarterKit.

78

CAPTULO4.TARJETADEEVALUACINPARAELPIC32:STARTERKIT

4.1.2. ARQUITECTURA DE LA TARJETA PIC32 STARTER KIT

En este apartado se realiza una explicacin exhaustiva del sistema de


evaluacinPIC32StarterKit.

Suministroelctrico:

HaydosformasdesuministrarlaenergaalPIC32delStarterKit:

CableUSBconectadoaJ1.
Una tarjeta externa con un suministro elctrico regulado para corriente
continuaqueproporcione+5VyqueseconecteaJ2delStarterKit,situado
enlaparteposteriordelatarjetadeevaluacin.

ConectividadUSB:

El PIC32MX Starter Kit incluye un microcontrolador PIC18LF4550 USB, el cual


proporciona la conectividad y el soporte del protocolo USB. El cableado desde
PIC18LF4550alPIC32MXnosproporcionadostiposdeconectividad:
PinsdeE/SdelPIC18LF4550aICSPpinsdelPIC32MX
PinsdeE/SdelPIC18LF4550aJTAGpinsdelPIC32MX
El PIC32MX Starter Kit usa comnmente los pines del JTAG del PIC32MX para
programarydepurar.Laprimeravezqueseenchufa,elPIC18LF4550secargaconel
firmware USB. Adems, mediante la conexin USB se puede actualizar de una forma
muysencillaelfirmwaredeldispositivo.

Interruptores:

Latarjetadeevaluacindisponedelossiguientespulsadores:
SW1:InterruptoractivobajoconectadoaRD6
SW2:InterruptoractivobajoconectadoaRD7
SW3:InterruptoractivobajoconectadoaRD13
Estos interruptores no tienen ningn circuito antirebote y requieren el uso
internoderesistenciasconectadasa+5V.Portanto,losinterruptoresestarnanivel
alto(3,3V)cuandonosepulsanycuandolospresionamosseencontrarnanivelbajo.
79

CAPTULO4.TARJETADEEVALUACINPARAELPIC32:STARTERKIT

LEDS:

Los3ledsdisponiblesseencuentranconectadosalaslneas0,1y2delpuerto
D.Paraqueseenciendanestosleds,lospinesdelPORTDcorrespondientessetendrn
queponeranivelaltoparaqueseenciendan.Adems,cadaunodeestosledstienen
uncolordistinto,rojo,naranjayverdetalycomopodemosverenlaFigura4.3.

Pulsadores

LEDs

Figura4.3:PIC32StarterKit,Ledsencendidos.

OpcionesdelOscilador:

El microcontrolador de la tarjeta de evaluacin tiene un circuito oscilador el


cualseencuentraconectadoaeste.Elosciladorprincipal(Y2)usaunrelojde8MHzy
actacomoelosciladorprimariodelcontrolador.Portanto,noesnecesarioelusode
un cristal externo para usar el PIC32. En caso de que queramos se podr usar el
osciladorinternodelmicrocontrolador.
Porotraparte,elrelojdelPIC18LF4550esindependientedelPIC32MXytiene
supropiocristalde8MHz(Y1).

Conectorparaexpansinmodularde120pin(J2):

LaplacadelPIC32MXStarterKithasidodiseadaconunainterfazdeexpansin
modular de 120 pins (situada en la parte trasera de la tarjeta, ver figura 4.4). Esta
interfaz proporciona a la placa un elemento modular para posibles ampliaciones de
nuevas tecnologas que puedan aparecer en el futuro, haciendo de la tarjeta un
elemento flexible. As mismo este conector nos va a servir ms adelante para poder
conectarestatarjetaalaExplorer16ascomoalaI/OExpansinBoardqueveremos
enloscaptulos5y7respectivamente.

80

CAPTULO4.TARJETADEEVALUACINPARAELPIC32:STARTERKIT

Figura4.4:Conectorparaexpansinmodularde120pinsy/oalimentacindelatarjeta.

Acontinuacinmostramoseldiagramadebloquesdealtoniveldelatarjetade
evaluacinPIC32StarterKit:

Figura4.5:DiagramadeBloquesdelatarjetadeevaluacinPIC32StarterKit.

81

CAPTULO4.TARJETADEEVALUACINPARAELPIC32:STARTERKIT

4.2. PROGRAMAS UTILIZADOS PARA VERIFICAR STARTER KIT

Acontinuacinsedetallanalgunosdelosprogramasutilizadosparacomprobar
elfuncionamientodelatarjetadeevaluacin.Hayquetenerencuenta,quealseruna
tarjetadeevaluacinsinmuchosmdulosconlonicoquesepuedeoperaresconlos
pulsadoresyconlosledsdedistintoscolores.
El primer programa evaluado (StarterKitTutorial.c) sigue el siguiente diagrama
deflujo:

82

CAPTULO4.TARJETADEEVALUACINPARAELPIC32:STARTERKIT

EsteprimerprogramaincluyelalibreraDebugprint(db_utils.h)conlaque
vamos a ser capaces de mostrar mensajes por pantalla a la espera de una respuesta
porpartedelusuario.Enestecuadrosenosvaaindicarquedebemosdeintroducir
unadelasletrasquesenosindicanenlaventanadesalida,estasson:E,R,O,G,X,sila
entrada no se corresponde con ninguna de estas letras se mostrar un mensaje de
error y se intercambiar el estado de cada LED (ver diagrama de flujo anterior). Por
tanto, el programa responder con una accin u otra dependiendo de la letra
introducida. A continuacin mostramos el cuadro de dilogo (figura 4.6) en el que
introducimosnuestraeleccinascomolosmensajesquesemuestranenlaventana
desalida(Figura4.7)delMPLABIDE:

Figura4.6:Cuadrodedilogoparalaintroduccindelaaccinarealizar,programa
Starterkitturorial.c.

Figura4.7:VentanadeSalidadelprogramaStaterKitTutorial.c.

83

CAPTULO4.TARJETADEEVALUACINPARAELPIC32:STARTERKIT

En la Figura 4.7, podemos ver el resultado de la ventana de salida tras haber


conectadolatarjetamedianteelcableUSBalordenadoreintroducirRenelcuadro
dedilogo(colorrojo).Enelsiguienterecuadropodemosverelmensajedeerrortras
la introduccin de un carcter errneo, lo que lleva a intercambiar el estado de los
Leds.

El segundo programa (Simon_says.c) evaluado, consiste en imitar al juego


clsicoSimondice.Primeramente,cuandoprogramamoselStarterkitconeljuegoy
conectamoselcableUSB,los3Ledscomenzarnailuminarsedeformaintermitente
indicando el comienzo del juego. El juego comenzar presionando uno de los 3
pulsadores, con tal de indicar la dificultad del juego. De manera que pulsaremos el
interruptorSW3siqueremoselnivelmsfcil,SW2paraunnivelintermedioySW1
paraelmsdifcil.Elobjetivodeljuegoesimitarlaslucesquesevanencendiendode
formaaleatoriatantotiempocomopodamospresionandoelpulsadorcorrespondiente
del led que se haya encendido. El Juego termina cuando cometamos un error al
presionarelinterruptorequivocado,momentoenelquetodoslosLEDSseencendern
indicando que el juego ha terminado. Despus de una pequea pausa, podremos
seleccionarunnuevoniveldejuegoycomenzarotravez.

84

CAPTULO4.TARJETADEEVALUACINPARAELPIC32:STARTERKIT

4.3. PROGRAMAS REALIZADOS PARA EL PIC32 STARTER KIT

Como ya hemos dicho, el modelo exacto de 32 bits montado sobre nuestra


tarjeta Starter Kit es el PIC32MX360F512L. Por tanto sobre este vamos a grabar los
programasrealizadosenesteapartado,sinembargo,tambinsepodrangrabarenel
otromicrocontroladorquedisponemos,elPIC32MX460MX512L.
Las opciones de grabacin para todos los programas desarrollados en este
apartadosemuestranenlasiguientefigura:

Figura4.8:ConfigurationsbitsparaelPIC32StarterKit.

Programa1:Semaforosv1.0.c

El programa simula el comportamiento de un semforo. Primeramente se


suponequeelsemforoseencuentraenrojo.Detalformaqueestarenesteestado
durante 15 segundos, momento en el que se encender el led verde durante 25
segundos y posteriormente el led naranja durante 5seg, para volver a encenderse el
ledrojo.Paracontabilizareltiemposehautilizadoeltimer1medianteelcualseha
generadounafuncinquecuenta0.1segundos.
Para controlar la mayora de las funciones del Timer1 vamos a tener que
acceder a 3 registros de propsito general, el TMR1, el cual contiene el valor del
contadorde16bits,T1CON,elcualcontrolalaactivacinyelmododeoperacindel
TimeryelregistroPR1,elcualseusaparaproducirunresetperidicodelTimer(nolo
vamosanecesitarennuestrocaso).ParaqueelTimer1comienceacontardesdecero
simplemente tendremos que poner el registro TMR1 a 0. Para configurar el registro
T1CONconsultamoselmanual:
85

CAPTULO4.TARJETADEEVALUACINPARAELPIC32:STARTERKIT

Figura4.9:RegistroT1CON,asociadoalTimer1.

Tendremosqueoperarsobrelossiguientesbitsdeesteregistro:

TON,lopondremosa1paraactivarelTimer1

TCS, como fuente usamos el reloj principal del MCU, por tanto lo
ponemosa0.

TCKPS, seleccionamos como preesacalado el valor mnimo (1:1), luego


TCKPS=00.

TGATEyTSYNC,comousamosdirectamenteparaquecuenteelTimerel
relojinternodelMCU,ambosbitslospondremosa0.

Portanto,elvalorquetendremosqueasignaralregistroes:
T1CON=1000000000110000(binario)equivalenteaT1CON=0x8000(hexadecimal)

Una vez asignadas las opciones de operacin al Timer1 habr que calcular el
nmero total de impulsos a contar por el mismo antes de que desborde. Para ello
usamoslasiguientefrmula:
Tdelay=(Fpb)*Prescaler*DELAY
Donde,Tdelayeseltiempodeseado(nuestrocaso1ms),Fpbeselperiodode
unciclomquina(hayquetenerencuentaqueestamosoperandoaunafrecuenciadel
busperifricode36MHZ),Prescalereselpreescaladoseleccionado(1ennuestrocaso)
yDelaylosimpulsosacontarporelTimer1.
PortantooperandoparanuestrocasosaleunvalorDelayiguala36000.

86

CAPTULO4.TARJETADEEVALUACINPARAELPIC32:STARTERKIT

Elprogramasemuestraacontinuacin:
/***********************************************************************************
Semforo v1.0 README
***********************************************************************************
* Objetivo: Simula el funcionamiento de un semforo. En rojo durante 15 seg,
* en verde durante 25 seg y en mbar durante 5 seg.
*
* Tools:
*
1. MPLAB with PIC32MX support
*
2. C32 Compiler
*
3. Starter Kit.
*
***********************************************************************************/
#include <p32xxxx.h>
// Processor defs
#include <plib.h>
// Peripheral Library's
/////////////////////////////////////////////////////////////////////////////
//
PROTOTYPES
/////////////////////////////////////////////////////////////////////////////
void Initialize(void);
void SemaforoTask(void);
void Delayms( unsigned t);
// Configuration Bit settings
// System Clock = 72 MHz, Peripherial Bus = 36 MHz
// Primary Osc w/PLL (XT+,HS+,EC+PLL)
// Input Divider 2x Divider
// Multiplier 18x Multiplier
// WDT disabled
//Other options are don't care
//
//#pragma config PLLMUL = MUL_18, PLLIDIV = DIV_2, FWDTEN = OFF
//#pragma config POSCMOD = HS
// LED Macros
#define mSetAllLedsOFF()

(mSetRedLedOFF(), mSetYellowLedOFF(), mSetGreenLedOFF())

#define mSetRedLedON()
#define mSetRedLedOFF()

mPORTDSetBits(BIT_0)
mPORTDClearBits(BIT_0)

#define mSetYellowLedON()
#define mSetYellowLedOFF()

mPORTDSetBits(BIT_1)
mPORTDClearBits(BIT_1)

#define mSetGreenLedON()
#define mSetGreenLedOFF()

mPORTDSetBits(BIT_2)
mPORTDClearBits(BIT_2)

//Delay
#define FPB 36000000L
int main(void)
{
// Set Periph Bus Divider 72MHz / 2 = 36MHz Fpb
SYSTEMConfigWaitStatesAndPB(72000000);
// Initiallize board
Initialize();
while (1)
{
SemaforoTask();

87

CAPTULO4.TARJETADEEVALUACINPARAELPIC32:STARTERKIT
}
return 0;
}//main
// Initialize routine
void Initialize(void)
{
// Turn All Led's Off
mSetAllLedsOFF();
// Set LED Pins to Outputs
PORTSetPinsDigitalOut(IOPORT_D, BIT_0 | BIT_1 | BIT_2);
}//Initialize
void SemaforoTask(void)
{
mSetRedLedON();
Delayms(15000); //wait 15 sec.
mSetRedLedOFF();
mSetGreenLedON();
Delayms(25000); //wait 25 sec.
mSetGreenLedOFF();
mSetYellowLedON();
Delayms(5000); //wait 5 sec.
mSetYellowLedOFF();
}//SemaforoTask
/*********************************************************************
** Delay
**
** uso del: Timer1: 0.1 segundos.
*********************************************************************/
void Delayms( unsigned t)
{
T1CON = 0x8000; // Habilitacion del TMR1, Tpb, 1:1
while (t--)
{ // t x 1ms bucle
TMR1 = 0;
while (TMR1 < FPB/1000);
}
} // Delayms

Programa2:Semaforosv1.2.c

Enestasiguienteversindelprogramaanterior,vamosaaadirlaposibilidad
deindicareltiempoquequeremosqueestecadaLedencendido.
Paraellovamosautilizarlosinterruptorespresentesenlatarjeta,funcionando
del siguiente modo: El led que tengamos que configurar se encender previamente
durante 5 segundos y para asignar el tiempo pulsaremos SW1 tantas veces como
segundosqueramos,teniendoencuentaquedespusdecadapulsacinseencender
el Led Rojo durante un segundo indicando que se ha contabilizado tal segundo. Una
88

CAPTULO4.TARJETADEEVALUACINPARAELPIC32:STARTERKIT

vezapagadopodremosvolverapulsardenuevo.Cuandoyahayamospulsadotodas
las veces que queramos el interruptor, pulsaremos SW3, tras lo cual se encender
durante5segelsiguienteLEDaconfigurar.Unavezrealizadaestaoperacinconlos3
LEDs,semostrarndeformaintermitentementeparasealarqueyahemosfinalizado
con la configuracin de los mismos. Terminado el paso anterior se mostrar el
semforo actuando como en el programa anterior (semaforov1.0.c), pero en el que
cadaLedseencenderelperiododetiempoindicado.Acontinuacinmostramoslas
modificacionesrealizadasrespectoalprogramaanterior:

***********************************************************************************
Semaforo v1.2 README
***********************************************************************************
* Objetivo: Simula el funcionamiento de un semforo. En el que introducimos mediante
* los pulsadores de la tarjeta los segundos que queremos que se encienda cada uno.
*
* Tools:
*
1. MPLAB with PIC32MX support
*
2. C32 Compiler
*
3. Starter Kit.
***********************************************************************************/
#include <p32xxxx.h>
// Processor defs
#include <plib.h>
// Peripheral Library's
/////////////////////////////////////////////////////////////////////////////
//
PROTOTYPES
/////////////////////////////////////////////////////////////////////////////
void Initialize(void);
int SelectTime(void);
void ConfigureTime(void);
void ToogleLeds(void);
void SemaforoTask(void);
void Delayms( unsigned t);
// Configuration Bit settings
// System Clock = 72 MHz, Peripherial Bus = 36 MHz
// Primary Osc w/PLL (XT+,HS+,EC+PLL)
// Input Divider 2x Divider
// Multiplier 18x Multiplier
// WDT disabled
//Other options are don't care
//
//#pragma config PLLMUL = MUL_18, PLLIDIV = DIV_2, FWDTEN = OFF
//#pragma config POSCMOD = HS
// LED Macros
#define mSetAllLedsOFF()
#define mSetAllLedsON()

(mSetRedLedOFF(), mSetYellowLedOFF(), SetGreenLedOFF())


(mSetRedLedON(), mSetYellowLedON(), mSetGreenLedON())

#define mSetRedLedON()
#define mSetRedLedOFF()

mPORTDSetBits(BIT_0)
mPORTDClearBits(BIT_0)

#define mSetYellowLedON()
#define mSetYellowLedOFF()

mPORTDSetBits(BIT_1)
mPORTDClearBits(BIT_1)

89

CAPTULO4.TARJETADEEVALUACINPARAELPIC32:STARTERKIT
#define mSetGreenLedON()
#define mSetGreenLedOFF()

mPORTDSetBits(BIT_2)
mPORTDClearBits(BIT_2)

// Switch Macros
#define mGetRawRedSwitch()
#define mGetRawYellowSwitch()
#define mGetRawGreenSwitch()

(!mPORTDReadBits(BIT_6)) //SW1
(!mPORTDReadBits(BIT_7)) //SW2
(!mPORTDReadBits(BIT_13)) //SW3

//Delay
#define FPB 36000000L
//Globar variables
int TimeR,TimeY,TimeG;
int main(void)
{
// Set Periph Bus Divider 72MHz / 2 = 36MHz Fpb
SYSTEMConfigWaitStatesAndPB(72000000);
// Initiallize board
Initialize();
//Configure time
ConfigureTime();
while (1)
{
SemaforoTask();
}
return 0;
}//main
// Initialize routine
void Initialize(void)
{
// Turn All Led's Off
mSetAllLedsOFF();
// Set LED Pins to Outputs
PORTSetPinsDigitalOut(IOPORT_D, BIT_0 | BIT_1 | BIT_2);
// Set Switch Pins to Inputs
PORTSetPinsDigitalIn(IOPORT_D, BIT_6 | BIT_7 | BIT_13);
}//Initialize
int SelectTime(void)
{
int Time,c=0;
while(mGetRawGreenSwitch()==0)
{
if (mGetRawRedSwitch()==1)
{
mSetRedLedON();
Delayms(1000);
mSetRedLedOFF();
c++;
}
}
Time=c;
return Time;

90

CAPTULO4.TARJETADEEVALUACINPARAELPIC32:STARTERKIT
}//SelecTime
void ToogleLeds(void)
{
mSetAllLedsON();
Delayms(1000);
mSetAllLedsOFF();
Delayms(1000);
}//ToogleLeds
void ConfigureTime(void)
{
mSetRedLedON();
Delayms(5000);
mSetRedLedOFF();
TimeR=SelectTime();
mSetGreenLedON();
Delayms(5000);
mSetGreenLedOFF();
TimeG=SelectTime();
mSetYellowLedON();
Delayms(5000);
mSetYellowLedOFF();
TimeY=SelectTime();
//Finalizado
ToogleLeds();
ToogleLeds();
ToogleLeds();
ToogleLeds();
}//ConfigureTime
void SemaforoTask(void)
{
mSetRedLedON();
Delayms(TimeR*1000); //wait TimeR sec.
mSetRedLedOFF();
mSetGreenLedON();
Delayms(TimeG*1000); //wait TimeG sec.
mSetGreenLedOFF();
mSetYellowLedON();
Delayms(TimeY*1000); //wait TimeY sec.
mSetYellowLedOFF();
}//SemaforoTask
/*********************************************************************
** Delay
**
** uso del: Timer1: 0.1 segundos.
*********************************************************************/
void Delayms( unsigned t)
{
T1CON = 0x8000; // Habilitacion del TMR1, Tpb, 1:1
while (t--)
{ // t x 1ms bucle
TMR1 = 0;
while (TMR1 < FPB/1000);
}
} // Delayms

91

CAPTULO4.TARJETADEEVALUACINPARAELPIC32:STARTERKIT

Programa3:Semaforosv2.0.c

Porltimohemosrealizadounaltimamejoraalprograma.Seguramenteenel
programa anterior, podra ocurrir que no supiramos muy bien cmo funciona
realmente el programa ni cuntas veces hemos pulsado el interruptor asignando de
esta manera los segundos a cada led. Este problema lo vamos a resolver usando la
librera db_utils.h, la cual como ya hemos comentando se utiliza para mostrar
mensajesenlaventanadesalidamientrasseencuentraeldepuradorfuncionando.
Este programa ya ms completo que los anteriores no lo vamos a mostrar
debidoasuextensin,sinembargo,elcdigodelmismosepuedeconsultarenelCd
adjuntoalpresenteproyecto.
A continuacin mostramos la ventana de salida del MPLAB IDE para una
configuracinde20segundosenrojo,30enverdey5enmbar.

Figura4.10:VentanadeSalidadelprogramasemforosv2.0.c.

Podramos seguir mejorando este programa, aadindole nuevas


funcionalidades, pero no merece la pena realizar programas ms complejos con el
PIC32STARTERKIT,yaquenodisponedemsmdulosquepodamosprobaryverde
unaformasencilla,puesestatarjetahasidodiseadapararealizarlaprimeratomade
contacto con la familia de microcontroladores de microchip de 32 bits y no para
realizarprogramascomplejos.

92

Manejo de una pantalla tctil con el PIC32 para el


control de dispositivos externos.

5.

SISTEMA DE DESARROLLO
EXPLORER16

CAPTULO5.SISTEMADEDESARROLLO
EXPLORER16

5.1. INTRODUCCIN

El sistema de desarrollo Explorer16, consiste en un entrenador o placa de


evaluacinparaaplicacionesbasadasenlosmicrocontroladoresPICdeMicrochip.Se
ha diseado para permitir a estudiantes e ingenieros explorar y trabajar con las
capacidades de los microcontroladores PIC. Permite adems, concentrarse
principalmente en el desarrollo del software puesto que las conexiones entre
microcontroladoresPICycircuitosexternossonmuysencillasderealizar.
Dispone de una serie de perifricos bsicos de E/S con los que se puede
verificarelfuncionamientodeunaaplicacin,ascomoloscircuitosnecesariosparala
grabacindediversosmodelosdemicrocontroladoresPIC24F/24H/dsPIC33F/PIC32MX
de100pines.

Figura5.1:SistemadedesarrolloExplorer16.

95

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

5.1.1. CARACTERSTICAS GENERALES

A continuacin se enumeran las principales caractersticas del sistema


Explorer16:

1.Zocalo de 100 pines, compatible con las versiones de todos los dispositivos de
Microchipsiguientes:PIC24F/24H/dsPIC33F/PIC32MX.
2. Alimentacin mediante fuente de alimentacin externa AC/DC de 9 a 15V
proporcionando+3.3Vy+5Ventodalaplaca.
3.LedindicadordeAlimentacin.
4.PuertoserieRS232yhardwareasociado.
5.SensortrmicoanalgicoTC1047A.
6.ConectorUSBparacomunicacionesyprogramacin/depuracindeldispositivo.
7.Conectorparalafamiliadeprogramadores/depuradoresICD.
8.Interruptordeseleccindelprocesador.
9.LCDde16caracterespor2lneas.
10.PCBparaaadirunaLCDgrfica.
11.Pulsadores,resetyentradasdefinidasporelusuario.
12.Potencimetrodeentradaanalgica.
13.8Leds.
14.Multiplexoresrelacionadosconlacomunicacinserie.
15.EEPROMserie.
16.Relojesdeprecisin.
17.reaparaeldesarrollodeaplicacionespropias.
18.ConectorparalastarjetasPICtailPlus.
19.Interfazde6pinsparaelprogramadorPICkit2.
20.ConectorJTAG.

96

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

10

17

12
7

11
8

14

16
18

19

16

18

4
5
3

15
13

20
11

Figura5.2:ComponentesdelsistemadedesarrolloExplorer16.

5.1.2. ARQUITECTURA DE LA TARJETA EXPLORER16

Enesteapartadoserealizaunaexplicacinexhaustivadelsistemadedesarrollo
Explorer16.

Soportedelmicrocontrolador:

La tarjeta de desarrollo Explorer16 ha sido diseada para que los


microcontroladores estn montados permanentemente (U1) o bien que estos se
puedan desacoplar siempre que queramos a travs del zcalo de 100 pins. El
interruptorS2,nosindicadequformavamosautilizarnuestromicrocontrolador,el
cualseexplicamsadelanteenelapartadoInterruptordeseleccindezcalo.

Porotraparte,siemprequecoloquemoscualquiermicrocontroladorenlaplaca
nos tenemos que fijar que la marca con la esquina cortada quede orientada hacia la
esquinasuperiorizquierda.Delocontrarioestaramoscolocandomaleldispositivoy
nofuncionaracorrectamente.
97

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

a) b)
Figura5.3:a)Zcalode100pins.b)DetalledelaesquinaparalacolocacindelPIC.

Interruptordeseleccindezcalo:

EsteinterruptortienedosposicionesPIMyPIC.CuandoenlaExplorer16
no tengamos montado permanentemente un microcontrolador tipo PIC24FJ,
tendremosqueasegurarnosqueelinterruptorseencuentraenlaposicinPIM,por
elcontrario,silotenemosdeformapermanentetendrqueestarenlaposicinPIC.

Figura5.4:Selectordelprocesador,PICPIM.

Fuente de alimentacin:

Existen2formasdesuministrarcorrienteatarjetaExplorer16:
1. Mediante fuente de alimentacin externa AC/DC de 9 a 15V
(preferiblemente DC 9V) conectada a J12, proporcionando +3.3V y +5V en toda la
placa.

98

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

2. Mediante una fuente de alimentacin externa DC que proporcione +5V y


+3.3Vyqueseconectealosterminalesmostradosenlafigura5.5.b.
Una vez que se suministre corriente a la tarjeta mediante cualquiera de esos
dosmtodos,seencenderelLEDD1.

a) b)
Figura5.5:Suministrodeenergaelctricamediantefuentedealimentacinexterna
conectadaa:a)ConectorJ12.b)Patillajesituadoenlaparteinferiorizquierdadelaplaca.

LEDs:

Los diodos emisores de luz (LED) son los componentes ms utilizados,


principalmenteparamostrarelnivellgicodelospinesalosqueestnconectados.El
sistema Explorer16 tiene 8 LEDs que estn conectados al puerto A del
microcontrolador. De tal forma que estos LEDs se iluminaran cuando los pines
correspondientes del puerto A tengan un valor alto. Este grupo de ocho LEDs puede
serhabilitadoodeshabilitadomedianteelinterruptorJP2.

Adems la tarjeta Explorer16 dispone de un LED verde (D1) que se enciende


cuandoselesuministraalatarjetaunafuentedealimentacin,indicandolapresencia
de+3.3V.

Figura5.6:LEDspresentesenlatarjetaExplorer16.

99

CAPTTULO5.SISTTEMADEDESSARROLLOEX
XPLORER16

P
Pulsadores
:

La placa Explorer16
6 tiene 4 pulsadores,
p
con los que se pued
de interactuar a
travs de difereentes programas. Eso
os pulsadore
es se deno
ominan S3, S6, S4 y S5
S los
cualeesestnconectadosa laslneas6
6,7y13de
elpuertoD
Dyalalneaa7delpue
ertoA
respeectivamente.Tambinlaplacadissponedeun
npulsadorR
RESET,quecuandosepulsa
el prrograma deel microcontrolador em
mpieza a ejjecutarse desde el priincipio, es decir,
d
resettea el procesador. To
odos los pu
ulsadores son activos bajos, es d
decir, cuand
do se
presiionanpasan
natierra,0V.

Figuraa5.7:Pulsad
dorespresenteselsiste
emadedesarrolloExplorer16.

J
Jumpers:

Los jumpers, al igu


ual que loss interruptores, realizzan la coneexin entre
e dos
punttos.Debajo delacubieertadeplssticodeljum
mperexisteeuncontacctometlico
oque
estab
blecelacon
nexinalsituareljump
perentredo
ospinesdessconectadoss.
Esteeseelcasodeljjumperutiliizadoparah
habilitarel grupodeo
ochoLEDsve
erdes
dispo
oniblesenlaExplorer1
16,detalfo
ormaquelaaconexinsserealizacu
uandoeljumper
(JP2))sesitaen
ntreamboscontactos.

a) b)
Figurra5.8:Jump
perenmodo
oInterruptor:a)JumperrenmodoO
ON.b)Jump
perenmodo
oOFF.
100

CAPTULO5.SISTEMADEDESARRO
OLLOEXPLOR
RER16

A menu
udo, los ju
umpers se utilizan como
c
selecctores entrre dos possibles
coneexionesutiliizandoconeectoresde trespines. Comosem
muestraen laFigura5
5.9,el
contaacto del centro
c
puede conectaarse al pin
n de la deerecha o de la izqu
uierda
depeendiendodeelaposicin
ndeljumpeer.
En la Explorer16 ell jumper J7
7 decide el camino deel conector ICD (JP1). Si el
jump
per esta en lado PIIC24, JP1 se comun
nica directaamente con
n el dispositivo
coneectadoenelzcalode100pins.SSieljumperrestaenlad
doF4450,elconecto
orJP1
seco
omunicaprimeramenteeconelmiccrocontroladorPIC18LFF4550delaplaca.

a)b)

c)

d)

Figurra5.9:Jump
perJ7enmo
odomultipleexor:a)Ubiccacindelju
umperenlaplacaExplorer16
b
b)Detallede
elos3piness.c)JumperenelladoFF4450.d)Jum
mperenelladoPIC24.

M
MduloLCD
:

Enlaexp
plorer16ten
nemosund
displaycon dosfilaspo
or16caractterescada unay
unm
moduloLCDalfanumricode3Vco
ompatibleconloscontroladoresH
HD44780.

En los mdulos
m
alffanumrico podemos colocar dirrectamente un carcte
er en
ASCII en el bufffer de la RAM del controlador
c
del modulo LCD (Daata RAM Buffer,
DDRA
AM). La imagen
i
de salida se produce usando
u
unaa tabla 5x7
7 en la qu
ue se
repreesenta cadaa carcter. Adems see dispone de
d la posibilidad de crrear o mod
dificar
nuevvoscaracterresaccediendoaunseegundobuffferinterno (Character Generator RAM
buffeer,CGRAM)),ofreciendo
olaposibilidaddecreaar2nuevosscaracteres.
Estemd
duloLCDseecomunicaconelPICaatravsdelpuertoparralelo(PMP),por
loqu
ueparacom
municarnos conestem
mdulovam
mosatener queutilizarelbusparralelo
de8 bitsatravsdelpuertoDyE(co
oncretamen
ntelaslneaasdelpuerttoD,RD4,R
RD5y
RD15
5;ydelpuertoE,RE7:R
RE0).

101

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

AcontinuacinmostramoseljuegodecaracteresdisponiblesenelmduloLCD,
ascomolavisualizacindelLCDmientrasseestejecutandounprograma:

Tabla5.1:JuegodecaracteresdelmduloLCD

Figura5.10:MduloLCDdelaplacaExplorer16.

Sensor trmico analgico TC1047A:

Laplacadisponedeunsensordetemperaturaconsalidaanalgica(TC1074A
[9], U4) conectado a uno de los canales del controlador analgico/digital,
concretamente al canal AN4. Este sensor es muy prcticopara medir la temperatura
ambientesoportandounrangodetemperaturasentre40Cy125C.Dentrodeeste
102

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

rango su variacin respecto la tensin es lineal de acuerdo a 10mV/C y con una


precisinde+/0.5C.

Figura5.11:SensordeTemperaturaTC1047A.

Potencimetro:

Latarjetatambindisponedeunpotencimetro(R6)elcualestconectadoa
travsdeunaresistencia(R12)alcanalanalgicoAN5.Estepotencimetrosepuede
ajustardesdelatensindealimentacin(3.3V)hastatierra(0V),porloquesusalida
estarcomprendidaentreesosvalores.

Figura5.12:PotencimetroR6de10K.

Conector ICD:

El modulo MPLAB ICD en cualquiera de sus versiones, se puede conectar a la


tarjetaExplorer16atravsdelconectormodularJP1tantoparagrabarlosprogramas
enelmicrocontroladorcomoparadepurarlosmismos.ElconectorICDutilizalospines
delpuertoBseisysiete,permitiendoelusodeldepuradorenlnea.

Figura5.13:Conectorparalafamiliadeprogramadores/depuradoresICD.
103

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

Comunicacin RS-232:

La comunicacin RS232 permite transferir datos punto a punto. Se suele


utilizarenaplicacionesdeadquisicindedatosparalatransferenciadedatosentreel
microcontrolador y el ordenador. Puesto que los niveles de tensin de un
microcontroladoryunordenadornosoncompatiblesconlosdelRS232,seutilizael
adaptadordenivelesMAX32320.
Esta interfaz permite realizar todo tipo de comunicaciones serie entre la
Explorer16 y cualquier otro equipo mediante el protocolo estndar RS232. La
velocidaddetransferenciairenfuncindeltipodemicrocontroladorempleadoysu
velocidaddetrabajo.

Figura5.14:PuertoserieRS232.

Comunicacin USB:

ElconectordecomunicacinUSBseencuentraenelladoizquierdodelaplaca
Explorer16. Adems, incluye un PUC18LF4550 el cual proporciona el soporte para la
transmisin de datos, el controlador USB. Para que se pueda usar la comunicacin
USBhayqueutilizarmicrocontroladoresPICespecficosquesoportenlainterfazUSB
talescomolagamadePIC32MX460F.

Figura5.15:ConectorUSB.

104

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

EEPROM serie:

EnlaplacaExplorer16sehaincluidounamemoriaEEPROMenserie,25LC256
(U5), la cual posee 32Kbytes de memoria no voltil. Esta se encuentra conectada al
mdulo SPI2 con el objetivo de mostrar cmo se utiliza este tipo de comunicacin
sncrona. Adems hay que tener en cuenta que el nmero de veces que se puede
grabar y borrar una memoria EEPROM es finito, por lo que no es recomendable una
reprogramacincontinuadeesta.

Figura5.16:MemoriaEEPROM(25LC256)presenteenlaExplorer16.

Relojes:

Elosciladororelojseencargadegenerarlafrecuenciaprincipaldetrabajodel
microcontrolador. En la placa nos podemos encontrar 2 osciladores diferentes. El
oscilador principal usa una frecuencia de 8MHz (Y3) y acta como el oscilador
principal.Ademsexisteotroconunafrecuenciade32.768kHz(Y2)elcualactacomo
oscilador del Timer1 y sirve como recurso para el contador de tiempos y para el
osciladorsecundario.
Por otra parte, el PIC18LF4550 presenteen la placa, tiene su propio reloj con
unafrecuenciade20MHz(Y1).

a) b)

Figura5.17:Relojes:a)Osciladorprimario8MHzysecundario32.768kHz(cilndrico).
b)OsciladorparaelPIC18LF455020MHz.
105

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

LCD grfica:

La explorer16 tiene tambin un espacio reservado (situado en la esquina


superiorizquierda)ascomoeldiagramanecesarioyelcircuitoasociado,paracolocar
unaLCDgrficaOptrexconunamatrizdepuntosde128x64(F51320GNBLWAB).

Figura5.18:Explorer16,PCBparaaadirunaLCDgrfica.

Conector para las tarjetas de expansin PICtail Plus:

La tarjeta Explorer16 ha sido diseada con una interfaz para colocar mdulos
de expansin a travs de los conectores PICtail plus. Estos conectores proporcionan
una gran flexibilidad para nuevas tecnologas que puedan estar disponibles en el
futuro.
LosconectoresPICtailPlussebasanenunaconexinde120pinsdivididosen3
secciones de 30 pins, 30 pins y 56 pins. Cada seccin de 30 pins proporciona
conexionesparatodaslascomunicacionesconlosperifricosascomopuertosdeE/S,
interrupcionesexternasycanalesdeA/D.Todoestoproporcionasuficientesseales
para desarrollar diferentes interfaces de expansin como la tarjeta Ethernet. Por
tanto,lastarjetasdeexpansinPICtailplusde30pinssepodrnusartantoenlos30
pinssuperiorescomoenlosdelmedio.
En la placa nos encontramos con tres posibles sitios en los que vamos a ser
capaces de colocar las tarjetas de expansin, dos conectores hembras J5 (el ms
populardadosufciluso)yJ6,ascomounconectormachoenelladoderecho(J9).
Adems la interfaz PICtail Plus nos va a permitir conectar dos tarjetas
Explorer16sinlanecesidaddeusarunconectoradicional,permitiendoelintercambio
dedatosentrelosdosmicrocontroladoresmedianteelusodelainterfazSPIoUARTy
teniendoencuentaquesolounodeellostendrqueestarconectadoaalimentacin.

106

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

Figura5.19:Explorer16,conectorparatarjetasdeexpansinPICtaillPlus.

Conector PICkit 2:

El conector J14 proporciona el espacio necesario para colocar la interfaz del


programadorde6pinsPICkit2.Esteproporcionalaterceraopcinparaprogramara
bajocosteelmicrocontrolador,enlugardeusarlafamiliaMPLABICDobienlainterfaz
JTAG.

Figura5.20:Explorer16,conectorPICkit2.

Conector JTAG:

ElconectorJ13nosvaaproporcionarlainterfazestndarJTAGpermitindonos
conectaryprogramarlosdispositivosatravsdeesta.

107

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

Figura5.21:Explorer16,conectorJTAG.

A continuacin mostramos el diagrama de bloques de alto nivel de la tarjeta


Explorer16:

Figura5.22:DiagramadeBloquesdelatarjetaExplorer16.

108

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

5.2. SOFTWARE DE GRABACIN


El sistema de desarrollo Explorer16 no dispone de un programador integrado
enlaplaca,comopudieraserelejemplodelsistemadedesarrolloEasyPIC,porloque
vaasernecesarioelusodeunequipoexternoduranteelprocesodeprogramacin.
Como hemos comentado en el Captulo 5.1.1 existen diferentes formas de
grabar en el microcontrolador los programas realizados en el computador. En el
presentetrabajosehautilizadoelMPLABICD3InCircuitDebuggerparalagrabaciny
depuracindelcdigo,talycomohemosdescritoenelcaptulo3.
AdemshayquetenerencuentaquesiqueremosusarlaplacaPIC32Starter
Kit vamos a tener que usar la tarjeta 100L PIM Adaptor, para poder conectar la
anterioralsistemadedesarrolloExplorer16.

Figura5.23:AdaptadorPIC32StarterKit100LPimAdaptor.

AcontinuacinmostramosunafiguraenlaqueseestusandoelMPLABICD3
paragrabarenlaExplorer16utilizandolaplacaPIC32StarterKit:

Figura5.24:MPLABICD3InCircuitDebuggerenfuncionamientoenlaExplorer16.
109

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

5.3. EJEMPLOS DE PROGRAMAS PARA LA EXPLORER16

Tras describir en el Apartado anterior los componentes y caractersticas del


sistemadedesarrolloExplorer16,serealizaunaseriedepruebasconelfindeverificar
quetodosloscomponentesqueintegranlaplacaseencuentranenperfectoestadoy
nopresentanningncomportamientoanmalo.
Estas pruebas consisten en cargar una serie de programas en el
microcontrolador,ycomprobarqueelcomportamientodelaplacasecorrespondecon
el cdigo grabado. Para realizar dichas pruebas se han utilizado algunos de los
programas que se encuentran disponibles en el libro Programming 32bit
MicrocontrollersinC:ExploringThePIC32[10]ascomolapginawebdeMicrochip
[11]enlacualaparecentambinmuchosprogramasejemplos.Sinembargo,eneste
apartado nicamente vamos a ver algunos de los ejemplos del libro citado
anteriormenteascomolosprogramasrealizadosbasndonosenellos.

Acontinuacinmostramosunatablaresumenconlosprogramasquevamosa
detallarenestecaptuloascomolosquenicamentehemosprobadodealgunadelas
dosreferenciascitadasenelprrafoanterior.Todosestosprogramasseencuentranen
lacarpetaPROGRAMAS_EXPLORER16delCDadjuntoalpresenteproyecto:

Programa
LED.c
LED_TIMER.c
SPI2.c
SEEtest.c
Serial.c
U2test.c
LCDtest.c
ProgressBar.c
Bounce.c
Buttons.c
Pot.c
Potman.c
Temperatura.c
Message.c
String.c
Punteros.c
Liquid.c

CarpetaenelCDadjuntoalpresenteproyecto
PROGRAMAS_EXPLORER16/LED
/LED_TIMER
/SPI2
/SPI2
/UART
/UART
/LCD_PMP
/LCD_PMP
/PULSADORES
/PULSADORES
/POTENCIOMETRO
/POTENCIOMETRO
/TEMPERATURA
/OTROS_PROGRAMAS/MESSAGE
/OTROS_PROGRAMAS/STRING
/OTROS_PROGRAMAS/STRING
/OTROS_PROGRAMAS/LCD_MANUAL
110

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

Counter.c
/OTROS_PROGRAMAS/ICD_3
Timer.c
/OTROS_PROGRAMAS/ICD_3
Todos(parael
/OTROS_PROGRAMAS/TUTORIAL_EXPLORER16
PIC24)
ProgramasWeb
/OTROS_PROGRAMAS/All_PIC32_v10004.zip
Microchip
Tabla5.2:ListadetodoslosprogramasevaluadossobreelsistemaExplorer16.

Vistos todos los programas presentes en el CD adjunto, mostramos una tabla


resumencontodoslosprogramasquevamosadetallarconmayorprofundidadenlos
siguientesapartados,indicandoelnombredelprograma,suselementosimplicadosy
unabrevedescripcindelmismo:

Programa
LED.c
LED_TIMER.c
SPI2.c
SEEtest.c

Serial.c

U2test.c

LCDtest.c

ProgressBar.c
Bounce.c
Buttons.c
Pot.c

ElementosImplicados

Funcionamiento
EncendidodelosLEDsconectadosal
LEDS
puertoA
LEDSyTimer1
Apagadoyencendidodeledscada256ms
InterfazSPIyEEPROM
EscrituraenlaEEPROMatravsdela
25LC256
interfazsncronaSPI
Verificacindelafuncionalidaddelas
InterfazSPIyEEPROM
librerasSEE.cySEE.h,incrementandouna
25LC256
variabledelaEEPROM.
ComunicacinentreelPIC32yel
InterfazUARTe
ordenadormedianteelRS232,
Hyperterminal
escribimosdatoseneltecladoyse
muestranenlaconsoladelHyperterminal
Verificacindelafuncionalidaddelas
InterfazUARTe
librerasconU2.hyconU2.c,loque
Hyperterminal
escribimosenlaconsoladelprogramase
duplicahasta128caracteres.
Verificacindelafuncionalidaddelas
InterfazPMPymodulo
librerasLCD.cyLCD.hmostrandoenel
LCD
moduloLCDunmensaje.
Simulacindeunabarraqueseva
InterfazPMPymodulo
cargandomediantelacreacindeun
LCD
carcternuevocada100ms.
Ejemploquemuestraelefectoderebote
Pulsadores
enlospulsadores
SemuestraenelmoduloLCDquebotn
Pulsadores,interfaz
sehapresionado,codificadoen
PMPymoduloLCD
hexadecimal.
Potencimetro,modulo
Nosmuestraeneldisplayunabarra
111

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

ADC,InterfazPMPy
moduloLCD

asociadaalpotencimetrocuyacarga
dependedelvalordeeste,indicandoas
mismoelvalordelpotencimetro.
SimulacindeljuegoPacManenelLCD,
Potencimetro,modulo
moviendoesteltimogirandoel
Potman.c
ADC,InterfazPMPy
potencimetro.Aadidoelnmerode
moduloLCD
vecesquecomemosyposibilidadde
reiniciodeljuego.
ProgramaPotman.caplicadoalsensorde
Sensordetemperatura,
temperatura,enelqueademsse
Temperatura.c moduloADC,Interfaz
muestralatemperaturaenlasegunda
PMPymoduloLCD
lneadeldisplay.
Tabla5.3:ProgramasdetalladosejecutadosenelsistemadedesarrolloExplorer16.

Vamos a detallar algunos de los cdigos utilizados (Tabla 5.3), as como una
breve descripcin del comportamiento del sistema de desarrollo Explorer16. Para
todosestos programassehautilizadoelesquemadelafigura5.24,usamoselPIC32
StarterKit,portantolosprogramassonejecutadosparaelmodeloPIC32MX360F512L.
Las siguientes aplicaciones se han clasificado en funcin del dispositivo
implicadoenlaejecucindelprograma.

5.3.1. EJEMPLO 1: LEDS

Como hemos comentado anteriormente, el grupo de 8 leds presentes en


nuestraplacaestnconectadosalPuertoA.Loprimeroquetendremosquerealizarsi
queremosqueseiluminenlosLedsesconfigurarestepuertocomoentradaosalida,
para lo cual tendremos que hacer uso del registro TRISA. Si queremos configurar el
puertocomosalida,lopondremosa0ysiloqueremosconfigurarcomoentradaa1.
EnnuestrocasoloquequeremosrealizaresqueseiluminentodoslosledsdelPuerto
A,luegoportantolotendremosqueconfigurarcomosalida.
Sinembargo,hayquetenerencuentaqueelpuertoJTAG(recordemosquela
interfazJTAGesotradelasopcionesdisponiblesparagrabarodepurarenlneaaparte
dedelainterfazICD)seencuentraconectadoalospinesdelpuertoA0,1,4,5,yque
tieneprioridadsobreotrasacciones.Portanto,comonosotrosusamoselMPLABICD3
incircuit debuggers, tendremos que deshabilitar el puerto JTAG para tener acceso a
todoslospinesdelpuertoA.

112

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

Acontinuacinmostramoselcdigodelprogramayunaimagenenlaquese
puedenverlosledsencendidos:
#include <p32xxxx.h>
main()
{
DDPCONbits.JTAGEN=0; // Disable the JTAG port
TRISA = 0;
// Configure all POTA as output
PORTA =0xff;
}//main

Figura5.25:LEDSencendidos,programaLED.c.

Como segundo programa, modificamos el anterior, introduciendo el Timer1


(visto en el Captulo 4 para la realizacin del programa Semaforosv1.0.c), el cual lo
utilizamos para apagar y encender los Leds cada 256ms. A continuacin mostramos el
cdigodelprograma:
/*
** LED_TIMER.c
** Calcule Tdelay-> Tdelay=Fpb*256*DELAY, Tdelay=256ms y FPB->36 MHz
*/
#include <p32xxxx.h>
#define DELAY 36000

// 256ms delay

main()
{
// Initialization
DDPCONbits.JTAGEN = 0; // disable JTAGport, free up PORTA
TRISA = 0xff00;
// all PORTA as output
T1CON = 0x8030; // TMR1 on, prescale 1:256 PB=36MHz
PR1 = 0xFFFF;
// set period register to max
//Main loop
while( 1)
{
//Turn all LED ON
PORTA = 0xff;
TMR1 = 0;
while ( TMR1 < DELAY){
//wait
}

113

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

// Turn all LED OFF


PORTA = 0;
TMR1 = 0;
while ( TMR1 < DELAY){
//wait
}
} // main loop
} // main

5.3.2. EJEMPLO 2: INTERFAZ SPI

Enelapartado2.2.6.4delCaptulo2comentamoslospuertosdecomunicacin
disponiblesparanuestroPIC32.VamosahoraaverunejemplousandolainterfazSPI
(comunicacinsncrona)paraaccederalamemoriaEEPROMserie(25LC256,tambin
llamadaSEE)presenteenlatarjetadedesarrolloExplorer16.
Como podemos ver en la siguiente figura necesitamos 3 lneas, dos para la
transmisin de datos, una para los datos de entrada (SDI) y otra para los de salida
(SDO)yotraparalalneadelreloj(SCK).Sinembargo,senecesitaotralneaadicional
paraconectarcadadispositivo(SS).

Figura5.26:DiagramadebloquesdelainterfazSPI.

Esta interfaz se compone bsicamente de un registro shift, circuito de alta


velocidadquepermitedesplazarunconjuntodebitsaderechaoizquierda.Eltamao
deesteregistroshiftvaraentre8,16y32.Estosbitssonmovidosrpidamentedesde
elmssignificante,desdelalneaSDI,yhaciaafuera,porlalneaSDO,sncronamente
conelrelojdelpinSCK.
El dispositivo se puede configurar de dos formas, dependiendo de la
configuracin, la seal de reloj provendr de una u otra parte. Si el dispositivo se
configura como bus master, el reloj se generar internamente derivado del reloj
perifrico(Fpb),generandolaondaporelpinSCK.Mientrasquesieldispositivoacta
comoesclavorecibirelrelojporelpinSCK.

114

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

Lasopcionesdeconfiguracindeestainterfazsecontrolanmedianteelregistro
SPIxCON mientras que la seal se genera con el registro SPIxBRG (disponemos de 9
bits para formar la onda). La forma ms fcil y rpida de configurar la interfaz es
asignandoelvalorcorrectoacadabitdelregistroSPI2CON.Paraellohayqueteneren
cuenta las caractersticas de la menora EEPROM a la cual queremos acceder:
deshabilitar el modo de 16 bits y el de 32 (luego actuar en modo 8bits, MODE16=0,
MODE32=0),relojactivoalto(CKP=0),yloscambiosenlasalidaseproducendeactivo
a bajo (CKE=1). Adems hay que configurar el PIC32 como bus master (MSTEN=1),
luego:

#define SPI_CONF 0x8120 // SPI on, 8 bit master, CKE=1, CKP=0

Por otra parte, para determinar la frecuencia de reloj utilizamos la siguiente


frmula:
F

CK

F B
SPIxBRG

ElprogramaseleccionaunvalordeSPI2BRG=15,paraqueaunafrecuenciade
9MHZ del bus perifrico tengamos una frecuencia FSCK de 280kHZ, con tal de que la
comunicacinseproduzcadeformaadecuadayreducirelconsumodelaEEPROM.
Lo nico que nos falta, es saber cmo est conectada la interfaz SPI con la
EEPROM.Consultandoelconexionado[12],observamosqueelpin12delpuertoDest
conectadoalpindeseleccindememoriaCSyqueesteesactivobajo,nuestroSS.
Una vez sabemos cmo se configura la interfaz vamos a ver de qu manera
vamosapoderenviaryrecibirdatosatravsdeestainterfaz.Paraenviardatosvamos
a utilizar el registro SPIxSTAT y el SPIxBUF (para ms detalles de estos registros
consultar las paginas 388390 de la referencia [3]). De entre los bits del registro
SPIxBUF cabe destacar el bit SPIRBF, con el que vamos a esperar hasta que una
transferenciatermine(1=Receivebuffer,SPIxRXBisfull,0=Receivebuffer,SPIXRXBis
notfull).

Ejemplodecmoenviarundato:

int writeSPI2(int i){


SPI2BUF=i;
while (!SPI2STATbits.SPIRBF)
return SPI2BUF;
}//writeSPI2

Unavezdisponemosdeestafuncinhayquesaberque,trasenviarelcomando
apropiadoconestefuncin,necesitamosenviarunsegundobyte(falso,dummy)para
115

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

capturarlarespuestadesdeeldispositivodememoria.Detalformaqueparaenviarun
datoalaEEPROMserequieren4pasos:

Activarlamemoria,CSpinbajo.
Shiftoutloscomandosde8bits
Enviarorecibirdatos
Desactivar la memoria para completar el comando. Despus de esto el
dispositivovolveralmododebajoconsumo

Esdecir,siqueremosleerelregistroStatusdelaEEPROMelcdigoencser:

CSEE=0;
writeSPI2( SEE_STAT);
i=writeSPI2( 0);
CSEE=1;

//seleccionamos el EEPROM
//enviamos el comando leer status
//enviamos y recibimos
//deshabilitamos terminado el comando

Si nos fijamos en este trozo de programa estamos escribiendo en la EEPROM


SEE_STATqueesunodelos6posiblescomandosparaleeryescribirdatosaodesdeel
dispositivo de memoria, estos comandos se muestran en el cdigo del programa
SPI2.c.
Sin embargo, tenemos que tener en cuenta que antes de poder escribir y
modificarelcontenido delaEEPROMtenemosqueponera1elbitWELdelregistro
STATUS (figura 5.27), bit de habilitacin de escritura, ya que por defecto el valor del
registrostatuses0x00.Portanto,pordefectonoestnactivadoslosbitsdeproteccin
BP1yBP0,nielbitWELdehabilitacindeescrituranitampocoelbitWIPdeescritura
enprogreso.

Figura5.27:RegistroSTATUSdelaEEPROMserie,25LC256.

Una vez conocido como funciona y que registros tenemos que utilizar para
configurar la interfaz SPI as como la memora EEPROM ya podemos probar el siguiente
programa,SPI2.c:
/*
** SPI2.c
*/
#include <p32xxxx.h>
//Configuracin de las opciones de bit, reloj, Fcy=72Mhz, FPb=9Mhz
#pragma config POSCMOD=XT, FNOSC=PRIPLL
#pragma config FPLLIDIV=DIV_2, FPLLMUL=MUL_18, FPLLODIV=DIV_1

116

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

#pragma config FPBDIV=DIV_8, FWDTEN=OFF, CP=OFF, BWP= OFF


// Fcy=8(/2)(*18)(/1) =72MHz Fpb=72/8= 9Mhz
//Configuracin del periferico
#define SPI_CONF 0x8120 // SPI on, 8 bit master, CKE=1, CKP=0
#define SPI_BAUD 15 // clock divider frecuencia SPI=FPB/2*(15+1)=281,25KHz
//I/O Definiciones
#define CSEE _RD12
//seleccionamos la linea EEPROM
#define TCSEE _TRISD12 // control para el pin CSEE
//Comandos para el 25LC256
#define SEE_WRSR
1
//escribe en el registro status
#define SEE_WRITE
2
//escribe un comando
#define SEE_READ
3
//lee un comando
#define SEE_WDI
4
//escribe deshablitiar
#define SEE_STAT
5
//lee el registro status
#define SEE_WEN
6
//escribe habilitar
//Funcin para transferir los datos y devolverlos al dispositivo serie EEPROM
//Envia un byte de datos y lo devuelve al mismo tiempo
/* Inmediantamente escribe un caracter para transmitirlo al buffer, y
** entonces entra en un lazo y espera pa recibir el flag que se haya
** puesto a 1 indicando que la transmissin se ha completado. El dato
** se devuelve como retorno de la funcion. */
int writeSPI2(int i)
{
SPI2BUF=i; //escribimos en el buffer
while (!SPI2STATbits.SPIRBF); //esperamos a que se complete
return SPI2BUF; //nos devuelve el valor recibido en el dispositivo
}//write SPI2
main()
{
int i;
//1.- Inicializamos el SPI perifrico
TCSEE=0;
CSEE=1;
SPI2CON=SPI_CONF;
SPI2BRG=SPI_BAUD;
//BUCLE PRINCIPAL
while (1)
{
// 2.1.-Enviamos el comando de habilitar escritura
CSEE=0;
//habilitamos el EEPROM
writeSPI2( SEE_WEN); //enviamos el comando, ignoramos dato
CSEE=1;
//Habilitado el bit WEL del registro Status de la SEE podemos
//empezar a escribir comandos y modificar el contenido del
// dispositivo.
// 2.2.- Comprobamos el status del EEPROM
CSEE=0;
//seleccionamos el EEPROM
writeSPI2( SEE_STAT); //enviamos el comando leer status
i=writeSPI2( 0);
//enviamos y recibimos
CSEE=1;
//deshabilitamos terminado el comando
}//bucle principal
}//main

117

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

Enesteprogramaloquevemoseselvalorledoenelapartado2.2delmismoa
travsdelavariablei.Estevalores2,correspondindosealoesperadotrashabilitar
elbitWELdelregistroSTATUS.
Una vez probado el programa anterior veamos la forma general de escribir y
leermsdeundatoenlaEEPROM.
/*ESCRIBIR UN DATO EN LA EEPROM
//escribir un dato en la EEPROM
CSEE=0;
writeSPI2(SEE_WRITE); //envia el comando
writeSPI2(ADDR_MSB); // envia msb de la direccin de memoria
writeSPI2(ADDR_LSB); //
envia lsb de la direccin de memoria
writeSPI2(data); // envia el dato actual
//enviar mas datos aqui para realizar una escritura de pagina
CSEE=1; //Comienza el actual ciclo de escritura en la EEPROM
*/
/*LEER CONTENIDO DE LA MEMORIA
CSEE=0;
writeSPI2(SEE_READ); //envia el comando
writeSPI2(ADDR_MSB); // envia MSB de la direccin de memoria
writeSPI2(ADDR_LSB); //
envia LSB de la direccin de memoria
data=writeSPI2(0);
// envia un dato falso y lee los datos
//leer ms datos aqui incrementando la direccin
CSEE=1; //Termina la secuencia de lectura y regresa a bajo consumo
*/

Como podemos ver en el cdigo anterior, la EEPROM comienza el ciclo de


escrituraunavezquelalneaCSregresaalvaloralto,CSEE=1,porloquehayquedejar
un tiempo (consultar el data sheet de la EEPROM [13]) antes de volver a enviar
cualquier otro comando. Hay dos formas de estar seguros de que la memoria ha
dejado el tiempo suficiente para completar la escritura. El ms simple consiste en
insertar un retraso fijo despus de la escritura de comando, para el caso ms
desfavorableserade5ms(mximosegn[13]).Obien,chequearelregistroSTATUS
antes de leer o escribir cualquiercomando, utilizando el bit WIP (esperaremos hasta
quesepongaa0,momentoenelquehabrterminado,locualcoincideconqueelbit
WENseponea0,reset).Conesteltimoesperaremosnicamenteelmnimotiempo
requerido.
Contodolodesarrolladohastaaqusecreaunapequealibreraparaaccedera
la memoria EEPROM presente en la Explorer16, see.c y see.h, las cuales se
encuentranenelCdadjuntoaesteproyecto.
Paraverificarlafuncionalidaddelaslibrerassecreaelsiguienteprograma:
/*
** SEE Access library
** Programa para probar la funcionalidad de la libreria SEE

118

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

** Programa que lee repetidamente el contenido de memoria de 16


** e incrementa su valor y lo vuelve a escribir en la memoria.
*/
#include <p32xxxx.h>
#include "see.h"
//Configuracion de las opciones de bit, reloj, Fcy=72Mhz, FPb=9Mhz
#pragma config POSCMOD=XT, FNOSC=PRIPLL
#pragma config FPLLIDIV=DIV_2, FPLLMUL=MUL_18, FPLLODIV=DIV_1
#pragma config FPBDIV=DIV_8, FWDTEN=OFF, CP=OFF, BWP= OFF
// Fcy=8(/2)(*18)(/1) =72MHz Fpb=72/8= 9Mhz
main()
{
int data;
// Inicializacion del puerto SPI2 y CS y acceso al 25LC256
intSEE();
//bucle principal
while(1){
//lectura del contenido actual de la memoria
data=readSEE (16);
//incrementamos el valor actual
data++; //Breakpoint
//reescribimos el nuevo valor
writeSEE( 16,data);
//address++;
}//bucle principal
}//main

Una vez que compilamos el programa, usamos el depurador para probarlo,


colocando un breakpoint en el sitio indicado, pues de lo contrario podramos
sobrepasarellmitedeescrituradelaEEPROM,establecidoenunmillndeciclos[13].
UtilizandolaherramientaWatchWindowsobservamoscomoelcontenidode16seva
incrementando sucesivamente. Adems si desconectamos la fuente de alimentacin,
elcontenidodelaEEPROMnovariar.

5.3.3. EJEMPLO 3: INTERFAZ UART

Estainterfaztambinlacomentamosenelapartado2.2.6.4delCaptulo2.Vamos
ahora a ver un ejemplo usando esta interfaz (comunicacin asncrona) para
comunicarnosconunordenadormedianteelpuertoserieRS232.Adems,tendremos
que hacer uso de un programa de emulacin para comprobar su funcionamiento
(Hyperterminal).

119

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

ElmduloUARTdelPIC32soportalas4principalesfuncionesdeunaaplicacin
serie asncrona: RS232 pointtopoint connection (puerto serie), RS485 multipoint
serial connection, LIN bus e infrared wireless communication. Como hemos dicho
nosotrosvamosausarelmduloUART2conectadoauncableRS232hembra.
Los parmetros necesarios para configurar el modulo UART son: Ancho de
baudio,nmerodebitsdedatos,paridad(siesnecesaria),nmerodebitsdestopyel
protocolo Handshake. Para el programa vamos a usar una configuracin rpida y
prcticadelainterfaz,115.200baudio,8bitsdedatos,Noparidad,1bitdeparaday
HardwarehandshakeusandolaslneasCTSyRTS.
El Hardware Handshake es necesario para la comunicacin con un ordenador
Windows, ya que Windows es un sistema de operacin multitarea y en estas
aplicaciones pueden ocurrir largos retrasos que pueden significar una prdida de
datos. Para ello, usamos el pin RF12 (CTS) de la Explorer16 como entrada para
determinarcuandoelordenadorestpreparadopararecibirunnuevocarcter(Clear
tosend)yunpincomosalida(RF13,RTS),paraavisarcuandonuestraaplicacinest
preparadapararecibirunnuevocarcter(Requesttosend).
Por otra parte, para seleccionar el ancho de baudio utilizamos el registro
U2BREG,uncontadorde16bitsquealimentaalrelojdelbusperifrico.Enmodoalta
velocidad (BREGH=1) opera con un divisor 1:4, y la frmula para calcular la
configuracinidealdeestees:
UxBRG

F B
Baude Rate

EnnuestrocasoFpb36Mhz,luegoU2BRG=77,125aproximadamente77.
LosotrosdosregistrosquenospermitenconfigurarelmduloUART2sonlos
registrosllamadosU2MODEyU2STA(paramsdetallesdeestosregistrosconsultarlas
paginas 428433 de la referencia [3]). Del registro U2MODE configuraremos el modo
dealtavelocidadconelbitBREGH(comohemosvistoenelprrafoanterior),elbitde
parada (bit STSEL) y el bit de paridad (PDSEL). Mediante el registro U2STA
habilitaremoseltransmisorTX(bitUTXEN)ydeshabilitaremoslosflagsdeerrores(bit
PERRyFERR).
Portantodeacuerdoalascaractersticasvistasanteriormentetendremosque
inicializarambosregistrosa:
//Inicializacion para el U2MODE
#define U_ENABLE 0x8008 //enable, BREGH=1, 1 stop, no paridad
//Inicializacion para el U2STA
#define U_TX 0x1400 //enable tx & rx, clear all flags

120

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

UnavezconfiguradalainterfazUARTprocedemosigualqueconlainterfazSPI,
quepasoshayquerealizarparaenviarundatoalpuertoserie:

Elordenadortienequeestarencendidoyconlaconsoladelhyperterminal
preparada,chequeandolalneaCTS(Cleartosend).
Hay que estar seguro que la interfaz no est ocupada enviando datos. El
moduloUARTdelPIC32tiene4nivelesenelbufferdetipoFIFO(Firstinfirst
out),portantotenemosqueesperarhastaquealmenoselnivelaltoeste
libre.ChequeamosqueelflagdebufferllenoUTXBF,estea0.
Finalmentetransferimoselnuevocarcteralbuffer.

//Funcion para realizar los 3 pasos de enviar un caracter al puerto serie


int putU2(int c)
{
while (CTS); //esperamos a CTS
while (U2STAbits.UTXBF); //esperamos mientras buffer lleno
U2TXREG=c; //enviamos el caracter c
return c;
}//putU2

Pararecibirundatoporelpuertoserie,hayquerealizarunasecuenciaparecida
alaanterior:
Avisar al ordenador que estamos preparados para recibir un dato, RTS
activobajo.
Esperaralallegadadealgndatoenelbuffer,chequeandoelflagURXDA
dentrodelregistrostatusdelUART2,U2STA.
Leerycargarelcarcterdesdeelbuffer(FIFO).
//Funcion que recibe un caracter del puerto serie
char getU2(void)
{
RTS=0;
while(!U2STAbits.URXDA); //esperamos a la llegada de un nuevo caracter
RTS=1;
return U2RXREG; //lee el caracter recibido en el buffer
}//getU2

Elprogramaaprobar(serial.c)utilizalasdosfuncionesanterioresademsde
la inicializacin comentada anteriormente, a continuacin mostramos nicamente la
funcinmaindelprograma:
main()
{
char c;
//1.-Inicializamos el puerto UART2
initU2();
//2.-enviamos un guia, prompt
putU2('>');
//3.- bucle principal
while(1){

121

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

//3.1 esperamos a un caracter


c=getU2();
//3.2.- visualizamos el caracter por pantalla
putU2(c);
}//bulce principal
}//main

Como hemos dicho antes, para ver cmo funciona la interfaz UART, vamos a
utilizar el programa hyperterminal, mediante el cual dispondremos de la consola
necesariaparavisualizarlosdatosenviadosyrecibidosatravsdelPIC32.Paraello,
tenemos que configurar la comunicacin con los mismos parmetros que hemos
puestoenelprograma,esdecir:

Figura5.28:ConfiguracindelProgramaHyperterminal.

Acontinuacinmostramoslasalidadelprogramaanterior,quecomopodemos
verenlaFigura5.29,primerorecibimoselcarcterdegua,paraverquetodofunciona
correctamenteydespus,loqueescribimoseneltecladosemuestraenlaconsola.

122

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

Figura5.29:ConsoladelProgramaHyperterminal,ejecucinprogramaserial.c.

AligualquelorealizadoconlainterfazSPI,seratiltenerunalibreraconlas
funcionesrealizadasanteriormenteascomolacreacindeunafuncinquemuestre
unacadenadecaracteresdeunavezynosolouncarcter,ydelamismamanerauna
funcin que lea una cadena de caracteres completa siempre que no sobrepase el
buffer, limitado a 128. Por tanto generamos una librera para la comunicacin
asncronaaadiendoestasdosfunciones.
Puts(char*s):funcinquemuestraunacadenaenterahastaqueseescribe
un0.
Char*getsn(char*s,intlen):Leeunacadenadesdelaconsolaylaalmacena
enelbuffer(teniendocuidadodenosobrepasarsulmite).
CreamosunalibreraparaelmanejodelmoduloUART2,conU2.hyconU2.c.

Para verificar la funcionalidad de la librera anterior se crea un programa que


realizalassiguientestareas:

Inicializaelpuertoserieylimpialaventanadelhyperterminal.
EnvaunmensajedeBienvenidaalaconsolayposteriormenteunprompt.
Sequedaesperandoaleerunalneadetextoylovuelveaescribirenuna
nuevalnea.

Acontinuacinmostramoselcdigodeprogramadelafuncinmain(U2test.c):
// configuration bit settings, Fcy=72MHz, Fpb=36MHz
#pragma config POSCMOD=XT, FNOSC=PRIPLL
#pragma config FPLLIDIV=DIV_2, FPLLMUL=MUL_18, FPLLODIV=DIV_1

123

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

#pragma config FPBDIV=DIV_2, FWDTEN=OFF, CP=OFF, BWP=OFF


#include <p32xxxx.h>
#include <stdlib.h>
#include "CONU2.h"
#define BUF_SIZE 128
main(){
//int i = RAND_MAX;
char s[BUF_SIZE];
// 1. init the console serial port
initU2();
// 2. text prompt
clrscr();
home();
puts( "Exploring the PIC32!");
// 3. main loop
while ( 1){
// 3.1 read a full line of text
getsn( s, sizeof(s));
// 3.2 send a string to the serial port
puts( s);
} // main loop
}// main

Comopodemosobservar,esteprogramanosvaapermitirusarelpuertoserie
comounaherramientadedepuracin.Portanto,utilizandoestalibreravamosaser
capaces de mostrar variables crticas de funciones por pantalla as como otra
informacin adicional que queramos. En la siguiente figura se muestra la consola de
salidadeesteprograma.

Figura5.30:ConsoladelProgramaHyperterminal,ejecucinprogramaU2Test.c.
124

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

5.3.4. EJEMPLO 4: MODULO LCD Y PUERTO PARALELO (PMP)

Enelapartado5.1.2deesteCaptulohemosvistoqueelsistemadedesarrollo
Explorer16disponedeunmduloLCD,elcualsecomunicaconelPIC32atravsdel
puerto paralelo (PMP). Veamos ahora un ejemplo de cmo configurar el puerto
paraleloparaaccederalLCDymostrarcaracteres.
ElmoduloLCDdisponedeuncontroladorHD44780elcualcontiene2registros
de8bits,unoparadatos(DR)yotroparalasinstrucciones(IR).ParacontrolarelLCD
existen 10 instrucciones predefinas en el HD44780 cuya codificacin se puede
consultarenlapgina24delasiguientereferencia[14].Portantoparaoperarconel
LCDtendremosqueenviarestasinstruccionesusandoelpuertoparalelo.
Lo primero que tenemos que realizar, de la misma manera que con las
interfacesdecomunicacinanteriores,esconfigurarelpuertoparaleloparacontrolar
elmoduloLCD.Paraello,estavezexisteunagrancantidadderegistrosdestinadosa
configurarelPMP,deentreloscualeselmsimportanteeselPMCON.Sinembargo,
tambinhabrqueinicializarlossiguientesregistros,PMMODE,PMADDR,PMSTATy
PMAEN.DetalformaqueparamanejarelLCDtendremosqueconfigurarelPMPdela
siguientemanera:

HabilitarelPMP.
Separacinentrelneasdedatosydirecciones.
Habilitarlasealstrobe,enpinRD4.
Sealdelectura,enpinRD5.
Habilitarelstrobe,activoalto.
Lecturaactivoalto,yescrituraactivobajo.
Modomasterconsealesdelecturayescrituraenelmismopin,RD5.
8bitbus(usandoelPORTE).
Solo se necesita un bit de direccin, por lo que usaremos la mnima
configuracinparaelPMP,usandoPMA0(RB15)yPMA1sinusar.

No obstante, para configurar el PMP se puede usar una librera especfica,


pmp.h. En particular 4 funciones con todas las herramientas que necesitamos para
controlarelPMPascomoeldialogoconeldisplayLCD:

mPMPOpen(),nosayudaaconfigurarelPMP.
PMPSetAddress(),nospermiteaccederalregistrodedirecciones.
PMPMasterWrite(),inicialasecuenciadeescritura.
mPMPMasterReadByte(),inicialasecuenciadelecturaydevuelveelvalor.

125

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

A la hora de inicializar el puerto paralelo hay que tener en cuenta que el


modulo LCD es un dispositivo extremadamente lento, y que el controlador HD44780
necesita de un cierto tiempo para llevar a cabo la secuencia de Inicializacin. Luego
tendremos que aadir una espera, que en nuestro caso tendr que ser de al menos
30ms segn la referencia [14]. Adems, para realizar la secuencia completa de
escrituraenelbusparalelohayqueseguirunasecuenciadepasosespecfica,queen
totalsetardaenejecutaralmenosotros40us.Porloquealahoradellevaracabola
inicializacinhabrquetenerencuentaquehayintroduciresteretraso.Elcdigoenc
necesarioparainicializarelpuertoparalelosemuestraacontinuacin:

void initLCD( void){


//Inicializacion del PMP
mPMPOpen( PMP_ON | PMP_READ_WRITE_EN | 3,
PMP_DATA_BUS_8 | PMP_MODE_MASTER1 |
PMP_WAIT_BEG_4 | PMP_WAIT_MID_15 |
PMP_WAIT_END_4,
0x0001,
// solo PMA0 habilitado
PMP_INT_OFF); // No usamos interrupciones
//espera ms de 30ms
Delayms( 30);
//Inicializacin del HD4470, secuencia
PMPSetAddress( LCDCMD); // Seleccionamos el registro de comando(ADDR=0)
PMPMasterWrite( 0x38);
// 8-bit int, 2 lineas, 5x7
Delayms( 1);
// > 48 us
PMPMasterWrite( 0x0c); // ON, no cursor, no blink
Delayms( 1);
// > 48 us
PMPMasterWrite( 0x01);
// clear display
Delayms( 2);
// > 1.6ms
PMPMasterWrite( 0x06);
//incrementamos cursor, no shift
Delayms( 2);
// > 1.6ms
} // initLCD

Adems como es el caso de las otras interfaces vistas en los apartados


anterioressecreaunalibreraparautilizardeformamssencillaelLCD.Entreestas
funcionesdestacanlas3siguientes:
readLCD(intaddr),leedesdeelregistrodedatosocomandosunaposicin
concreta(addr).
writeLCD(intaddr,charc),escribeenunaposicinconcreta(addr)enuno
delosregistros,elvalorc.
putsLCD(char *s), funcin que usa la anterior pero que tiene la capacidad
deinterpretarcaracteresespecialescomofinaldelnea,tabulacinonueva
lnea.

126

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

Por tanto con las funciones anteriores y conuna serie de macros tiles como
posicionarelcursorenlaprimeraposicinosegundalnea,secrealalibreraLDC.cy
LCD.h. A continuacin mostramos un pequeo ejemplo (LCDtest.c) utilizando la
libreraanterior.

main(){
initEX16();
initLCD();
clrLCD();
putsLCD( "Explorando \n el PIC32");
while(1);
}//main

Como podemos observar tambin se ha incluido la librera Explore.c la cual


contiene la inicializacin del PIC32 as como la funcin de retraso (Delayms()) usada
porlalibreradelmduloLCD.

Figura5.31:ProgramaLCDtest.cejecutadoenlaExplorer16.

Por otra parte, como ya hemos anteriormente, mediante el modulo LCD se


puedencrear2caracterespropiosaccediendoaunsegundobufferinterno(CGRAM).
Vamosaverdequformapodemosllevarloacabo.Primerovamosanecesitarqueel
punterodelbufferdelaRAMdelLCDapuntealprincipiodelreaCGRAM.Usandolas
funciones descritas en la librera LCD.c, podremos usar la siguiente macro la cual
emplealafuncinwriteLCD():
#define setLCDG( a) writeLCD(LCDCMD, (a & 0x3F)|0x40)

Una vez apunta al principio del buffer (setLDG(0)), podemos usar la funcin
putLCD()paracolocar8bytesdedatosenelbuffer.Cadabytededatoscontendr5
bits (Lsb), es decir, formaremos el nuevo carcter de 5x8. El nuevo carcter lo
podemosdefinirconelcdigo0x00.
Vamosahoraacrearunnuevocarcterparasimularelcomportamientodeuna
barra de progreso. Para ello se utiliza el ltimo carcter definido en la tabla (0xff) y
adems se crea un bloque para dar ms precisin al programa. Este bloque estar
formadoporWx8,dondeWserelanchodelcarcter(cdigo0x00),deacuerdoala
siguientefigura:
127

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

Figura5.32:EsquemadelnuevocarcteracrearenelmoduloLCD(0x00).

Elprogramaencdeesteejemplo(ProgressBar.c)sepuedeconsultarenelCD
adjunto al presente proyecto en la carpeta Explorer16/LCD_PMP. Bsicamente
consiste en simular una barra la cual se va cargando de 0 a 100. Para lo cual se va
creandoelcarcternuevoquesearequeridocada100ms.Acontinuacinmostramos
unaimagendelprogramasiendoejecutadoenlaplaca.

Figura5.33:ProgramaProgressBar.cejecutadoenlaExplorer16.

5.3.5. EJEMPLO 5: PULSADORES

ElsistemadedesarrolloExplorer16,comohemoscomentadoenelapartadode
arquitectura de la Explorer16, dispone de 4 pulsadores, por tanto tiene 4 entradas
digitales(10).Cuandoelbotnsepulsaelcontactosecierrayelpindeentradapasaa
nivel bajo, mientras que si no se pulsa, una resistencia hace que la salida lgica se
mantengaanivelalto.Veamosahoraunejemplousandoestospulsadores.
Siseconsideraalswitchcomouncomponenteideallatransicinentrelosdos
estados sera inmediata, no obstante esto no es as. Generalmente existe la
posibilidad de que ocurra un rebote, este efecto es conveniente eliminarlo ya que
estos rebotes se podran contar como distintas activaciones de la lnea de entrada.
Esteefectosepuedeobservarenlasiguientegrficaascomoenelejemplobounce.c.
128

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

Figura5.34:Rebotesocasionadosporlospulsadores.

Si ejecutamos el programa bounce.c, podremos comprobar este efecto.


Aadiendo a la ventana Watch el contador count y presionando el pulsador unas
veinte veces nos damos cuenta que este marca alrededor de 23 ya que se ha
producidoelefectocomentadoanteriormente.Cdigodelprogramabounce.c:
main (void){
int count; //contador de rebotes
count=0;
while(1){
while (_RD6); //esperamos a que el boton sea pulsado
count++; //contamos las veces que es presionado
//esperamos a que se deje de pulsar el boton
while(! _RD6);
}//Bucle principal
}//main

La tcnica general para evitar estos rebotes consiste en aadir un pequeo


restrasodespusdedetectarlaprimeraconmutacindeunaentradayseguidamente
verificarquelasalidahaalcanzadounacondicinestable.Cuandoelbotnsesuelta,
seaadeotrobreveretraso,antesdeverificarunavezmsquesehaalcanzadouna
condicin estable, funcin getK(). Mientras que la funcin readK(), nos va a permitir
detectar que entrada ha sido pulsada o si se han presionado ms de un pulsador
simultneamente.
Enelsiguienteprogramaejemplo(buttons.c)mostramosporelLCDquebotn
sehapresionadocodificndoloenhexadecimal.Esdecir,sisepulsaelbotnmsala
izquierda(S4)secorrespondercon1,ysisepulsaelbotnmsaladerecha(S3),se
correspondercon8.Ademssepuedenpresionarvariosbotonesalavezdandolugar
al cdigo hexadecimal desde el 1 hasta F. A continuacin mostramos el cdigo
completo:
int readK( void){ // devuelve 0..F si se presiona, 0 = nada
int c = 0;
if ( !_RD6) // De izquierda a derecha

129

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

c |= 8;
if ( !_RD7)
c |= 4;
if ( !_RA7)
c |= 2;
if ( !_RD13)
c |= 1;
return c;
} // readK
int getK( void){ // Esperamos a que se pulse un pulsador
int i=0, r=0, j=0;
int c;
// 1. Esperamos a que se pulse un pulsador durante al menos 0.1seg
do{
Delayms( 10);
if ( (c = readK())){
if ( c>r)
// Si mas de un pulsador
r = c;
// Generamos un nuevo codigo
i++;
} else
i=0;
} while ( i<10);
// 2. Esperamos a que se suelte el pulsador durante al menos .1 sec
i =0;
do {
Delayms( 10);
if ( (c = readK())){
if (c>r)
// Si mas de un pulsador
r = c;
// Generamos un nuevo codigo
i=0;
j++;
// Contamos
} else
i++;
} while ( i<10);
// 3. Chequeamos si un boton ha sido pusado durante mas de 500ms y aadimos
// si es necesario una bandera que nos indicara de ello.
if ( j>50)
r+=0x80;
// Aadimos una bandera en el bit 7 del codigo
// 4. Regreso del codigo
return r;
} // getK
main( void) {
char s[16];
int b;
initLCD();
// Inicializamos el LCD
putsLCD( "Press any button\n");
// Bucle principal
while( 1){
b = getK(); //el mensaje no se muestra hasta que no soltamos todos los pulsadores
//si se muestran dos bits, el primero siempre sera 8 e indica que se
//ha pulsado el boton durante mas de 500ms.
sprintf( s, "Code = %X", b);
clrLCD();
putsLCD( s);
} // bucle principal
} // main

130

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

A continuacin mostramos una foto del programa buttons.c siendo ejecutado


en laExplorer16. La primeraimagen se corresponde al haber presionado el pulsador
situadomsalaizquierda(S3)ylasegundaalpulsarlosdosbotonesqueestnmsa
laderecha(S5yS4)simultneamente.

Figura5.35:Programabuttons.cejecutadoenlaExplorer16.

5.3.6. EJEMPLO 6: ENTRADAS ANALGICAS

Como hemos comprobado en el primer apartado de este captulo, el


sistemadedesarrolloExplorer16disponedeunpotencimetroydeunsensorde
temperatura(TC1047A).VamosportantoausarlacapacidadqueofreceelPIC32
de convertir la informacin analgica a digital a travs de un modulo ADC de 10
bitsparapoderusarloselementosanteriores.
El potencimetro (R6) est conectado a travs de una resistencia (R12) al
canal analgico AN5. Por lo que lo primero que tendremos que realizar es
configurarelmoduloADCaccediendoaunaseriederegistros.
Registrosaconfigurarinicialmente:

AD1PCFG,pasaremosunamscaraparaseleccionarloscanalesdeentradas
analgicos,0sernentradasanalgicasy1entradasdigitales.
AD1CON1: fijaremos la conversin para que empiece de manera
automtica(existelaopcinmanualtambin)yelformatodesalidaserun
valorenterosinsigno.
AD1CSSL, lo pondremos a 0 ya que no usaremos la funcin de escanear,
puessolousamosunaentrada.
AD1CON2: seleccionaremos el uso de MUXA y conectaremos las entradas
dereferenciadelADCalospinesdelasentradasanalgicasAVddyAVss.
AD1CON3:seleccionaremoselrelojyeldivisor.
ActivaremosADONenelregistroAD1CON1,paraactivarelmoduloADCy
queestestepreparadoparasuuso.

131

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

La conversin AnalgicoDigital es un proceso con dos etapas: Primero


obtenemosunamuestradelasealdeentradayentoncespodemosdesconectar
la entrada y realizar la conversin de la muestra de voltaje al valor digital. Estas
dosetapassoncontroladaspordosbitsdelregistroAD1CON1:SAMPyDONE.De
tal forma que el tiempo de las dos etapas es importante para proporcionar una
precisinadecuadadelamedida.Estetiempoquehayquedejarsepuederealizar
de forma manual o automtica. No obstante, nosotros la haremos de forma
automticayaquedeestemodonosernecesarioutilizarunretrasoyelcdigo
necesarioparalalecturadelaentradasermssencillo.Portantoelcdigopara
inicializarelmoduloADCeselsiguiente:
void initADC (int amask){
AD1PCFG=amask; //seleccionamos los pins de entrada
AD1CON1=0x00E0; //secuencia de conversion automatica
AD1CSSL=0; //no se requiere sccaning
AD1CON2=0; //uso del MUXA, Avss/Avdd como referencia Vref+/AD1CON3=0x1F3F; //Tsamp=32*Tad, el maximo
AD1CON1bits.ADON=1; //activamos el ADC
}//intADC

Por otra parte para comenzar la lectura y conversin hay que acceder a los
siguientesregistros:

AD1CHS,seleccionaelcanaldeentradaparaelMUXA.
Cuando el bit SAMP del registro AD1CON1 este a 1, comienza la fase de
tomadelasmuestrasyseguidamentelaconversin.
El bit DONE se pondr a 1 en el registro AD1CON1 tan pronto como la
secuenciatermineyelresultadoestlisto.
LeyendoelregistroAD1BUF0obtendremoselresultadodelaconversin.

DetalformaqueelcdigoenCparalalecturadeunaentradaanalgicaes:

int readADC( int ch){


AD1CHSbits.CH0SA=ch;
AD1CON1bits.SAMP=1;
while(!AD1CON1bits.DONE);
return ADC1BUF0;
}//readADC

// Seleccionamos la entrada analogica


// Empezamos a tomar muestras.
// Esperamos a que termine la conversion
// Leemos el resultado.

ConambasfuncionesanterioresnoscreamosunalibreraparaelmoduloADC.
Paraprobarlasnoscreamoselsiguienteprograma,elcualutilizatambinlaslibreras
paramanejarelmoduloLCD.Esteprogramaloquemuestraeneldisplayesunabarra
la cual muestra la resistencia del potencimetro en tanto por cierto, es decir, si la
resistenciaesmxima(10K) 100% y si la resistencia es mnima (0K) 0%. Para ello
sehanusadolasfuncionescreadasenelprogramaProgressBar.c(vistoenelapartado
132

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

anterior) para dotar de ms precisin, recordemos que en este programa nos


definamos un carcternuevo. Adems en la segunda lnea del display se muestra el
valordelaresistencia.Elcdigodelprogramaeselsiguiente:
main(){
int i, a, p,value;
char s[8],val[4],Aux[1];
//Inicializaciones
initADC( AINPUTS); //inicializacion del ADC
initLCD();
//Bucle principal
while(1){
a =readADC(POT); //sleccionamos la entrada POT y convertimos
//reducimos el resultado de 10bits a un valor de 7 bits (0..127)
//(dividimos por 8 o movemos a derecha 3 veces)
value=a/10;
a>>=3;
clrLCD();
p=((a*100)/127);
sprintf(s, "%2d", p);
putsLCD(s); putLCD('%');
//dibujamos una barra en el display proporcional a la posicion
// del potenciometro
drawProgressBar(a, 127,HLCD-3);
sprintf(Aux, "%d.%d", value);
if(value<10){// Valores menores que 1 Kh
Aux[1]=Aux[0];
Aux[0]='0';
}
val[0]=Aux[0];
val[1]='.';
val[2]=Aux[1];
val[3]='K';
val[4]='h';
putsLCD("\nPoten:");
putsLCD(val);
//Parada para evitar parpadeos
Delayms(200);
}//bucle principal
}//main

Figura5.36:ProgramaPot.cejecutadoenlaExplorer16.

133

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

Comosegundoprogramautilizandoelpotencimetroprobamoselejemplode
lareferencia [10],elcualconsisteenutilizarelpotencimetroparasimulareljuegoPac
ManenelLCD,moviendoesteltimogirandoelpotencimetrodeizquierdaaderecha.El
juegoconsisteenmoverlabocahastallegaralacomida,simuladaporelcarcter*
(asterisco). Tan pronto como lleguemos a esta posicin aparecer otra en una nueva
posicinparalocualseusalafuncinrand()definidaenlalibrerastdlib.h.
Ademssehamodificadoesteprogramaejemploaadiendouncontadorconlas
veces que comemos, mostrndolo en la segunda lnea del display. Tambin se ha
aadido la posibilidad de que podamos comenzar a que cuente de nuevo las veces que
hemos conseguido alcanzar el asterisco, para lo cual presionaremos el pulsador S4 (el
situadomsalaizquierda).AtravsdelLCDsenosmostraraelnmerototaldevecesque
hemos comido e inmediatamente comenzar de nuevo el contador. A continuacin
mostramoselcdigodelprogramaascomounaimagendelmismoenlafigura5.37.
main (){
int a, r, p, n,cont=0;
char Conta[2];
// 1.- Inicializaciones
initADC( AINPUTS); //inicializacion del ADC
initLCD();
// 2.-leemos el primer valor del potenciometro y usamos su posicion para crear un valor aleatorio
srand(readADC(POT));
// 3.- inicializamos PAC
p='<';
// 4.- Generamos la posicion del bit de comida
r=rand()%16;
while(1){ //bucle principal
//5.- Seleccionamos como entrada POT y convertimos
a=readADC( POT);
// 6.- Reducimos el resultado de 10 a 4 bits (0...15)
a>>=6;
// 7.- Giramos a PAC en la direccion del movimiento
if (a<n)//movemos a la izquierda
p='>';
if (a>n)//movemos a la derecha
p='<';
// 8.- Cuando Pac coma generamos mas comida
while(a==r){
r=rand()%16;
cont++;
}
// 9.- Actualizamos el display
clrLCD();
setLCDC( a);
putLCD( p);
setLCDC( r);
putLCD( '*');
putsLCD("\nNum:");
sprintf(Conta, "%d", cont);
putsLCD(Conta);
putsLCD(" Press S4");
if ( !_RD13){
clrLCD();
putsLCD("Comenzamos de 0");

134

CAPTULO5.SISTEMADEDESARROLLOEXPLORER16

putsLCD("\nAnterior: ");
putsLCD(Conta);
cont=0;
Delayms( 5000);
}
Delayms( 200); //limite de velocidad del juego
n=a;
}//bucle principal
}//main

Figura5.37:ProgramaPOTMAN.cejecutadoenlaExplorer16.

Por otra parte, como ya comentamos, la placa dispone de un sensor de


temperatura con salida analgica (TC1074A) conectado a una de los canales del
controlador A/D, concretamente al canal AN4. Para utilizar la librera anterior para
estenuevosensor,lonicoquetendremosquemodificardelosprogramasanteriores
ser la entrada, es decir, en lugar de usar la entrada cinco correspondiente al
potencimetro, la entrada cuatro (TSENS=4). A continuacin mostramos una imagen
del programa (el cdigo del mismo no se muestra por ser muy parecido al anterior,
disponibleenelCdadjunto)deljuegodelPacMan,aplicadoalsensordetemperatura.
Aligualqueenelanteriormostramosenlasegundalneadeldisplaylatemperatura
delsensorascomoelnmerodevecesquehemosalcanzadolacomida.Asmismosi
pulsamosS4,comienzalacuentadesde0.

Figura5.38:ProgramaTemperatura.cejecutadoenlaExplorer16.

135

Manejo de una pantalla tctil con el PIC32 para el


control de dispositivos externos.

6.
PANTALLA TCTIL:
HARDWARE Y SOFTWARE

CAPTULO6.PANTALLATCTIL:HARDWAREY
SOFTWARE.
6.1. INTRODUCCIN
EstecaptulosebasaenelestudioHardwaredelapantallatctilpresenteenla
placadeexpansinGraphicsPICtailPlusDaughterBoard(versin2)lacualsepuede
conectaralsistemadedesarrolloExplorer16atravsdelconectorPICtailplus.Setrata
de una GLCD tctil, en concreto el modelo TFTG240320UTSW92WTPE con una
resolucinde320x240pxelesy262kcolores.
Adems se estudiar el funcionamiento de la librera Microchip Graphic
Libraryversin1.6.lacualnosvaapermitirdesarrollarprogramasparaelcontrolde
lapantallatctilbasndonosenlasfuncionesimplementadasenestalibrera.Aunque
esta librera fue en principio diseada para los microntroladores PIC24F/24H y
dsPIC33F,esposibleutilizarlasiseempleaunPIC32sobrelaExplorer16.

6.1.1. IMPORTANCIA DE LAS PANTALLAS TCILES EN APLICACIONES


EMBEBIDAS

Losdisplaysgrficosseestnvolviendocadavezmspopularesyaqueseest
incrementando el rango de las aplicaciones embebidas tales como displays de
navegacin, unidades handheld (portables como PDAS), domotica, aplicaciones
mdicas,etc.Ademshayvariosbeneficiosasociadosalusodefuncionesgrficaspara
distintasaplicaciones.Lamsnotableesqueproporcionaunavisualizacinmuchoms
ricaparaelusuarioyunainformacinmsprecisaydetalladagraciasalasimgenes.
Adems,elpreciocadavezmsbajodelaspantallasgrficasascomodelatecnologa
TFToSTNesthaciendoquecadavezseusenmsenaplicacionesgrficasembebidas.
Acontinuacinmostramosvariasimgenesdondeseusanpantallasgrficastctiles.

Figura6.1:EjemplosdeAplicacionesconpantallastctiles.
139

CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE

6.2. ARQUITECTURA HARDWARE

6.2.1. ARQUITECTURA DE LA PANTALLA TCTIL

Caractersticas generales de la placa de evaluacin Graphics PICtail Plus


DaughterBoard(versin2):
1.ModuloLCDQVGAconunaresolucinde320x240pixeles.
2.Controladorgrfico,LGelectronicsLGDP453.
3. Memoria flash para almacenamiento de datos adicionales de 4Mbit
(512Kx8).
4.Zumbador(soundbuzzer).

Figura6.2:GraphicsPICtailPlusDaughterBoardv2.

Adems, la tarjeta dispone de una serie de jumpers para configurar la placa.


Porejemplo,eljumperJP3controlaelsoundbuzzer.Cuandocolocamoseljumperel
pitidoestarhabilitadoycuandoloquitamossedeshabilitar.Elrestodejumperscon
sus posibles configuraciones as como las distintas conexiones de la placa se puede
consultarenlasiguientereferencia[15].

140

CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE

Enlasiguientefigurapodemosvereldiagramadebloquesdelsistemagrfico
de Microchip. El sistema consiste en un microcontrolador, un controlador LCD y
finalmente el cristal LCD. El controlador LCD incluye la lgica de control digital, un
acelerador grafico (opcional), un buffer para las imgenes (RAM) y el gate driver. El
microcontrolador normalmente, crea, manipula y dibuja elementos grficos como
botones, mens o imgenes. El acelerador grfico proporciona una aceleracin
hardware para algunos elementos grficos y otras funciones grficas. Adems, el
moduloLCDrequieredeunbufferdeimgenesparaalmacenarlasestructuradeestas,
detalformaquelalgicadecontroldigitalsirvecomouncontroladorparaelbufferde
imgenes y para el acelerador grfico. Finalmente el gate driver convierte la seal
digitalaanalgicayhacefuncionaralcristalLCD.

Figura6.3:DiagramadeBloquesdelmoduloLCD.

ElpanelLCDpuedevenirconelcontroladorLCDosinl,ennuestrocasoviene
conelcontroladorLCDembebido,diagramadebloquesanterior.Nuestrocontrolador
es concretamente el LGDP453, para ms informacin sobre este consltese la
siguientereferencia[16],disponibleenlacarpetadedocumentosenelCdadjunto.

141

CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE

6.2.2. FUNCIONAMIENTO DE UNA PANTALLA TCTIL

Paraverdequmanerafuncionalapantallatctilprimerovamosavercmo
acta cada pixel y despus veremos cmo funciona todo en conjunto. Sin embargo,
hay que distinguir entre dos tipos de pantallas tctiles, las reflectantes o las
transmisivas.

Reflectantes:

El LCD, como su nombre indica, est hecho de cristales lquidos. Los cristales
lquidos son el corazn del display y la operacin del display depende de la
manipulacindelaluzpolarizada.Laluzambientepasaatravsdelprimerpolarizador
(front polarizer), el cual elimina los rayos de luz excepto los que son polarizados
verticalmente.Detalforma,quelaluzatraviesaloscristaleslquidosygira90grados.
Entonces la luz atraviesa el segundo polarizador y se refleja y contina el mismo
proceso hasta el primer polarizador. Hay que tener en cuenta que si la luz sale del
primerpolarizador,entoncesnoveramosningunaimagen,porloquehayqueevitar
daar el polarizador haciendo un correcto uso de la pantalla tctil. A continuacin
mostramoslasiguienteimagenqueilustraloexplicado.

Figura6.4:Esquemadefuncionamientodeunpixelenunapantallareflectiva.

No obstante, la orientacin del cristal lquido puede cambiar cambiando la


carga aplicada en l. La carga se aplica a travs de unos electrodos en forma de
cuadrado,comopodemosverenlafiguraanterior.Portanto,paracadapixeldelLCD
grfico,habruncuadrado.
Cuandocambiamoslacarga,elresultadoequivaleaqueloscristaleslquidosno
giran(verfigura6.5).Porloquecuandolaluzalcanzaelsegundopolarizadorlaluzse
bloquea debido a la polarizacin vertical de esta. De tal forma que la luz no se
reflejaryestepixelestaroscuro.EstetipodeLCDrequieredeluzambienteparaque
funcione,porloquenofuncionarenunahabitacinoscura.
142

CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE

Figura6.5:EsquemadefuncionamientodeunpixelenunapantallareflectivaII.

Transmisivas:

ElotrotipodetecnologadeLCDnorequiereluzambiente.Enlugardelaluz
ambiente dispone de una luz dentro del display, la cual est situada en la parte
posterior del LCD, backlight. La forma de operacin es contraria a la tecnologa
anterior. Si la luz gira 90 grados (TN, Twisted Nematic), esta se bloquea en el
polarizador delantero y no veremos nada, tal y como podemos ver en la siguiente
imagen.

Figura6.6:Esquemadefuncionamientodeunpixelenunapantallatransmisiva.

Portantosicambiamoslacargaaplicadaaloscristaleslquidosseeliminarel
giroyentonceslaluzpasaratravsdelpolarizadordelanteroyveremoslaimagen,es
comodecirqueelpixelestarenON(verfigura6.7).

Figura6.7:EsquemadefuncionamientodeunpixelenunapantallatransmisivaII.
143

CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE

Laventajadeestatecnologarespectoalaanterior,esqueestetipodedisplay
se puede usar bajo condiciones de poca luz, sin embargo, no funcionar bien si son
expuestasdirectamentealsol.Nuestrapantallatctilusaestaltimatecnologa,cuyo
backlightson4Ledsconectadosenparalelo[17].

Unavezhemosvistoelmododeoperacindeunpixel,vamosaverqutipode
tecnologasseusanparacontrolaryconectarlospixelesdeunaLCDgrfica.
La solucin ms sencilla sera utilizar una matriz de puntos habilitando los
pixelesdelascolumnasyfilasquequeramos,PassiveMatrix.Todoslospixelesestn
conectadosatravsdecablesformandounamatriz.Sinembargocuandoqueremos
cambiarelestadodeunpixel,estaaccinnoserealizadeformainmediata,sinoque
secomportacomouncondensador.Portantohayqueesperaruntiempoparaqueel
pixelpasedeunestadoaotro.
La ventaja de esta tecnologa es que es barata, sin embargo requiere de un
tiempoderespuestaaltoparaquedesaparezcaelefectocondensadoralcambiarun
pixeldeestado.Estoimplica,quenosonapropiadasparausarseenelmovimientode
objetospuesresultarasermuylento.
Nuestra pantalla no se basa en la tecnologa anterior sino que se basa en la
tecnologa TFT (ThinFilm Transistor, Display Active Matrix). La ventaja principal
respecto a la anterior es que el tiempo de respuesta es mucho ms rpido. Esta
tecnologa se est haciendo cada vez ms popular ya que su precio est bajando
rpidamente.

6.2.3. CARACTERSTICAS MS IMPORTANTES DEL LCD GRFICO

En la siguiente tablaenumeramos las principales caractersticas de lapantalla


tctil.
Caracterstica
Tipo
TipodeLCD
TFTtransmisiva
Resolucin
240(RGB)x320
Driver
LGDP4531
Colors
262k
TipodeBacklight
LED
Tipodeinterfaz
Puertoparalelo/Serie
Tiempoderespuestamximo
55.2ms
Voltajedeentrada
2.8/1.8V
Consumo
304mw
Tabla6.1:CaractersticasprincipalesdelTFTG240320UTSW92WTPE.
144

CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE

6.2.4. CONEXIONADO DE LA PANTALLA TCTIL

LaGraphicsPICtailPlusDaughterBoardhasidodiseadaparautilizarsecomo
herramienta de desarrollo, es decir, para incorporarse a otra placa en la cual se
disponga del microcontrolador que la va hacer funcionar. Existen dos opciones, la
primeraopcinesconectarlaalatarjetaExplorer16atravsdelbusPICtailPlusyla
segunda opcin sera conectar la pantalla tctil a la I/O Expansion Board [18],
tambinmedianteelusodelbusPICtailPlus.Sinembargo,parafamiliarizarnosconla
librera grfica y con la pantalla tctil resulta mucho ms sencillo conectarla a la
Explorer16,pueslosprogramasejemplodisponibleshansidodesarrolladosparaquela
pantalla tctil se conecte a esta. La segunda opcin la usaremos para desarrollar la
aplicacin final pues mediante la I/O Expansion board, es muy sencillo acceder a las
distintospinesdelmicrocontrolador.

Por tanto, la interconexin del equipo completo para el funcionamiento de


todos los dispositivos es la que se muestra en la figura 6.8. Utilizamos el
microcontroladorPIC32queproporcionalatarjetaPIC32StarterKitsiendonecesario
usareladaptador100LPIMAdaptorparaconectarlosobrelatarjetaExplorer16(como
yahicimosenelcapituloanterior)ylatarjetaExplorer16seconectaalapantallatctil
mediante el bus PICtail Plus. Por otro lado, como tambin hemos visto, para la
grabacinydepuracindelosprogramaseditadosdesdeelMPLABv8.33usaremosel
sistemaMPLABICD3inCircuitDebugger.

Figura6.8:Equipocompletoenfuncionamiento,sistemadedesarrolloExplorer16,MPLAB
ICD3yGraphicsPICtailPlusDaughterBoard.
145

CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE

6.3. MICROCHIP GRAPHIC LIBRARY

EnesteapartadovamosaestudiarelfuncionamientodelalibreraMicrochip
Graphic Library versin 1.6. la cual nos va a permitir desarrollar programas para el
control de la pantalla tctil basndonos en las funciones implementadas en esta
librera.

6.3.1. ESTRUCTURA DE LA LIBRERA GRFICA

Lalibreragrficasepuededividiren4capasespecficas:

Un archivo tipo c implementa las funciones ms bsicas tales como


PutPixel,GetPixel,SetColor,necesariasparainicializaryusareldisplaydel
dispositivo. Esto est controlado a travs del controlador del display.
Ademselaceleradorgrficoproporcionadoporelcontroladordeldisplay
vaaejecutarestasfuncionesdeunaformamseficiente.Esteacelerador
sehabilitaescribiendoalgunosregistrosespecialesenelcontrolador.Todo
estocomponelacapadeldriverdeldispositivo(DeviceDriverLayer).
Por encima de esta capa se encuentra la capa de Grficos primitivos
(Graphicsprimitivelayer),lacualllamaalasfuncionesdelacapaanterior
para construir formas primitivas. Por ejemplo, para la formacin de una
lneasellamarrepetidamentealafuncinPutPixeldelacapadeldriver
deldispositivo.
Lasiguientecapaesladeobjetosgrficos(GraphicsObjectslayer),enesta
capa se implementan objetos avanzados como widgets. En esta capa
manejaremoselcontrol,ladestruccinycreacindeestoswidgets.Detal
formaqueestacapaestarealizadaparaqueseafcilmenteintegrablecon
distintasinterfaces,siguientecapa.
Por ltimo tenemos la capa de aplicacin (Application layer), la cual
contienelosmdulosqueinicializanycontrolanlasinterfacesdelusuario,
pantallatctil.
Adems, a travs de la interfaz de mensaje, la aplicacin se puede
comunicar con los distintos objetos de una forma relativamente sencilla.
De tal forma que tendramos integrado totalmente los objetos en las
funcionesdelaaplicacin.

146

CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE

Figura6.9:Estructuradelalibreragrficav1.6demicrochip.

6.3.2. CARACTERSTICAS DE LOS WIDGETS (OBJETOS)

Loswidgets(objetos)soportadosporlalibrerason,Button,Chart,CheckBox,
Dial,EditBox,GroupBox,ListBox,Meter,Picture,ProgressBar,RadioButton,Slider,
StaticText,Window,TextEntry.Lasprincipalescaractersticasdeestosobjetosson:

Usando la API (Application Programming Interface) de un objeto se puede


crear,controlaryeliminarelmismo.
Elcomportamientodelosobjetosvienedeterminadoporsuestadoactual
yporlaaccindelusuarioendichoobjeto.
Losobjetossepuedenencontrarenunestadoactivooinactivo
El control de los objetos se simplifica mediante una serie de listas
vinculadasaestos,demaneraquecadaobjetonuevoseaadeaestalista.
Graciasaestalista,lalibreradibujadeformaautomticalosobjetosenel
display.
Cada objeto se puede implementar usando una combinacin de estilos
diferente,detalformaquesinoseleasignaunaenconcreto,seusaruna
combinacinprefijadapordefecto.Sinembargo,sepuedecrearunnuevo
estilo y asignarlo al objeto en el momento de la creacin de este o en
147

CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE

cualquierotromomentoenelqueelobjetoseencuentreenlamemoria.
La combinacin del estilo determina la tabla fuente y la combinacin de
coloresusadaparadibujarelobjetoencuestin.

Adems,graciasaquelalibreraintegraelcontrolbsicodelosobjetosbasado
en las acciones del usuario, se derivan una serie de beneficios debido a esta
implementacin:

Desde el punto de vista de la aplicacin, simplifica bastante el control de


losobjetos.
Lacapadelainterfazdemensaje,simplificalaintegracindelasentradas
denuestrodispositivo.
Soportaunagranvariedaddeentradas,ratn,pantallatctil,etc.
Proporciona una integracin completa de las entradas del dispositivo con
losobjetosdelapantalla.

Figura6.10:Libreragrfica,controldelosobjetosatravsdelainterfazdemensaje.

6.3.3. FUNCIONAMIENTO DE LA LIBRERA

Para ver de qu forma funciona la librera, vamos a verlo a travs de un


ejemplo,dequformapodemosrepresentarunbotn,comolopodemosconfigurary
aquefuncioneshacefaltallamarparadibujaryactualizarlapantallatctil.
LaprimerafuncinalacualtenemosquellamaresInitGraph();pararesetearel
controladordeldispositivodeldisplay,moverelcursoralaposicin(0,0)einicializarel
dispositivoennegro.
DespusllamamosalafuncinGOLCrateScheme(),paradefinirlacombinacin
de estilos a usar por los objetos. Por defecto, todos los objetos usan una estructura
que contiene una combinacin de estilos globales, definiendo la tabla fuente y la
combinacindecoloresusada.Veamoslaestructuraaplicadaaunbotn:
148

CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE
typedef struct {
WORD EmbossDkColor;
WORD EmbossLtColor;
WORD TextColor0;
WORD TextColor1;
WORD TextColorDisabled;
WORD Color0;
WORD Color1;
WORD ColorDisabled;
WORD CommonBkColor;
char *pFont;
} GOL_SCHEME;

ComopodemosverenlaestructuraGOL_SCHEMEanterior,todaslasvariables
tipowordseleccionanuncolorelcuallopodemoselegirnosotros,mientrasquepFont
es un puntero que selecciona el tipo de fuente de texto a usar. Por otra parte, para
emular el efecto de 3D al pulsar el botn, intercambiamos el relieve de este de un
coloroscuroaotroclaro.Acontinuacinpodemosverquerepresentacadavariable:

Figura6.11:Libreragrfica,estructuraGOL_SCHEMEaplicadaaunbotn.

Tambin, las dos funciones anteriores de pueden ejecutar usando una nica
instruccin,llamandoalafuncinGOL_Init().

El siguiente paso es crear los objetos. Para ello cada objeto tiene su funcin
especficaenlaquesedefinenlosparmetrosquehayqueasignarlesparacreardicho
objeto.Enelejemplodelbotn,lafuncinalacualhayquellamaresBtnCreate().

BUTTON *BtnCreate( WORD ID, SHORT left, SHORT top, SHORT right, SHORT bottom, SHORT
radius, WORD state, void *pBitmap, XCHAR *pText, GOL_SCHEME *pScheme)

ElIDesunnmerodefinidoporelusuariodestinadoaidentificardichoobjeto.
Left, top, right, bottom, son los parmetros usados para definir las dimensiones del
objeto,mientrasqueRadiusdefineelredondeadodelaesquinasdelbotn(verfigura
6.12.)
149

CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE

Figura6.12:Libreragrfica,parmetrosparadefinirlasdimensionesdeunbotn.

Por otra parte, State define el estado actual del objeto. Para cada tipo de
objeto se definen una lista de estados posibles, sin embargo, existen una serie de
estadoscomunesatodoslosobjetosloscualesson:
#define BTN_FOCUSED 0x0001
#define BTN_DISABLED 0x0002
#define BTN_DRAW_FOCUS 0x2000
#define BTN_DRAW
0x4000
#define BTN_HIDE
0x8000

// Bit for focus state.


// Bit for disabled state.
// Bit to indicate focus must be redrawn.
// Bit to indicate button must be redrawn.
// Bit to indicate button must be removed from screen.

Ademselbotntieneunaseriedeestadospropiosloscualesson:
#define BTN_PRESSED

0x0004
#define BTN_TOGGLE
0x0008
#define BTN_TEXTRIGHT 0x0010
#define BTN_TEXTLEFT 0x0020
#define BTN_TEXTBOTTOM 0x0040
#define BTN_TEXTTOP 0x0080

// Bit for press state.


// Bit to indicate button will have a toggle behavior.
// Bit to indicate text is right aligned.
// Bit to indicate text is left aligned.
// Bit to indicate text is top aligned.
// Bit to indicate text is bottom aligned.
// Note that if bits[7:4] are all zero text is centered.

LosestadosBTN_DRAWyBTN_HIDEindicanquehayqueredibujar,actualizar
los objetos en el display, para lo cual se basan en los otros estados, BTN_PRESSED,
BTN_TOGGLE,etc.
ContinuandoconlafuncinBtnCreate(),sinoseusaningntextoniunbitmap,
las variables pBitmap y pText hay que asignarlas a NULL. Por otra parte, el texto se
puede alinear a la derecha, a la izquierda, arriba o abajo, dependiendo del estado
seleccionado. Si no se selecciona ninguno de los anteriores, el texto se encontrar
centrado en el botn. Por ltimo pSchme, es un puntero que apunta a una variable
quecontienelacombinacindelestiloelegida.Sinoseseleccionaningunaseutilizar
elestilopordefecto.
Una vez que ya hemos realizado las llamadas a las funciones para crear los
objetos,hayquellamaralafuncinGOLDraw()paraquelosdibujeeneldisplay.Esta
funcin analiza sintcticamente la lista de objetos vinculados y chequea el estado
actualdecadaunodelosobjetos.Siunobjetotieneunestadopendientededibujar,el

150

CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE

objetoserredibujado.UnavezquelafuncinGOLDraw()hayaactualizadoelobjeto,
reseteaelestadopendienteanterior.

Elsiguientepasoesobtenerlasentradasdelusuario.Paraellohacemosusode
lainterfazdemensajes,lacual,cuandoocurreuneventoenundispositivodeentrada,
enva a la librera la estructura de mensaje. Es decir, estos mensajes contienen la
accin del usuario en los objetos de la pantalla. La estructura de la interfaz de
mensajeseslasiguiente:
typedef struct {
BYTE type;
BYTE event;
SHORT param1;
SHORT param2;
} GOL_MSG;

Elcampotype,defineeltipodedispositivodeentradausado(ennuestrocaso
la pantalla tctil). Dependiendo del dispositivo usado param1 y param2 sern
interpretadosdeunamanerauotra.Paraelcasodelapantallatctilparam1yparam2
sondefinidoscomolacoordenadaxeyrespectivamente.Hayquetenerencuentaque
lacoordenada(0,0)sesitaenlapartesuperiorizquierdadelapantalla.Porltimo,
eventdeterminalaaccinrealizadaporelusuario,lascualesestnpredefinidas.Para
lapantallatctilestasson:
EVENT_INVALID = 0
EVENT_MOVE
EVENT_PRESS
EVENT_RELEASE

// An invalid event.
// A move event.
// A press event.
// A release event.

Cuandounobjetorecibeunmensaje,esteevalasielmensajeesvlidoonolo
es. Cuando es vlido responde con una de las acciones ID definidas. Las acciones ID,
sonunalistadeposiblesaccionesqueunobjetopuedeaceptar,detalformaquecada
objetotienesupropialistadeacciones.Paraelcasodelbotn,estetienedosacciones
predefinidas:
BTN_MSG_PRESSED,
BTN_MSG_RELEASED,

// Button pressed action ID.


// Button released action ID.

Sinembargo,sielmensajeesconsideradocomoinvalido,elobjetoresponder
conunMSG_INVALID.Unejemplodeestasituacinseproducecuandounobjetopasa
a estar inactivo, de manera que cualquier mensaje que le llegue a este, el objeto
responderconMSG_INVALID.

151

CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE

De tal forma que cuando se toca la pantalla debe existir una funcin que
proceselosmensajesanterioresyquechequelalistadeobjetosparadeterminarque
objeto se ver afectado por el mensaje, esta funcin es GOLMsg(). El objeto que
incluyalaposicin(x,y)cambiarsuestadobasadoenelestadoactualyenelevento.
Sinembargo,esteanlisisdelosmensajessepuedenrealizardeunaformamsrpida
travsdelafuncinGOLMSGCallback().Cadavezqueunmensajevlidosearecibido
por algn objeto se llamar a esta funcin. Adems esta funcin nos va a permitir
personalizar el comportamiento de los objetos en funcin de su estado y el evento
ocurrido,talycomoveremosenelsiguienteapartado(ejemplos).
Por tanto, una vez los mensajes han sido procesados, se vuelve a llamar otra
vezalafuncinGOLDraw()paraactualizardichosobjetos.Deestemodosecompleta
el ciclo de funcionamiento de la librera. A continuacin mostramos un esquema del
funcionamientodelamisma.

Figura6.13:Diagramadeflujobsicodelfuncionamientodelalibreragrfica.

152

CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE

6.3.4. PROGRAMAS EJEMPLO

Los siguientes programas ejemplo han sido extrados del documento AN1136
HowtouseWidgetsinMicrochipgraphicsLibrary[19],disponibleenelCdadjuntoa
esteproyecto,ascomodelosprogramasejemplosdisponiblesenlalibreraunavez
que la instalamos en nuestro ordenador. Adems los programas extrados de la
referencia anterior se pueden encontrar en el CD adjunto en la carpeta
correspondientealapantallatctil.
Hay que tener en cuenta que para el funcionamiento de estos programas es
necesario copiar la carpeta que contenga el programa que queramos probar al
directorioenelquehemosinstaladolalibrera.Pordefecto,tendremosquecopiarla
carpetarequeridaalasiguientedireccinC/MicrochipSolutions,paraquepuedausar
todoslosobjetosdisponiblesenlalibrera.
Carpeta: Graphics Primitives Layer Demo.

Con este primer programa vamos a ejecutar uno de los disponibles en la


carpetacreadaunavezinstaladalalibrera,tambindisponibleenelCdadjunto.Este
programaslovahacerusodelasfuncionesmsbsicasdelalibrera,sinusarobjetos,
es decir, va a hacer uso de funciones tales como dibujar lneas asignando distintos
colores, dibujar crculos rellenndolos de distintos colores, etc. A continuacin
mostramos un trozo de cdigo extrado del programa MainDemo.c con su
correspondienteimagenalserejecutadoenlapantallatctil.
while(1){
SetColor(WHITE);
for(counter=0; counter<GetMaxX(); counter+=20){
Line(counter,0,GetMaxX()-1-counter,GetMaxY()-1);
}
DelayMs(4000);

Figura6.14:ProgramaGraphicsPrimitivesLayerDemoejecutadoenlapantallatctil.

153

CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE

Lafuncinusadaenelprogramaanteriores:

VoidLine(shortx1,shorty1,shortx2,shorty2)cuyosparmetrosson:
o x1,Coordenadaxdelpuntodecomienzodelalnea.
o y1,Coordenadaydelpuntodecomienzodelalnea.
o x2,Coordenadaxdelpuntofinaldelalnea
o y2,Coordenadaydelpuntofinaldellalnea.

El programa tambin utiliza otras funciones bsicas como son Circle(), Fillcircle(),
Arc(),Bbar(),entreotras.

Programa: AN1136_v1.0.c

El siguiente programa ejemplo muestra la interaccin entre las acciones del


usuario y el estado actual de un objeto. De qu forma podemos modificar el
comportamientodeunobjetoenfuncindeotro.
Elejemploconstade3objetos,2botonesyunslider.Cadaobjetosehacreado
con su correspondiente funcin de creacin del objeto indicando los parmetros
necesarios. En los botones se ha escrito las palabras Left y Right. Una vez ya
tenemos creado los 3 objetos vamos a ver de qu forma pueden interactuar entre
ellos. Lo que realiza este programa es que dependiendo del botn pulsado por
nosotros se mueva en pasos fijos el slider. Concretamente en la creacin del slider
fijamoseltamaodelapginaen5. Portantocadavezquepresionemosunbotn
incrementaremosoreduciremoslaposicindelSlideren5unidades.
Para implementar esta funcionalidad hay que usar, tal y como hemos
comentado en el apartado anterior, la funcin GOLMsgCallback(), cuya funcin se
llamacadavezquelafuncinGOLMsg()recibaunmensajevlidoprovenientedeun
objeto.Lostresparmetrosquenecesitalafuncinson:

RawGOLmessage(pMseg),Punteroalaestructurademensajeconlos
datosobtenidosalpulsarenlapantallatctil.
PointertotheObject(pObj),estepunteronospermiteobtenertodala
informacinsobreelobjetoafectadoycontrolarsuestado.
Translatedmesage(objMsg),esunnmerodevueltoporlalibreraque
nos muestra la clase de evento ocurrido por el objeto afectado.
Especficoparacadaobjeto,vistoanteriormente.

A continuacin mostramos el cdigo del programa mediante el cual


modificamoselcomportamientodelSliderenfuncindelosbotones.Sipresionamos
el botn 1 reducimos la posicin del slider mientras que presionando el botn 2 lo
incrementamos.
154

CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE
//
OBJECT'S IDs
#define ID_BTN1
10
#define ID_BTN2
11
#define ID_SLD1
20
//
LOCAL PROTOTYPES
void CheckCalibration(void);
// check if calibration is needed
//
MAIN
GOL_SCHEME *altScheme;

// alternative style scheme

int main(void){
GOL_MSG msg; // GOL message structure to interact with GOL
/////////////////////////////////////////////////////////////////////////////
// ADC Explorer 16 Development Board Errata (work around 2)
// RB15 should be output
LATBbits.LATB15 = 0;
TRISBbits.TRISB15 = 0;
/////////////////////////////////////////////////////////////////////////////
#ifdef __PIC32MX__
INTEnableSystemMultiVectoredInt();
SYSTEMConfigPerformance(GetSystemClock());
#endif
BeepInit();
EEPROMInit();
// initialize EEPROM
TouchInit();
// initialize touch screen
GOLInit();
// initialize graphics library &
// create default style scheme for GOL
// If S3 button on Explorer 16 board is pressed calibrate touch screen
if(PORTDbits.RD6 == 0){
TouchCalibration();
TouchStoreCalibration();
}
// If it's a new board (EEPROM_VERSION byte is not programed) calibrate touch screen
if(GRAPHICS_LIBRARY_VERSION != EEPROMReadWord(EEPROM_VERSION)){
TouchCalibration();
TouchStoreCalibration();
EEPROMWriteWord(GRAPHICS_LIBRARY_VERSION,EEPROM_VERSION);
}
// Load touch screen calibration parameters from EEPROM
TouchLoadCalibration();
altScheme = GOLCreateScheme();
altScheme->TextColor0 = BLACK;
altScheme->TextColor1 = BRIGHTBLUE;
BtnCreate(ID_BTN1,
20, 160, 150, 210,
0,
BTN_DRAW,
NULL,
"LEFT",
altScheme);

// create alternative style scheme

// objects ID
// objects dimension
// radius of the rounded edge
// draw the object after creation
// no bitmap used
// use this text
// use alternative style scheme

BtnCreate(ID_BTN2,
170, 160, 300, 210,
0,
BTN_DRAW,

155

CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE

NULL,
"RIGHT",
altScheme);
SldCreate(ID_SLD1,
20, 105, 300, 150,
SLD_DRAW,
100,
5,
50,
NULL);
while(1){
if (GOLDraw()) {
TouchGetMsg(&msg);
GOLMsg(&msg);
}
}
}

// objects ID
// objects dimension
// draw the object after creation
// range
// page
// initial position
// use default style scheme

// Draw GOL object


// Get message from touch screen
// Process message

WORD GOLMsgCallback(WORD objMsg, OBJ_HEADER* pObj, GOL_MSG* pMsg){


WORD objectID;
SLIDER *pSldObj;
objectID = GetObjID(pObj);
if (objectID == ID_BTN1) {
if (objMsg == BTN_MSG_PRESSED) {
// check if button is pressed
pSldObj = (SLIDER*)GOLFindObject(ID_SLD1); // find slider pointer
SldDecPos(pSldObj);
// decrement the slider position
SetState(pSldObj, SLD_DRAW_THUMB); // redraw only the thumb
}
}
if (objectID == ID_BTN2) {
if (objMsg == BTN_MSG_PRESSED) {
pSldObj = (SLIDER*)GOLFindObject(ID_SLD1); // find slider pointer
SldIncPos(pSldObj);
// increment the slider position
SetState(pSldObj, SLD_DRAW_THUMB); // redraw only the thumb
}
}
return 1;
}
//Call Back functions must be defined and return a value of 1 even though they are not used.
WORD GOLDrawCallback(){
return 1;
}

Comopodemosobservarenelmainnicamentellamamosadosfunciones,una
para obtener el mensaje cuando tocamos la pantalla tctil y otra para procesarlo.
Estas llamarn a su vez a las funciones GOLMsgCallback(), para que realice el
comportamiento deseado una vez hemos presionado el botn que queramos. A
continuacinmostramosunaimagenconelprogramasiendoejecutadoenlapantalla
tctil.

156

CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE

Figura6.15:ProgramaAN1136_v1.0.cejecutadoenlapantallatctil.

Programa: AN1136_v2.0.c

En el siguiente programa se ha realizado una modificacin del programa


anterior. Esta modificacin consiste en que mientras que estamos presionando el
botnizquierdosemuestraunaimagen(bitmap),unaflechaapuntandoalaizquierda.
Paraquesepuedadibujarynosedibujeencimadeltextohayquealineareltextoala
izquierda y una vez soltado el botn que vuelva a su posicin original. La misma
modificacin se realiza en el botn derecho pero al contrario. Para ello hay que
modificarlafuncinGOLMsgCallback()talycomomostramosacontinuacin:
//

IMAGES USED

extern const BITMAP_FLASH redRightArrow;

extern const BITMAP_FLASH redLeftArrow;


WORD GOLMsgCallback(WORD objMsg, OBJ_HEADER* pObj, GOL_MSG* pMsg){
WORD objectID;
SLIDER *pSldObj;
objectID = GetObjID(pObj);
if (objectID == ID_BTN1) {
if (objMsg == BTN_MSG_PRESSED) {
// check if button is pressed
BtnSetBitmap(pObj, (void*)&redLeftArrow); // set bitmap to show
SetState(pObj, BTN_TEXTRIGHT);
// move the text to the right
pSldObj = (SLIDER*)GOLFindObject(ID_SLD1); // find slider pointer
SldDecPos(pSldObj);
// decrement the slider position
SetState(pSldObj, SLD_DRAW_THUMB); // redraw only the thumb
}

157

CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE

else {
BtnSetBitmap(pObj, NULL);
ClrState(pObj, BTN_TEXTRIGHT);

// remove the bitmap


// place the text back in the middle

}
}
if (objectID == ID_BTN2) {
if (objMsg == BTN_MSG_PRESSED) {
BtnSetBitmap(pObj, (void*)&redRightArrow); // set bitmap to show
SetState(pObj, BTN_TEXTLEFT);
// move the text to the left
pSldObj = (SLIDER*)GOLFindObject(ID_SLD1); // find slider pointer
SldIncPos(pSldObj);
// increment the slider position
SetState(pSldObj, SLD_DRAW_THUMB); // redraw only the thumb
}
else {
BtnSetBitmap(pObj, NULL);
// remove the bitmap
ClrState(pObj, BTN_TEXTLEFT);
// place the text back in the middle
}
}
return 1;
}

Adems, para la visualizacin de las imgenes ha sido necesario incluir el


archivoPicturesPIC32.c,cuyoarchivosehageneradomediantelaherramientaBitmap
and Font converter.exe. Esta herramienta nos permite, partiendo de una imagen en
bitmap,generarunarchivo.cconlainformacinrequeridaparaquesepuedeusarcon
la librera grfica. A continuacin mostramos una imagen del programa mientras se
estpulsandoelbotnderecho.

Figura6.16:ProgramaAN1136_v2.0.cejecutadoenlapantallatctil.

158

CAPTULO6.PANTALLATCTIL:HARDWAREYSOFTWARE
Programa: AN1136Demo PIC32.c

Parafinalizarprobamoselprogramacompletopropuestoenlareferencia[19],el
cual aade un objeto personalizado mediante una serie de bitmaps. Este objeto se va a
comportar como una serie de barras, de tal forma que cuando el valor del Slider se
incremente las barras aumentarn en concordancia con su valor. As mismo cuando el
valor del Slider se reduzca las barras correspondientes sern eliminadas. Este objeto
personalizado lo tendremos que incluir dentro de la funcin GOLDrawCallBack(). Estas
barrassepuedendesplazaraligualqueenlosejemplosanteriores,tocandolosbotoneso
bienmoviendoelcursordelslider.Debidoalaextensondeesteprogramanomostramos
elcdigosinounaimagendelmismomientrasqueestasiendoejecutado.Elprogramase
encuentradisponibleenlamismacarpetaquelosdosanteriores.

Figura6.17:ProgramaAN1136Demo.cejecutadoenlapantallatctil.

Para ms informacin acerca de la pantalla tctil, la librera, las distintas


soluciones grficas para aplicaciones embebidas y el software empleado se puede
consultarlapginaoficialdemicrochipenelapartadoGraphics.Desdeesteapartado
sehadescargadoyconsultadotodoslosdocumentosascomoelsoftwarenecesario
[20].

159

Manejo de una pantalla tctil con el PIC32 para el


control de dispositivos externos.

7. APLICACIONES DESRROLLADAS

CAPTULO7.APLICACIONESDESARROLLADAS.

7.1. INTRODUCCIN

Elpresentecaptulotienecomofinalidaddescribirculeshansidolosmtodos
seguidos y las aplicaciones desarrolladas haciendo uso de todos los componentes
explicadosenloscaptulosanteriores.
El objetivo final buscado es la creacin de varios programas que muestren el
funcionamientodedichosmdulos,ascomolasdistintasfuncionesempleadasenla
elaboracindelasdistintasaplicaciones.

7.2. PANTALLA TCTIL

Este programa desarrollado para funcionar con la Explorer16+Graphics Pictail


nos va a permitir integrar en nico programa aspectos tan diversos como son las
entradasanalgicastratadasmedianteelmoduloA/Dprocedentesdelpotencimetro
ydelsensordetemperaturaparasuvisualizacindeformagrficaenlapantallatctil,
as como la utilizacin del modulo RTCC del PIC32, para configurar de una forma
grficatantolafechacomolahoraactual.

7.2.1. ASPECTOS A TENER EN CUENTA PARA ELABORAR EL PROGRAMA

Loprimeroquetenemosquesaberescmofuncionacadamduloquevamos
anecesitaremplearparaelaborarnuestroprograma,estosson:

MduloADC,vistoenelCapitulo5apartado5.3.6.
LibreraGrfica,funcionamientovistoenelCaptulo6.
MduloRTCC,usamoslalibrerartcc.cyrtcc.h.

163

CAPTULO7.APLICACIONESDESARROLLADAS

Deestostresmdulos, elqueannohemoscomentadocomofuncionaesel
moduloRTCC(SalvoenelAnexoBenelquesemuestracomoconfigurarloparaactuar
comointerrupciones).

ParausarelMduloRTCCvamosausarlaslibrerasrtcc.cyrtcc.h,lascualesnos
vanafacilitarlaconfiguracindeestemdulo.Parausarestemduloserequiereque
sedispongadeunrelojexternode32.768kHZdelocontraronolopodramosutilizar
[3].Sinembargo,elsistemadedesarrolloExplorer16disponedeesterelojincorporado
enlaplaca(VerCapitulo5).
Para controlar este mdulo vamos a usar las siguientes funciones disponibles
enlalibreraanterior:

RTCCInit();InicializaelmoduloRTCC,habilitandoelosciladorSOSC,para
funcionarbajoelmoduloRTCC.

mRTCCOff(); Deshabilita el modulo RTCC temporalmente, para poder


accederasusregistros,configuracininicialdelmismo.

RTCCSetBinXXX(Value);Asignaelao,elmes,elda,lahora,elminutoy
elsegundodelvalordevaluealosregistrosdelRTCC,dondeXXXse
correspondealasdistintasfuncionessegnasignamoselda,hora,etc.

RTCCCalculateWeekDay(); Esta funcin lee el da, mes y ao de los


registrosdelmoduloRTCCycalculaeldadelasemana.

mRTCCSet(); copia los registros asignados mediante las funciones


anteriores,alosregistrosdelrelojdelmduloRTCC.

RTCCProcessEvents(); Esta funcin actualiza las cadenas de caracteres


que nos permiten mostrar la hora y fecha, desde los registros del
mduloRTCC.

mRTCCGetBinXXX();segnseaXXX,obtieneelvalordelossegundos,
minutos,horas,da,mesoaoactualesdesdelosregistrosdelRTCC.

Apartedelosmduloscitadosanteriormente,tambintenemosqueconocer
cmo funciona tanto el potencimetro como el sensor de temperatura para poder
trabajarconellos.

164

CAPTULO7.APLICACIONESDESARROLLADAS

Potencimetro:
Las principales caractersticas del potencimetro presente en el sistema de
desarrolloExplorer16son:

Potencimetrode10kOhmios.

LecturadelpotencimetroatravsdeR6.

Est conectado directamente a 3.3V, por lo que su salida estar


comprendidaentre3.3Vy0V.

ConectadoalaentradaanalgicaAN5.

Figura7.1:EsquemadelPotencimetroR6delatarjetaExplorer16.

Sensor de Temperatura:
LasprincipalescaractersticasdelsensordetemperaturaTC1047presenteen
elsistemadedesarrolloExplorer16son:

Pendiente10mV/C

ConectadoalaentradaanalgicaAN4,enlaexplorer16.

Temperatura:
T

Vout 500mV

10mV/C

Donde Vout=ADC Reading * ADC resolution (mV/bit), y donde


resolution=3.3mV/bit,portanto:

165

CAPTULO7.APLICACIONESDESARROLLADAS

3.3

500
10

Para una correcta medicin de la temperatura vamos a tener que tomar


muestrascada0.1sdurante1syvamosacalcularlamediadetodasellas,yaquelos
sensoresdetemperaturaproporcionanunaltonivelderuido,porloquedeestaforma
conseguiremosreducirestoserrores.

Figura7.2:SensordetemperaturaTC1047,Voltajedesalida(Vout)respectotemperatura.

7.2.2. ESTRUCTURA DEL PROGRAMA

Una vez conocemos como van a funcionar los mdulos empleados para la
realizacindelprograma,veamosdequformavamosaestructurarlo.
Elprogramavaaconstardeunapantallaprincipalatravsdelacualvamosa
poderaccederacadaunadelasdistintaspantallassecundariascontaldecomprobar
el funcionamiento del sensor, el potencimetro y el ajuste de la hora, tal y como
podemosobservarenelsiguientediagrama:

166

CAPTULO7.APLICACIONESDESARROLLADAS

AligualqueenlosprogramasvistosenelCaptulo6,lafuncinmaindenuestro
programasolovaacontenerdosfuncioneslascualesllamanaotrasdos,estasson:
while(1){
if (GOLDraw()) {
TouchGetMsg(&msg);
GOLMsg(&msg);
}
}

// Draw GOL object


// Get message from touch screen
// Process message

DetalformaquelafuncinGOLMsgCallbackserllamadaporGOLmsg()cada
vez que un mensaje valido sea recibido por un objeto, mientras que la funcin
GOLDrawCallBack(),serllamadaporlafuncinGOLDraw()cadavezqueunobjetosea
dibujado completamente. Por tanto, mediante esta funcin podremos cambiar el
estadodelosobjetosenlalistaactivaascomocambiarsuconfiguracin,color,tipo
delnea,grficos,etc.
Estas dos funciones, estn estructuradas mediante una serie de estados de
pantalla.Cadaunadelaspantallasanteriores,entotalvamosatenercinco(pantalla
principal, ms las cuatro pantallas secundarias), van a tener una serie de estados
asociados a estas, llamados SCREEN_STATES. Cada uno de estos estados nos va a
ayudaraorganizarnuestroprograma,yaqueatravsdeestosestadosvamosapoder
saberquesloqueseestmostrandoporpantalla.Losestadosasociadosacadauna
delaspantallassonlossiguientes:

167

CAPTULO7.APLICACIONESDESARROLLADAS

Elcambiodeunestadoaotrosepuededeberadistintascausas.Porejemplo,

cuandoconectamosnuestrosistemaacorriente,elprimerestadoqueseasignaesel
Create_Buttons.Detalformaquecuandoseejecutelafuncindeactualizarlapantalla
ysechequeeelestadodelapantallaelseleccionadosereste.Esteestadollamarala
funcinCreateButtons(),lacualcrearelmeninicialdenuestroprograma.Unavez
finalizada la creacin de la pantalla principal, se cambiar el estado por
Display_Buttons.Duranteesteestadonicamentesevaaestarchequeandolainterfaz
de mensaje hasta que se produzca un evento, es decir, seleccionemos alguno de los
cuatro botones de la pantalla inicial para que se muestre una secundaria.
Dependiendodelbotnseleccionadosecambiaraunestadouotro,enelsiguiente
diagramadeflujolomostramos(losestadosquenosehanmostradoenelsiguiente
diagramadeflujo,sedebeaquetodosellosseutilizanparaactualizarcadaunadelas
pantallassecundariasalaquepertenecen).

168

CAPTULO7.APLICACIONESDESARROLLADAS

A continuacin mostramos las funciones GOLMsgCallback()


GOLDrawCallback()dadasuimportanciaenelfuncionamientodelprograma.
WORD GOLMsgCallback(WORD objMsg, OBJ_HEADER* pObj, GOL_MSG* pMsg){
/* beep if button is pressed
if(objMsg == BTN_MSG_PRESSED)
Beep();*/
if ((screenState & 0xF300) != 0xF300) {
// check for time setting press, process only when not setting time and date
if (objMsg == ST_MSG_SELECTED) {
if ((GetObjID(pObj) == ID_STATICTEXT1) || (GetObjID(pObj) == ID_STATICTEXT2)) {
prevState = screenState - 1; // save the current create state
screenState = CREATE_DATETIME;// go to date and time setting screen
return 1;
}
}
}
// process messages for screens
switch(screenState){
case DISPLAY_BUTTONS:
return MsgButtons(objMsg, pObj);
case DISPLAY_POT:
return MsgPotentiometer(objMsg, pObj);
// date and time settings display
case DISPLAY_DATETIME:
return MsgDateTime(objMsg, pObj);
case DISPLAY_DATE_PDMENU:
return MsgSetDate(objMsg, pObj, pMsg);
case CREATE_DATETIME:
case SHOW_DATE_PDMENU:
case HIDE_DATE_PDMENU:
return 0;
case SHOW_DATETIME:
return MsgDateTime(objMsg, pObj);
case ACT_DATETIME:
return MsgDateTime(objMsg, pObj);
case DISPLAY_SLIDE_POT:
return MsgSlidePOt(objMsg, pObj);
case DISPLAY_SLIDE_TEMP:
return MsgSlideTemp(objMsg, pObj);
default:
return 1;
}
}//GOLMsgCallback

WORD GOLDrawCallback(){
OBJ_HEADER *pObj;
SLIDER
*pSld;
LISTBOX
*pLb;
static BYTE pBDelay = 40;
static BYTE direction = 1;
static DWORD prevTick = 0;
static DWORD prevTime = 0;
WORD
i;

// used to change text in Window


// used when updating date and time
// used when updating date and time
// progress bar delay variable
// direction switch for progress bar
// keeps previous value of tick
// keeps previous value of time tick

169

CAPTULO7.APLICACIONESDESARROLLADAS
// update the time display
if ((screenState & 0x0000F300) != 0x0000F300) {// process only when NOT setting time and date
if ((tick-prevTime) > 1000){
RTCCProcessEvents(); // update the date and time string variabes
i = 0;
while (i < 12) {
dateTimeStr[i] = _time_str[i];
dateTimeStr[i+13] = _date_str[i];
i++;
}
dateTimeStr[12] = 0x000A;
// (XCHAR)'\n';
dateTimeStr[25] = 0x0000;
// (XCHAR)'\0';
if (pObj = GOLFindObject(ID_STATICTEXT2)) {
// get the time display obj pointer
StSetText((STATICTEXT *)pObj, dateTimeStr); // now display the new date & time
SetState(pObj, ST_DRAW);
// redraw the time display
StDraw((STATICTEXT *)pObj);
}
prevTime = tick;
// reset tick timer
}
} else {
// process only when setting time and date
// do not update when pull down menus are on
if ((screenState != DISPLAY_DATE_PDMENU) && (screenState != HIDE_DATE_PDMENU))
{
if ((tick-prevTime) > 1000){
updateDateTimeEb(); // update edit boxes for date and time settings
prevTime = tick; // reset tick timer
}
}
}
switch(screenState){
case CREATE_BUTTONS:
CreateButtons();
// create window and buttons
screenState = DISPLAY_BUTTONS; // switch to next state
return 1;
case DISPLAY_BUTTONS:
return 1;
// redraw objects if needed
case CREATE_POT:
CreatePotentiometer();
screenState = BOX_DRAW_POT;
return 1;
case BOX_DRAW_POT:
if(0 == PanelPotentiometer())
return 0;

// create window
// switch to next state
// draw objects created
// draw box for potentiometer graph
// drawing is not completed, don't pass
// drawing control to GOL, try it again
// switch to next state
// pass drawing control to GOL, redraw objects if needed

screenState = DISPLAY_POT;
return 1;
case DISPLAY_POT:
if((tick-prevTick)>20){
if(GetPotSamples(POT_MOVE_DELTA))
GraphPotentiometer();
// redraw graph
prevTick = tick;
}
return 1;

case CREATE_DATETIME:
CreateDateTime();
// create date and time demo
screenState = DISPLAY_DATETIME;// switch to next state
return 1;
// draw objects created

170

CAPTULO7.APLICACIONESDESARROLLADAS

case SHOW_DATE_PDMENU:
ShowPullDownMenu();
screenState = DISPLAY_DATE_PDMENU;
return 1;
case HIDE_DATE_PDMENU:
if (RemovePullDownMenu())
screenState = DISPLAY_DATETIME;
return 1;

// switch to next state

case DISPLAY_DATE_PDMENU:
// this moves the slider and editbox for the date setting to
// move while the up or down arrow buttons are pressed
if((tick-prevTick)>100) {
pLb = (LISTBOX*)GOLFindObject(ID_LISTBOX1);
pSld = (SLIDER*)GOLFindObject(ID_SLIDER1);
pObj = GOLFindObject(ID_BUTTON_DATE_UP);
if(GetState(pObj, BTN_PRESSED)) {
LbSetFocusedItem(pLb,LbGetFocusedItem(pLb)-1);
SetState(pLb, LB_DRAW_ITEMS);
SldSetPos(pSld,SldGetPos(pSld)+1);
SetState(pSld, SLD_DRAW_THUMB);
}
pObj = GOLFindObject(ID_BUTTON_DATE_DN);
if(GetState(pObj, BTN_PRESSED)) {
LbSetFocusedItem(pLb,LbGetFocusedItem(pLb)+1);
SetState(pLb, LB_DRAW_ITEMS);
SldSetPos(pSld,SldGetPos(pSld)-1);
SetState(pSld, SLD_DRAW_THUMB);
}
prevTick = tick;
}
return 1;
case DISPLAY_DATETIME:
// Checks if the pull down menus are to be created or not
pObj = GOLFindObject(ID_BUTTON_MO);
if (GetState(pObj, BTN_PRESSED)) {
screenState = SHOW_DATE_PDMENU; // change state
return 1;
}
pObj = GOLFindObject(ID_BUTTON_YR);
if (GetState(pObj, BTN_PRESSED)) {
screenState = SHOW_DATE_PDMENU; // change state
return 1;
}
pObj = GOLFindObject(ID_BUTTON_DY);
if (GetState(pObj, BTN_PRESSED)) {
screenState = SHOW_DATE_PDMENU; // change state
return 1;
}
// this increments the values for the time settings
// while the + or - buttons are pressed
if((tick-prevTick)>200) {
pObj = GOLFindObject(ID_BUTTONHR_P);
if(GetState(pObj, BTN_PRESSED)) {
MsgDateTime(BTN_MSG_PRESSED, pObj);
}
pObj = GOLFindObject(ID_BUTTONHR_M);

171

CAPTULO7.APLICACIONESDESARROLLADAS
if(GetState(pObj, BTN_PRESSED)) {
MsgDateTime(BTN_MSG_PRESSED, pObj);
}
pObj = GOLFindObject(ID_BUTTONMN_P);
if(GetState(pObj, BTN_PRESSED)) {
MsgDateTime(BTN_MSG_PRESSED, pObj);
}
pObj = GOLFindObject(ID_BUTTONMN_M);
if(GetState(pObj, BTN_PRESSED)) {
MsgDateTime(BTN_MSG_PRESSED, pObj);
}
pObj = GOLFindObject(ID_BUTTONSC_P);
if(GetState(pObj, BTN_PRESSED)) {
MsgDateTime(BTN_MSG_PRESSED, pObj);
}
pObj = GOLFindObject(ID_BUTTONSC_M);
if(GetState(pObj, BTN_PRESSED)) {
MsgDateTime(BTN_MSG_PRESSED, pObj);
}
prevTick = tick;
}
return 1;
case SHOW_DATETIME:
CreateDataTime();
screenState = ACT_DATETIME;
return 1;

// create window and buttons


// switch to next state

case ACT_DATETIME:
if ((tick-prevTime) > 1000){
RTCCProcessEvents();// update the date and time string variabes
i = 0;
while (i < 12) {
dateTimeStr[i] = _time_str[i];
dateTimeStr[i+13] = _date_str[i];
i++;
}
dateTimeStr[12] = 0x000A;
// (XCHAR)'\n';
dateTimeStr[25] = 0x0000;
// (XCHAR)'\0';
if (pObj = GOLFindObject(ID_STATICTEXT1)) { // get the time display obj pointer
StSetText((STATICTEXT *)pObj, dateTimeStr); // now display the new date & time
SetState(pObj, ST_DRAW);
// redraw the time display
}
prevTime = tick;
// reset tick timer
}
screenState = ACT_DATETIME;
return 1;
case CREATE_SLIDE_POT:
CreateSlidePot();
// create window and buttons
screenState = DISPLAY_SLIDE_POT;
// switch to next state
return 1;
case DISPLAY_SLIDE_POT:
if((tick-prevTick)>20){
GraphSlidePOT();
// redraw graph
prevTick = tick;
}
return 1;

172

CAPTULO7.APLICACIONESDESARROLLADAS

case CREATE_SLIDE_TEMP:
CreateSlideTemp();
// create window and buttons
screenState = DISPLAY_SLIDE_TEMP;
// switch to next state
return 1;
case DISPLAY_SLIDE_TEMP:
if((tick-prevTick)>20){
GraphSlideTemp();
// redraw graph
prevTick = tick;
}
return 1;
}
}//GOLDrawCallback

Como podemos observar en el cdigo anterior, los estados de cada pantalla nos
ayudan a organizar nuestro programa llamando a la funcin concreta para crear una
seriedeobjetos,obienparaactualizarestos.

7.2.3. FUNCIONAMIENTO DEL PROGRAMA

Una vez aclarada la estructura, vamos a ver que realiza cada una de las
pantallasmencionadasanteriormente.
Lapantallaprincipaleslapantallamediantelacualvamosapoderaccederalas
demspresionandoelbotnquequeramos.Unavezhayamosaccedidoaunapantalla
secundaria y pulsemos el botn de retorno, volveremos a esta pantalla. Adems en
estapantallaprincipalsehaincorporadoellogodelaUMH,cuyoarchivoenformatoc
sehageneradomediantelaherramientaBitmapandFontconverter.exe,disponible
en la librera grfica usada. A continuacin mostramos una imagen de esta pantalla
principal.

Figura7.3:Pantallaprincipal,ProgramaProyecto_1.c.
173

CAPTULO7.APLICACIONESDESARROLLADAS

Sipresionamossobreelprimerbotn(Poten)accederemosaunapantallaen
laquesenosmostrarunagrficaenlaquevamosapoderverentiemporealcomo
cambialaresistenciadelpotencimetro(lamodificamosdeformamanualatravsde
la tarjeta Explorer16) en funcin del tiempo. Adems en todas las pantallas
secundarassehaincorporadounbotnderetornoalapantallaprincipalsituadoala
izquierdadelamisma.Acontinuacinmostramosunaimagendedichapantallaenla
quesehaidocambiandoelvalordelpotencimetro.

Figura7.4:PantallaSecundaria,Potentiometer,ProgramaProyecto_1.c.

Sipresionamossobreelsegundobotn(SlidePot),vamosapodervercomo
vara el potencimetro mediante el uso de cuatro objetos diferentes. El primero es
unabarralacualmuestraelvalorentantoporcientosegnsilaresistenciaesmxima
(10K,100%)omnima(0K,0%).Estabarraestasociadaaunslidedetalforma
queesteltimosemoverenlamismamedidaenlaquelohagalabarraentantopor
ciento.Porotrapartesemuestraunindicadorcircular(meter)enelquesemuestra
el valor de la resistencia del potencimetro de una forma grfica. Por ltimo a la
derecha de la pantalla podemos visualizar el valor de este numricamente, segn la
figura7.5.

Figura7.5:PantallaSecundaria,SlidePotentiometer,ProgramaProyecto_1.c.
174

CAPTULO7.APLICACIONESDESARROLLADAS

La tercera pantalla (Time) nos permite ajustar la fecha y la hora, para


visualizarlaposteriormenteenlapantallaprincipal.Primerovamosaindicarlafecha,
esdecir,mesdayao,yposteriormentelahora,minutosysegundos.Paraelaborar
estos mens de seleccin se han utilizado mens desplegables (Figura 7.6.a) para
ajustarlafechaybotonesdeadicinorestaparaelcasodelahora.Unavezajustada
nuestra hora le damos show y se nos mostrar en esta misma pantalla la fecha y la
hora seleccionada (Figura 7.6.b). Una vez que pulsemos el botn de retorno para
regresar a la pantalla principal, en esta ltima, se nos mostrar la fecha y la hora y
podremos observar cmo va contando el tiempo (Figura7.6.c). Adems si pulsamos
sobreestetextounavezconfiguradalahoratambinpodremosaccederdenuevoal
mendeconfiguracindelafechaydelahora.Acontinuacinmostramosunaimagen
deestapantallasecundaraydelapantallaprincipalunavezconfiguradalahora.

a)b)

c)
Figura7.6:ProgramaProyecto_1.ca)PantallaSecundaria,SetTimeandDate,detalle
alpresionarelmendesplegableparaseleccionarelmes.b)Fechayhoraconfiguradatras
pulsarelbotnShow.c)Pantallaprincipaltrasconfigurarlahoraylafecha.

175

CAPTULO7.APLICACIONESDESARROLLADAS

Porltimo,sipresionamossobreelcuartobotn(SensorT),accederemosa
una pantalla en la que vamos a comprobar el funcionamiento del sensor de
temperatura TC1047 presente en la tarjeta Explorer16. A travs de una barra
deslizadoraquesemueveenintervalosdeungradovamosamostrarlatemperatura
en los alrededores de la placa (Figura7.7.a). El intervalo de temperatura se ha
establecido entre 20C y 27C, dada la dificultad de enfriar por debajo de 20C y de
calentarporencimade27C.Ademssehanaadidounaseriedefuncionalidadesa
este programa. Si la temperatura supera los 24C, el indicador de la temperatura se
mostrardecolorrojo(Figura7.7.b),ysiestaexcedeoesiguala26C,semostrarun
botn de aviso de alta temperatura (Figura7.7.c). A continuacin mostramos las
posiblescombinacionesdeestapantalla.

a)

b)

c)
Figura7.7:PantallaSecundaria,TemperatureSensor,ProgramaProyecto_1.c
a)Pantallacuandolatemperaturaesinferiora24C.b)Temperaturadelsensorentre24C
y25C.c)Temperaturaigualosuperiora26C.

El cdigo completo de este programa se puede encontrar en la ubicacin


APLICACIONES_FINALES/PANTALLA_TACTIL/PROYECTO_1delCdadjuntoalpresente
proyecto.Estenosehaimprimidodebidoasuextensinyaquecontienemsdedos
millneasdecdigo.
176

CAPTULO7.APLICACIONESDESARROLLADAS

7.3. PANTALLA TCTIL Y ACELEROMETRO

Una vez visto el programa anterior, vamos a proceder a incorporar un


acelermetro a nuestros programas, calibrndolo primero y realizando una serie de
aplicacionesmedianteelusodelapantallatctil.

7.3.1. ASPECTOS A TENER EN CUENTA PARA ELABORAR EL PROGRAMA

Como dijimos en el captulo 6, la pantalla tctil se poda conectar bien al


sistema de de desarrollo Explorer16 o bien a la I/O Expansion Board, ambas
mediante el uso del bus PICtail Plus. Para este programa conectaremos la pantalla
grficaalaI/OExpansionBoardpuesmedianteestatarjetavaaresultarmuchoms
fcil acceder a los pines del microcontrolador para poder conectar el acelermetro.
Adems, como podemos ver en la siguiente figura, colocaremos directamente el
Starter Kit PIC32 en el zcalo reservado para ello, por lo que no ser necesario
utilizareladaptadorcomoenloscasosanteriores.
Accesoa
todoslos
pinesdel
PIC32

Interfazde
expansin
modularde
120pinspara
StarterKIT
PIC32

Figura7.8:I/OExpansionBoard.

El acelermetro, dispone nicamente de 5 pines (ver Anexo C), estos son:


alimentacin,tierra,yvoltajedesalidaenlostresejes.Laalimentacinlatendremos
quecolocaraunodelospinesdelatarjetadeexpansinquenosproporcione+5Vyla
tierra a un pin que vaya a masa. Por otra parte, las salidas del acelermetro las
tendremos que conectar a tres canales cualesquiera de entrada del modulo
Analgico/Digital. Por tanto, fijndonos en la figura anterior nos damos cuenta que
solovamosanecesitarlahileraJ11(lasituadamsaladerecha),yaqueenestavamos
ateneraccesoatodoslassealesquenecesitamos.
177

CAPTULO7.APLICACIONESDESARROLLADAS

Para poder conectar el sensor a la placa de expansin, lo primero que


realizamos fue soldar a la tarjeta en la que se encontraba el acelermetro 5 cables
parapoderaccederaellosdeunaformamscmoda.Porotraparte,sesoldenla
placa de expansin un conector para poder acceder a los pines comentados en el
prrafoanterior,elcuallocolocamosnicamenteenlahileraJ11,talycomopodemos
ver en la siguiente figura (en la figura se han sealado las seales a la que vamos a
conectarnuestroacelermetro).

Figura7.9:I/OExpansionBoardconconectorsoldado.

De tal forma que el conjunto placa de expansin y acelermetro quedar


conectadodelasiguienteforma:

Figura7.10:ConexindelacelermetroalaI/OExpansionBoard.
178

CAPTULO7.APLICACIONESDESARROLLADAS

7.3.2. ESTRUCTURA DEL PROGRAMA

Aligualqueenelprogramaanterior,estevaaconstardeunapantallaprincipal
atravsdelacualvamosaaccederalasdemspantallassecundarias,calibracindel
sensor,lecturadelsensorentiemporeal,deteccindegolpes,juegodelapelota,etc.
Tambin, vamos a organizar nuestro programa a travs de una serie de estados
asociadosacadapantalla,detalmaneraquelosestadosasociadosacadaunodelas
pantallassonlossiguientes:

Como podemos ver el diagrama anterior, la estructura y organizacin del


programaesmuysimilaralanterior.AdemstantolafuncinGOLMsgCallback()como
lafuncinGOLDrawCallback()vanaestarestructuradasdelamismaformaqueantes:
179

CAPTULO7.APLICACIONESDESARROLLADAS
WORD GOLMsgCallback(WORD objMsg, OBJ_HEADER* pObj, GOL_MSG* pMsg){
/* beep if button is pressed
if(objMsg == BTN_MSG_PRESSED)
Beep();*/
// process messages for demo screens
switch(screenState){
case DISPLAY_BUTTONS:
return MsgButtons(objMsg, pObj);
case DISPLAY_CALIBRATEZ: //Calibrate
return MsgCalibrationZ(objMsg, pObj);
case DISPLAY_CALIBRATEX:
return MsgCalibrationX(objMsg, pObj);
case DISPLAY_CALIBRATEY:
return MsgCalibrationY(objMsg, pObj);
case DISPLAY_CALIBRATE:
return MsgCalibration(objMsg, pObj);
case DISPLAY_READ:
return MsgRead(objMsg, pObj);
case DISPLAY_SLIDE_ACEL:
return MsgSlideAcel(objMsg, pObj);
case DISPLAY_SHOCK:
return MsgShock(objMsg, pObj);
case DISPLAY_ANGLES:
return MsgAngles(objMsg, pObj);
case DISPLAY_APP:
return MsgAPP(objMsg, pObj);
case DISPLAY_LEVEL:
return MsgLevel(objMsg, pObj);
default:
return 1;
}
}//GOLMsgCallback
/////////////////////////////////////////////////////////////////////////////
// Function: WORD GOLDrawCallback()
/////////////////////////////////////////////////////////////////////////////
WORD GOLDrawCallback(){
OBJ_HEADER *pObj;
// used to change text in Window
SLIDER
*pSld;
// used when updating date and time
LISTBOX
*pLb;
// used when updating date and time
static DWORD prevTick = 0;
// keeps previous value of tick
static DWORD prevTime = 0;
// keeps previous value of time tick
WORD
i;
switch(screenState){
case CREATE_BUTTONS:
CreateButtons();
screenState = DISPLAY_BUTTONS;
return 1;
case DISPLAY_BUTTONS:
return 1;

// create window and buttons


// switch to next state

// redraw objects if needed

180

CAPTULO7.APLICACIONESDESARROLLADAS

case CREATE_CALIBRATEZ:
CreateCalibrationZ();
screenState = DISPLAY_CALIBRATEZ;
return 1;
case DISPLAY_CALIBRATEZ:
return 1;
case CREATE_CALIBRATEX:
CreateCalibrationX();
screenState = DISPLAY_CALIBRATEX;
return 1;
case DISPLAY_CALIBRATEX:
return 1;
case CREATE_CALIBRATEY:
CreateCalibrationY();
screenState = DISPLAY_CALIBRATEY;
return 1;
case DISPLAY_CALIBRATEY:
return 1;
case CREATE_SHOW_CALIBRATE:
CreateCalibration();
screenState = DISPLAY_CALIBRATE;
return 1;
case DISPLAY_CALIBRATE:
return 1;
case CREATE_READ:
CreateRead();
screenState = DISPLAY_READ;
return 1;
case DISPLAY_READ:
if((tick-prevTick)>20){
ActRead();
prevTick = tick;
}
return 1;

// create window and buttons


// switch to next state

// redraw objects if needed

// create window and buttons


// switch to next state

// redraw objects if needed

// create window and buttons


// switch to next state

// redraw objects if needed

// create window and buttons


// switch to next state

// redraw objects if needed

// create window and buttons


// switch to next state

// redraw graph

case CREATE_SLIDE_ACEL:
CreateSlideAcel();
// create window and buttons
screenState = DISPLAY_SLIDE_ACEL;
// switch to next state
return 1;
case DISPLAY_SLIDE_ACEL:
if((tick-prevTick)>20){
ActSlideAcel();
// redraw graph
prevTick = tick;
}
return 1;
case CREATE_SHOCK:
CreateShock();
// create window and buttons
screenState = DISPLAY_SHOCK;
// switch to next state
return 1;
case DISPLAY_SHOCK:
if((tick-prevTick)>20){
ActShock();
// redraw graph
prevTick = tick;
}
return 1;

181

CAPTULO7.APLICACIONESDESARROLLADAS
case CREATE_ANGLES:
CreateAngles();
// create window and buttons
screenState = DISPLAY_ANGLES;
// switch to next state
return 1;
case DISPLAY_ANGLES:
if((tick-prevTick)>20){
ActAngles();
// redraw graph
prevTick = tick;
}
return 1;
case CREATE_APP:
CreateAPP();
// create window and buttons
screenState = DISPLAY_APP;
// switch to next state
return 1;
case DISPLAY_APP:
ActAPP();
// redraw graph
return 1;
case CREATE_LEVEL:
CreateLevel();
screenState = DISPLAY_LEVEL;
return 1;
case DISPLAY_LEVEL:
return 1;
}
}//GOLDrawCallback

// create window and buttons


// switch to next state

Comopodemosobservar,estasdosfunciones,nosvanapermitirorganizarnuestro
cdigodelprogramallamandoalafuncinconcretaparacrearunaseriedeobjetoso
bienparaactualizarestos,medianteelusodelosestadosdepantalla.

7.3.3. FUNCIONAMIENTO DEL PROGRAMA

Una vez aclarada la estructura, vamos a ver que realiza cada una de las
pantallasmencionadasanteriormente.

Lapantallaprincipaleslapantallamediantelacualvamosapoderaccederalas
demspresionandoelbotnquequeramos,sobreesta,tambinsehaincorporadoel
logodelaUMHenlapartesuperiorizquierdadelamisma.Acontinuacinmostramos
unaimagendeestapantallaprincipal.

182

CAPTULO7.APLICACIONESDESARROLLADAS

Figura7.11:Pantallaprincipal,ProgramaAPP.c

Loprimeroquetenemosquerealizarunavezconectamosacorrienteelsistema
escalibrarelacelermetro,primerbotn(Calibrate),talycomosehadetalladoenel
AnexoC.Paraconfigurarlotenemosquecolocarelacelermetroentresposiciones,las
cuales nos las irn indicando por pantalla, de tal forma que una vez colocado en la
posicin descrita le daremos a Save, para que guarde los valores que necesitamos
obtener en los tres ejes. Esos valores que tenemos que obtener son, el valor del
acelermetro cuando se detecta una aceleracin de 1 g, as como el valor cuando la
aceleracinencadaejeesde0g,offset.
Unavezcalibradoelsensorsemostrarporpantallalosvaloresobtenidospara
cada ejecuando la aceleracin medida es de1 g y de 0 g, que son los parmetros a
calibrar.Enlasiguientefiguramostramoslapantalladelaprimeraposicinacalibrar
ascomolosresultadosobtenidosdelacalibracin.

a)

b)

Figura7.12:Calibracindelsensor,ProgramaAPP.ca)Primeraposicinacalibrar.
b)ResultadosdeCalibracin.
183

CAPTULO7.APLICACIONESDESARROLLADAS

Si presionamos sobre el segundo botn (Read), vamos a poder leer los


valores que obtenemos a travs del modulo A/D respecto cada eje en tiempo real.
Comopodemosobservar,alirvariandoelacelermetrodeposicin,losvaloresvana
variarentreeldatodecalibracinobtenidoparacadaejecuandolaaceleracinesde
1gyentreeldobledeladiferenciaentreelvalorpara1gyelvalorobtenidopara
cada eje en la calibracin de 0 g, es decir, el rango de valores estar comprendido
entre:
(1g,1g=1g2*(1g0g))
Acontinuacinmostramosestapantallaenlasiguientefigura:

Figura7.13:Lecturadevalores,ProgramaAPP.c.

La tercera pantalla (Display) nos permite visualizar de una forma grfica el


valorentiemporealdecadaejemientrasqueobservamoselvalordecadaunoenla
parte superior. El slide se generar de acuerdo a los parmetros de calibracin,
estableciendosusvaloresmximosymnimosdeacuerdoalrangovistoanteriormente
(Figura7.14).

Figura7.14:Pantalladisplay,ProgramaAPP.c.

184

CAPTULO7.APLICACIONESDESARROLLADAS

Lacuartapantalla(Shock)nosvaadetectargolpesencadaunodelosejes,es
decir,elprogramaestalaesperadequeseproduzcauncambiobruscoenlosvalores
decadaejeunavezquegolpeemosalgunodeellos.Unavezexisteunshock(golpe),
se mostrar por pantalla el eje en el que se ha producido. La mayor o menor
sensibilidad ante estos golpes se puede controlar mediante la variable umbral, un
valormayorsecorresponderconungolpemayorparaqueesteseadetectado.Sise
coloca un valor excesivamente bajo, cualquier mnimo movimiento del sensor, se
corresponder con un golpe mientras que no ha sido as. A continuacin mostramos
unaimagendeestapantalla.

a)b)
Figura7.15:Pantallashock,ProgramaAPP.ca)Esperandoaunshockenalgunodelos
ejes.b)ShockproducidoenelejeX.

Porotraparte,sipulsamossobreelbotn(Angles),vamosapodervisualizar
los ngulos de cada eje respecto a su posicin de offset (aceleracin igual a 0 g), es
decir,cuandoelvalordelaaceleracinseamxima(1g)marcar90gradosycuando
seamnima(1g)90grados.Pararepresentarlosgradosnegativosypositivosdecada
eje hemos utilizado el objeto meter, sin embargo, hemos tenido que modificar su
librerapuesestaestabarealizadaparafuncionarnicamenteconnmerospositivos,
creandolanuevalibrerameter_sens.hymeter_sens.c.Portantoparapoderusar
este nuevo objeto, tendremos que colocar estos dos archivos anteriores en las
carpetas en las que se encuentran los archivos .c y .h de nuestros objetos.
Adems, en el archivo Graphics.h, hay que modificar la librera meter.h anterior
porlanuevaquehemoscreado,meter_sens.h.Tambin,enlapartesuperiordela
pantalla,semuestraelngulodecadaejemedianteuntextodinmico(Figura7.16).

185

CAPTULO7.APLICACIONESDESARROLLADAS

Figura7.16:Lecturadengulos,ProgramaAPP.c.

Porltimo,sipresionamossobreelltimobotn(Game),vamosapoderver
eljuegocreadodeunapelotacontroladaporelacelermetro.Elobjetivoesmantener
la bola dentro de un cuadro rojo, una vez que sobrepasemos este recuadro el juego
habrterminadoypodremoscomenzardenuevo.
Portanto,estabolasemoverenfuncindelainclinacindelosejesXeY,de
talformaqueelejeXcontrolarlaposicinhorizontaldelabolayelejeYlaposicin
verticaldelamisma.Esdecir,sielngulodelejeYespositivo,labolasemoverhacia
arriba,porelcontrariosiesnegativohaciaabajo.Delamismamanerasucederconel
ejeX,siesteesnegativosemoverhacialaizquierdaysiespositivohacaladerecha.
Adems,dependiendodelainclinacindelsensor,labolasemoveraunavelocidadu
otra,amayorinclinacinconrespectoacualquieradelosdosejes,labolasemover
msrpidaenesadireccin.
Primeramente, el juego consta de un mensaje de bienvenida y de una
explicacin de las instrucciones del mismo (Figura 7.17a y Figura 7.17.b
respectivamente), como se mueve la pelota con el acelermetro. Una vez ledas las
instrucciones se nos mostrar automticamente una pantalla para elegir el nivel de
dificultaddelmismo(Figura7.17.c).Existentresnivelesdedificultad,nivelalto,medio
ybajo,detalmaneraqueamayornivelmsdifcilsercontrolarlapelotadentrode
nuestro cuadrado. Elegido el nivel de dificultad se nos mostrar por pantalla que el
juego est a punto de comenzar, momento a partir del cual podremos comenzar a
moverlapelotadentrodenuestrapantalla(Figura7.17.d).Eljuegofinalizarunavez
toquemosunadelasparedesdenuestrorecuadro,indicndonoseltiempototalque
hemos estado jugando en segundos (Figura 7.17.e). A continuacin mostramos 5
imgenesdeljuegocorrespondindoseacadaunadelaspartesdelmismo.

186

CAPTULO7.APLICACIONESDESARROLLADAS

a)b)

c)d)

e)
Figura7.17:Juegodelapelota,ProgramaAPP.ca)Mensajedebienvenidaaljuego.
b)Instruccionesdeljuego.c)Seleccindelniveldedificultad.d)Pantalladeljuego.
e)Mensajefinalconeltiempoenejecucin.

Al igual que el programa anterior, el cdigo completo de este programa se


puede encontrar en el CD adjunto al presente proyecto en la siguiente ubicacin
APLICACIONES_FINALES/PANTALLA_TACTIL+ACELEROMETRO/APP,
pues
este
tampocosehaimprimidodebidoasuextensin.
187

Manejo de una pantalla tctil con el PIC32 para el


control de dispositivos externos.

8.

CONCLUSIONES Y TRABAJOS
FUTUROS

CAPTULO8.CONCLUSIONESYTRABAJOS
FUTUROS

El presente Proyecto Fin de Carrera se ha centrado en el desarrollo de


aplicaciones prcticas mediante la programacin de microcontroladores PIC de gama
alta.
Este proyecto presenta los equipos, herramientas de Microchip, programas y
documentos necesarios para implementar el control de una pantalla tctil con un
microcontroladorPIC32.Adems,hemospretendidodestacarlafacilidadconlaquees
posibletrabajarconunmicrocontroladordeestapotencia.
Porloexpresadoanteriormentelaelaboracindelpresenteproyectosirvepara
comprenderunpocomslateoradelosmicrocontroladoresysuaplicacin;deahla
importancia del mismo, donde se puede apreciar lo interesante que es la
programacinennuestravidacotidiana.
Como trabajo futuro o continuacin del presente proyecto y tras el resultado
bastantesatisfactoriodelaspruebasrealizadas,seabrelapuertaparalarealizacinde
aplicacionesmssofisticadas.
En concreto se ha pensado en la adquisicin de video a travs de la placa de
expansinUSB[21],utilizandoelPIC32MX460F512L.Lafigura8.1muestralaplacade
expansinUSBlacualsepuedeconectaralsistemadedesarrolloExplorer16atravs
del conector PICtail plus y la figura 8.2 presenta un esquema del sistema propuesto.
Sin embargo, habra que solucionar el problema de incompatibilidades al usar esta
placaUSBconlatarjetagrfica[22].

Figura8.1:USBPICtailPlusDaughterBoard.
191

CAPTULO8.CONCLUSIONESYTRABAJOSFUTUROS

Figura8.2:Estructurapropuestaparalacaptacindevideo.

Finalmente,destacarqueotradelasposiblesampliacioneseseldesarrollode
programas para la teleoperacin de un robot mvil (Moway) a travs del dispositivo
tctilusadoenesteproyecto.

Para concluir, recalcar que este proyecto fin de carrera puede servir como
puntodereferenciaparaeldesarrollodelasampliacionesindicadas,ascomodeotros
trabajosfuturos.

192

Manejo de una pantalla tctil con el PIC32 para el


control de dispositivos externos.

ANEXO A. DISEO DE LA MEMORIA


DEL PIC32

ANEXOA.DISEODELAMEMORIADELPIC32

A.1.INTRODUCCIN

En el presente anexo, se describe la manera de configurar la memoria del


PIC32.

A.1.1. REGISTROS DE CONTROL

PrimerovamosaverlosregistrosSFRsquehayqueusarparaconfigurarlaRAM
ascomolasparticionesdelamemoriaflashtantoparadatoscomocdigo(enambos
modos,userykernel).

FiguraA.1:RegistrosSFRsparaconfigurarlamemoriadelPIC32.
195

ANEXOA.DISEODELAMEMORIADELPIC32

TodoslosregistrosqueterminanenCLR,SEToINV,sonregistrosusadosparala
manipulacin de los bits del registro que precede a su nombre. Por ejemplo, si
tenemos el registro BMXCONCLR, pondr a 0 los bits correspondientes al registro
BMXCON que hayamos escrito como 1 en los bits de BMXCONCLR. Es decir,
BMXCONCLR=0x00000101pondra0losbits15y0delregistroBMXCON.
DeigualmanerafuncionanlosregistrosterminadosenSETquepondrna1los
bitscorrespondientes,olosterminadosenINV,queinvertirnlosbits.
Estas funciones nos permiten configurar los siguientes registros BMXCON,
BMXDKPBA, BMXDUDBA, BMXDUPBA y BMXPIPBA, mediante el uso de sus
correspondientesfuncionesclear,setoinvert.
Tambin existen registros de solo lectura como BMXDRMSZ, el cual indica el
tamaodelaRAMdedatosenbytes,ennuestrocaso0x00008000,queequivaleaque
nuestro dispositivo posee 32KB de RAM. Del mismo modo BMXPFMSZ, nos indica el
tamao de la memoria flash de programa (PFM) en bytes, en nuestro caso
0x00080000, dispositivo de 512KB. Por ltimo, el registro BMXBOOTSZ, nos indica el
tamaodelamemoriaflashbootenbytes,12KB.
Porotraparte,medianteelregistroBMXPUPBA,vamosasercapacesdedefinir
la direccin de la base para el PFM en modo usuario. Para configurar la direccin
tenemos32bits,noobstante,desdeelbit31al20noestnimplementados.Adems
sehaforzadoaquesetomenvaloresenincrementosde2KB,yaquesus11primeros
bits(100)sonforzadosa0,porloquesolotenemosdelbit19al11(9bits)disponibles
paraconfigurarnuestradireccindelabasedelamemoriadeprogramaflash.Enla
imagensemuestraelregistroBMXPUPBA:

FiguraA.2:RegistroBMXPUPBAasociadoalamemoriaflashdeprograma.
196

ANEXOA.DISEODELAMEMORIADELPIC32

A.2. DISEO DE LA MEMORIA PIC32

ElPIC32implementadosespaciosdedireccionesunavirtualyotrafsica.Todos
los recursos hardware as como la memoria de programa, memoria de datos y
perifricos estn localizados con sus respetivas direcciones fsicas. Mientras que las
direccionesvirtualessonexclusivamenteusadasporlaCPUparacargar,leeryejecutar
lasinstrucciones.Portanto,lasdireccionesfsicassonusadasporlosperifricoscomo
DMA y los controladores flash que acceden a la memoria independientemente de la
CPU.
Los 4GB del espacio de direcciones virtuales se dividen en dos regiones
primarias,espaciodeusuarioykernel.Los2GBmsbajosdelespaciodelsegmentode
memoria del modo usuario, se llama useg/kuseg. Una aplicacin en modo usuario
deberesidiryejecutarseenestesegmentoelcualesttambinaccesibleparatodas
lasaplicacionesenelmodokernel.Esteeselporqudequesellamenindistintamente
usegykuseg.
Porotraparte,los2GBmsaltosocupanelespaciodedireccionesvirtualesdel
kernel.Adems,esteespaciosedivideasuvezen4segmentosde512MBcadauno,
kseg0,kseg1,kseg2ykseg3.Sololasaplicacionesenmodokernelpuedenaccedera
esteespaciodememoria,elcualincluyetodoslosregistrosperifricos.
Tambinhayquetenerencuentaquesolokseg0ykseg1sealanarecursos
dememoriarealesmientrasqueelsegmentokseg2soloestaaccesibleparaelEJTAG
deldebugger.Portanto,elPIC32solousalossegmentoskseg0ykseg1,demanera
que, Boot Flash Memory (BFM), Program Flash Memory (PFM), Data RAM Memory
(DRM)ylosregistrosperifricosestnaccesiblesdesdekseg0obiendesdekseg1.

FiguraA.3:DivisindelamemoriadelPIC32,regionesprimarias.
197

ANEXOA.DISEODELAMEMORIADELPIC32

Por otra parte, la unidad FMT es la encargada de trasladar los segmentos de


memoria a sus correspondientes regiones de memoria fsica. Un segmento de la
memoria virtual puede ser cacheada, lo nico que esta solo se puede realizar en los
segmentoskseg0ouseg,yaqueelsegmentodememoriakuseg1noloes.
Adems,lossegmentoskseg0ykseg1sonsiempretrasladadosaladireccin
fsica0x0.EstopermitequelaCPUaccedaalasmismasdireccionesfsicasdesdedos
direcciones virtuales separadas, una desde kseg 0 y la otra desde kseg 1. Como
resultado, la aplicacin puede elegir ejecutar el mismo trozo de cdigo desde la
memoriacache o no (tal y como hemos visto antes). No obstante hay que tener en
cuentaquelosperifricosdelPIC32sonsolovisiblesatravsdelsegmentokseg1,no
cache.

FiguraA.4:Mapeodelamemoriavirtualalafsica.

198

ANEEXOA.DISE
ODELAMEEMORIADELPIC32

A
A.2.1.
CLC
CULO DE LA
L DIRECC
CIN FSIC
CA A VIRTU
UAL Y VIC
CEVERSA

A contin
nuacin vam
mos a desccribir las op
peraciones que hay que realizar para
cono
ocerunadireccinfsicaovirtualeenfuncind
deladireccindelacu
ualpartamo
os:

Para transformaarunadirecccindelke
ernel(KSEG
G0oKSEG1))aunadire
eccin
u
operaciin AND de
d la direcccin virtual con
fsicaa, hay que realizar una
0x1FFFFFFFF.
Para pasar unaa direccin fsica a una direcci
n virtual K
KSEG0, hayy que
realizzarunaopeeracinORcconladirecccinfsicayy0x80000000.
Para pasaruna direccinfsicaaKSEG
G1,hayqueerealizarun
naoperaci
nOR
conlladireccinfsicay0xA
A0000000.
ParapasarunadireccindeKSEG0aK
KSEG1,hayquerealizaarunaoperacin
ORconladirecccinvirtualdeKSEG0yy0x2000000
00.

A
A.2.2.
PART
TICIN DE
E LA MEMO
ORIA FLAS
SH DE PRO
OGRAMA

Cuando hay un reeset, la particin en modo usu


uario no exxiste, por tanto
BMX
XPUPBA es inicializado a 0 y todaa la memoria de proggrama flash
h es mapeaada al
modokernelen
nelespaciodeprogram
ma,empezaandoporladireccinvvirtualenKSSEG1:
0xBD
D000000 (o KSEG0, 0x9D000000). Para establecer una particin p
para el mod
do de
usuario, hay que in
nicializar BMXPUPBA
A como: BMXPUP
PBA=BMXPFFMSZ
USER
R_FLASH_PG
G_SZ.Com
mohemosvistoennue
estrocasoB
BMXPFMSZ0
0=0x00800
0000,
porttanto:
BMXPUP
PBA=0x0080
00000USER
R_FLASH_PG
G_SZ,dondeUSER_FLA
ASH_PG_SZZesel
tamaaodelapaarticindelprogramaeenmodoussuario.
Ejemplo,, queremos disear una particcin de 20
0KB (0x500
00), por lo
o que
tendremosquerealizarlassiguienteop
peracin:
BM
MXPUPBA=0x008000000x5000=0xx7B000.
Y por tanto la direcccin inicial y final de la particin de la m
memoria flassh en
modousuarioseer:

Useer
Flash

0x7D07FFF
0
FF
0x7D07B0
0
00

199

20KB

ANEX
XOA.DISEO
ODELAMEM
MORIADELP
PIC32

Mientrass que la paarticin en el modo kernel


k
vend
dr condicio
onada a 51
12KB
20KB
B=492KB. Entonces
E
tendremos que para las dos particioness, su rango de
direcccionesser:

KSEG
G0

0x9D07AF
0
FFF
0x9D0000
0
000

492KB

KSEG
G1

0xBD07AF
0
FFF
0xBD0000
0
000

492KB

A
A.2.3.
PART
TICIN DE
E LA RAM

Lamemo
oriaRAMseepuededividiren4particionesdistintas:

Dato
osKernel
ProgramaKerneel
Dato
osUsuario
ProgramaUsuarrio

utar los datos de la RA


AM, habr que definirr previamen
nte la
Con el fiin de ejecu
particindelprogramausu
uariookern
nel.Enesttecasotam
mbin,cuand
dohayunrreset,
d Kernel. Para realizzar la
toda la RAM dee datos se asigna a laa particin de datos del
particin de la RAM, tend
dremos quee programar los siguieentes registtros BMXDK
KPBA,
XDUDBA y BMXDUPBA
B
A. Adems, tal y como
o hemos visto antes, el tamao de la
BMX
RAM
Mvienedado
oporBMXD
DRMSZ,queeennuestro
oPICesde3
32KB.

Considerracionessob
brelaparticcindelam
memoriaRA
AM:

Lapaarticinde laRAMde programa enmodokernelesrequeridasiempre


que sea necesaario ejecutarse el proggrama desdee la RAM d
de datos en
n este
modo.Hayqueetenerencuentaquettrasunreseetestapariccinnoexiste.
Poro
otraparte, habrque crearunap
particindeelaRAMdeedatosenm
modo
usuaario,paraqu
uelasaplicaacionessee
ejecutenenestemodo
o.Tampocoe
existe
trasunreset.
200

ANEXOA.DISEODELAMEMORIADELPIC32

La particin de laRAMde programa en modo usuario es requerida por el


mismomotivoqueelprimerpunto,encasodequeseanecesarioejecutar
el programa desde la RAM de datos en modo usuario. Al igual que las
anterioresnoexistedespusdeunreset.

FiguraA.5:EsquemadedireccionesparalaparticindelamemoriaRAM.

Para ms informacin sobre la memoria del PIC32 se puede consultar el


Captulo 3 Memory Organization del documento PIC32MX Family Reference
Manual o bien el Captulo 6 Memory Organization del documento
PIC32PIC32MX3XX/4XX Family Data Sheet, disponibles ambos en la pgina web de
MicrochipascomoenelCDadjuntoalpresenteproyecto.

201

Manejo de una pantalla tctil con el PIC32 para el


control de dispositivos externos.

ANEXO B. CONSIDERACIONES
PRCTICAS PARA PROGRAMAR EL
PIC32

ANEXOB.CONSIDERACIONESPRCTICASPARA
PROGRAMARELPIC32

B.1. INTRODUCCIN

Enelpresenteanexo,sevanadescribirdistintosaspectosatenerencuentaa
la hora de programar sobre el PIC32 que no se han comentado en ninguno de los
captulosdelproyecto.

B.2. VARIABLES

En este apartado vamos a ver la importancia que tiene el usar distintas


variablesparalaejecucindelosprogramas.

AlahoradeprogramarmedianteelMPLABC32,podemoselegirentre10tipos
dedatosenterosdiferentes,char(8),short(16),int(32)long(32)ylonglong(64)consus
correspondientesvariantessinsigno(unsigned),verlasiguientetabla:
Tipo
Bits
Min
Max
char,signedchar
8
128
127
unsignedchar
8
0
255
short,signedshort
16
32768
32767
unsignedshort
16
0
65535
31
int,signedint,long,signedlong
32
2
2311
unsignedint,unsignedlong
32
0
2321
longlong,signedlonglong
64
263
2631
unsignedlonglong
64
0
2641
TablaB.1:ComparacindelasvariablesenterasdisponiblesenelMPLABC32.
Talycomopodemosobservarenlatablaanterior,cuandoelvaloresconsigno
se va a dedicar un bit para evaluar el signo. Tambin podemos comprobar que int y
longsonsinnimospuesambosocupan32bits(4bytes).Dehecho,talycomohemos
vistoenelcaptulo2,lasoperacionesconvalores8,16bitso32bitsseprocesanenel
mismotiempoporlaALU,sinembargo,cuandolasdefinamostipolongeltiempoen
procesar una operacin va a aumentar considerablemente as como la cantidad de
RAMocupadaporcadaunodeellos.Vemosloconunejemplo:
205

ANEXOB.CONSIDERACIONESPRCTICASPARAPROGRAMARELPIC32

main (){
int i1, i2, i3;
long long ll1, ll2, ll3;
i1=1234; //test para enteros int de 32 bits
i2=5678;
i3=i1*i2;
ll1= 1234; // test para enteros long long de 64 bits
ll2= 5678;
ll3=ll1*ll2;
} //main

Unavezcompiladoelproyectoabrimoselcdigogeneradoporelcompilador
(Disassembly Listing) para observar la diferencia entre el cdigo necesario para
ejecutarseconlavariableenteratipointytipolonglong.
11:
i1=1234; //test para enteros int de 32 bits
9D000024 240204D2 addiu
v0,zero,1234
9D000028 AFC20000 sw
v0,0(s8)
12:
i2=5678;
9D00002C 2402162E addiu
v0,zero,5678
9D000030 AFC20004 sw
v0,4(s8)
13:
i3=i1*i2;
9D000034 8FC30000 lw
v1,0(s8)
9D000038 8FC20004 lw
v0,4(s8)
9D00003C 70621002 mul
v0,v1,v0
9D000040 AFC20008 sw
v0,8(s8)
14:
15:
ll1= 1234; // test para enteros long long de 64 bits
9D000044 240204D2 addiu
v0,zero,1234
9D000048 00001821 addu
v1,zero,zero
9D00004C AFC20010 sw
v0,16(s8)
9D000050 AFC30014 sw
v1,20(s8)
16:
ll2= 5678;
9D000054 2402162E addiu
v0,zero,5678
9D000058 00001821 addu
v1,zero,zero
9D00005C AFC20018 sw
v0,24(s8)
9D000060 AFC3001C sw
v1,28(s8)
17:
ll3=ll1*ll2;
9D000064 8FC30010 lw
v1,16(s8)
9D000068 8FC20018 lw
v0,24(s8)
9D00006C 00620019 multu
v1,v0
9D000070 00002012 mflo
a0
9D000074 00002810 mfhi
a1
9D000078 8FC30010 lw
v1,16(s8)
9D00007C 8FC2001C lw
v0,28(s8)
9D000080 70621802 mul
v1,v1,v0
9D000084 00A01021 addu
v0,a1,zero
9D000088 00431021 addu
v0,v0,v1
9D00008C 8FC60018 lw
a2,24(s8)
9D000090 8FC30014 lw
v1,20(s8)
9D000094 70C31802 mul
v1,a2,v1
9D000098 00431021 addu
v0,v0,v1
9D00009C 00402821 addu
a1,v0,zero
9D0000A0 AFC40020 sw
a0,32(s8)
9D0000A4 AFC50024 sw
a1,36(s8)

206

ANEXOB.CONSIDERACIONESPRCTICASPARAPROGRAMARELPIC32

Comopodemosobservarparaelcasodelasvariablestipolonglong,elcdigo
generado es ms grande que para las variables tipo int, ya que para realizar la
operacin de multiplicacin se requiere el uso de ms instrucciones para llevarla a
cabo. Esto es debido a que, como ya comentamos en el captulo 2, la ALU puede
ejecutar operaciones de 32bits de una sola vez. Sin embargo, para operaciones con
datos de 64 bits, en realidad, estas se ejecutan como una secuencia de
multiplicacionesysumasde32bits.
Por otra parte, para el caso de una operacin de divisin obtendramos el
mismoresultado.Elcdigoparalasvariablesenterasdetipochar,shorteint,serael
mismo, mientras que para la variable entera tipo long long, el espacio requerido
aumenta considerablemente respecto a las anteriores, pues para realizar dicha
operacin es necesario llamar a la subrutina jal, la cual est dentro de la librera
libgcc2.c.
Encuantoalasvariablesfraccionalesexistentrestipos:
Tipo

Bits
Float
32
Double
64
Longdouble
64
TablaB.2:ComparacindelasvariablesfraccionalesdisponiblesenelMPLABC32.
No existe ninguna diferencia entre estas dos ltimas, sin embargo, hay que
tenercuidadoaldeclararunavariablefloat,yaqueenelPIC32noexisteunaunidad
especial que trate los datos tipo float y por tanto tiene que ser compilada usando
libreras aritmticas, aumentando el cdigo a usar. Esto se traduce en ms memoria
necesariaparaejecutarelprograma.
Vamos a realizar un anlisis temporal de la funcin de multiplicacin
dependiendodequvariableestimplicadaendichaoperacin,elcdigoaanalizares
elsiguiente(Analisis_Temporal.c):
main (){
char c1, c2, c3;
short s1, s2, s3;
int i1, i2, i3;
long long ll1, ll2, ll3;
float f1, f2, f3;
long double d1, d2, d3;
c1=12; //test para enteros char de 8 bits
c2=34;
c3=c1*c2;
s1=1234; //test para enteros short de 16 bits
s2=5678;
s3=s1*s2;
i1=1234567; //test para enteros long de 32 bits
i2=3456789;
i3=i1*i2;

207

ANEXOB.CONSIDERACIONESPRCTICASPARAPROGRAMARELPIC32

ll1= 1234; // test para enteros long long de 64 bits


ll2= 5678;
ll3=ll1*ll2;
f1= 12,34; //test para single float
f2=56,78;
f3=f1*f2;
d1=12,34; //test para double float
d2=56,78;
d3=d2*d1;
} //main

EnlatablaB.3podemosverdeformamsdetallaelanlisistemporalrealizado
paraunafrecuenciadesimulacinde64MHz.Lasdosltimascolumnasnosmuestran
ladiferenciarelativarespectoalavariableintofloat.
Comopodemosobservar,lasoperacioneshasta32bitsdelasvariablesenteras
son hasta 3 veces ms rpidas que cuando usamos el entero tipo long long.
Evidentemente las operaciones que usan las variables tipo float requieren de ms
tiempoparaejecutarse,llegandoaduplicareltiemponecesariorespectoaestaltima
paraejecutarunaoperacinconformatolongdouble.
Portantopodemosdecirquelaeleccindelasvariablesnosvaaafectartanto
altamaodelcdigodelprogramacomoalavelocidaddeejecucindeeste.
Tipo

Bits

CycleCount Tiempo(s)

Respectoa Respectoa
int
float
char
8
6
0.09375
1

Short
16
6
0.09375
1

Int,long
32
6
0.09375
1

Longlong
64
21
0.328125
3.5

Float
32
51
0.796875
8.5
1
Longdouble
64
97
1.515625
16.5
2
TablaB.3:Anlisistemporaldelasdiferentesvariables,multiplicacin.

Tambin se ha llevado a cabo un analisis temporal del programa anterior


sustituyendolaoperacinmultiplicacinporunadivisin(Analisis_Temporal_II.c),cuyos
resultadosonlossiguientes:

Tipo

Bits

CycleCount Tiempo(s)

Respectoa Respectoa
int
float
char
8
17
0.265625
0.5

Short
16
24
0.375000
0.75

Int,long
32
31
0.484375
1

Longlong
64
67
1.046875
2.2

Float
32
80
1.250000
2.6
1
Longdouble
64
163
2.546875
5.25
2
TablaB.4:Anlisistemporaldelasdiferentesvariables,divisin.
208

ANEXOB.CONSIDERACIONESPRCTICASPARAPROGRAMARELPIC32

B.3. INTERRUPCIONES

Tal y como hemos comentado en el apartado 2.2.3.7, las interrupciones


proporcionan un mecanismo para el control en tiempo real, permitiendo a las
aplicaciones tratar con eventos externos asncronos, las cuales requieren de una
atencinrpidaporpartedelaCPU.
El PIC32 proporciona 64 recursos distintos de interrupciones (Consultar la
siguientereferenciaparaconocerestosrecursos [3]).Detalforma,quecadarecurso
deinterrupcinpuedeteneruntrozodecdigonico,llamandoalarutinadeservicio
de interrupcin (ISR) asociada a l, proporcionando de esta manera la respuesta
requerida.Portanto,lasinterrupcionespuedenserejecutadasdesdecualquierpunto
en un orden impredecible, cambiando la instruccin actual temporalmente para
ejecutarseunprocedimientoespecial.
Lasinterrupcionestienenquesercapacesdesalvarelcontextodelprocesador
antes de tomar cualquier accin y cargarla despus, tal y como estaba antes de que
ocurrieselamisma.EstasaccioneslasrealizaelcompiladorMPLABC32,sinembargo
existenunaseriedelimitacionesquehayquetenerencuenta:

Lasfuncionesdeserviciodelainterrupcinnodevuelvenningnvalor,
sondetipovoid.
Nosepuedenpasarparmetrosalafuncin.
Nopuedenserdirectamentellamadasporotrasfunciones.
No deberan llamar a otras funciones, como recomendacin para una
mayoreficienciadelprograma.

Como hemos comentado, existen 64 recursos de interrupcin los cuales a su


vez pueden generar distintos eventos de interrupcin, de tal forma que en total se
dispone de 96 eventos diferentes que pueden ser controlados por el PIC32.
Evidentemente,cuandovariosrecursosdeinterrupcinestnhabilitados,esnecesario
quelaISRidentifiquecualhasidolainterrupcinquehaocurridoparaqueseejecute
el trozo de cdigo correcto. Para lo cual se van a utilizar varios flags en distintos
registros.
Cada recurso de interrupcin tiene 7 bits de control asociados, agrupados en
variosregistrosespeciales,estosson:

Bit de habilitacin de la interrupcin, (Interrupt Enable,IE). Cuando


esta1,sepodrprocesarlainterrupcin.

209

ANEXOB.CONSIDERACIONESPRCTICASPARAPROGRAMARELPIC32

Bit de interrupcin (Interrupt flag,IF), se activa una vez ocurre el


eventoesperadoporlainterrupcin.Debeserpuestoa0porelusuario
antesdesalirdelaISR.
Nivel de prioridad (Group Priority level, IP). Existen 7 niveles de
prioridad (desde ipl1 a ipl7, 3 bits) de tal forma que si dos
interrupciones ocurren al mismo tiempo se ejecutar la que tenga un
mayorniveldeprioridad.
Niveldesubprioridad.Existen4nivelesmsdeprioridad(2bits)paraun
grupodeprioridadenconcreto.Detalformaquesidoseventosocurren
simultneamente y estos tienen la misma prioridad, el que tenga una
subprioridadmsaltaserelseleccionado.Enelcasodenoconfigurar
lasprioridadesexistenunaspordefecto(consultarelDataSheet).

Para configurar y controlar las interrupciones vamos a usar las siguientes


libreras, plib.h y int.h. Entre las principales funciones de estas libreras podemos
encontrar:

INTEnableSystemSingleVectoredInt(); Esta funcin sigue una secuencia


deinicializacindelmodulodecontroldelainterrupcinparahabilitar
elmanejodelasinterrupcionesdelPIC32.

mXXSEetIntPriority(x); Asigna un nivel de prioridad al recurso de


interrupcinseleccionadoenXX.

mXXClearIntFlag(); permite poner a cero el flag IF, bandera que nos


detectaquerecursodeinterrupcinhasidohabilitado.

Vamos a ver un ejemplo (Interrupciones.c) usando las funciones anteriores.


Para ello en el primer programa vamos a usar una sola interrupcin, la cual va ser
llamada cada vez que se desborde el timer2. Para ello habilitamos el modulo del
Timer2 con una cuenta de 15, de tal forma que cuando se produzca el
desbordamiento, ser atendida por la rutina de servicio de interrupcin (ISR),
incrementandoelvalordelavariablecount.Acontinuacinmostramoselcdigodel
programaempleado:
#include <p32xxxx.h>
#include <plib.h>
int count;
#pragma interrupt InterruptHandler ipl1 vector 0
void InterruptHandler ( void){
count++;
mT2ClearIntFlag();
}// Interrupt Handler

210

ANEXOB.CONSIDERACIONESPRCTICASPARAPROGRAMARELPIC32

main(){
//Timer
PR2=15;
T2CON= 0x8030;
//Interrupcion
mT2SetIntPriority(1);
INTEnableSystemSingleVectoredInt();
mT2IntEnable(1); (*)
//Bucle
while(1);
}//main

Alahoraderealizarelprogramaanteriorhayquetenerencuentadoscosas:

Antesdehabilitarlainterrupcinhayquedeclararlacompletamente(*).
Laprioridadasignadaalainterrupcindebecoincidirconlasintaxisen
ladeclaracindeesta,remarcadoenelprogramaanteriorennegrita.

En el caso de no realizar correctamente los dos puntos anteriores nuestro


programanofuncionaracorrectamente.
Si abrimos la ventana watch del MPLAB y colocamos la variable count,
podremos ver como el valor de esta se va incrementando cada vez que el timer2
alcanzaelvalorseleccionado.

Comosegundoprogramavamosausardosrecursosdeinterrupcinasignando
acadauno deellosdiferentesnivelesdeprioridad.Laprioridaddecidirculdelas
dos interrupciones ser atendida primero si ocurren de forma simultnea. Sin
embargo, cuando una de ellas se est ejecutando, la otra tendr que esperar a que
estatermineparaquesepuedaejecutar.
Noobstante,puededarseelcasoqueseestejecutandounainterrupcinde
un nivel de prioridad bajo, pero que una interrupcin con una prioridad superior
requieraunaatencininmediataporpartedelprograma,interrumpiendolaejecucin
delaprimerainterrupcin.Unavezfinalizadalaejecucindelainterrupcinconun
niveldeprioridadmsaltovolveralainterrupcindenivelmsbajoparaterminarla,
estoesloqueseconocecomonesting.
Enelsiguienteprogramavamosaverdequmanerafuncionaelnesting,para
locualusamoslafuncindelMIPSAsm(ei)lacualnosvaapermitiranidarllamadasa
interrupciones,delocontrarioseejecutaransecuencialmente.Elcdigodelprograma
(Interrupciones_II.c)semuestraacontinuacin:

211

ANEXOB.CONSIDERACIONESPRCTICASPARAPROGRAMARELPIC32

#include <p32xxxx.h>
#include <plib.h>
int count;
void __ISR(0, ipl1) InterruptHandler ( void){
// 1.- Rehabilitamos las interrupciontes (nesting)
asm("ei");
// 2.- Chequeamos primeramente la prioridad ms alta
if(mT3GetIntFlag()){
count++;
//Ponemos a cero el flag
mT3ClearIntFlag();
}// _T3
// 3.- Chequeamos la de ms baja prioridad
else if (mT2GetIntFlag()){
//pasamos aqu el tiempo
while(1);
//quitamos la bandera
mT2ClearIntFlag();
}// _T2
}// Manejo de las interrupciones
main(){
// 4.- Inicializamos los timers
PR3=20;
PR2=15;
T3CON=0x8030;
T2CON=0x8030;
// 5.- Inicializamos las interrupciones
mT2SetIntPriority(1);
mT3SetIntPriority(3);
INTEnableSystemSingleVectoredInt();
mT2IntEnable(1);
mT3IntEnable(1);
//main loop
while(1);
}//main

Lo que realiza este programa es lo siguiente: una vez inicializado los Timers,
asignado las prioridades a las interrupciones (nivel 1 para el timer2 y nivel 3 para el
Timer3) y habilitadas las mismas, entra en un bucle hasta que ocurre la primera
interrupcin,ladelTimer2yaquesucuentaesmenor.Portantoseejecutarelcdigo
de la interrupcin del Timer2. Sin embargo, la ejecucin de esta equivale a un bucle
infinito,porloqueunavezqueelTimer3alcancesucuenta,yalhaberempleadoel
nestingytenerunaprioridadmayor,interrumpirlaejecucindelainterrupcindel
Timer2 para ejecutar ladel Timer3,incrementado el valor de la variable count. Una
vezfinalizadalaejecucindeestainterrupcin,volveraejecutarelcdigodeladel
Timer2,yassucesivamente.

212

ANEXOB.CONSIDERACIONESPRCTICASPARAPROGRAMARELPIC32

El mecanismo de funcionamiento del servicio de interrupcin visto hasta el


momento, es muy similar a como funciona en los anteriores microcontroladores de
Microchip. Hemos utilizado una funcin de interrupcin para ejecutaruna rutinade
serviciodelainterrupcinenfuncindelaquehayasidohabilitada.Estoseconoce
conelnombredeSinglemodevector.Sinembargo,elPIC32ofrecelaposibilidadde
usar vectored interrupts y mltiples registros de interrupcin, para dotar de una
respuestamsrpidaalasinterrupcionesyevitarsobrecargas.Enparticularexisten64
vectores distintos de interrupcin y 2 registros de 32 bits. Los 96 recursos de
interrupcionesquehabamoscomentadoquedisponalaarquitecturadelPIC32estn
agrupadosenlosdistintosvectores(consultarelDataSheet).
Esta nueva posibilidad de asignar un vector separado para cada grupo de
recursos de interrupcin elimina la necesidad de testear secuencialmente todos los
posiblesrecursosdeinterrupcinparaencontrarelquenecesitaejecutarse.Esdecir:

Singlemodevector:Todaslasrespuestasdeinterrupcinsonejecutadas
desdeelmismovectordeinterrupcin,vector0.
Multivector mode: Las respuestas de interrupcin son ejecutadas
desdeelvectordeinterrupcincorrespondiente.

Portanto,elprologodeunainterrupcin(secuenciadecomandosquehayque
ejecutarantesdepasaralainterrupcinpropiamente),severeducidaconestaforma
de controlar las interrupciones. Adems, podremos seguir usando el nesting para
ejecutarlasinterrupcionesdealtaprioridaddeunaformamsrpida.
Para programar las interrupciones usando este nuevo modo, tenemos que
tenerencuentaquecadainterrupcintienesupropiafuncin,enlacualtendremos
quecolocarelnmerodelvector,estesepuedeconsultarenelDataSheet.Adems,
como ahora ya no hay que comprobar que interrupcin ha sido la que ha
incrementadosubandera,yaqueserealizaimplcitamente,cadafuncinserllamada
cuandosehayadesbordadosubanderacorrespondiente.Yelltimocambioesque
para inicializar el Multivector mode tendremos que usar otra funcin de
inicializacin.Vamosarealizarestoscambiosrespectoalprogramaanterior,loscuales
estnremarcadosennegrita,programaMultivectored.c.
#include <p32xxxx.h>
#include <plib.h>
int count;
void __ISR( _TIMER_3_VECTOR , ipl7) T3InterruptHandler ( void){
// 1.- T3 incrementa la cuenta
count++;
// 2.- Ponemos a cero el flag
mT3ClearIntFlag();
}// _T3
void __ISR( _TIMER_2_VECTOR , ipl1) T2InterruptHandler ( void){

213

ANEXOB.CONSIDERACIONESPRCTICASPARAPROGRAMARELPIC32

// 3.- Rehabilitamos las interrupciones (nesting)


asm("ei");
// 4.- Cdigo del T2
while(1);
// 5.- quitamos la bandera y salimos
mT2ClearIntFlag();
}// _T2
main(){
// 6.- Inicializamos los timers
PR3=20;
PR2=15;
T3CON=0x8030;
T2CON=0x8030;
// 7.- Inicializamos las interrupciones
mT2SetIntPriority(1);
mT3SetIntPriority(7);
INTEnableSystemMultiVectoredInt();
mT2IntEnable(1);
mT3IntEnable(1);
//main loop
while(1);
}//main

B.3.1. MDULO RTCC

La familia de microntroladores PIC32MX dispone de un modulo RTCC (Real


Time clock and Calendar), el cual funciona en modo de bajo consumo y nos va a
permitirgenerarinterrupcionesenelmes,da,hora,minutoysegundoquequeramos
una vez al ao. Este modulo tambin dispone de otras caractersticas y ms
funcionalidades que sepueden consultar en elCapitulo 21 de la siguiente referencia
[3].
Paraconfigurarlohayqueaccederaunaseriederegistrosenelordencorrecto
yrellenarlosconlosdatosadecuados.Acontinuacinmostramosunejemplodecmo
accederaestosregistrosyconfigurarelmoduloRTCCparagenerarunainterrupcin
enlafechaquequeramos:
RtccInit();
// inicializar el RTCC
// Poner en hora
rtccTime tm; tm.sec=0x15; tm.min=0x30; tm.hour=01;
// Poner los datos actualese
rtccDate dt;
dt.wday=0; dt.mday=0x15; dt.mon=0x10; dt.year=0x07;
RtccSetTimeDate(tm.l, dt.l);
// alarma deseada para Feb 29th
dt.wday=0; dt.mday=0x29; dt.mon=0x2;
RtccSetAlarmTimeDate(tm.l, dt.l);

214

ANEXOB.CONSIDERACIONESPRCTICASPARAPROGRAMARELPIC32

B.3.2. OTRAS FUNCIONES TILES

Tambinpuededarseelcasodequequeramosqueuntrozodenuestrocdigo
requiera que todas las interrupciones estn temporalmente deshabilitadas, para lo
cualpodremosusarlossiguientescomandos:
Asm(di);
// Cdigo protegido aqu
Asm(ei);

O bien podemos utilizar las siguientes dos funciones de la librera plib.h las
cualesnosaportaninformacinadicionalrespectoalasanteriores:

INTDisableInterrupts(); deshabilita las interrupciones y nos devuelve el


valor correspondiente a los estados de las interrupciones antes de
ejecutarelcdigoquequeremosproteger.
INTRestoreInterrupts(status); restaura el estado del sistema original
pasandocomovariableelestadodevueltoporlaanteriorfuncin.

Luegolasinterrupcionesnosproporcionanunaherramientamuyflexiblepara
programas de control embebidos, destinadas a ayudar y manejar mltiples tareas
mientrasexisteuncontroldeltiempoascomodelosrecursos.

B.4. CONFIGURACIN DEL PIC32

En este apartado vamos a estudiar los distintos relojes del sistema y como
configurarlosydequformasacarleelmayorusoalamemoriacachedelsistema,dos
aspectosnuevosenlaarquitecturahardwaredelPIC32.
Como se puede observar en el captulo 2, concretamente en el apartado
2.2.6.3,existenhasta5osciladoresparaproporcionarnosunasealdeentradaconla
frecuencia,elconsumoylaprecisinquequeramos.
En todas las aplicaciones nos va a interesar controlar tanto el rendimiento
como el consumo. El consumo nos determina el tamao y el coste de la potencia a
suministrar.Mientrasqueelrendimientonosdeterminacuantotrabajopuederealizar
nuestra aplicacin en un periodo de tiempo. Aumentar la velocidad del reloj
aumentareltrabajoproducidoperoaumentaratambinelconsumodeldispositivo.

215

ANEXOB.CONSIDERACIONESPRCTICASPARAPROGRAMARELPIC32

Paraayudarnosaobtenerunbuencontroldelconsumo,elmodulodelrelojdel
PIC32nosofrecelassiguientescaractersticas:

Cambioentiemporealentreosciladorinternoyexterno.
Controlentiemporealdetodoslosdivisoresdelosrelojes
ControlentiemporealdelcircuitoPLL(multiplicadordereloj).
ModosIDLE,dondelaCPUseparaylosperifricoscontinanoperando.
ModoSLEEP,dondelaCPUylosperifricosseparanyesperanaqueun
eventolosdespierte.
Control separado sobre los relojes perifricos, de tal forma que el
consumodelosmdulosperifricospuedeseroptimizado.

Para los programas que vamos a desarrollar a lo largo del presente proyecto,
ejecutados tanto en la placa PC32 STARTER KIT como en la placa de desarrollo
Explorer16,ambostienenencadaunadeellasunrelojprincipalconunafrecuenciade
8MHz.Aestafrecuencia,yaqueseencuentrapordebajode10MHZ,serecomienda
activarelosciladorprimarioparaqueopereenelmodoXT.
Posteriormente, para poder usar los circuitos PLL hay que reducir esta
frecuencia a 4MHz, ya que es a la mxima frecuencia a la que pueden operar estos
circuitos.Unavezasignadaestafrecuenciaasignaramoselfactordemultiplicacindel
PLL y por ltimo el factor de divisin de salida (todos estos valores se controlan a
travs de distintos bits del registro OSCCON). Dndonos nuestra frecuencia de reloj
delsistema,talycomopodemosverenlasiguientefigura:

FiguraB.1:Esquemadelaconfiguracindelrelojdelsistema.

Por ltimo, para poder configurar el bus del reloj perifrico hay que enviar la
sealdelrelojdelsistemaatravsdeotrocircuitodivisor,haciendoqueelconsumo
delbusdelosperifricossereduzca,produciendolasealderelojPB.Estosecontrola
mediante el bit PBDIV del registro OSCCON. El valor recomendado para el bus
perifrico es de 36 MHZ, correspondindose a un ratio 1:2 entre el reloj del sistema
paraunafrecuenciadeoperacinde72MHzyelrelojPB.

216

ANEXOB.CONSIDERACIONESPRCTICASPARAPROGRAMARELPIC32

Paraseleccionarelrelojylasfrecuenciasalasquevamosatrabajar,existenun
grupodebits,conocidoscomobitsdeconfiguracin(almacenadosenlamemoriaflash
delPIC32),loscualesnosvanaproporcionarlaconfiguracininicialdeldispositivo.El
mdulo del oscilador utiliza alguno de estos bits para la configuracin inicial del
registroOSCCON.
De tal forma que para poder configurar estos bits, lo vamos a poder realizar
desde el MPLAB en el men Cofigure>Configuration Bits, cuyas posibles
configuracionessepuedenconsultarenHelp>Topic>ConfigSettings.Sinembargo,
usandoestemtodo,nosepuedemodificarelvalordeldivisordeentradaentiempo
deejecucin.Porloquepararealizarlaconfiguracininicialdeestosbitsvamosausar
ladirectiva#pragma.Acontinuacinmostramoslaconfiguracinrepresentadaenla
figuraanterioryconunafrecuenciadelbusperifricode36MHZ.
#pragma config POSCMOD=XT, FNOSC=PRIPLL
#pragma config FPLLIDIV=DIV_2, FPLLMUL=MUL_18, FPLLODIV=DIV_1
#pragma config FPBDIV=DIV_2, FWDTEN=OFF, CP=OFF, BWP=OFF

Adems,enlaltimalneadecdigosedeshabilitaelwatchdogylaproteccin
delcdigoysehabilitalaprogramacindelamemoriabootflash.

UnavezrealizadalaconfiguracininicialdelPIC32vamos averdequforma
podemos ejecutar nuestro cdigo en el menor tiempo posible empleando las
caractersticasofrecidasporelPIC32.ParaellovamosausarelprogramaFFT.c(Fast
Fourier Transform), disponible en el captulo 7 de la referencia [10], el cual se
encuentra en la carpeta de SIMULACION del CD adjunto, programa
Analisis_tiempo.c.
Loquevamosarealizaresmedireltiempoquetardaenejecutarseestafuncin
mediante el uso de un Timer de 32 bits formado por la pareja de Timers 4 y 5. A
continuacinmostramoselmaindelprogramaaejecutar:
main(){
int i, t;
double f;
initFFT();
// test sinusoid
for (i=0; i<N_FFT; i++) {
f = sin(2 * PI2N * i );
inB[ i] = 128 + ( unsigned char) (120.0 * f);
} // for
// init 32-bit timer4/5
OpenTimer45( T4_ON | T4_SOURCE_INT, 0);
// clear the 32-bit timer count
WriteTimer45( 0);

217

ANEXOB.CONSIDERACIONESPRCTICASPARAPROGRAMARELPIC32

//2.- perform FFT algorithm


windowFFT( inB);
FFT();
powerScale( inB);
// read the timer count
t = ReadTimer45();
f = t/36E6;
// 3. infinite loop
while( 1);
} // main

Si aadimos un breakpoint al bucle principal y abramos la ventana wacth


asignndole la variable f, podremos ver el tiempo que se ha tardado en ejecutar el
algoritmoFFT.Ennuestrocasonossaleuntiempodet=0.17s.Vamosahoraaverde
qumanerapodemoshacerqueestetiemposereduzca.
Eltiempodeejecucindelprogramanosvaadependerengranmedidadela
velocidaddelamemoriaFlash.Paramejoraresteaspecto,losdiseadoresdelPIC32
han comprobado que existe un balance perfecto usando un bajo consumo de la
memoria flash y desdoblando el bus del ncleo del sistema, proporcionando un
nmerodeestadosdeesperasduranteloscualeselprocesadoresperaaquelosdatos
seanledosdesdelamemoriaflash.Parareducirlosestadosdeesperautilizamosla
funcin:SYSTEMConfigWaitStatesAndPB(freq).
Comovemoshayquepasarlafrecuenciadelrelojcomoparmetro,contalde
que se asigne los mnimos estados de espera recomendados para una frecuencia de
relojdelsistemadada.Ademslafuncinmodificarautomticamentelafrecuencia
de reloj de los perifricos (PB divisor) con tal de mantenerla siempre por debajo de
50MHZ.Detalformaqueennuestrocaso:
SYSTEMConfigWaitStatesAndPB (72000000L).

Si volvemos a ejecutar el programa nos damos cuenta que el tiempo de


ejecucindelprogramasehareducidoat=0.04s.

Sin embargo nuestro programa aun se puede hacer ms rpido si usamos el


nuevomoduloentreelbusdelncleoyeldelamemoria,lacache.Cadavezqueel
procesador cargue y lea una instruccin o dato desde la memoria flash, el modulo
cache guardar una copia pero tambin recordar su direccin. De tal forma que
cuando el procesador necesite el mismo dato otra vez, la cache devolver el valor
rpidamente, sin tener que acceder de nuevo a la memoria Flash. No obstante,
cuando toda la memoria cache est llena, el contenido ser rotado, es decir, la ms

218

ANEXOB.CONSIDERACIONESPRCTICASPARAPROGRAMARELPIC32

vieja ser sobrescrita con nueva informacin. Utilizando el mdulo pcache.h,


aadimoslasiguientelneaalprograma:
CheKseg0CacheOn();

Ejecutandodenuevoelprogramanosfijamosqueeltiemposehareducidoa
t=0.02s.

Adems, la cache, posee otra importante herramienta que puede reducir el


tiempodeejecucindelprograma.Estatienelahabilidaddeejecutarinstruccinpre
fetching, es decir, el mdulo de la cache no solo registra instrucciones que han sido
ledas y cargadas por el ncleo, tambin lee todo un bloque de 4 instrucciones (4
palabrasde32bits)alavez.Portantolasprximastresfetchessernejecutadassin
consumirningnestadodeespera.Parahabilitarlacacheprefetchhayqueactivarlos
bitsPREFENenelregistroCHECONobienutilizarlasiguientefuncindesdelalibrera
pcache.h:
mCheConfigure (CHECON | 0x30)

Realizandoestanuevamodificacineltiemposereduceat=0.016467s.

No obstante, an se puede reducir el tiempo, relacionado con el acceso a la


memoriaRAM.ElaccesoalamemoriaRAMespordefectolentodebidoalapresencia
de un estado de espera. Este estado se puede deshabilitar utilizando la siguiente
funcin:
mBMXDisableDRMWaitState()

De tal forma que el tiempo se ha reducido a t=0.016459s. Aunque en este


programanoseproduceunagranmejoraconlaintroduccindeestafuncin,puede
queenotrosprogramassqueaumentesieltamaodeesteesconsiderable.

Portantomedianteelusodeestas4instruccioneshemosconseguidoreducirel
tiempo de ejecucin del programa de 0.17 segundos a 0.0164 segundos. Adems,
estas 4 instrucciones utilizadas hasta ahora se pueden resumir utilizando una nica
funcin que nos va a permitir llevar a cabo todas las optimizaciones realizadas
anteriormente.
SYSTEMConfigPerformance(72000000L);

219

ANEXOB.CONSIDERACIONESPRCTICASPARAPROGRAMARELPIC32

Acontinuacinmostramosunatablaresumenconeltiempoexactotardadoen
ejecutarseelprogramadependiendodelainstruccinaadida:
Instruccin

Tiempo(s)

Respecto Respecto
Inicial
Anterior
Ninguna
0.170626

SYSTEMConfigWaitStatesAndPB(72000000L)
0.042656
4.00
4.00
CheKseg0CacheOn()
0.020231
8.43
2.11
mCheConfigure(CHECON|0x30)
0.016467
10.36
1.23
mBMXDisableDRMWaitState()
0.016459
10.37
1.00
SYSTEMConfigPerformance(72000000L)
0.016459
10.37
1.00
TablaB.5:Anlisistemporaldelasdiferentesinstruccionesdeoptimizacindecgido.

Por tanto, gracias al mecanismo de la memoria cache y al prefetch, el PIC32


puedeejecutaralmenosunainstruccinporcicloderelojinclusocuandoseoperaala
mximafrecuenciaderelojmientrasseusaunbajoconsumodelamemoriaflash.

220

Manejo de una pantalla tctil con el PIC32 para el


control de dispositivos externos.

ANEXO C. ACELERMETRO ADXL330

ANEXOC.ACELERMETROADXL330.

C.1. INTRODUCCIN

EnesteanexovamosaestudiarelhardwaredelacelermetroADLX330parala
deteccindemovimientoenelespacio.Elobjetivoesincorporarloalapantallatctil
paradarvistosidadalosprogramasejecutadosenestayverquesuintroduccinnoes
muycomplejagraciasalusodelaI/OExpansionBoard.

C.1.1. IMPORTANCIA DE LOS SENSORES EN APLICACIONES EMBEBIDAS

Actualmente existen muchas aplicaciones, tanto a nivel industrial como


comercial, en las que se utilizan este tipo de sensores. Se puede destacar su actual
importancia en sistemas de telfonos mviles, plataformas de juego, sistemas de
seguridadenautomviles,entreotras.Porejemplo,recientementesehaincorporado
este sensor en telfonos mviles (iPhone, Blackberry Storm) para la deteccin de
movimiento en el espacio, cuando la pantalla gira de la orientacin retrato a la
posicinpaisaje(FiguraC.1).Ademsdefacilitarotrasaplicaciones,comoreordenar
unalistaalsacudirlo.

FiguraC.1:UsodeunacelermetroeneliPhone.
223

ANEXOC.ACELERMETROADXL330

C.2. FUNCIONAMIENTO DEL SENSOR

ElsensorADXL330(FiguraC.2)esunacelermetroquemidelaaceleracinen
lostresejes,atravsdeuncircuitointegrado(CImonoltico,esuntipodedispositivo
electrnico en un circuito integrado el cual contiene dispositivos pasivos y activos
comodiodos,transistores,etc,loscualesestnmontadossobreunasuperficiedeuna
piezadeunsolosemiconductor,comounaobleadeSilicio)[23].

FiguraC.2:AcelermetroADXL330.

Las seales de salida del sensor son voltajes analgicos los cuales son
proporcionalesalaaceleracin,siendoelrangodeestede3g.Elacelermetropuede
medir la aceleracin de la gravedad esttica en las aplicaciones de deteccin de
inclinacin, as como la aceleracin dinmica resultante de movimiento, choque o
vibraciones. Adems su conexionado es muy sencillo, slo necesita 5 lneas:
alimentacin, tierra y 3 lneas de entrada hacia el microcontrolador (aceleracin
medidaenlostresejes,FiguraC.3),talycomopodemosverenlafiguraanterior.

FiguraC.3:SensibilidaddelsensorADLX330enlostresejes.
224

ANEXOC.ACELERMETROADXL330

Se trata, de un acelermetro tipo MEMS (Microelectomechanical Systems, se


refieraalatecnologaelectromecnica,micromtricaysusproductos)basadoenun
sensor capacitivo diferencial [24]. Un sensor capacitivo diferencial consiste en dos
condensadoresvariablesdispuestosdetalmodoqueexperimentanelmismocambio
peroensentidosopuestos(FiguraC.4).

FiguraC.4:Modelofsicodeunsensorcapacitivodiferencial.

Elacelermetronosdevolverunvoltajeenfuncindesuposicin,lacualse
podrevaluarsiemprerespectoaunaaceleracinde0g,offset.Portantohabrque
calibrarelsensorparaconocertantoelvalordeesteoffsetcuandolaaceleracinesde
0gascomoelvalordelsensorcuandolaaceleracinesde1g(FiguraC.5).

FiguraC.5:SalidadelsensorADXL330enfuncindelaorientacindelmismo.

225

ACRNIMOS

ALU

ArithmeticLogicUnit

API

ApplicationProgrammingInterface

BFM

BootFlashMemory

CPU

CentralProcessingUnit

DMA

DirectmemoryAccess

DR

DataRegister

DRM

DataRAMMemory

DSP

DigitalSignalProcessor

EEPROM

ElectricalErasableProgrammableReadOnlyMemory

EPROM

ErasableProgrammableReadOnlyMemory

E/S

Entrada/Salida

FFT

FastFourierTransform

FIFO

FirstInFirstOut

FMDU

FastMultiplyDivideUnit.

FMT

FixedMappingTranslation

GOL

GraphicsObjectLayer

I2C

InterIntegratedCircuit

ICD

InCircuitDebugger

IDE

IntegratedDevelopmentEnvironment

IR

Instructionregisters
227

ACRNIMOS

ISR

InterruptServiceRoutine

IU

IntegerUnit

JTAG

JointTestActionGroup

LCD

LiquidCrystalDisplay

LED

LightEmittingDiodes

MCU

MicrocontrollerUnit

MDU

Multiply/DivideUnit

MMU

MemoryManagementUnit

PFM

ProgramFlashMemory

PLL

PhaseLockedLoops

PMP

ParallelMasterPort

PROM

ProgrammableReadOnlyMemory

PWN

PulseWidthModulator

QVGA

QuarterVideoGraphicsArray

RAM

RandomAccessMemory

RISC

ReducedInstructionSetComputer

ROM

ReadOnlyMemory

RTCC

RealTimeClockandCalendar

SPI

SerialPeripheralInterface

SRAM

StaticRandomAccessMemory

TFT

ThinFilmTransistor

TN

TwistedNematic

TQFP

ThinQuadFlatPack

UART

UniversalAsynchronousReceiverTransmitter

228

BIBLIOGRAFA

[1]

Informacin sobre el ncleo del PIC32 M4K CPU basado en la tecnologa


MIPS32.
http://www.mips.com/products/processors/3264bitcores/mips32
m4k/index.cfm#features

[2]

Brief Introduction to MIPS32M4K Core Shadow Registers for


microcontrollerApplications,MIPSTechnologies,Inc.

[3]

PIC32MX3XX/4XX Family Data Sheet 64/100Pin General Purpose and USB


32BitFlashMicrocontrollers,MicrochipTechnologyInc.

[4]

PIC32MXFamilyReferenceManual,MicrochipTechnologyInc.

[5]

Informacin sobre la familia de de microcontroladores de 32 bits,


http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId
=2591

[6]

Informacin y descarga del MPLAB IDE, Microchip Technology Inc.


http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId
=1406&dDocName=en019469&part=SW007002

[7]

Informacin y descarga del compilador C32, Microchip Technology Inc


http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId
=2615&dDocName=en532454&redirects=c32

[8]

Informacin sobre el MPLAB ICD 3 InCircuit Debugger en Resource Center,


http://edn.resourcecenteronline.com/resource_center/asset/1996
MPLAB_ICD_3_InCircuit_Debugger

[9]

Data Sheet Temperature Sensor TC1047/TC1047A. Microchip Technology


Inc.

[10]

Programming 32bit Microcontrollers in C: Exploring The PIC32 (Embedded


Technology),L.DiJasio.NewnesBooks(2008).

229

ACRNIMOS

[11]

Informacin y descarga de programas ejemplos, Microchip Technology Inc


http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId
=1406&dDocName=en024858&part=DM240001&redirects=explorer16

[12]

Explorer16DevelopmentBoardUsersGuide,MicrochipTechnologyInc.

[13]

256KSPIBusSerialEEPROM,MicrochipTechnologyInc.

[14]

HD44780U(DotMatrixLiquidCrystalDisplayController/Driver),Hitachi.

[15]

GraphicsPICtailPlusDaughterBoard2,MicrochipTechnologyInc.

[16]

HojadecaractersticasdelcontroladorLCD,LGDP453,LGElectronics.

[17]

Hoja de caractersticas de la pantalla tctil TFTG240320UTSW92WTPE,


TRULYSEMICONDUCTORSLTD.

[18]

InformacinsobrelatarjetaI/OExpansionBoard,MicrochipTechnologyInc
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId
=2615&dDocName=en535444

[19]

How to use Widgets in Microchip graphics Library, Microchip Technology


Inc.

[20]

Informacin sobre la pantalla tctil, Microchip Technology Inc


http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId
=2608&page=1&param=en532061&redirects=Graphics

[21]

Informacin sobre la placa de expansin USB, Microchip Technology Inc


http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId
=2651&param=en534494

[22]

TB3012,ConversionofGraphicsPICtailPlusBoard2forCompatibilitywith
USBPICtailPlusandFirmwareModification,MicrochipTechnologyInc.

[23]

Manual del Acelermetro ADXL330 iMEMS, Analog Devices


http://www.analog.com/static/importedfiles/data_sheets/ADXL330.pdf

[24]

Informacin sobre la tecnologa MEMs en el ADXL330, Electroiq


http://www.electroiq.com/index/display/semiconductorsarticle
display/328028/articles/solidstatetechnology/chipforensics/2008/05/two
differentapproachestointegratedmems.html

230

Das könnte Ihnen auch gefallen