You are on page 1of 60

LENGUAJES DE ALTO NIVEL

161

pile View

Help Folders Favorites - \*


; ;>

Folders . ;. PluginEditor > SerialCom ,: VHBExplorer

Virtual Hardware Boards -

_* |

_j pIcl2_8PIN...

PIC16 ALC...

1515

Resource ; VHBoards
Web
;

ProgrammerHook SampleslJte -rj

PIC16_GLC... PIC18_ALC... PIC18_GLC...

Figura 11.4. : este caso hemos dibujado el circuito mostrado en la figura 11.5. Como observamos, el ftware vinculador ha aadido automticamente una lnea de script al microcontrolador que Raciona el programa BASIC al Pie utilizado en Proteus. Si ahora volvemos al entorno IDE de oton PLUS y cambiamos alguna lnea de cdigo, el funcionamiento de la simulacin se tualizar inmediatamente. ta capacidad sencilla de automatizacin en la simulacin de nuestros proyectos es, sin duda, 'tente para los diseadores y, de hecho, Labcenter la recomienda expresamente.
Microchip MPLAB IDE

MPLAB IDE puede ser utilizado como un entorno general para el desarrollo profesional de proyectos basados en compiladores Pie. Proporciona un editor de textos potente y a travs de un driver puede integrarse con simulaciones a bajo nivel. Adems, puede integrar compiladores como CCS o Hitech, como se ver en el siguiente apartado de este mismo captulo.
IAR Systems

IAR produce un gran rango de compiladores que cubren todos los micros soportados por Proteus. Tambin ofrece herramientas de desarrollo visual como MakeApp y VisualState. La depuracin bajo Proteus se puede hacer bien utilizando el formato estndar UBROF8 directamente, o bien haciendo uso del formato EWARM mediante el phtgin correspondiente que IAR ofrece.

162 PROTELS

H i

r le

tai

Figura 11.5. Keil GMBH Keil est especializado en el desarrollo de herramientas para los procesadores 8051 y AR. La integracin entre los entornos Keil uVision2 / uVisionS es proporcionada a travs de ur driver propio de Keil o bien utilizando el formato ELF/DWARF (ARM) y el estndar OMF51 (8051). El driver remoto permite el depurado de proyectos con uVision2 / uVisic para controlar simulaciones en Proteus de forma parecida a cmo se realizara utilizando ur emulador hardware. Byte Craft

i C

Co. mii bre

[a

Byte distribuye una serie de compiladores incluyendo el MPC P7C 'C. Presenta limitador del formato simblico COD para depurar con Proteus. En concreto, no es posible, momento, ejecutar funciones de de depuracin paso a paso en alto nivel. CCS linc

Dis dsP corr mar simT

:
Er. este ;
^er al utilizar JE herra .zar c ?riorn i-rfuraci

CCS es un compilador para un gran nmero de PIC y de dsPIC. En versiones reciei soporta todo tipo de opciones de depuracin de alto nivel. Se trata de un compila, sencillo, con amplia documentacin y mltiples libreras libres disponibles en internet. [ quizs por ello que su uso sea muy extendido en ambientes educativos y tenga un alca: muy amplio entre los diseadores.

LENGUAJES DE ALTOOVB

Hitech C f or PIC

HiTech Software dispone de compiladores para todas las familias PIC. Soporta el formato COFF estndar perfectamente. Se trata de un compilador profesional con un porcentaje de optimizacin de cdigo realmente alto en comparacin con sus competidores. Su posible desventaja es la falta de libreras libres ofreeware. Imagecraft ICCAVR Compiler

Imagecraft soporta una amplia variedad de compiladores para distintos microcontroladores. En el caso del compilador para el AVR (ICCAVR) soporta el formato COFF y en breve tiempo lo har para el formato ELF/DWARF. Codevision AVR Compiler

Codevisin soporta una amplia variedad de compiladores para distintos microcontroladores. En el caso del compilador para el AVR soporta el formato COFF y en breve tiempo lo har para el formato ELF/DWARF. MikroElektronika Ha hecho su aparicin en el mundo de los compiladores hace relativamente poco tiempo. Dispone de compiladores C y BASIC para los procesadores de las familias PIC, AVR y dsPIC. Ofrece ventajas muy interesantes: nico entorno de desarrollo para todos los compiladores, ayuda en lnea muy completa, variedad de funciones built-in, sencillez de manejo, etc. Un inconveniente que en un futuro ser soslayado es el de poseer un formato simblico propio que lo hace incompatible con la depuracin en alto nivel con Proteus.

11.2

EJEMPLO DE SIMULACIN EN LENGUAJE C

En este apartado se va a mostrar de forma sencilla cmo trabajar con el compilador C CCS y el orno Proteus para desarrollar proyectos electrnicos. Ello nos servir de gua didctica para 1 poder abarcar los diseos de ms envergadura que se realizarn en el prximo captulo. Se 3 nlizar el formato simblico COFF que nos va a permitir, como veremos ms adelante, utilizar ? herramientas de depuracin de alto nivel dentro de Proteus. De forma parecida, se podran _:ilizar otros compiladores y otros microcontroladores siempre que, segn la tabla mostrada interiormente en la figura 10.1, Proteus soporte el correspondiente formato para la tan deseada lepuracin y correccin de errores en el propio lenguaje de desarrollo.

164 PROTEUS

El ejemplo que vamos a realizar consiste en la alarma de 4 sensores basada en un PIC16F84A que se desarroll en lenguaje ensamblador en el captulo 9. Ahora vamos a utilizar ; compilador CCS para escribir el cdigo de programa que, como veremos, simplifica muer desarrollo y que apenas supone un aumento de la memoria de programa utilizada. Utilzame un interruptor adicional como reset del micro para desarmar la alarma. En la figura 11.6 observa nuestro diseo. A continuacin observamos el listado 11.1 del programa realizado en CCS y que presen: mayor abstraccin en el uso de los recursos del Pie, ya que no necesitamos, por ejemplo, expendientes de los registros o bits implicados en el manejo de la interrupcin provocada por u cambio de nivel lgico en el puerto B del micro. En general, hacemos uso de las llamada funciones built-in-functions del compilador que se encargan de manejar o controlar los recurro del micro de forma trasparente para el programador.

SIMULACIN DE UNA ALARMA DE CUATRO SENSORES

?pue -emos <

Interruptores que simulan la activacin

Figura 11.6.

Antes de compilar, hemos de asegurarnos de que se genere el fichero simblico con frmate COFF para poder cargarlo posteriormente en Proteus. Para ello, seleccionamos el mer_ Options en el entorno CCS (figura 11.7) y dentro de l, la opcin File Formats (figura 11.8 Entonces nos abrir una ventana donde podemos seleccionar el tipo de ficheros que se producirn en el proceso de compilacin. Como observamos en la figura 11.9, debemos tener seleccionado el formato COFF en la parte que hace referencia al depurado.

ersione utilizar t _;e las op

LENGUAJES DE ALTX

1.6

finclude <16F84a.h> #FUSES XT,NOWDT #int_RB RB_isr() I output_high(PIN_AO); ! void main() { enable_interrupts(INT_RB); enable_interrupts(GLOBAL); while (1); !

// Rutina de interrupcin

// Bucle Infinito

Listado 11.1.

de compilar encontraremos, con el mismo nombre, una serie de archivos junto al ro fuente. El que nos ocupa principalmente es el que posee la extensin COFF, ya que ios de cargarlo en Proteus para el depurado en alto nivel.

File Project Edit Options Compile View Tools Debug Help

Figura 11.7.

iones anteriores del compilador CCS slo generaban tipos COD, de ah que necesitramos Lzar un driver denominado CODDDX.EXE, que era preciso configurar para poder disfrutar as opciones de depuracin en alto nivel.

Recall Open Files Order Open Files Editor Properties... Customize.. File Formats Global Defines... Debugger/Programer.. Include Dirs... Specificto User

, Debug File f" None r" Standard.CQD f- ATD .MAP I C Expanded.COD ff COFF -Eira Pite r Qripnal ; & Standard f"~ Mulli-Lines

Obtect Rte f * SBitHEX r 16611 HEX

LislFfei* CCS r Sandard r OldStandard

r
Other Fes j P Cali tree Fte X Staslics lile r Seach files

Compile WhdowUpNo Ertois: |3Sec Dn Error 3

No

*|

Figura 11.8.

Figura 11.9.

Ahora podemos asociar el fichero COD generado al micro de nuestra alarma. Para ello editarru la ventana de propiedades del Pie bajo Proteus y lo insertamos en la pestaa Program File:, : como se muestra en la figura 11.10. Finalmente, iniciamos la simulacin del circuito observanc el funcionamiento de la alarma.
Pragan File: jessona\capitulo10\ala[ma.co[ _j JHide Figura 11.10.

En el caso de que obtuvisemos un funcionamiento errneo podemos utilizar las opciones c depuracin en alto nivel. Para ello, detenemos la simulacin y examinamos el cdigo fuente qv ahora, claro est, se muestra en lenguaje C (figura 11.11). Podemos avanzar paso a pa? establecer puntos de ruptura, etc., tal y como lo hacamos en ensamblador. Por otra parte, disponemos tambin de un fichero intermedio con extensin LST que pdeme.abrir con cualquier editor o procesador de textos, en el que vemos una serie de datos relativos a uso de memoria de programa y de datos, as como el listado de instrucciones en ensamblado: generadas. Ello nos puede ser de utilidad para optimizar, an ms si cabe, el cdigo, c simplemente para estudiar el proceso de compilacin.

LENGUAJES DE AL"!

C:Archivos de pmgtamaMabcenter Electtonics\PrQtei.is 6 Pro[e;>sinal\capnulo10\alarma c

JOOO *includ= <16F84a.h> 1FUSES XT.NODT

*int_RB RB_isr()

XX Rutina de interrupccin de los sensores

:."." output_high(PIN_AO);

void main()

enable_interrupts(GLOBAL); 'ihiie (1)

Bucle Infinita

Figura 11.11

L le: \

i-!.. :

dL i
Y' -

bl, tigo,

LENGUA E - :E -._-

CMrchivos de programaMabcenter ElectioniCVProteus 6 ProlessinalVcapiluIol 0\alaFma.c

J^\ '-$

uOOfl tincludE <16F84a h! FDSES XT,NODT

*int_RB KB_isr()

// Rutina de interrupccin de los sensores

output_high(PIN_O);

vod main() 0035 { ensble_interrupts{GLOBAL5, while (1)

// Bucle Infinito

. I
Figura 11.11

CAPITULO 12

PROYECTOS EN LENGUAJES DE ALTO NIVEL


. - .1 de las ventajas a la hora de abordar el diseo de un circuito basado en microcontroladores zando un lenguaje de alto nivel, es la posibilidad de utilizar las mltiples libreras que se recen. Habitualmente, la empresa que distribuye el compilador pone a disposicin de los arios libreras para los ms variados perifricos que vayamos a conectar al rocontrolador. Por ejemplo, si vamos a realizar la medida de temperatura con un dispositivo Z'S1621, no necesitamos conocer profundamente su hardware interno ni el protocolo de -.nunicacin para realizar nuestro proyecto. Basta con hacer referencia a su librera en nuestro jrama principal y utilizar sus funciones para la adquisicin de los valores de temperatura ~ e di dos por este integrado. Por otra parte, hoy en da, muchos de los compiladores que existen en el mercado disponen de dones integradas en el compilador que manejan los recursos ms habituales en el proceso de ::eo de un proyecto tpico. Funciones para gobernar recursos como el RS232,12C, CAN IR, ETHERNET, etc., estn implementadas como una funcin ms dentro de : ampliadores. Evidentemente, el uso de estas posibilidades implica un distanciamiento < secuta el procesador, con lo que pueden surgir errores o problemas que no depsndan de ?stro cdigo sino de la librera utilizada. A pesar de ello, no cabe d>.:: ~empo de desarrollo de una aplicacin disminuye considerablemente, En este captulo abordaremos distintos proyectos utilizando diferi:stintos compiladores para que el lector adquiera una ice esarrollo con estas herramientas. No se trata de realiz:

r? de complicados sino de

- : _-:rar la filosofa de trabajo y de cmo utilizar el Proteus como etapa previa a la realizac: del prototipo hardware. Todos los esquemas, programas y libreras utilizadas en estos diseos se encuentran en el CU ROM que acompaa al libro.

12.1

DISEO DE UN CONTADOR CON LCD

Se trata de emular el funcionamiento de las mquinas tipo "SU TURNO" habituales en mltir j supermercados o centros comerciales. Sobre el LCD alfanumrico 2x16 se visualizar el mime del turno actual (2 dgitos). Este se incrementa a cada pulso aplicado por un pulsador. Er memoria EEPROM de un PIC16F84a se almacena el ltimo nmero visualizado, de forma qu ante un fallo de alimentacin, se reanude la cuenta en el ltimo nmero. El circuito se muestra en la figura 12.1.

LCD1
LMD16L

Turno! 48

Figura 12.1. Bsicamente, el programa debe guardar en la memoria no voltil EEPROM del Pie el que representa el turno actual, de tal manera que si falla la alimentacin, cuando est t restablezca y el Pie se reinicie, se vaya a leer la memoria para recuperar el valor del turno. F otra parte, continuamente, es decir, dentro de un bucle infinito, se interroga el estado . = dor de avance de contaje. Si se presiona ste, se guarda en la EEPROM y se visualiza

PROYECTOS EN LENGUAJES DE ALTC

Tumero en el Lcd. El programa est hecho en lenguaje C con el compilador CCb y iTizando la librera Icd4.c para gobernar el Lcd con slo 4 lneas de datos, tal y ce T uestra en el listado siguiente (listado 12.1).

ei :
#include <16f84a.h> #usedelay(clock=4000000,RESTART_WDT) #use fast_io(A) #use fast_io(B) #include <lcd4.c> int turno; void Visualizar_Turno() { lcd_gotoxy(8,l); lcd_putc('0'+turno/10); lcd_putc('0'+turno%10); ! main() ! lcd_init(); lcd_putc("Turno: "); turno = read_eeprom(0); if(turno<l I I turno>99) turno = 1; Visualizar_Turno(); while(l) { restart_wdt(); if(input(PIN_A4)) delay_ms(20); turno++; if (turno > 99) turno = 1; write_eeprom(0,turno); Visualizar_Turno(); while(input(PIN_A4)) restart_wdt(); delay_ms(20); }

lt ir En J

Listado 12.1.

Como se observa, el uso de las funciones de C simplifica la estructura y el estudio de la lgi del programa. Gracias a la disponibilidad de las funciones read_eeprom() y write_eeprom< realizamos el control de la memoria EEPROM de una forma muy sencilla. De igual mane sucede con el gobierno del LCD. Compilamos el cdigo y cargamos el fichero tipo COD correspondiente en Proteus. Aho podemos ejecutar el programa paso a paso, como se observa en la figura 12.2, e incluso ver contenido de la posicin 0x00 de la memoria EEPROM que es donde se guarda el valor d turno actual (figura 12.3).
i-c En

C \Archivos de programaMabcenter Electrc

js 6 Professional'',caprh.ilo1 1 \tur

lcd_gotosy!8,l); IcdjnitcC ' O ' + t u r n lcd_putc('O'+turn

lcd_init(): lcd_putc "Turr turno = read_ i f ( t u r n o < l ||

te_eeproHL(0, turno); hileinput(FIN_A4J}

Figura 12.2. Si cucamos sobre esta ventana con el botn contrario del ratn accedemos a las opciones d depuracin tal y como se hacia en ensamblador. Desde aqu podemos desensamblar el cdigo : poner puntos de ruptura. En la ventana de la memoria EEPROM del Pie se muestran las direcciones y sus contenidos. Aa la direccin 0x00 contiene el valor 32, que se corresponde en decimal con el nmero 5 representa el turno actual.

.i _ ,_ mu

Por oi CCS, contrc :orma

PROYECTOS EN LENG1

: la lgi: eepromi ' 1 manera


08*

38:

2!

s. Ahora so ver e", valor de_

38:

FF FF FF FF FF FF FF FF

FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ~ FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF . . FF FF FF FF FF FF

Figura 12.3. !:-.cluso podemos ver el contenido de las variables que hayamos definido en nuestro programa. En la figura 12.4 se observa que en este momento el valor de la variable turno es de 50.
PIC CPU Variables - U l > 1 |g=:S: ="~ :r:::~
:

~'"T;-p:

ame Icd turno

fiddress
0K0006 0K000E

Ualue <no type info> 50 = '2'

Figura 12.4.

: .2

USO DE LOS LCD GRFICOS

_ na de las caractersticas que diferencian a los distintos tipos de LCD grficos que existen en el ".ercado es el controlador o driver que llevan incorporado. Proteus soporta el controlador tpico KS108 y el Toshiba T6963C. Aunque con cada nueva revisin va creciendo el nmero modelos de LCD que son integrados para su simulacin.En la pgina web de la empres \vw.labcenter.co.uk) se pueden observar los tipos de LCD grficos soportados, tal y muestra en la figura 12.5.
LJJ-ti
- UJIl

-]

F012

JFG12 J]P01

Figura 12.5. Por otra parte, la mayora de los compiladores ofrecen libreras para su CCS, ya que dispone no slo de libreras para la utilizacin d : mtrolador KS108 y T6963C, sino que aporta otras libreras con rue formas sencillas, como lneas, crculos, cuadrados, etc.

. . -:cas de ti

Es por ello que el uso de los LCD grficos con lenguajes de alto nivel se reduce a la utilizacior del driver o librera adecuada al tipo de controlador grfico y a su configuracin de puertos i pines para el tipo de microcontrolador que estemos utilizando en nuestro proyecto. Como ejemplo prctico de todo esto vamos a desarrollar un pequeo proyecto que consist:* simplemente en mostrar un logotipo muy sencillo con un mensaje de texto en un LCD KS108. Se ha desarrollado en CCS para un PIC16F877 y se ha utilizado para su simulacin er Proteus, el LCD grfico modelo LGM12641BS1R. El circuito se observa en la figura 12.6.

Figura 12.6. En primer lugar, para desarrollar el cdigo de programa, se ha utilizado la librera HDM64GS12.H, que viene con este compilador y est pensada para trabajar con un Icd grfic: de 128x64 pixeles basada en un controlador KS108. Es conveniente abrirla para examinar 1 puertos y pines implicados en la comunicacin con el Pie y por si quisisemos cambiar 1= configuracin que viene por defecto para ajustara a nuestras necesidades. En el listad: siguiente se observa la descripcin de la configuracin por defecto. Si deseamos cambiarla, nc hay ms que redefinirla, utilizando los sentencias define para los pines de control y datos en b parte de cdigo inicial de la librera, tal y como se muestra a continuacin. //// LCD Pin connections: //// ////1: VSS is connected to GND //// //// 2: VDD is connected to +5V//// '/ 3: VO, LCD operating voltage ////

PROYECTOS EN LENGUAJE-

05

stra ti:

//// 4: D/I, Data or Instruction is connected to B2 /// //// 5: R/W - Read or Write is connected to B4 //// //// 6: Enable is connected to B5 lili lili 7-14: Data Bus O to 7 is connected to port d /// ////15: Chip Select 1 is connected to BO //// ////16: Chip Select 2 is connected to Bl //// ////17: Reset is connected to CO //// ////18: Negative voltage connected to the 20k Ohm //// ////19: Positive voltage for LED backlight is +5V lili lili 20: Negavtive voltage for LED is GND //// Listado 12.2. i general, las libreras de los LCD (listado 12.2 y listado 12.3) poseen cierta flexibilidad de rtiguracin, aunque este es un tema siempre delicado, ya que no siempre es posible ajustara nuestras necesidades de conexionado. En ese caso, es tarea del programador realizar naciones en la librera que no siempre es sencillo y rpido. ffifndef GLCD_CS1 Mefine GLCD_CS1 #endif tfifndef GLCD_CS2 #define GLCD_CS2 #endif ifndef GLCD_DI #define GLCD_DI #endif fifndef GLCD_RW Mefine GLCD_RW #endif tfifndef GLCD_E Mefine GLCD_E #endif ifndef GLCD_RST #define GLCD_RST #endif

PIN_BO //Chip Selection 1

PIN_B1 //Chip Selection 2

PIN_B2 //Data or Instruction

PIN_B4 //Read/Write

PIN_B5 //Enable

PIN_CO //Reset Listado 12.3.

En segundo lugar, se ha utilizado una segunda librera denominada graphicsx que es la ir.cargada de realizar el dibujado de formas bsicas, como rectas, rec." - Adems, posee una funcin para escribir grficamente (pixel a pixel ~.;nciones definidas en ella son las siguientes:

glcd_rect(xl, yl, x2, y2, fill, color). Dibuja un rectngulo desde una esi dada por (xl,yl) a otra (x2,y2). Se puede rellenar o no (fill). glcd_line(xl, yl, x2, y2, color). Dibuja una lnea desde un punto dado (\l.\ otro (x2,y2). Se puede mostrar o no (color). glcd_bar(xl, yl, x2, y2, width, color) Dibuja una barra desde un punto (\ otro (x2,y2) con cierto ancho (width). glcd_circle(x, y, radius, fill, color) Dibuja un crculo con centro en un p_~ (x,y) y radio (radius). Se puede rellenar o no (fill). Icd_text57(x, y, textptr, size, color) Escribe un texto (variable textptr) a part:: un punto (x,y) y con un tamao de fuente escalado (size). Evidentemente, se trata de funciones muy bsicas que podemos ampliar si, lgicame" tenemos conocimientos suficientes de programacin. De hecho, en los foros dedicado? microcontroladores abundan este tipo de libreras modificadas. El programa principal que, utilizando estas dos libreras, muestra el logotipo y mensaje de te\ en el Lcd, es el que se muestra en el siguiente listado 12.4. Vemos que despus de incluir arr.'r libreras, llama a la funcin glcd_init(ON) que es la encargada de inicializar el Lcd. Esto de hacerse siempre antes de utilizar las funciones propias de dibujado. A continuacin, se dibi un rectngulo, se muestra el texto y las otras formas bsicas que conformen este sena logotipo. Una vez compilado el cdigo se carga el fichero tipo COFF en Proteus para as correr simulacin. Es importante resear que si detenemos la simulacin es posible observar contenido de los bancos de memoria RAM del Lcd a travs de las opciones que nos ofrece men Debug. Por otra parte, podemos editar las propiedades del Lcd que nos permitirn variar su frecuen> de funcionamiento e incluso observar, a cmara lenta, el dibujado de las formas grfica? habilitamos la propiedad avanzada Log internal Events. Illlllllllllllllllllllllllllllllllllllllllllllllll lili kslOSccs.C /// //// Este ejemplo muestra las capacidades /// /// grficas en un LCD basado en el controlador/ /// KS108 ///

PROYECTOS EN LENGUAJES DE ALTO NIVEL

177

#include <16F877.h> ttfuses XT,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) tfinclude <HDM64GS12.h> tfinclude <graphics.c> char voltText[] = "USO DE LOS LCD"; char voltTextlt] = "GRFICOS"; void main() ! glcd_init(ON); // Inicializacin LCD glcd_rect(l,5,126,60,NO,ON);// Dibuja Rectngulo glcd_text57(5,18, voltText,l,ON); // Dibuja TEXTo glcd_text57(5,40,voltTextl,2,ON); // Dibuja TEXTo glcd_circle(170,40,5,YES,ON);// Dibuja Circulo glcd_circle(170,10,10,NO,ON);// Dibuja Circulo

Listado 12.4. segundo proyecto del uso de los LCD grficos vamos a utilizar un compilador BASIC de --cente aparicin, denominado MikroBasic, que sorprende, a primera vista, por la elevada :intidad de funciones integradas (built-in) de que dispone y por su facilidad de utilizacin en entorno integrado (IDE). Otra cosa es su grado de optimizacin de cdigo con respecto a compiladores ms profesionales; aunque tambin es verdad que se distribuye a un precio muy =.equible. De todas maneras, es una opcin muy recomendable en entornos educativos ya que, tener excesivos conocimientos de programacin, podemos realizar aplicaciones muy .iriadas con muy pocas instrucciones y en un corto espacio de tiempo. la librera de funciones del Lcd grfico se denomina GLCD y est integrada dentro compilador. Las funciones que podemos utilizar son las que se muestran en la figura 1 vienen muy bien documentadas en la propia ayuda en lnea del compilador. El proyecto que vamos a realizar consiste en mostrar una imagen grfica en AMPIRE 128x64 basado en un controlador KS108. El microcontrolador utiliza La imagen tiene, lgicamente, un tamao de 128x 64 pixeles y se ha diseado el programa de dibujo Paint (figura 12.8).

- -

P8 PROTEUS

L h ir., R M tBasic routines:

Advanced routines: Glcd Fu

Glcd_HJJne

I
. :. 'ct_Por,t

Figura 12.7. Esta imagen, ahora, debemos convertirla a un formato determinado para poder mandarla memoria RAM del Lcd. Lo que se hace normalmente es convertirla en una ristra de vak hexadecimales que representan el encendido o no de cada uno de los pixeles que formar i pantalla. Estas cadenas de valores se almacenan ordenadamente en una matriz que despv.Tllamada por la funcin Glcd_Image(), como veremos ms adelante. MikroBasic dispone de una utilidad muy sencilla que realiza esto automticamente 12.9). Primero, se carga la imagen en formato bmp, a continuacin se elige el tipo de compilaoi (en nuestro caso MikroBasic) y finalmente, se copia al portapapeles la matriz de datos genera para su posterior utilizacin. Examinemos, ahora, el programa principal (listado 12.5). En primer lugar, incluimos el ficheJ denominado Images que es donde debemos copiar, utilizando el portapapeles, la tabla as valores hexadecimales correspondiente a la imagen del camin generada con la utili anterior. Este fichero se va a cargar dentro del programa principal como un mdulo externo a I valores (listado 12.6). A continuacin, configuramos el patillaje de conexin del Lcd al Pie. Pana utilizamos la funcin granea Glcd_Init donde hemos establecido el PORTE como puerta para los pines de control del LCD y el PORTD como puerto de datos.

PROYECTOS EN LENGUAJES DE ALT :

Figura 12.8. onveniente acudir a la ayuda en lnea de compilador para ver la correspondencia exacta de pines del Lcd con los pines de los puertos del Pie. program Icdbasic include "images"' Fichero donde se incluye la imagen

mam: ' Inicializa el LCD especificando los puertos de ' control y datos ' con los pines deseados. Parmetros csl,cs2,rs,rw,rst.

Figura 12.9.

-. ?:- TEUS

Glcd_Init(PORTB,2,0,3,5,7,l,PORTD) ' Dibuja la imagen Glcd_Imagen (truck_bmp)

end.
Listado 12.5. Finalmente, utilizamos la funcin Glcd_image para enviar la imagen al Lcd visualizar constantemente. No hay ms que cargar el fichero compilado tipo HE" momento, este compilador no genera ficheros tipo COFF) en Proteus para observar el resultai como se muestra en la figura 12.10. // GLCD Picture ame: truck.bmp // GLCD Model: KS0108 128x64 unsigned char const maska_bmp[1024] = {0,0,0,0,01 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 J ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,128,128,128,128,128,64,64,64,64,64,64,32,32,32,32,32,32,32,32,32,32,32,32,31 ,32,32,32,32,32,32, 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, 32, Listado 12.6. En definitiva, el uso de los LCD grficos se simplifica enormemente con los compiladores q existen actualmente en el mercado, a pesar de que se consuman ms recursos hardware en 1 microcontroladores. Se invita al lector a visionar el videotutorial relacionado con este tern; que est incluido en el CD-ROM que acompaa a este libro.
lie

12.3

GENERACIN DE UNA ONDA DE DIENTE DE SIERRA

En este proyecto se va a generar una onda de diente de sierra, utilizando para ello -j PIC16F876a y un convertidor DAC PCF8591 que sirve del protocolo I2C para su control desde; micro.

PROVECTOS EN LENGUAJES DE ALTO NIVEL

181

mE

ionde HEX (i esultac Figura 12.10. El circuito se muestra en la figura 12.13. Observamos las conexiones SDA Y SCL entre el Pie y el IAC externo propias del protocolo I2C con las dos resistencias pull-up necesarias. El cdigo de rrograma est hecho con el compilador CCS, ya que ofrece una librera con funciones muy modas para la comunicacin I2C. De ellas resaltamos como ms importantes las siguientes: 32,32,-: Inicializa el protocolo y es imprescindible utilizarla al principio de la comunicacin. i2c_write
res que : en los tema Y

0,0,0,0.0 .0,0,0,0;:

i2c_start()

Enva un byte de datos a travs del bus I2C. i2c_read Lee un byte de datos desde el dispositivo esclavo. I2c_stop Detiene el proceso de comunicacin.

lo sdt

Conviene recordar que para utilizar estas funciones es preciso indicara al '.a librera #use i2c (master,sda=PIN_X4, scl=PIN_X3), donde sda . sel e concretos del puerto del Pie implicado en el protocolo. El listado c 12.7) se muestra a continuacin:

// Programa para la generacin de una onda /// /// en diente de sierra /// =include <16f876a.h> fusesXT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT #use delay(clock=4000000) #use standard_io(b) int analogico=OxOO; #use i2c(master,sda=PIN_C4, scl=PIN_C3) void main() { i2c_start(); i2c_write(0b!0010000); 2c_write(0b01000000); do{ i2c_write(++analogico); } while (TRUE);
!

Listado 12.7.

Como se desprende de la lectura del cdigo de programa, la seal en diente de sierra se construye a base de pequeos pasos o escalones (256), que van desde Ov a 5 voltios. Para ello * incrementa progresivamente de valor una variable de tipo int (analgico). Es conveniente echar un vistazo a las caractersticas del PCF 8591 para entender su direccionamiento I2C ex concordancia con la direccin enviada a travs de la funcin i2c_write y los niveles lgicos a sus patillas AO, Al y A2. El circuito se muestra en la figura 12.11, donde se observa la utilizaaor de una grfica tipo mixta y una sonda de prueba de voltaje para visualizar con ms claridad . :peldaos con que est hecha la seal de diente de sierra.

PROYECTOS EN LENGUAJES DE ALTO NIVEL

183

Figura 12.11.

12.4

MEDICIN DEL ANCHO DE PULSO

sierra a ello ite 12C gico lizaci idad

Un Pulso (figura 12.12) es lo que ocurre entre uno y otros flancos de subida sucesivos o de ada. El tiempo T que transcurre ente dos flancos sucesivos de subida (o de bajada) es lo que nocemos como Periodo del Pulso (W), o sea, lo que dura un pulso completo. Cada T segundos renemos un nuevo pulso completo. Como vemos, cada pulso tiene un tiempo en alto (High ';e) y un tiempo en estado bajo (Low Tim). La suma de los dos es el Periodo T del pulso. Al r.empo que permanece un pulso en alto es lo que vamos a llamar Ancho del Pulso (Pulse Width). , rilizando el modo de captura del mdulo CCP1 de un PIC18F452 mediremos el ancho de I so W de una seal aplicada a la patilla RC2/CCP1/P1A del micro. El valor medido lo Trasmitiremos mediante el canal RS232 a un terminal virtual. Al activar el mdulo CCP1, configuramos el flanco que deseamos que lo dispare: sub rajada. Automticamente, cada vez que se nos presente dicho flanco en el pin RC2 C~ ^ copia el valor de TMR1, de 16 bits, en la pareja de registros CCPRL y CCPKH ega un flanco tenemos en CCPR el valor que posee el TMR1 en ese momento.

vi

!.= L :'<

Figura 12.12. Si adems habilitamos la Interrupcin CCP del Pie se producir adems una peticin de serv para esta interrupcin cada vez que nuestro esperado flanco se presente en el correspondiente. En esta rutina de interrupcin podremos as cambiar el modelo de flanc utilizar para el siguiente disparo del CCP, cambindolo ahora al flanco de bajada, y asi e: siguiente disparo tendremos en CCPR el nuevo valor de TIMER1. Restando ste del antenan tendremos el ancho de pulso en high que deseamos. Como fuente de seal se ha ele^-jro arbitrariamente un pulso de SOOus de ancho, como se observa en la figura 12.13. Adema t hace trabajar el PIC a 20Mhz. El diseo se muestra en la figura 12.14. Observamos que la ventana del terminal virtual RS232 muestra un valor resultante de ?_"..> como resultado de restar t2 - ti (los instantes en que se producen ambos flancos de la seal: Esnecesario ajustar este valor a la frecuencia de funcionamiento del micro. Como ste trab: 20Mhz, el valor de ajuste ser de 0.2. El cdigo de programa (listado 12.8) se ha realizado utilizando el compilador CCS y se muesttJ a continuacin: // Medida del ancho de pulso mediante CCP1 /// // PIC 18F452 a 20 Mh/ y pulso de SOOus /// tfinclude <18f452.h>

PROVECTOS EX LENGUAJES DE ALTO NIVEL

185

figura 12.13. ffuses XT,NOWDT,NOPROTECT #use delay(clock=20000000) #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) float const ajuste = 0.2; // Ajuste de TMR1 a 20 Mhz intl CFlanco=0; // Flag para cambiar de flanco intl tl=OxOO,t2=OxOO,tt=OxOO; float st=0.0; #int_ccpl void handle_ccpl_int() { if(CFlanco==0)

!
tl=get_timerl(); // Flanco de Subida setup_ccpl(CCP_CAPTURE_FE); CFlanco=l;
Ultr"

else t2=get_timerl(); // Flanco de Bajada setup_ccpl(CCP_CAPTURE_RE); set_timerl(0); // Reinicia TMR1 1

CFlanco=0;

void mainO

setup_counters(RTCC_INTERNAL,RTCC_DIV_2); setup_timer_l(Tl_INTERNAL);

setup_ccpl(CCP_CAPTURE_RE); CFlanco = 0; enable_interrupts(int_ccpl); enable_interrupts(global); do ! if (t2 > ti)

tt = t2 - ti; st = ajuste * tt; printf ("Ticks %Lu - %Lu = %Lu = %3.1fuS

\r\n",t2,tl,tt,st);

! } while (TRUE);
I

Listado 12.8. Utilizando este mismo proyecto, se ofrece al lector la posibilidad de medir los anchos de puls de otras seales, variando, simplemente, los valores del generador virtual de Proteus.

12.5

MEDICIN DEL PERIODO DE UNA SEAL

En este proyecto se emplea el mdulo CCP1 para medir el periodo de una seal mediante captura del valor del TMRlcada vez que lleguen dos flancos ascendentes. Conocida velocidad a la que evoluciona el TMR1, se puede determinar el lapsus de tiempo transcurrid: entre un flanco y el siguiente (periodo). El Lcd visualiza dicho tiempo expresado a microsegundos. Ahora utilizamos un PIC16F876 trabajando a 4 Mhz. El TMR1 acta en el modo temporizador con reloj interno y un preescaler 1:8 evoluciona cac 8uS a 4MHz. Segn esto, el periodo mximo que se puede medir estar comprendido entre 0. : (2Hz) y 8 uS (125 KHz) aproximadamente. Para otros rangos se debe seleccionar un preescale: diferente.

PROTEUS

if (captura < 2) // Se han producido 2 capturas ?? I captura ++; // Siguiente captura CCP_1=0; set_timerl(0); // Carga el TMR1 con O I else I captura = 1; // Restablecer 1a captura v_captura=CCP_l; // Lee valor capturado v_captura=v_captura*8; // Ajusta *8 printf(lcd_putc,"%061u",v_captura); i

main() I set_tris_c(0xff); //Puerta C entrada enable_interrupts(int_ccpl); lcd_init(); //Inicia el mdulo LCD

setup_timer_l(Tl_INTERNAL I T1_DIV_BY_8); setup_ccpl(ccp_capture_re); enable_interrupts(global); while(l) I I Listado 12.9.

12.6

CONTAJE PROGRAMARLE DE PULSOS

En este proyecto se cuenta el nmero de pulsos externos segn se indique en 6 interruptora Cada vez que se alcance el valor fijado por estos, se cambia el estado lgico de una salida. Se t elegido, arbitrariamente, una seal generadora de pulsos de IKHz que es aplicada a la patil IIOSO/TICKI del PIC. Como salida de la frecuencia dividida se ha optado por la pat.L RBO.

PROYECTOS EN LENGUAJE

Utilizamos el mdulo CCP1 en modo comparacin de un PIC16F876 a 20Mhz. El TV en el modo contador de pulsos externos sensible al flanco ascendente y con un pree-;: -. - : Istos pulsos son suministrados por el generador virtual de Proteus. El mdulo CCPl modo de comparacin e interrupcin al coincidir ambos valores.

Figura 12.15.

Los interruptores son implementados por componentes virtuales denominados LOGICS que pertenecen a la librera DEBUGGING TOOLS. Ello facilita y simplifica el proces* desarrollo del proyecto, tal y como se muestra en la figura 12.16. El resultado del la divisin de frecuencia se puede observar en la siguiente grafic: : ?rresponde con la figura 12.17 en lo que respecta al valor de los inyectores logice* 000011 i ' este caso, la salida RBO cambia cada tres pulsos de la seal de entrada.

! '. '.i .

iptp*

'n?*' .W. . .
tK Er .

1U

' L_

OWaoLffiOT

R^ RBafPQH

. I
PJi^lfMyfREf*

-U7T

RBTPOt
BC1/T1';

;__;

;r _j
:

RcascKracL
WSSKBO

3::Seri;a l digiteJttelKHz:: ^ :::*:::

Figura 12.16. El cdigo de programa se ha realizado con el compilador CCS y se muestra en el listado 12.K

Figura 12.17.

PROYECTOS EN LENGUAJES DE ALTO NIVEL

191

/// Contaje de pulsos de una seal digital // /// PIC 16F876A a 20 Mhz linclude <16f876A.h> #fusesNOPROTECT,NOCPD,NOLVP,NOWDT,XT #use fast_io (A) #use fast_io (B) #use fast_io (C) #use delay(clock=4000000) #int_ccpl trataO

:
setup_timer_l(Tl_DISABLED); //TI en OFF set_timerl(0); //Reiniciar el TMR1 output_b(input_b() A 0x01); //RBO cambia de estado setup_timer_l(Tl_EXTERNAL I T1_DIV_BY_1);

12,:

main() ! SETUP_ADC_PORTS(NO_ANALOGS); //Puerta A Digital outputJb(OxOO); //Borra las salidas set_tris_a(0xf f); //Puerta A entrada set_tris_b(OxOO); //Puerta B salida set_tris_c(0xff); //Puerta C entrada enable_interrupts(int_ccpl); setup_ccpl(CCP_COMPARE_INT); //Mdulo comparacin CCP_1=0; //Puesta CCP1 set_timerl(0); //Reiniciar el TMR1 setup_timer_l(Tl_EXTERNAL I T1_DIV_BY_1); enable_interrupts(global); while(l) i CCP_l=input_a()&Ob00111111; //Lee puerta A y carga el CCP1//

Listado 12.10.

CONTROL PWM EN UN MOTOR DC proyecto consiste en variar la velocidad de un motor de corriente continua DC utilizanB tcnica PWM (Pulse-ividth modulation). Esta consiste en la modulacin por ancho de pul una seal. Si tenemos una seal como la mostrada en la figura 12.18, el parmetro PW U'/iff/i), o ancho de pulso, representa al ancho (en tiempo) del pulso y el DUTY (Duty cyc valor que determina el porcentaje de tiempo que el pulso (o voltaje aplicado) est en s activo (ON) durante un ciclo.

12."

Figura 12.18. Por ejemplo, si una seal tiene un periodo de 10 ms y sus pulsos son de ancho (PW) 2ms : seal tiene un Duty Cyck de 20% (20% on y 80% off). La seal PWM se utiliza como tcnica r. controlar circuitos analgicos. El periodo y la frecuencia del tren de pulsos pueden determ: la potencia entregada a dicho circuito. Si, por ejemplo, tenemos un voltaje de 9v modulamos con un Duty Cycle del 10%, obtenemos 0.9V de seal analgica de salida. 1 seales PWM son comnmente usadas para el control de motores DC (si se decrementa frecuencia, la inercia del motor es ms pequea y el motor se mueve ms lentamente), ajusta: intensidad de brillo de un LED, etc. Para controlar la velocidad del motor DC emplearemos el mdulo hardware CCP1, trabajan; en modo PWM, de un PIC16 F876. Generaremos una seal de onda cuadrada por la ImeJ RC2/CCP1 cuyo periodo puede ser modificado, as como la anchura del pulso (Duty Cycle). La seal de salida tiene un periodo determinado para la constante "Periodo" y una anchura (D-a Cycle) determinada por la constante Duty. Un osciloscopio conectado en RC2/CCP1 pueJt ayudar a realizar las oportunas medidas. Sin embargo, se ha aadido un anlisis grfico paaJ observar con ms claridad la seal modulada de salida. Para gobernar el motor DC se utiliza un driver de corriente tpico, como es el LM298. El circuito diseado bajo Proteus se muestra en la figura 12.19. El programa se ha realizad^ lenguaje C utilizando el compilador CCS.

PROYECTO EN LE

C utilizando o de pulso ^ tro PW (P. ity cycle), es d st en esta;

Como observamos en el listado 12.11que se muestra a continuacin ruadrada con un valor de periodo de 40us y un valor de Duty Cuele de 2-lis. L mportantes del programa son las que configuran el funcionamiento del module CCP_l_LOW=duty setup_ccpl(CCP_PWM<

Figura 12.19. // Control de la velocidad de un motor DC // utilizando PWM

2ms, cnica par determir e 9v y k salida. Lasj rementa ., ajustar li

tfinclude <16f876A.h> #fusesNOPROTECT,NOCPD,NOLVP,NOWDT,XT #use fast_io (C) #use delay(clock=4000000) int periodo=40; //Variable para el periodo int duty=20; //Variable para la anchura del pulso rnain() I output_c(OxOO); set_tris_c(0xbllll011); CCP_l_LOW=duty; //Carga la anchura del pulso setup_ccpl(CCP_PWM); //Modo PWM para el CCP1 setup_timer_2(T2_DIV_BY_l,periodo-l,l); while(l);

rabajanc: r la lir.; Cycle). La ura (1 5 1 put:fico y

)
Listado 12.11.

Variando el valor de la variable duty en el listado anterior observaramos distintas velocidades _ :> del motor bajo Proteus. Si cambiamos, por ejemplo, el valor de duty a 10, la seal que se mostrara en el osciloscopio sera la mostrada en la figura 12.20, y consiguientemente, el valor medio de la seal aplicada al motor sera menor, con lo que su velocidad de giro disminuira.

cm U

CH2 H * .= 1 i;1

Figura 12.20.

12.8

UTILIZACIN DE UNA MEMORIA I2C

Este proyecto consiste en utilizar una memoria I2C tipo 24LC32A de MICROCHIP para guare un dato en una direccin. Utilizaremos de nuevo un Pie de gama alta como el PIC16F876. La razn principal de la exposicin de este proyecto tan simple es aprender a simular y depurar a Proteus proyectos que incluyan esta clase de componentes I2C, los cuales ofrecen va opciones de depurado distintas a otro tipo de dispositivos. Los dispositivos I2C, lgicamente, funcionan de acuerdo con dicho protocolo. El bus I2C es ur interface de comunicacin serie que consta de dos hilos. En este protocolo cada dispositivo tiene una direccin. Cuando un maestro quiera iniciar una transferencia de datos, lo primero qu transmitir ser la direccin del dispositivo con que se quiera comunicar. Todos los disposit estn atentos y comprueban si se trata de su direccin. Dentro de esta direccin, el ltimo : especifica si el maestro quiere realizar una lectura o una escritura sobre el esclavo. Durante una operacin de transferencia de datos el maestro y el esclavo estn siempre modos opuestos, uno en modo de transmisin y otro como receptor. Indistintamente de qu: reciba y quin transmita, la seal de reloj la genera el maestro. Las lineas de salida de las seales de reloj (SCL) y datos (SDA) deben estar en drenador colector abierto, de modo que se pueda producir una conexin "Y" cableada en el bus. L

PROYECTOS EN LENGUAJES DE ALTO NIVEL

195

Deidades al que se el valor inuira.

resistencias externas son usadas para asegurar un nivel alto cuando ningn dispositivo la pone a cero. El nmero de dispositivos que se pueden conectar al bus I2C est limitado por la mxima carga que puede tener el bus, que es de 400 pF, y por la capacidad de direccionamiento. Existen dos formatos para el direccionamiento en el protocolo I2C. El ms simple es el formato de 7 bits de direccin con un bit de R/ W (figura 12.21), y el otro, ms complejo, es de 10 bits de direccin y el bit de R/ W. Todos los datos deben ser transmitidos por bytes, sin lmite en el nmero de bytes a transmitir por cada transferencia de datos. Despus de cada byte, el esclavo-receptor genera un bit de reconocimiento (ACK). Cuando el esclavo no manda este bit de reconocimiento, el maestro debe abortar la transferencia, para ello el esclavo deja la lnea SDA en alto para que el maestro pueda ;enerar la condicin de STOP. Si es el maestro el que est recibiendo datos, es ste el que ha de venerar el bit de reconocimiento despus de cada byte recibido, excepto para el ltimo. En este caso, el maestro no manda el bit de reconocimiento, liberando el dispositivo esclavo la lnea SDA para que el maestro genere la condicin de STOP. La condicin de STOP, tambin la puede enerar el maestro durante el pulso del bit de reconocimiento, terminando as la transferencia.

u a re: 176 irai varia;

e!: ' itiv 10 :

Figura 12.21.

Los ciclos, tanto de escritura como de lectura, entre el maestro y el esclavo se muestran -implificadamente en las figuras 12.22 y 12.23.

, -:

Ciclo de escritura (Maestro-Esclavo):

e,

,,;!.,

. .

Figura 12.22. Si el esclavo necesita retardo para la transmisin del siguiente byte, mantiene la lnea SCL o estado bajo, forzando al maestro a esperar. La transferencia de datos contina cuando el esclav: libera la lnea SCL. Esto permite al esclavo mover los datos recibidos o buscar los nuevos dato a transmitir antes de que el reloj se active. Cuando el maestro no quiere abandonar el bus (cos que ocurre cuando se genera una condicin de STOP), ste debe de generar una condicin D START repetida (Sr). Es idntica a la condicin de START explicada anteriormente, pero ocurr despus de un pulso de reconocimiento (no con el bus libre). Esto permite al maestro env.a: "comandos" al esclavo y recibir la informacin pedida o direccionar a distintos dispositiv;* esclavos. En el caso concreto de la memoria 24LC32A que vamos a utilizar en nuestro proyecta observamos en sus caractersticas que presenta un valor binario 1010 (fijo) en la parte de b direccin proporcionada por el fabricante.

Ciclo de lectura (Maestro-Eslavo):


!. i , - !!,f !l : !,,"[,<,;=

' S

Diittric.li

"~

s"'"\".

Dato"

[N

""": ::::: i
Ma.ll Eln-o Zaino

"~~ :
Mi

< . ^: L>n

'-''-

"r

-.: ::;. . :in D.1TO

'

D.ito

Figura 12.23.

PROVECTOS EX LENGUAJES DE ALTO NIVEL

197

'or otra parte, como slo vamos a utilizar una sola memoria, llevamos a masa sus pines propios de direccin AO, Al y A2. Con ello la direccin completa de 7 bits para nuestro proyecto es 1010000. Ello se puede ver grficamente en la figura 12.24.

A2

Figura 12.24. ? conectamos esta memoria 24LC32A al PIC16F876 el circuito resultante es el mostrado en la ;ura 12.25. Adems, se ha aadido una grfica digital para observar las dos seales SDA v SCL a lo largo del tiempo y estudiar con detalle el comportamiento del protocolo I2C. 3 programa se ha realizado en lenguaje C con el compilador CCS. Es muy simple, ya que lo -inico que hace es escribir un dato concreto (0x06) en la direccin de memoria 0x05 de la E PROM externa. Se ha optado por la utilizacin de las funciones primitivas e integradas del mpilador (built-in), aunque ste ofrece un driver o librera externa (2432.c) con funciones ms Tipletas. Sin embargo, lo que se desea mostrar es solamente el funcionamiento bsico del rrotocolo en Proteus.

Figura 12.25. El cdigo de programa (listado 12.12) es el que se muestra a continuacin: // Escritura en una memoria 24LC32a tfinclude <16F876.h> tffusesNOPROTEC^NOCPD^OLVP^NOWDT^XT

-use delay(clock=4000000) -use i2c(master, sda=PIN_C4, scl=PIN_C3,RESTART_WDT) #use fast_io (C) main() { i2c_start(); // Inicializacin del protocolo i2c_write(OxaO); // Direccionamiento del dispositivo i2c_write(OxOO); // Direccionamiento de la posicin 2c_write(0x02); // de memoria 0x02. 2c_write(0x08); // Escritura del dato 0x08 i2c_stop(); // Alto a la comunicacin I2C delay_ms(10);

Listado 12.12. Proteus nos ofrece la posibilidad de ayudarnos a depurar aquellos programas que mane dispositivos I2C. Para ello, cuenta con una ventana de informacin que nos muestra un lo. conjunto de mensajes que indican paso a paso el proceso de comunicacin de dicho protocc Es necesario pausar la simulacin para tener acceso a esta ventana que est situada bajo el mt Debug, como se muestra en la figura 12.26.

1. Simularon Log 2. Watch Window 1 . Log Messages - U2 2. Internal Memory - U2

1
',; ...

' -i-o

:.:.:

Figura 12.26.

La primera ventana llamada Log Messages - U2 muestra, tal y como se ve en la figura 12.1 mensajes muy detallados del funcionamiento del protocolo, tales como si se dan las condicin. de START. RECONOCIMIENTO, STOP, etc.

n - cal iel p: o DIR'

PROVECTOS EN LENGUAJES DE ALTO NIVEL

199

zn el caso de que trabajemos con memorias extemas I2C disponemos de una segunda ventana jue nos muestra su contenido. As, en nuestro caso, se observa que el dato 0x06 se ha escrito en :- direccin de memoria 0x02 (figura 12.28).
cormiand received: OXAO (OblOlOOOOO^. e=0, Block=ovCC, AOore!s=:.--: - - - ---_*=*+---<: Start of acknowledge - drivinq SDA 1 End of acknowledge. New state is [PX^UDDR i'i'..] . upper address byte received: 0x00 (QbQOOQOOOCT . _--ir- :f -=i:-r-ow" edge - dnving SDA "1 ini. End of acknowledge. New state 1 s [R=L.ADDRi;2)]. Luwer address byte recev.ved: 0x02 robooooooioj. Compl Start of acknowledge - driving SDA low.
1. 133lm

End of acknowledge. New s

Figura 12.27. Por otra parte, si deseamos resetear en cualquier momento el contenido de la memoria EEPROM, podemos hacerlo bajo el men Debug con la opcin Reset Persistent Model Data. Tras ello se nos solicitar confirmacin de borrado (Figura 12.29).
rna! Memory- .112

oooc

0000

001S 0024 0030 003C 0048 0054

FF FF FF FF

FF FF{?VF:FF FF FF FFFF FF FF FF FF FF VF-JFF FF F F J F F FF FF FF


FF FF FF FF FF FF FF FF FF FF FFJFF FFFF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

FF FF FF FFFF

ooeo

FF FF FF:FF FF .FF-EF FF FF FF FF FF FF FF FF ; FF FF UfWF FF FF FF FF FF FF FF FF!FF FF FF FF

Figura 12.28.

Persistent Model Data is mode! data [e.g. mictoprocessor EEPROM rnemory) that ISIS maintains between simulations. Confirming this option will orce all models to revert to using their default memory settings when you next simlate yout design.

Cancel

Figura 12.29. En nuestro circuito hemos aadido un anlisis de tipo grfico digital para ayudamos aun mas, si cabe, en el proceso de depurado del cdigo de programa o, simplemente, en el :.zaje del protocolo I2C. La grfica se muestra en la figura 12.30 y en ella se ven las seales SDA y SLC a lo largo del tiempo y cmo evolucionan a travs de las condiciones de START, DIRECCIONAMIENTO, DATOS, etc.

Figura 12.30. Tras una condicin de START se enva la direccin del dispositivo I2C, que en este caso ti como parte fijada por el fabricante el nible 1010 y 000 como parte direccionada por nosot travs de las patillas AO, Al, A2 de la memoria. El ltimo bit es un "O" ya que se va a efectuar una operacin de escritura. En total, la direccin completa de la memoria es 1010 0000 continuacin se enva por SDA la direccin de memoria (0000 0010) donde se desea escrib dato 1000 que se trasmite por ltimo. La comunicacin I2C finaliza con una condicin de STOF Evidentemente, esta manera de analizar un protocolo de 2 o ms seales es muy efectiva i nica, comparada con la realidad de una instrumentacin real.

12.9

MEDIDA DE TEMPERATURAS CON EL DS1620

Con este proyecto se pretende implementar un termmetro digital utilizando para ello PIC16F628A y un sensor de temperatura 3-Wires denominado DS1620. Las temperaturas ser;-r mostradas en un terminal virtual RS232. El dispositivo DS1620 es un sensor de temperatura de 3 hilos que presenta un protocolo e comunicacin sencillo. Adems ofrece la posibilidad de trabajar como termstato. La apariencia del componente y el patillaje es la que se muestra en la figura 12.31.
- 3-Wire Input Ourput
DQ Rll GND THIGK TLOTV TCOM

re Clocfc Input and d-aloiie Coiivet Inpui

VDD

Figura 12.31.

PROYECTOS EN LENGUAJES DE ALTO NIVEL

201

-'. circuito desarrollado se muestra en la figura 12.32. Se pueden observar las conexiones del _ ^1620 al PIC16F628A a travs de sus tres hilos o pines fundamentales v que estn definidos en programa principal (listado 12.13) que se expone a continuacin: Adems, disponemos de una terminal virtual RS232 para mostrar las temperaturas sensadas. // Medida de temperaturas con el DS1620 finclude <16f628a.h>

so tit iotro :
)000. A

#fusesXT,NOWDT,NOPROTECT,PUT,NOLVP #fuses INTRC #use delay (clock=4000000) #users232(baud=9600,xmit=PIN_B2,rcv=PIN_Bl)

:ribir e STOP. ctiva T

lio se
Figura 12.32.

)li ier

Mefine DS1620_DQ PIN_AO define DS1620_CLK PIN_A1 #define DS1620_RST PIN_A2 #include <libds.c> // Librera del DS1620 // Realizada por vszener float dato; void main(void) ! while(l)

!
dato=read_dsl620(); setup_uart(TRUE);

printf("\fPROTEUS->TermometroDigital\n\r\n\ rTemperatura:%3.1fQC",read_dsl6200); delay_ms(1000);

Listado 12.13. Al ejecutar la simulacin vemos la temperatura en la ventana del terminal virtual RS232. (fir. 12.33).

Figura 12.33. Por otra parte, se han aadido tres sondas de voltaje al esquema para visualizar las seaJ fundamentales de comunicacin del PIC con el DS1620 en una grfica digital (figura 12.34 deja al lector el estudio pormenorizado del protocolo de 3 hilos.

Figura 12.34.

12.10.

MEDIDA DE TEMPERATURAS CON EL CONVERTIDOR A/D

Se va a desarrollar un proyecto que consista en adquirir las temperaturas desde dos sensor^ LM35a y las muestre a travs de un terminal RS232 para enviarlas a cualquier dispositivo roe utilice este protocolo. Utilizaremos un Pie 16F876A y el compilador CCS para escribir el cdigo

PROYECTOS EN LENGUAJES DE ALTO NIVEL

203

programa. Por otra parte, desde el propio terminal RS232 decidiremos si queremos visualizar dos temperaturas o bien controlar el encendido de un calefactor.

sensor LM35a convierte el valor de temperatura en un valor en voltios. Linealizando esta iacin, llegamos a una expresin matemtica aproximada cuya expresin es: Temperatura (QC) = (Voltios (V) * 391) /1000

2. (fig

oteus no posee el modelo de este sensor; de ah que emulemos su comportamiento utilizando expresin anterior y una serie de tres potencimetros para ajusfar el valor de forma precisa, circuito se muestra en la figura 12.35.
.Simulacin de LM35a (1)

.Simulacin del LM35a (2)


ren Resistencia TJ calefactora

Figura 12.35. is dos salidas tericas de los LM35a estn conectadas a dos pines (RAO y RA) del puerto A I el Pie que hemos configurado como entradas del convertidor analgico/digital del PIC16F876. 1 pin RA3 establece la tensin de referencia y resolucin del convertidor a travs de un rotencimetro. El terminal RS232 se comunica con el microcontrolador mediante los pines RC6 v RC7. El control del calefactor se emula mediante el pin RB5. El programa se muestra en e 12.14. // Programa para la adquisicin de la temperatura de // // dos sensores LM35a utilizando el convertidor // // analgico/digital de un PIC16F876 y bajo el control // //de un terminal RS232// finclude <16f 876a.h> #fusesXT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT #use delay(clock=4000000) #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) int adc_temperatural=OxOO; int adc_temperatura2=OxOO;

int grados_temperatural=0; int grados_temperatura2=0; char Keypress=' '; #int_rda void rda_isr() ! Keypress=OxOO; if(kbhitO)

!
Keypress=getc();
! ! void toma_adc_y_transmite(void) i set_adc_channel(0); // Lectura del canal O -> ANO delay_ms(l); adc_temperatural=read_adc(); delay_ms(l);

set_adc_channel(l); // Lectura del canal 1 -> AN1 delay_ms(l); adc_temperatura2=read_adc(); delay_ms(l); grados_temperatural= (int) ((adc_temperatural * 391) / 1000); grados_temperatura2 = (int) ((adc_temperatura2 * 391) / 1000); printf(" LM35a(l) = %u aC; a/d(l) = %u; LM35a(2) = *Q C;a/d(2)%u\r",grados_temperatural,adc_temperatural,grados_temperatura2,adc_temperat 2);

void main() ! set_tris_a(OxFF); setup_adc(ADC_CLOCKJNTERNAL); setup_adc_ports(RAO_RAl_ANALOG_RA3_REF); output_low(PIN_B5); enable_interrupts(int_rda);

PROYE n

205

enable_interrupts(global); printf("\n\ AD - LM35a - Monitor\r\r");


do

if(Keypress!=OxOO) switch(Keypress)
!

case 't': toma_adc_y_transmite(); break; case 'O': output_low(PIN_B5); printf (" O - Calentador OFFV); break; case T: output_high(PIN_B5); printf (" 1 - Calentador ON\r"); break;
i

Keypress=OxOO;
} while (TRUE);

Listado 12.14. : ajustamos la tensin de referencia Vref a 3 Voltios tendremos una resolucin de irroximadamente 11, 7mV. Es decir, ese ser el paso mnimo del convertidor A/D del Pie. Tuando ejecutamos la simulacin observamos que se abre la ventana del terminal RSl^l aperando que pulsemos una de estas tres teclas: t para leer el dato de la conversin de temperatura en ambos sensores, O para apagar el calefactor y 1 para encenderlo. Cada vez sernos una tecla, se interrumpe el programa principal a travs de la interrupcin ini_rda( del terminal RS232 y se guarda en una variable de memoria. En funcin de su valor. ?e de las tres rdenes anteriores. En la figura 12.36 se observa el aspecto de la ve:~ - rminal RS232 en tiempo de simulacin. \Iientras se simula el circuito bajo Proteus, es posible variar el valor de emulado CT 35a a travs de sus respectivos conjuntos de potencimetros y as cambiar I Temperatura en tiempo real. 3 uso del terminal RS232 nos permite tener el control del calefactor des; Analizar las temperaturas en l, mediante su puertos COM y utiliz -iperterminal u otro parecido.

;-

Figura 12.36.

12.11

MEDIDA DE TEMPERATURAS CON EL DS1820

El DS1820 (figura 12.37) es un sensor de temperatura que trasmite el valor digital de temperatura leda en el lugar donde se encuentre el dispositivo. Utiliza una nica lnea >T que se comunica con otros dispositivos mediante el protocolo para bus de una lnea dise:': por Dallas Semiconductors. Sus principales caractersticas son: El patillaje para cpsula TO-92. La temperatura es leda como un valor digital de 2 bytes que incluye signo. Medida de temperatura desde -50QC hasta +125-. Requiere una nica lnea para la comunicacin mediante 1-Wire-Bus. Apenas requiere componentes externos.

Se trata de disear un proyecto sencillo que consista en medir constantemente la temperar. con este dispositivo y enviarla a un PIC16F877 para que la muestre en un Lcd alfanumri: cdigo del programa se desarrolla con el compilador MikroC, ya que ste ofrece una librera funciones 1-wire muy sencillas de utilizar que nos permiten centrarnos en otras tareas concretas que debe ejecutar el programa, como son, por ejemplo, las relativas al frmate. : valor de la temperatura para poder mostrarse, adecuadamente, como texto en el Lcd. La librera de funciones para los dispositivos 1-wire que ofrece el compilador MikroC se siguientes:

PROYECTOS EN LENGUAJES DE ALTO NIVEL 207

125 C

-50 C

Figura 12.37. Ow_Reset(*port, pin): Esta funcin provee del reseteo al DS1820. Ow_Read(*port, pin): Lee un byte de datos del DS1820. Ow_Write(*port, pin, par): Escribe un byte de datos en el DS1820.

El circuito de medida de temperatura se muestra en la figura 12.38. Observamos que la lnea de lomunicacin serie (DQ) del dispositivo DS1820 est conectada al pin RE2 del puerto E del r IC16F877. Por otra parte utilizamos el puerto D para el conexionado del Lcd alfanumrico.

Figura 12.38. Examinamos el cdigo de programa (listado 12.15). El ncleo del programa est definido en la -_ncin principal main(). Ah es donde definimos los puertos y los pines implicados en el nexionado con el DS1820 y el Lcd, as como el envo o escritura de la serie de comandos rjesarios para hacer funcionar el DS1820 convenientemente. Finalmente se llairt; ncin \isualizar_temp(), que es la encargada de formatear adecuadamente lo- dos bytes que Tpresentan la temperatura leda, en dos cadenas de caracteres (parte entera y parte ccionaria) para su visualizacin en el Lcd. Para una compresin mav .receso es : inveniente estudiar las caractersticas del dispositivo DS1820 que proporciona el fabricante.

~ ; r ; cambiar el valor de temperatura que proporciona el DS1820 es necesario de: rirr.ulacion en curso y editar las propiedades del componente. En la casilla Temj: remos el valor deseado y al volver a simular el circuito, observaremos el nuevo v. temperatura en el Lcd. Hay que resear que el DS1820 es un dispositivo cuyo modelo y librera est slo disp partir de la versin 6.9 de Proteus. Sin embargo, es posible utilizarlo en versiones anfc Para ello, es necesario copiar el fichero con extensin DLL en la carpeta de libreras de F al igual que el fichero con extensin LIB en la carpeta Models, tambin, de Proteus i ficheros se encuentran en el CD-ROM que acompaa al libro. Este procedimiento de~^ vlido para cualquier dispositivo modelado y que no se encuentre en la versin que utio // Programa para adquirir la temperatura a travs de un // DS1820 y un PIC 16F87 mostrndola en un LCD. // La constante EMP RESOLUTION establece la resolucin del DS1820

const unsigned short TEMP_RESOLUTION = 12; const int RES_FACTOR_1[4] = {5000,2500,1250, 625}; const unsigned int RES_FACTOR_2[4] = {0x0001,0x0003, 0x0007, OxOOOF}; const unsigned int RES_FACTOR_3[4] = {0x8000, OxCOOO, OxEOOO, OxFOOO}; unsigned temp; unsigned short j, RES_SHIFT; void Visualizar_Temp (unsigned int temp) { const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8; unsigned int temp_whole, temp_fraction; unsigned short i; char text[8]; // Aisla la parte fraccionaria tempjraction = temp & RES_FACTOR_2[RES_SHIFT -1]; temp Jraction = temp_fraction * RES_FACTOR_1[RES_SHIFT -1]; temp_whole = temp; Interroga si la temperatura es negativa

PROYECTOS EN LENGUAJES DE ALTO NIVEL

209

er la
itUTT

if ((temp_whole & 0x8000) != Ou) i = 1; // Si, i = 1 else i = 0; // No, i = O PORTC = i; Quita la parte fraccionaria temp_whole = RES_SHIFT; Corrige el signo if (i) temp_whole I = RES_FACTOR_3[RES_SHIFT - 1]; IntToStr(temp_whole, text); // Convierte la parte entera //a una cadena Lcd_Out(2, 6, text); Lcd_Chr_Cp('.'); // Muestra la parte entera en // el LCD // Visualiza el punto decimal

ble,
ic >:

te

IntToStr(temp_fraction, text); // Convierte la parte //fraccionaria a una cadena Aade ceros if (tempjraction < lOOOu) Lcd_Chr_Cp('0'); if (tempjraction < lOOu) Lcd_Chr_Cp('0T); if (tempjraction < lOu) Lcd_Chr_Cp('0'); LcdJ3ut_Cp(text); // Visualiza la parte fraccionaria Lcd j:hr_Cp(223); // Muestra el carcter de grados (B) LcdJIhr_Cp('C'); // Muestra el carcter 'C'(centgrados)

id main()

PORTE =OxFF; TRISE =OxOF; PORTE =0; TRISE =0; Inicializa el LCD LcdJnit(&PORTB); Lcdj:md(Lcd_CURSORJ3FF); Lcd_Out(l, 1," Temperatura: ");

.Ow_Reset(&PORTE,2); // Seal de reset del DS1820 Ow_Write(&PORTE,2,OxCC); // Escribe el comando SKIP_ROM Ow_Write(&PORTE,2,Ox44); // Escribe el comando // CONVERT_T Delay_us(120); Ow_Reset(&PORTE,2); Ow_Write(&PORTE,2,OxCC); // Escribe el comando SKIP_ROM Ow_Write(&PORTE,2,OxBE); // Escribe el comando READ_SCRATCHPAD Delay_ms(400); j = Ow_Read(&PORTE,2); // Adquiere el dato (LSB) // temperatura temp = Ow_Read(&PORTE,2); // Adquiere el dato (MSB) // temperatura temp = 8; temp += j; // Formatea el resultado Display_Temperature(temp); // Visualiza el resultado en //el LCD Delay_ms(500); } while (1);

Listado 12.15. A partir de la versin 6.9 de PROTEUS el modelo del dispositivo DS1820 se ofrece en . variantes: el DS18B20 y el DS18S20. Ambos modelos son similares y presentan, en modo depurado de la simulacin, dos ventanas de informacin muy til bajo el men Debug i fig 12.39).

00

i FF

FF FF

FF i

00

AA 00 FF FF FF FF OC 10

Figura 12.39.

PROYECTO--

NIVEL

211

12.12

MEDIDA DEL TIEMPO CON EL PCF8583 (RTC)

Ir. algunas aplicaciones de APRS, como, por ejemplo, en la transmisin ck neteorolgicos, para poder disponer de la hora y fecha en la que se han :*; rr.2c . ~ : ~ - ::- rf necesario transmitir la informacin horaria dentro de la trama. El formato adc. normalmente estndar en los dispositivos RTC (reloj en tiempo real) es: hora mi: los datos proporcionados por el RTC son volcados al microcontrolador y este ?e - ' ratamiento y su posterior visualizado en la pantalla :* RTC que utilizaremos en este proyecto se basa en el chip PCF8583 de Philips. Este c genera los impulsos a partir de un cristal de cuarzo. El circuito RTC est controlado p: microcontrolador AVR (ATMEL) tipo AT90S4433, que se encargar simplemente de leer los latos proporcionados por el dispositivo I2C. II dispositivo PCF 8583 es un reloj en tiempo real cuyo control y programacin se hace a travs el protocolo I2C. En la figura 12.40 se puede observar su apariencia ms usual y patillaje. El circuito de lectura de tiempo bajo Proteus es el que se muestra en la figura 12.41. En esta ".isin, el cdigo de programa se ha desarrollado en BASIC y se ha utilizado el compilador FAST AVR. Este entorno de desarrollo es muy sencillo de utilizar ya que la sintaxis del lenguaje 3ASIC que usa es muy simple. Con muy pocas lneas, y gracias a las funciones que trae rtegradas, se consigue realizar proyectos medianamente complejos con muy poco esfuerzo. Adems, como se expuso en el capitulo anterior, la portabilidad de cdigo, tanto para otro tipo lenguajes de desarrollo, como de tipo de microcontrolador, es poco laboriosa si se trabaja en riiguajes de alto nivel; de ah que trasladar este programa a otros compiladores no es una labor :ediosa.

SYMBOL OSCI

PIN

DESCR1PTION osclsator npuL 50 Hz or event-p Jse nput

U
oseo [T PCFB53P T]ir PCF8583T T] CL M>[T

oseo
A
Vss SDA SCL INT VD:

2 3 4 p. 6 7 8

oi.c l'a'or cutput address inpjE negotive suppiy serial data hne seriai dock une ooen d-ai irte rup outpul (active

ssLI
WS3M

T]

SDA

LOW)
posttive supply

Fig-2 Pi'^nmg d'agra-r

Figura 12.40. El cdigo realizado en FAST AVR se muestra en el siguiente listad 1 las lneas de conexin al Lcd y al dispositivo PCF8583 se define 5ealar que la lnea de control R/W del Lcd debe estar puesta a tierra. .on de

F
: =

fteloj 12:i:15

Figura 12.41.

'/// Programa de medida del tiempo con PCF 8583 '/// AVR AT90S4433 $Device=4433 $Stack = 32 $Clock = 7,3728 $Lcd=PORTD.4, RS=PORTB.4, EN=PORTB.5,16,2 $I2C SDA=PORTB.O, SCL=PORTB.l Declare Sub Settime(ure As Byte, Min As Byte, sec As Byte) Declare Sub GettimeO Dim h As Byte, m As Byte, s As Byte Const PCF8583=&haO Settime(12,12,12) 'Establece un tiempo cualquiera Cls Lcate 1,1: Lcd "Reloj" Do GettimeO Lcate 2,1 LcdHex(h);":";Hex(m);":";Hex(s) WaitMs 250 Loop

PROVECTOS EN LENGUAJES DE ALTO NIVEL

213

Sub GettimeO LZCstart PCF8583 'Inicializa I2C 'selecciona segundo registro LZCwrite 2 5=I2Cread, Ack m=I2Cread, Ack h=I2Cread, Nack LZCstop 'Genera STOP End Sub Sub Settime(ure As Byte, Min As Byte, sec As Byte) I2Cstart PCF8583 'Genera START I2Cwrite 2 'Selecciona registro segundo I2Cwrite Bcd(sec) 'escribe segundos I2Cwrite Bcd(Min) 'escribe minutos I2Cwrite Bcd(ure) 'escribe horas I2Cwrite Bcd(O) 'escribe das I2Cwrite Bcd(O) 'escribe meses I2Cstop End Sub Listado 12.16. Cuando estamos bajo Proteus, en el modo depuracin disponemos de varias ventanas de informacin del dispositivo PCF8583. stas nos informan del su estado interno (figura 12.42).
::..-.'.'.:
COUNTERS R 'Status': wMhiits: Hour'5 Farrnat DSte;
rRQ -

PITH TO3 9Af - 1 ?


00 00 14 43 12 12 00 00 00

' , ,C

A<

oooooooob OOOljOlOb
24h 12 (ECO)

H s e c o n d s; OOOOloOb 14(BC03 ., e c o 1 1 d i- ; 0100 . nijllb 43 (BCDD

xxoi i ooiob

02(BCD)

XXOOi OOOOb OOfBCDD OOfBCO) oob Yarsfrin th; xxxo i ooo b OOfBCD) weekday: ooob O^BCD) Tinier; OOOO : OOOOb OO(BCO^ ''.. I^PM B.EGI STER S Critrl-: oooooooob Hsscdrids : oooo! oooob OOfBCDl Scdnds - ooooioooob OO(BCD) M utes i oooo i oooob oorBco'i \ Hours: xxoojoooob OOfBCD) i Format: 24h ; Date: xxooj oooob QOTBCD3 vear: OOfBCD oob Month: xxxo | oooob OO(BCO) OCBCD) weei* 3 ai : ooob Timer: ooooioooob

PCF8S83 CInck - U2

Time: 12-12-43 Date: OQ-00-oo

Figura 12.42.

12.13

USO BSICO DE LA MULTIMEDIA MEMORY CARD (MMC)

La tarjeta multimedia de memoria Multimedia Memory Card (MMC) es una tarjeta estndar tipo flash. Las tarjetas MMC (figura 12.43) son habitualmente disponibles con diversas capacidades

icria y son utilizadas en telfonos mviles, reproductores MP3, cmaras digitales, PD*

Figura 12.43. Desde el punto de vista tcnico, stas pueden trabajar mediante dos protocolos protocolo MultiMediaCard propiamente dicho y el protocolo SPI. El primero de el ms potente ya que permite ms operaciones que el segundo, pero por otro es ms fcil de implementar si se dispone de una interfaz SPI. De hecho, el puede considerar como una versin reducida del protocolo MultiMediaCard. serie distinto? * los protocolos * lado, el segunim( protocolo SFl st

El protocolo de acceso SPI se puede implementar mediante cualquier controlador (ordena o n personal, microcontrolador, etc.) que disponga de un canal SPI hardware o emulado :>3r software. Cuando se opera en este modo los pins de la tarjeta se denominan del siguiente meo* mostrado en la figura 12.44. CS: permite al controlador seleccionar la tarjeta sobre la cual quiere operar. 25. cuando CS vale O la tarjeta se encuentra seleccionada y lista para operar. Estt puede ser controlado por cualquier pin de salida del controlador. Dataln: es la entrada de datos serie a la tarjeta y debe estar conectada a la s.V :_ MOSI de la interfaz SPI del controlador. DataOut: es la salida de datos serie de la tarjeta y debe estar conectada al pin MISO de la interfaz SPI del controlador. CLCC: es la seal de reloj generada por el controlador y es la que marca el ritrr transferencia de la informacin serie entre ambos, as los datos se capturar transmiten por la tarjeta al ritmo marcado por esta seal. VDD: es el pin de alimentacin y VSS1 y VSS2 son los pins de masa.

PROYECTOS EN LENGUAJES DE ALTO NIVEL

215

# Pin:

'.<-"..-

igc

QP = C r r . - ' - '-:-. ':-'-.'-------- - . - - - - - - - - : ------ ---z Masa Alimentacin Clock Masa Lnea de datos y status de la tarjeta al rnicrocontrolador.

1 2
O

ICS Dataln
VSS1

:: . Entrada Alimentacin Alimentacin Entrada Alimentacin Salida

4
5
3

V'DD

CLK VSS2 DataOut

Figura 12.44. Tanto la tensin de alimentacin como las seales deben encontrarse en el rango de los 2,6 y ~ "V. Bsicamente, el protocolo SPI consiste en el intercambio de informacin entre el controlador "ster) y la tarjeta (slave). Este intercambio se lleva a cabo mediante el envo de comandos por rarte del controlador y de respuestas por parte de la tarjeta. As, en la lectura, el controlador enva el comando de peticin de lectura a la tarjeta y esta le enva la respuesta de confirmacin seguida del bloque de datos con la informacin contenida a partir de la direccin solicitada. En .a escritura el proceso es parecido, el controlador indica a la tarjeta mediante el comando de -entura que quiere escribir informacin en una determinada direccin, sta le responde indicando que est lista y a continuacin el controlador enva el bloque de datos a escribir. Las operaciones que no requieren intercambio de datos funcionan de igual forma pero sin usar bloques de datos. Los comandos SPI son bloques de bytes con un formato fijo (figura 12.45). La tarjeta identifica .os comandos porque el primer byte de estos (byte 1) siempre comienza por 01, el resto de bits del primer byte contiene el nmero de comando codificado en binario natural. As el primer rvte correspondiente al comando O (CMDO) seria: 01000000, o el primer byte correspondiente al comando 39 (CMD39) sera: 01100111. Los siguientes 4 bytes (bytes 2-5) contienen argumentos del comando. En los comandos que no requieren argumentos estos valen i .-.Itimo byte (byte 6) es el byte de CRC para la verificacin de errores y en realidad en el jrotocolo SPI no se utiliza, a no ser que en el registro de configuracin se especifique cv- se desea utilizar CRC.
Byte 1 Byte 2-5 31-0 Command Argument Byte 6
7 CRC
-

idor

7 6
0 1

5-0

Commanci

Figura 12.45. Toda la comunicacin entre la tarjeta y el controlador se realiz: izquierda a derecha, es decir, que primero se transmite el r del quema, de ?] bvte 1, v

.iltimo el bit de menos peso (bit 0) del byte 6, es decir: es una transferencia More - - -: i MSB First). Los principales comandos se muestran en la figura 12.46. Las respuestas de la tarjeta son bloques formados por 1 2 bytes, dependiendo del tip, respuesta que se trate. El tipo de respuesta es funcin del comando, es decir, que cada coma tiene asociado un tipo de respuesta. Los bloques de datos comienzan siempre con el byte OxFE, a este le siguen los bytes de da: por ltimo los 2 bytes de CRC. El nmero de bytes de datos depende de la longitud de blo definida mediante el comando 16, y sta puede ir de 1 hasta 512 bytes (por defecto 512). tanto, sumando a los bytes de datos el byte de inicio y los dos bytes de CRC, la longitud t del bloque de datos puede variar entre 4 y 512 bytes. Como, por defecto, en el protocol acceso SPI no se consideran los bytes de CRC, estos pueden tomar cualquier valor.

Comando:
CMDO CMD1 CMD9 CMD10 CMD13 CMD16

Argumentos:
No No No No No

31 ..0] Longitud del aloque. 31 ..0] Direccin de Jatos. 31 ..0] Direccin de datos

C-MD17 CMD24

Respuesta: Descripcin: R1 Resetea la tarjeta R1 nicialna la tarjeta R1 Pide a la tarjeta su informacin OSO R1 Pide a la tarjeta su identificacin CID 32 Consulta el estado de la tarjeta R1 Establece la longitud (en bytes) del bloque para los datos en las operaciones de lectura y escritura R1 Lee un blogue del tamao indicado por el enmarido 16 Escribe un blogue del tamao indicado R1 R1 R1 por el comando 16.

Figura 12.46. Por defecto, al arrancar la tarjeta, esta se encuentra en modo MultimediaCard. Para que entre modo SPI, hay que enviarle el comando O mientras se mantiene activa la seal CS (CS=0), p< antes de todo, para poder iniciar la comunicacin por el bus hay que enviar como mnimo ciclos de clock a la tarjeta. As, para hacer el reset de la tarjeta y prepararla para trabajar modo SPI hay que seguir la siguiente secuencia: Dar como mnimo 74 ciclos de clock, es decir, enviar unos 10 bytes a travs de la SPI. Activar la seal CS (CS=0). Enviar el comando O con el CRC bien calculado, ya que todava no estamos en ir.:SPI, por lo que s se considera el CRC. De hecho, la secuencia del comando O siempre la misma: 0x40, 0x00, 0x00, 0x00, 0x00, 0x95. Esperar el byte de respuesta que ha de ser 00000001 (tarjeta en modo idl).

PROYECTOS EN LENGUAJES DE ALTO NIVEL

217

."na vez reseteada y en modo SPI, hay que hacer la inicializatin de la tarjeta, para ello hay que enviar el comando 1. La secuencia general es esta: Activar el pinl CS (CS=0). Enviar el comando 1: 0x41,0x00, 0x00, 0x00, 0x00, Ox.XX. Como la tarjeta ya esta en modo SPI, el CRC puede tomar cualquier valor. Esperar el byte de respuesta que ha de ser 00000000 (tarjeta lista).

"_"na vez inicializada la tarjeta, para escribir un bloque en sta, hay que enviar el comando 24 con la direccin de inicio a partir de la cual se desean guardar los datos. Si todo va bien, la tarjeta enviar tres respuestas Rl repetidas, informando al controlador que ya puede enviar el bloque de datos, que ha de tener una longitud de 512 bytes (en la escritura slo se permiten 512 tes) ms el byte de inicio de bloque de datos y los dos bytes de CRC. La secuencia a seguir es: Activa el PIN CS (CSO). Enviar el comando 24 0x58, OxXX, OxXX, OxXX, OxXX, OxYY. Los 4 bytes XX corresponden a la direccin a partir de la cual se quieren guardar los datos. OxYY corresponde al byte de CRC y como la tarjeta est en modo SPI pueden tomar cualquier valor, ya que no se consideran. Si todo va bien, la tarjeta responde con el byte de respuesta Rl tres veces consecutivas. Enviar a la tarjeta el bloque de datos que consiste en: 1 byte de inicio de bloque de datos OxFE, 512 bytes con los datos a guardar, 2 bytes de CRC. Mientras la tarjeta est ocupada guardando el valor, ir enviando bytes indicando que est ocupada y cuando finalice la escritura enviar un byte de confirmacin.

La lectura de un bloque en la tarjeta modo SPI: Para leer un bloque de la tarjeta hay que enviar a esta el comando 17 con la direccin de inicio de lectura en los bytes de argumento. La direccin puede tomar cualquier valor comprendido dentro del rango de direcciones vlidas de la tarjeta, pero todo el bloque ledo debe estar dentro de un mismo sector fsico. A continuacin la tarjeta enva un byte de respuesta Rl seguido del bloque de datos, que comienza por OxFE, continua con los bytes de datos y finaliza con 1 bytes de CRC que no se usan. El nmero de bytes de datos depende del tamao de b se haya programado mediante el comando 16, y en la lectura puede ir de 1 a 512. La secuencia a seguir es la siguiente: Activar el PIN CS (CS=0). Enviar el comando 17, 0x51, OxXX, OxXX, OxXX, OxXX, OxYY. Lo corresponden a la direccin a partir de la cual se quieren leer los datos. OxYY corresponde al byte de CRC y como la tarjeta est en modo S mar cualquier valor ya que no se considera.

Si todo va bien, la tarjeta responde con un byte de respuesta Rl, seguido del bloque datos con la informacin solicitada y que el controlador tendr que ir capturando. Esa tiene la misma estructura que los bloques de datos utilizados en la escritura.

El proyecto que a continuacin se expone consiste en escribir y leer en una MCC desde PIC18F452. La comunicacin entre el Pie y la MMC Cara se realiza mediante el protc Sncrono SPI. Adems, el resultado de la lectura se volcar sobre un terminal virtual RS231 cdigo de programa se realiza utilizando el compilador C CCS. Segn toda la tea anteriormente expuesta, todo el protocolo est construido alrededor del driver denomir: mmcdos.c. ste proporciona las funciones necesarias para la lectura y escritura sobre memoria, lo cual simplifica enormemente el diseo del programa principal. En l, cabe desta: la configuracin apropiada de los pines que se van a utilizar para cada una de las funciones : (DO, DI, CK y CS). El cdigo del programa principal (listado 12.17) es el que se muestra a continuacin: #include <18F452.h> #FUSES NOWDT #use delay(clock=20000000) #users232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9) Mefine MMC_CLK PIN_C3 tfdefine MMC_DI PIN_C4 // Configuracin de los pines SPI Mefine MMC_DO PIN_C5 define MMC_CS PIN_C2 DEFINE _CS PIN_C2 #DEFINE MAX_FILES 2 #DEFINE MMC_BUFF_SIZE 32 *include<mmcdos.c> void main()
int mok; char deneme,okunan; 1

char oku[32]={'E', D';r;T';o','R';r;AVL1;


char dzl[32]; char data[512]; intl i,j,k,l;

/Rycyo/MVByo/yzyoyoys.,'

PROYECTOS EN LENGUAJES DE ALTO NIVEL 219

SETUP_SPI(SPI_MASTER I SPI_CLK_DIV_16 I SPI_H_TO_L i SPI_XMIT_L_TO_H ); //msdos setup_timer_0(RTCC_INTERNAL); set_tris_c(0bl0010011);


'

output_high(MMC_CS); printf("Simulacion MMC \r\r"); mok=init_mmc(10); printf("German Tojeiro: %u\r\r",mok); SET_BLOCKLEN( 512); MMC_dir_protected=false; write_BLOCK( O, oku, 512); printf ("Valores HEX Valores CHAR \r"); read_BLOCK(0,data);

j=0; 1=0; for(i=0;i<512;i++)

printf("%2X ",data[i]);

if (j= 16) {
printf(" "); for (k=l-16;k printf("%2C ",data[k]); putc(V); j=0;

putc('\r'); if (get_CID(dzl)) { printf("\rMMC CID:"); for(i=0;i<10;i++) printf("%C ", } putc('\r');

if (get_CSD(dzl)) { printf("\rMMC CSD:"); for(i=0;i<16;i++) printf("%X ",


1

while(true); Listado 12.17. El circuito desarrollado en Proteus se muestra en la siguiente figura 12.47:

Figura 12.47.

MICROCONTROLADORES
Los paquetes de simulacin electrnica no suelen incluir modelos de simulacin de las diferentes familias de microcontroladores que existen hoy en el mercado. Ello supone una barrera para los diseadores actuales de electrnica que de forma habitual acostumbran a incluir estos dispositivos en sus proyectos electrnicos. Esta limitacin es superada, hoy en da, por el entorno de desarrollo PROTEUS VSM, ya que trata al microcontrolador como un componente ms del circuito o proyecto a desarrollar. Y es en este punto donde se hace evidente la necesidad de desarrollar el presente libro; el cual ofrece de manera sencilla y didctica un punto de comienzo para disear nuestros propios circuitos electrnicos en los cuales la presencia de un microcontrolador no sea una limitacin. El autor de este libro lleva varios aos enseando microcontroladores y es consciente de las dudas que asaltan al alumno cuando un prototipo de un diseo ya montado y cableado no funciona, preguntndose si el problema es por un error en el diseo del programa que contiene el microcontrolador, o por el contrario, es culpa de alguna equivocacin en el cableado de los distintos componentes. Por ello, la utilizacin de un software de simulacin por parte del alumno o diseador, antes del montaje, es de vital ayuda para comprender el origen de los errores que se pudieran producir. En los captulos 1, 2,3 y 4 de este libro se hace una breve, pero intensa, descripcin del entorno de trabajo del mdulo ISIS de PROTEUS. Se finaliza esta primera parte con un ejemplo simple pero muy didctico de un primer circuito simulado para que el lector adquiera la base suficiente para enfrentarse a los captulos posteriores. Del captulo 5 al 9 se desarrollan aspectos ms profundos que son de inestimable ayuda al diseador. Herramientas como generadores o instrumentacin virtuales se tratan en estos apartados. El captulo 10 se centra por completo en la simulacin de microcontroladores bajo entorno de PROTEUS, ofreciendo una gua prctica de desarrollo. Del captulo 11 al 12 se realizan varios proyectos reales y prcticos de simulacin utilizando diversos tipos de microcontroladores escritos en lenguajes de alto nivel. Por otra parte, el lector puede seguir el aprendizaje de lo expuesto en el libro a travs de una serie de videotutoriales multimedia que, con ms de 15 horas de visionado, estn contenidos en el CD-ROM que acompaa al libro. Este libro est enfocado a todos aquellos lectores movidos por el inters acerca de la simulacin de microcontroladores y que deseen conocer un estupendo software como es PROTEUS.

marcombo
e d i c i o n e s t c n i c a s

www.marcombo.com

9 "78842