Vous êtes sur la page 1sur 76

PROYECTO FINAL DE CARRERA

TTULO: PFC Entrenador de microcontroladores (en leng a!e C"

AUTOR: Antonio #alerio Lo$ano %errano TITULACI&N: Ingenier'a t(cica de telecom nicaciones) sist* electr+nicos DIRECTOR: ,os( -atas Alcal. DEPARTA-ENTO: /01 ) Ingenier'a electr+nica FEC2A: 034345100

TTULO: PFC Entrenador de microcontroladores (en leng a!e C"

APELLIDO%: Lo$ano %errano

NO-6RE: Antonio #alerio

TITULACI&N: Ingenier'a t(cnica de telecom niaciones E%PECIALIDAD: %istemas electr+nicos PLAN: 0337

DIRECTOR: ,os( -atas Alcal. DEPARTA-ENTO: /01 ) Ingenier'a electr+nica

CALIFICACI&N DEL PFC

TRI6UNAL PRE%IDENTE %ECRETARI O #OCAL

FEC2A DE LECTURA:

Este 8ro!ecto tiene en c enta as8ectos medioam9ientales: PRO,ECTO FINAL DE CARRERA RE%U-EN (m.;imo 71 lineas"

:: %'

NO

Dado que no est destinado al gran pblico, o consumidores sino que tiene la finalidad puramente acadmica, no se ha hecho demasiado hincapi en los aspectos medioambientales. A pesar de ello, en el proceso de elaboracin del diseo, se ha realizado todo a nivel terico simulado, antes de montar nada. !onsiguiendo realizar cada una de las placas con un m"nimo de criterios razonables para no incurrir en un error de fabricacin de las mismas. Dado que la e#periencia ha sido un #ito, he dotado la memoria tcnica para aprender primero en el simulador $roteus % luego probarse en el circuito prctico. Ahorrando recursos a la entidad educadora, % evitando inducir errores que puedan llevar al deterioro de las placas de circuito impreso entrenador. &n la bsqueda de los componentes para el desarrollo de las prcticas, una de las premisas ha sido buscar el no encarecimiento del sistema, dotando cada placa con un m"nimo de recursos para hacerla funcional % cumpliendo su finalidad. 'tra premisa es que el componente e#ista en el simulador $roteus, para poder simular el e(ercicio al completo. ))))))))))))))))))))) Describo los aspectos medioambientales tenidos en cuenta* +tilizar en lo posible soldadura con estao sin plomo para que el circuito tenga un impacto ambiental m"nimo +tilizar fuentes de alimentacin conmutadas para la alimentacin de las placas de circuito impreso dado su alto rendimiento energtico !iclo de vida til, los microcontroladores tienen una duracin de* ,-.--- ciclos de escritura lectura de flash .programa/ ,-.---.--- ciclos de escritura lectura de la eeprom .memoria no voltil/

Pala9ras cla<e (m.;imo 01": entrenador ccs c compiler microcontrolador compilador pic proteus

Entrenador de microcontroladores

(lenguaje C)

Agradecimientos: Quisiera dedicar algunas letras a todas las personas que hicieron posible mi paso por esta universidad. Reconocer el trabajo del da a da en la universidad por todo el personal acad mico para que !o ! mis compa"eros ha!amos dis#rutado de la estancia ! de todos los conocimientos adquiridos. Agradecer a todos aquellos que me conocen ! me han dado su apo!o incondicional para que terminara la carrera. $edico esta obra a mi #amilia por la a!uda ! apo!o moral dedicado.

Esta gua de prcticas est concebida para el entorno acadmico y esta publicada bajo licencia creative-commons.

Reconocimiento % &oComercial % Compartir'gual (b!%nc%sa):


&o se permite un uso comercial de la obra original ni de las posibles obras derivadas( la distribuci)n de las cuales se debe hacer con una licencia igual a la que regula la obra original.

0ndice

,/ 1ntroduccin 2.................................................................................. , 3/ $rctica ,* &l coche fantstico........................................................... 4 5/ $rctica ,b* &l coche fantstico .timers/........................................... 36/ $rctica 3* 7u turno........................................................................... 34 8/ $rctica 5* 9recuencimetro.............................................................. 5: :/ $rctica 6* ;enerador de frecuencia.................................................. 65 </ $rctica 8* =olt"metro........................................................................ 83 >/ $rctica :* 'sciloscopio.................................................................... 8> 4/ 7oluciones propuestas ...................................................................... :6 ,-/ ?ibliograf"a % soporte digital.......................................................... <:

1ntroduccin
$retendiendo contribuir a me(orar las asignaturas de la carrera 7D13 % @7D1, habl con mi tutor de $9! Aos Batas Alcal % le e#puse hacer un entrenador de microcontroladores. $ara que los alumnos puedan probar los programas en un hardCare especifico para esa asignatura. Dueriendo ampliar los conocimientos de programacin de alumnado, me decanto por hacer los algoritmos de los microcontroladores en lengua(e !. Dado que mi e#periencia en este entorno, me ha enseado que se pueden realizar mu% buenos programas utilizando las librer"as que aporta dicho compilador. $udindose e#portar dichos algoritmos con pequeos cambios a diferentes fabricantes de microcontroladores. $ara ello aprenderemos el mane(o de librer"as. ?a(o este conte#to nosotros aprenderemos el mane(o de pantallas @!D, teclado matricial, convertidores A D .analgico digital/, timers % comunicaciones +7?. Eodas estas prcticas han sido probadas simuladas en las versiones descritas* Sistema operativo windows 7 (32bits) Proteus 7.8 sp2 CCS compiler 4.10 !P"#$ 8.80 (s%lo para volcar el c%di&o en el microcontrolador)

&l programador debugador probado en el puerto 1!7$ del entrenador es el pic'it 3. F Gota* &s recomendable consultar para el seguimiento de las prcticas utilizar el siguiente libro* Compilador C CCS ( simulador Proteus para microcontroladores P)C. &ditorial* Barcombo, 7.A. 17?G* 4<>>63:<,6486

Pr*ctica 1+ ,l coc-e .ant*stico

&ntrenador microcontroladores .@engua(e !/ &n esta primera prctica nos familiarizaremos con el entorno $roteus % !!7 !ompiler. Al ser una prctica introductoria daremos todos los pasos para realizar el circuito % se e#plicar detalladamente tanto el mane(o de proteus, como del entorno de programacin !!7 !ompiler. &n esta prctica se trata de encender uno a uno los leds % cuando llegue al ultimo led, cambie el sentido de encendido % apagado. !omo se describe en el siguiente diagrama*

!omenzaremos montando el circuito con proteus* ,/ Abrimos 1717 proteus* 1nicio H proteus < profesional H 1sis < proteus 3/ +na vez dentro del entorno, crearemos un esquema nuevo de la siguiente manera*

,-

$rctica ,* &l coche fantstico 5/ Ahora buscaremos los componentes a colocar*

Aadimos en el campo Ie%Cords los componentes que necesitemos uno a uno. Jasta tener el siguiente listado completado*

6/ !olocar % distribuir el circuito como esta indicado en el esquema que est al principio de la prctica.

,,

&ntrenador microcontroladores .@engua(e !/

$ara colocar las fuentes de alimentacin*

Jacer doble clicK sobre el icono de la fuente en continua % podris editar las propiedades. Aadir 8 =oltios.

8/ Lecordar editar el valor de todos los componentes tal % como estn marcados en el circuito anteriormente mencionado :/ $or ltimo configuraremos el clocK de simulacin del microcontrolador % cargaremos el firmCare que compilaremos con !!7 !ompiler. $ara ello iremos a las propiedades del microcontrolador de la siguiente manera*

Doble clicK encima del $1!,:9>6A.

,3

$rctica ,* &l coche fantstico Gos aparecer la siguiente ventana*

@a velocidad del clocK ser de 6BJz % el fichero habr que especificarle la ruta en program file, pero aun no tenemos ningn fichero que aadir.

,/plicaci%n de los di.erentes blo0ues del circuito+


,/ !locK del sistema* &n este modelo de microcontrolador no e#iste la posibilidad de seleccionar clocK interno, % tendremos que aadir nosotros un clocK e#terno. Dicho clocK esta formado por un cristal de cuarzo de 6Bhz % dos condensadores de ,8p9. +tilizando esta frecuencia de relo( obtenemos tiempos de computacin de ,u7. !onsiguiendo una buena base de tiempos para hacer clculos de las funciones implementadas. 3/ Leset del sistema* $odemos apreciar que el pin nM6 indica B!@L .master clear/, que en definitiva es el reset del sistema.

,5

&ntrenador microcontroladores .@engua(e !/

!omo veis, la funcin esta negada, por tanto el reset funcionar de la siguiente manera* B!L@ , 5/ $uerto A* !omo podemos observar el puerto A consta de 8 pines, desde LA- hasta LA6, de los cuales slo utilizaremos el pin A- como entrada % con un pulsador para poner en marcha % parar el sistema. $onemos una resistencia de pullNup de ,-K para que el puerto pueda interpretar correctamente los estados de , % -. Givel - O - volts es masa .;GD/, Givel , O 8 volts en continua. 6/ $uerto ?* &n el puerto ? estn todos los pines configurados como salida. &stas salidas pueden suministrar como m#imo 3-mA. 7e ha determinado las resistencias de 6<- ohm para que traba(en ,-,:mA cada led. Rled = V led 8v -v = = 6<- I led ,-,: mA Leset , -

,6

$rctica ,* &l coche fantstico

A continuacin veremos como generar el firmCare en he#adecimal en el entorno !!7 !ompiler. ,/ Abrimos el entorno !!7 !* 1nicio H $1!N! H $1! ! !ompiler. 3/ ;eneraremos un fichero nuevo tipo cdigo fuente*

@o guardaremos como P,N!oche fantastico.cQ.

,8

&ntrenador microcontroladores .@engua(e !/ 5/ Aadiremos el siguiente cdigo fuente a la ho(a que se ha creado*
$ractica ,* &l coche fantastico FF Directivas del microprocesador Rinclude S,:f>6a.hT Ruse dela%.clocKO6------/ Ruse standard)io.?/ 1ncluimos la libreria del microcontrolador utilizado 9i(amos la frecuencia del clocK del sistema &sta directiva nos genera que el puerto pueda declararse como entrada o salida Rfuses G'UDE,VE,$+E,G'$L'E&!E G'UDE*no Catchdog, VE*Eipo de oscilador, $+E*Eemporizado de arranque,G'$L'E&!E*Go prote(e el codigo Rb%te $'LE? O -#-: Direccion en he#adecimal a la cual apunta a puerto ? FF Definiciones FF Rdefine $+@7AD'L pin)aFF =ariables globales FF short antipulsacionO-,inicioO-,direccionO-W int led)onO-#--W FF $rototipo funciones FF void izquierda.void/W void derecha.void/W FF 9uncion principal FF void main.void/ X 7&E)EL17)A.-b----,/W 7&E)EL17)?.-#--/W $'LE?Oled)onW Chile.true/ X Aqui generamos la cabecera o prototipo de las funciones que iremos llamando desde la funcion main Declaracion de variables globales. &stas pueden ser consultadas en cualquier funcion 7hort es de tipo booleana. 1nt de tipo entera desde - a 388. Definicion para llamar $+@7AD'L al pin a-

!onfiguramos el puerto A*La- como entrada % el resto como salidas !onfiguramos el puerto ?*Eodos son salidas. !argamos el valor de la variable led)on, que esta a cero. Apaga todos los leds. ?ucle infinito !omprobacion de si no e#iste pulsacion $onemos la bandera de antipulsacion a cero, asi permitimos volver a pulsar

if ..input.$+@7AD'L/OO,/YY.antipulsacionOO,// X antipulsacionO-W Z

else if ..antipulsacionOO-/YY.input.$+@7AD'L/OO-//X !omprobacion de nueva pulsacion dela%)ms.:/W $ausamos : ms .antirebote/, if ..input.$+@7AD'L/OO-/YY.inicioOO-// % volvemos a comprobar si continua pulsado X antipulsacionO,W $onemos a uno la bandera de antipulsacion inicioO,W $onemos en marcha la rotacion de los leds direccionO,W Asignamos que va%a hacia la derecha led)onO-#-,W !argamos el bit de menor peso a , en la variable led)on $'LE?Oled)onW !argamos el puerto con el bit de menor peso Z else if ..input.$+@7AD'L/OO-/YY.inicioOO,// Ahora apagaremos el sistema X antipulsacionO,W 7e activa la antipulsacion inicioO-W Apagamos el sistema led)onO-#--W $onemos a cero la variable led)on $'LE?Oled)onW $onemos a cero el puerto ?. Apagando todas los leds Z

,:

$rctica ,* &l coche fantstico


Z else Xif ..inicioOO,/YY.direccionOO-// derecha./W else if ..inicioOO,/YY.direccionOO,//izquierda./W else dela%)us.,/W Z Z fin)?ucle infinito Z fin)main 9unciones void derecha.void/ 9uncion que rota hacia la derecha X $'LE?Oled)onW !argamos el puerto ? con la ultima rotacion rotate)right.Yled)on,,/W % rotamos a la derecha el contenido de la variable led)on dela%)ms.8-/W esperamos 8- ms if .bit)test.led)on,-/OO,/ direccionO,W !omprobamos si es el ultimo bit % si es asi Z cambiamos de direccion void izquierda.void/ 9uncion que rota hacia la izquierda X $'LE?Oled)onW !argamos el puerto ? con la ultima rotacion rotate)left.Yled)on,,/W % rotamos a la izquierda el contenido de la variable led)on dela%)ms.8-/W esperamos 8- ms if .bit)test.led)on,</OO,/ direccionO-W !omprobamos si es el ultimo bit % si es asi Z cambiamos de direccion

7i el sistema esta encendido, comprobamos la direccion % rotamos 7i el sistema esta encendido, comprobamos la direccion % rotamos 7i esta apagado el sistema, esperamos ,u7.

6/ !ompilamos el cdigo fuente.

Gos mostrar el siguienet resultado*

,<

&ntrenador microcontroladores .@engua(e !/ !omprobar en la carpeta donde se encuentre el cdigo fuente tiene que haber dos ficheros nuevos* ,/ ,N!oche fantastico.he# .9irmCare que cargaremos en el pic/ 3/ ,N!oche fantastico.cof .9ichero para depuracin en proteus/ Ahora podremos pasar a simular el programa en proteus.

7imulacin en proteus* ,/ !argamos nuestro pro%ecto en el $roteus 1717 de la siguiente manera*

,>

$rctica ,* &l coche fantstico

3/ Ahora cargaremos el firmCare del microcontrolador. $ara ello haremos doble clicK encima del $1!,:9>6A, nos aparecer la ventana de edicion del componente, iremos al apartado siguiente % especificaremos la ruta donde tengamos guardado el firmCare*

9ichero con e#tensin F.he# para simulacin solamente % F.cof para depuracin. 5/ $or ltimo pondremos en marcha el simulador para comprobar que funcione el programa cargado en el pic.

,4

Pr*ctica 1b+ ,l coc-e .ant*stico (1imers)

$rctica ,b* &l coche fantastico .timers/ 7e trata de realizar la misma prctica utilizando una funcin e#terna para la rotacin del encendido % apagado de los leds. &sta ser llamada por el timer- del pic cuando se desborde cada 8-ms. Dado que %a habremos hecho todos la prctica introductoria, ahora %a sabemos como funcionan el compilador % el simulador. !omenzaremos introduciendo el concepto de desbordamiento de timer. 1)!,2 0 [Due es un TIMER\ Go de(a de ser nada mas que un contador o registro de > bits, que se incrementa por hardCare % es programable. $udiendo hacer cuentas desde - hasta 388 con incrementos constantes de tiempo programables. $uede utilizarse de dos maneras* ,/ !ontador* contando los eventos e#ternos .pin LA6 E'!I,/ 3/ Eemporizador* cuenta los pulsos internos de relo(

$ara configurar los diferentes tiempos entre cuentas se suele utilizar un divisor de frecuencia o normalmente llamado preescaler. $uede dividir entre 3,6,>,,:,53,:6,,3> o 38:. &l tiempo de desbordamiento se calcula de la siguiente manera*
T =T CM Prescaler ( 38:Carga TMR0 )

Donde E!B es el ciclo mquina que se puede calcular de la siguiente manera* T CM = 6 6 = =, S F osc 6Bhz

$ara configurar el TIMER0 se har de la siguiente manera* setup3timer30 (21CC3)41,24#"521CC36)73289): enable)interrupts.global/W Jabilitamos todas las interrupciones !rearemos la funcin* ;int31)!,20 void 1)!,203isr(void) < set3timer0 (0/3C): == 2ecar&a de 80ms >==.in3timer30 $ara que el timer- de(e de contar, slo tenemos que inhabilitar las interrupciones* disable3interrupts(&lobal):

3,

&ntrenador microcontroladores .@engua(e !/ Diagrama de flu(o del programa Pcoche fantstico .timers/Q* 1nicioW $oner a - la salidaW !onfigurar timer-W 9uncin principal 1nterrupcin Eimer-

[Direccin va a derecha\ [Bientras se cumpla\ .?uble infinito/

71

Lota a la derecha

G'

G' Lota a la izquierda

71

[$ulsador no pulsado\ Y [Antipulsacion Dada\ G'

71

Duitar antipulsacionW

[$ulsador no pulsado\ Y [Antipulsacion Dada\ G'

71

[&st encendido\

71

Jabilitar timer-W

G'

$ausa ,u7W

1nhabilitar timer-W

33

,s0uema placa entrenador+ 19.84a

,s0uema placa entrenador+ leds ( pulsadores

$rctica ,b* &l coche fantastico .timers/

Dado que el entrenado no sigue el esquema utilizado en la simulacin, tendremos que hacer diferentes cambios en el programa para adaptarlo al entrenador. $ara ello revisaremos los esquemas anteriores buscando las diferencias entre el circuito de simulacin % el circuito de prueba. !onclu%endo, el alumno deber realizar las modificaciones en el cdigo simulado, % deber probar escribiendo en el microcontrolador utilizando el puerto 17!$. $ara la programacin 17!$ deber utilizar el picKit 5. Eeniendo especial atencin en el cone#ionado. $rocurar conectar el cable donde tiene la fran(a ro(a, en el pin ,. Barcado en el picKit 5 con una flecha blanca.

&squema de cone#ionado para el circuito del coche fantstico. Lecordar poner los (umpers en el lugar que corresponda. +tilizar el pulsador de la izquierda .L?-/ para la puesta en marcha % paro del sistema.

38

&ntrenador microcontroladores .@engua(e !/

Bane(o de B$@A? para programacin del microcontrolador por 17!$* =amos a 1nicio OT $rogramas OT Bicrochip OT Bplab 1D& OT !onectaremos el picKit5 al puerto +7? del pc % al puerto 17!$ del entrenador. Ahora vamos a detectar el picKit 5, pulsamos en la pestaa programmer % seleccionamos el programador, en nuestro caso es el nmero :.

7eleccionaremos el microcontrolador a programar de la siguiente manera*

$incharemos sobre Pselect deviceQ

3:

$rctica ,b* &l coche fantastico .timers/

Ahora buscaremos el dispositivo a programar*

&l siguiente paso ser importar el firmCare del microcontrolador que hemos creado en el ccs compiler.

?uscaremos el fichero F.he# que en este caso es el del coche fantstico.

3<

&ntrenador microcontroladores .@engua(e !/

Ahora tenemos diferentes opciones* $rogram O $rograma % verifica el chip =erif% O =erifica que este bien programado Lead O @ee el contenido del microcontroladores ?lacK checK all O !hequeo del borrado &rase flash device O ?orra el chip $or ltimo, e#isten dos maneras de alimentar el chip a la hora de ser programado* ,/ Directamente desde el picKit 5 por el puerto 17!$ activando la siguiente opcin*

3/ Alimentndolo desde la placa entrenadora en el conector mole# de 6 pines*

Aconse(o alimentar el microcontrolador, en esta modalidad, dado que si estas haciendo muchos ensa%os de prueba % error, te ser ms fcil, de(ar conectados ambos cables . 17!$ % Alimentacin/ para ir chequeando las pruebas de tus programas.

3>

Pr*ctica 2+ Su turno

&ntrenador microcontroladores .@engua(e !/

&n esta segunda prctica vamos a ver como generar un contador desde - a 44, que se incrementar en una unidad cada vez que pulsemos el pulsador. Dicho pulsador tambin encender % o apagar el sistema si lo mantenemos apretado durante 5 segundos. &n esta prctica aprenderemos el mane(o de displa%s < segmentos, lectura % escritura de memoria eeprom interna, % utilizar el Catchdog .perro guardin/ para evitar posibles fallos de sistema, como bloquearse. !omenzaremos e#plicando como funciona el displa% < segmentos* 6ispla( 7 se&mentos

Ja% que diferenciar dos tipos, nodo comn .H/ % ctodo comn .N/. &l displa% traba(a encendiendo los diferentes leds que forman cada segmento. $ara ello nosotros cargaremos el puerto donde este conectado el displa% con su nivel de tensin para que encienda o apague el segmento en funcin de si usamos nodo o ctodo comn. +tilizaremos un vector de constantes para llamarlos % obtener el carcter deseado. ]nodo comn* b%te !'G7E D17$@A^_,-` O X-#6-,-#<4,-#36,-#5-,-#,4,-#,3,-#-3,-#<>,-#--,-#,-ZW !todo comn* b%te !'G7E D17$@A^_,-` O X-#5f,-#-:,-#8b,-#6f,-#::,-#:d,-#<d,-#-<,-#<f,-#:fZW $ara cargar el puerto con dicho d"gito utilizaremos la siguiente sinta#is* '+E$+E)?.D17$@A^_digito`/W Donde d"gito es una variable tipo entero % apunta a la constante que deseemos desde - hasta 4. 5-

$rctica 3* 7u turno "ectura ( escritura de la eeprom interna @a eeprom interna, es una memoria de :6 b%tes de tipo no voltil. !ada b%te puede albergar un nmero de tipo entero. &sta memoria, es necesaria para guardar variables que modificamos % despus de apagar el sistema queremos volver a recuperar tal % como la de(amos la ltima vez que escribimos en ella. +tilizaremos la siguiente sinta#is* ,/ $ara recuperar el contenido de la memoria eeprom % volcar lo en una variable local* variable tipo int O read)&&$L'B.posicin de memoria/W e(emplo* unidades O read)&&$L'B.-/W @eemos la posicin - de la eeprom % guardamos en la variable entera unidades

3/ $ara escribir el contenido de una variable local en la memoria eeprom* Crite)eeprom.posicin de memoria,variable tipo int/W dela%)ms.3-/W e(emplo* Crite)eeprom.-,unidades/W dela%)ms.3-/W &scribimos la variable unidades en la posicin - de la eeprom % esperamos 3-ms para que termine de escribirse

?atc-do& (perro &uardi*n) &l perro guardin es empleado para posibles cuelgues del sistema, pudiendo reiniciar el sistema de forma autnoma % poder seguir funcionando el programa. [!mo se consigue esto\ +tilizando el timer-, este si termina su secuencia reinicia el microcontrolador, pero nosotros iremos reseteando el contador en los puntos del programa que creamos oportuno consiguiendo que si el programa de(a de resetear el timer-, este terminar su conteo % reiniciar el microcontrolador. 7olucionando posibles cuelgues del sistema. +tilizaremos la siguiente sinta#is* Rfuses UDE setup)Cdt.UDE)35-6B7/W restard)Cdt./W Jabilitaremos el Uatch Dog Eimer Dentro de la funcin BA1G incluiremos la configuracin del Catchdog, en este caso es de 3,5 segundos !ada vez que necesitemos resetear dentro de nuestro programa el Catchdog podremos este comando

5,

&ntrenador microcontroladores .@engua(e !/ Diagrama de flu(o del programa Psu turnoQ*


1niciamos variables @eemos eeprom !onfiguramos perro guardian

FLefresca displa%* es una funcin que escribe en el d"gito en el displa% de < segmentos

[+nidadesT4\ o [DecenasT4\

71

Leiniciamos a cero el contador

G'

?ucle infinito

G'

!ontadorOAntipulsacionO,

[$ulsado\ % [!ontadorS:-\ G'

71

[!ontadorO:-\

71

&ncendidoO,W

71

!ontador H ,W &spera 8-msW Leinicia Catchdog

G'

&ncendidoO-W

[$ulsado\ ^ [&ncendido\

71

!ontadorOAntipulsacionO,

[$ulsado\ % [!ontadorS:-\

71

[+nidades S4\

+nidadesH,W &scribe eepromW

G'

G' +nidadesO-W DecenasH,W &scribe eepromW

G'

!ontador H ,W Leinicia Catchdog Lefresca displa%F

[DecenasS4\

71

G' [Go pulsado\ 71 AntipulsacionO-W &ncendidoO-W

G'

[&ncendido\

71

Lefresca displa%F

G'

Apaga displa%

53

,s0uema placa entrenador+ 19.84a

,s0uema placa entrenador+ displa( 7 Se&mentos

$rctica 3* 7u turno

Leiteramos como en el e(ercicio anterior .coche fantstico/ que el entrenador no sigue el esquema utilizado en la simulacin, tendremos que hacer diferentes cambios en el programa para adaptarlo al entrenador. $ara ello revisaremos los esquemas anteriores buscando las diferencias entre el circuito de simulacin % el circuito de prueba. !onclu%endo, el alumno deber realizar las modificaciones en el cdigo simulado, % deber probar escribiendo en el microcontrolador utilizando el puerto 17!$. +tilizando el siguiente esquema de cone#ionado*

58

Pr*ctica 3+ @recuenci%metro

$rctica 5* 9recuencimetro &n esta tercera prctica vamos a aprender a utilizar el timer como contador, el mane(o de displa%s alfanumricos % a utilizar una interrupcin e#terna. @a prctica tiene como ob(etivo medir con la interrupcin del pin L?- la anchura del pulso % multiplicarla por dos. Dado que utilizaremos un dut% c%cle del 8-a. ^ as" obtener la frecuencia de la seal. $ara obtener ma%or precisin a la hora de tomar la medida, esperaremos a tomar 6- muestras % haremos una media aritmtica para obtener el resultado ms a(ustado. !omenzaremos e#plicando como funciona el displa% alfanumrico* Eendremos que incluir la siguiente directiva para que funcionen los comandos de imprimir pantalla* Rinclude S!*b&ntrenador +$!b!!7b5N9recuenciometrob@ibreriasb@!D)$'LE!.!T $ara imprimir en pantalla tendremos que utilizar la siguiente linea*

printf.lcd)putc,c$ulsoO ag u7bn9recuO ag Ihz c,A$,9L/W .Gota* $ara que el sistema sea preciso en frecuencias menores a , Ihz, el displa% deber mostrar en Jd el valor medido./ $ara utilizar el timer como contador, lo haremos de la siguiente manera* !ada vez que ha%a un flanco de subida % luego otro de ba(ada el microcontrolador deber de llamar a la siguiente funcin. &sta devolver el conteo en la variable E9?. Rint)e#t void funcion)e#t)int./ X if .cambioOO-/X set)timer,.-/W e#t)int)edge.-,J)E')@/W cambioO,W Z else X E9?Oget)timer,./W e#t)int)edge.-,@)E')J/W cambioO-W if.nuevopulsoOO-/ nuevopulsoO,W Z Z 5<

&ntrenador microcontroladores .@engua(e !/ &n la funcin principal deberemos configurar el timer, de la siguiente manera* setup)timer),.E,)1GE&LGA@eE,)D1=)?^),/W e#t)int)edge.-,@)E')J/W cambioO-W enable)interrupts.int)e#t/W enable)interrupts.global/W F$odis a%udaros del e(emplo 6, pgina ,-: que aparece en el libro !ompilador ! !!7 % simulador $L'E&+7 para microcontroladores $1! .&dicin ,f/. &ste e(emplo muestra como medir la anchura de un pulso. Diagrama de flu(o del programa P9recuencimetroQ* 9uncin interrupcin e#terna* [Ascendente\

[!ambioOO-\

7i

Go

!omienza a contar el timer ,. !ambio el tipo de flanco. !ambioO,.

;uardamos tiempo del timer ,. !ambiamos tipo de flanco. !ambioO-W

[Guevo pulsoOO-\

7i

Guevo)pulsoO,W

7alir de la funcin e#terna.

5>

$rctica 5* 9recuencimetro 9uncin principal .main/*

1niciar @!D. 1niciar Eimer,. !onfigurar el flanco. Jabilitar interrupciones .e#terna % global/.

?ucle infinito

Go

71

[Guevo $ulso\

7i

contSma#ima

Go

!ontadorO-W Jacemos media aritmtica

G'

71

Dela%)ms.,/

;uardamos la muestra. !ontadorH,W

$er"odoO Anchura de pulsoF-,-----3. 9recuencia O , $er"odo. 1mprimimos por pantalla el resultado en .Jz/.

7i

[Anchura de pulso S ,---\ G o

$eriodoOAnchura de pulsoF-,--3. 9recuenciaO, $er"odo. 1mprimimos por pantalla el resultado en .Ihz/.

54

,s0uema placa entrenador+ 19.879

,s0uema placa entrenadora+ $nc ( re&leta

&ntrenador microcontroladores .@engua(e !/

$ara este e(ercicio de ensa%o no necesitaremos retocar el programa, dado que el esquema utilizado es fiel a la simulacin. $ara la prueba utilizaremos el generador de frecuencia del laboratorio. Deberemos configurar lo en modo seal cuadrada % dutt% c%cle del 8-a. 7e deber de hacer la prueba en torno a las frecuencias diseadas % dentro de los l"mites del microcontrolador. +tilizaremos el siguiente esquema de cone#ionado*

63

Pr*ctica 4+ Aenerador de .recuencia

&ntrenador microcontroladores .@engua(e !/ &n esta cuarta prctica vamos a aprender a utilizar el timer como temporizador % el mane(o de un teclado matricial. @a prctica tiene como ob(etivo generar una seal cuadrada, pudindose variar la frecuencia tecleando el valor con el teclado matricial.

Dicha frecuencia deber a(ustarse entre >Jz % <Ihz. 7i se teclea una frecuencia fuera de rango, deber mostrar un mensa(e de error por pantalla. &l teclado dispone de dos teclas no numricas, que asignaremos para la siguientes funciones* PFQ N ?orrar el ultimo d"gito introducido. PRQ N 7e utilizar para finalizar % puesta en marcha del generador. 7i queremos pararlo deberemos introducir el valor -. &n primer lugar e#plicaremos como secuenciar el programa* +tilizaremos 5 estados % diferentes funciones para cada tarea. +n e(emplo de como quedar el bucle infinito de la funcin principal, quedar as"* Chile.,/X if .estadoOO-/ lectura)teclado./W else if .estadoOO,/ calcula)numero./W else if .estadoOO3/ X reinicia)variables./Wrefresca)lcd./WZ else dela%)us.,/W Z fin)Chile

&n segundo lugar e#plicaremos como se utiliza el teclado matricial* 1ncluiremos su librer"a* Rdefine use)portb)Kbd EL+& Rinclude SKbd.cT

66

$rctica 6*;enerador de frecuencia 1ncluiremos la librer"a para operar con cadenas de caracteres* Rinclude Sstdio.hT 1niciaremos desde la funcin principal el uso del teclado* Kbd)init./W +tilizaremos las resistencias internas de pullNup* $'LE)?)$+@@+$7.EL+&/W $ara almacenar las pulsaciones utilizaremos la siguiente funcin* pulsadoOKbd)getc./W &n ltimo lugar usaremos el timer , para temporizar la salida del generador de frecuencias. Rint)E1B&L, void E1B&L,)isr.void/ X output)toggle.7A@1DA/W set)timer,.:8858Npulso/W Z Diagrama de flu(o del programa P;enerador de frecuenciaQ* 9uncin refresca displa%* [!ont)3 OO-\
Go 7i

Buestra* 9rec*#####.Jz/ 1ntro*) Buestra* 9rec*#####.Jz/ 1ntro*#)

[!ont)3 OO,\
Go

7i

[!ont)3 OO3\
Go

7i

Buestra* 9rec*#####.Jz/ 1ntro*##) Buestra* 9rec*#####.Jz/ 1ntro*###) Buestra* 9rec*#####.Jz/ 1ntro*####)

[!ont)3 OO5\
Go

7i

Buestra* &rrorgg

Go

[!ont)3 OO6\

7i

7alir

68

&ntrenador microcontroladores .@engua(e !/ 9uncin principal main*

1nicio variables 1niciar @!D 1niciar I?D

Bostrar mensa(e de bienvenida

1nicio variables 1niciar @!D 1niciar I?D

?ucle infinito
7i

Go

@ectura teclado

[&stado OO-\
Go

!alcula nmero

[&stado OO,\
Go

Leiniciar variables Lefrescar @!D

[&stado OO,\
Go

6:

$rctica 6*;enerador de frecuencia 9uncin lectura teclado* 'btener pulsacin

Go

hltima pulsacin
Go

7i

&stado O,W Lefresca displa%W

-S$ulsadoS4

7i

;uardar tecla pulsadaW 1ncrementar contadorW Lefrescar @!DW

Go

$ulsado OOPFP

7i

Decrementa contadorW Lefresca @!DW

Go

$ulsado OOPRP

7i

&stadoO,W Lefresca @!DW

Go

&spera , u7

7alir de la funcin

6<

&ntrenador microcontroladores .@engua(e !/ 9uncin calcula nmero* 1nicia variables para el procesado del clculo. Au#O9recW

[contadorSDigitos)Ba#imos\

7i

!alcula iteracin del clculo

Go

[9recOO-\

7i

Apaga la salidaW Deshabilita interrucion timer,W

Go

[>SO9recSO<---\

7i

Jabilitamos interrupcion Eimer,W

Go

9recOau#W Bostramos errorW Lefrescamos el @!DW

7alir de la funcin 6>

,s0uema placa entrenador+ 19.879

,s0uema placa entrenador+ $nc ( re&letas

$rctica 6*;enerador de frecuencia

$ara este e(ercicio de ensa%o no necesitaremos retocar el programa, dado que el esquema utilizado es fiel a la simulacin. $ara la prueba utilizaremos el osciloscopio del laboratorio. 7e deber de hacer la prueba en torno a las frecuencias diseadas % dentro de los l"mites del microcontrolador. +tilizaremos el siguiente esquema de cone#ionado*

8,

Pr*ctica 8+ 7oltBmetro

$rctica 8* =olt"metro &n esta quinta prctica vamos a aprender a usar el convertidor analgicoNdigital del microcontrolador. @a prctica tiene como ob(etivo medir un volta(e entre ,3v % N,3v, para posteriormente, mostrar el valor de dicha amplitud % el nivel cuantificado en el displa% alfanumrico.

$ara conseguir aumentar la escala de medida que por defecto viene dado dese - hasta 8= .tensin de alimentacin/, se consigue poniendo en H=ref % i =ref las tensiones m#ima % m"nima de referencia. 1ncluiremos en las directivas del microcontrolador el convertidor a ,- bits* Rdevice adcO,$ara configurar el microcontrolador con dichas referencias pondremos* setup)adc)ports.AG-)=L&9)=L&9/W setup)adc.AD!)!@'!I)1GE&LGA@/W $ara hacer la captura de la amplitud a medir pondremos* set)adc)channel.V/W dela%)us.3-/W variable)adc O read)adc./W Donde V sera el numero de canal que asignemos, por e(emplo -. &speramos a que realice la muestra ;uardamos la lectura del convertidor en la variable adc

$or ltimo reescalaremos la medida con la siguiente frmula, para hacerlo mas inteligible* volts O.N=ref/H.36Fadc ,-36/W Leescalamos el valor, para hacerlo inteligible

4ota+ &sta prctica no podr implementarse f"sicamente dado que los microcontroladores se queman si en la entrada del A D ponemos una tensin negativa.

,Cercicio opcional+ Lehacer el cdigo para que acepte tensiones nicamente positivas desde - a ,3v, simularlo % montarlo prcticamente.

85

&ntrenador microcontroladores .@engua(e !/ Diagrama de flu(o del P=olt"metroQ* 9uncin principal* !reacin =ariablesW !onfigurar A DW 1niciar el @!DW

?ucle infinito

Go

!onfiguramos el canal a muestrearW &speramos a que realice la muestraW ;uardamos la lectura del convertidor en la variableW Leescalamos el valor, para hacerlo inteligibleW

Bostramos por pantallaW &spera ,-- ms para realizar la siguiente muestraW

Gota* $odis a%udaros a la elaboracin de este e(ercicio con el libro !ompilador ! !!7 % simulador $roteus para microcontroladores $1!. &n la pgina ,3<, si utilizis la primera edicin.

86

,s0uema placa entrenador+ 19.879

,s0uema placa entrenador+ $nc ( re&letas

$rctica 8* =olt"metro

$ara este e(ercicio de ensa%o no necesitaremos retocar el programa, dado que el esquema utilizado es fiel a la simulacin. $ara la prueba necesitaremos un potencimetro % cableado para enlazar los bornes de tensin. Deberemos realizar la prueba con tensiones nicamente positivas, tal % como se e#plic en la nota ad(unta en el apartado de simulaciones. +tilizaremos el siguiente esquema de cone#ionado*

8<

Pr*ctica 9+ Dsciloscopio di&ital con captura de seEal ( comunicaci%n por puerto FS$

$rctica :* 'sciloscopio digital con captura de seal % comunicacin por puerto +7? &n esta se#ta % ltima prctica vamos a aprender a utilizar displa%s matriciales % comunicaciones usb. $artiremos de la a%uda del cdigo que nos proporciona el libro Pcompilador ! !!7 % simulador $roteus para microcontroladores $1!Q pgina ,8, de la ,f edicin. 7imularemos el programa con el microcontrolador con el pic ,:f><< para que todo funcione correctamente, % posteriormente haremos la migracin al microcontrolador al ,>f688- para que nos proporcione funciones de comunicaciones +7?. !omenzaremos e#plicando, [como se codifica la seal para ser transmitida por el usb\

@a pantalla se divide en ,3> p"#eles en el e(e V % :6 p"#eles en el e(e ^. &n la solucin se propone guardar en un vector de ,3> posiciones, la coordenada ^. Duedar tal que as"* int captura_,3>`W captura_-`O%aW Declaramos un vector de ,3> posiciones

7iendo P%aQ el valor escalado de , a :6.

$osteriormente, una vez capturados los ,3> datos, para enviarlos, deberemos hacer una lectura del vector % lo enviaremos por el puerto +7?, de la siguiente manera* &(emplo de envio de tramas del usb. if .usb)enumerated.// X for .contadorO-WcontadorS,3>WcontadorHH/X Eransmitiremos ,3> tramas printf.usb)cdc)putc,cai,aibnccontador,captura_contador`/W Z printf.usb)cdc)putc,cRbnRbnRbnRbnRbnRbnRbnRbnRbnRbnRbnRbnRbnRbnRRbnRbnRbnRbnRbnRbnRbnRb nRbnRbnRbnRbnRbnRbnRc/W Lelleno transmitidoO,W 9in de transmision Z

84

&ntrenador microcontroladores .@engua(e !/

&#isten dos maneras de programar el puerto de comunicaciones +7?* ,/ $ropsito general Ja% que asignarle un =.1.D % un $.1.D para identificarlo en el pc al conectarlo. 3/ +7? !D! .!ommunication Device !lass/ Eraba(a en modo L7N353 virtual. Lealiza una conversin de +7? a !'B. $ara facilitar esta prctica, vamos a programar el sistema en modo !D!. $ara ello deberemos utilizar* R9+7&7 J7$@@,$@@8,$+E,?L'UG'+E,G'UDE,!!$3!,,G'@=$,G'D&?+;,+7?D1= 1mportante traba(ar con J7$@@ dado que tenemos que subir de frecuencia el clocK proporcionado por elc ristal de cuarzo de 3-Bhz a 6>Bhz. $ara que traba(e bien el puerto +7?.

Rdefine +7?)!'G)7&G7&)$1G $1G)?< $ara identificar que el usb este conectado, deberemos asignar un pin del Bicrocontrolador para detectar la tension de alimentacin.

Rinclude Susb)cdc.hT 1ncluimos el driver para traba(ar en modo !D!.

Dentro de la funcion main* usb)cdc)init./W usb)init./W usb)tasK./W !onfiguramos el puerto usb en modo !D! 1niciamos el usb 1niciamos la deteccin del usb

:-

,s0uema placa entrenador+ 18.4880

,s0uema placa entrenador+ Dsciloscopio

$rctica :* 'sciloscopio digital con captura de seal % comunicacin por puerto +7?

$ara este ltimo e(ercicio de ensa%o no necesitaremos retocar el programa, dado que el esquema utilizado es fiel a la simulacin. $ara la prueba necesitaremos el generador de funciones del laboratorio. 7e deber a(ustar como m#imo a 3,8v de amplitud. $odremos ver representadas las diferentes funciones peridicas en el displa% matricial del entrenador. Eanto senoidal, cuadrada % triangular. +tilizaremos el siguiente esquema de cone#ionado*

:5

&ntrenador microcontroladores .@engua(e !/ Pr*ctica 1b+ ,l coc-e .ant*stico (timers)


$ractica ,b* &l coche fantastico .Eimers/ FF Directivas del microprocesador Rinclude S,:f>6a.hT Ruse dela%.clocKO6------/ Ruse standard)io.?/ 1ncluimos la libreria del microcontrolador utilizado 9i(amos la frecuencia del clocK utilizado &sta directiva nos genera que el puerto pueda declararse como entrada o salida Rfuses G'UDE,VE,$+E,G'$L'E&!E G'UDE*no Catchdog, VE*Eipo de oscilador .cuarzo/, $+E*Eemporizado de arranque,G'$L'E&!E*Go prote(e el codigo Rb%te $'LE? O -#-: Direccion en he#adecimal que apunta el puerto ? FF Definiciones FF Rdefine $+@7AD'L pin)aFF =ariables globales FF short antipulsacionO-,inicioO-,direccionO-W int led)onO-#--W FF $rototipo funciones FF void izquierda.void/W void derecha.void/W FF 7ubrutina E1B&L - FF Rint)E1B&Lvoid E1B&L-)isr.void/ X set)timer- .-#5!/W if .direccionOO-/ derecha./W else izquierda./W Z fin)timer)FF 9uncion principal FF void main.void/ X 7&E)EL17)A.-b----,/W 7&E)EL17)?.-#--/W $'LE?Oled)onW !onfiguramos el puerto A*La- como entrada % el resto como salidas !onfiguramos el puerto ?*Eodos son salidas !onfiguramos timer- con el relo( interno % un preescaler de 38: Jabilitamos todas las interrupciones ?ucle infinito !omprobacion de si no e#iste pulsacion $onemos la bandera de antipulsacion a cero, asi permitimos volver a pulsar 1nterrupcion del timer-, llamada siempre que se se desborda el timerLecarga de 8-ms del timer!omprueba direccion % salta a la funcion derecha si es - e izquierda si es , Aqui generamos la cabecera o prototipo de las funciones que iremos llamando desde la funcion timerDeclaracion de variables globales. &stas pueden ser consultadas en cualquier funcion 7hort es de tipo booleana. 1nt de tipo entera desde - a 388. Definicion para llamar $+@7AD'L al pin a-

setup)timer)-.LE!!)1GE&LGA@eLE!!)D1=)38:/W enable)interrupts.global/W Chile.true/ X if ..input.$+@7AD'L/OO,/YY.antipulsacionOO,// X antipulsacionO-W Z

:6

7oluciones propuestas

else if ..antipulsacionOO-/YY.input.$+@7AD'L/OO-//X !omprobacion de nueva pulsacion dela%)ms.:/W $ausamos :ms .antirebote/, if ..input.$+@7AD'L/OO-/YY.inicioOO-// % volvemos a comprobar si continua pulsado .&nciende/ X antipulsacionO,W $onemos a uno la bandera de antipulsacion direccionO,W 9i(amos la direccion hacia la izquierda led)onO-#-,W !argamos el bit de menor peso a , en la variable led)on $'LE?Oled)onW !argamos el puerto con el bit de menor peso set)timer- .-#5!/W !argamos a 8-ms el timerenable)interrupts.1GE)E1B&L-/W Jabilitamos todas las interrupciones inicioO,W $onemos en marcha la rotacion de los leds Z else if ..input.$+@7AD'L/OO-/YY.inicioOO,// % volvemos a comprobar si continua pulsado .Apaga/ X antipulsacionO,W $onemos a uno la bandera de antipulsacion disable)interrupts.1GE)E1B&L-/W Deshabilitamos todas las interrupcines led)onO-#--W $onemos a cero led)on $'LE?Oled)onW Apagamos el puerto ? inicioO-W $aramos la rotacion de los leds Z Z else dela%)us.,/W $ausa de ,us Z fin)bucle infinito Z fin)main 9unciones void derecha.void/ X $'LE?Oled)onW rotate)right.Yled)on,,/W if .bit)test.led)on,-/OO,/ direccionO,W Z void izquierda.void/ X $'LE?Oled)onW rotate)left.Yled)on,,/W if .bit)test.led)on,</OO,/ direccionO-W Z 9uncion de rotacion a la derecha !argamos el puerto ? con la ultima rotacion % rotamos a la derecha el contenido de la variable led)on !omprobamos si es el ultimo bit % si es asi cambiamos de direccion 9uncion que rota hacia la izquierda !argamos el puerto ? con la ultima rotacion % rotamos a la izquierda el contenido de la variable led)on !omprobamos si es el ultimo bit % si es asi

:8

&ntrenador microcontroladores .@engua(e !/ Pr*ctica 2+ Su turno


$ractica 3* 7u turno FF Directivas del microprocesador FF Rinclude S,:f>6a.hT Ruse dela%.clocKO6------/ Rfuses UDE,VE,$+E,G'$L'E&!E R+7& fast)1' .A/ R+7& fast)1' .?/ FF Definiciones FF Rdefine $+@7AD'L pin)aRdefine ELE)+G1 pin)a, Rdefine ELE)D&! pin)a3 1ncluimos la libreria del microcontrolador utilizado 9i(amos la frecuencia del clocK utilizado UDE*utilizamos Catchdog, VE*Eipo de oscilador .cuarzo/, $+E*Eemporizado de arranque,G'$L'E&!E*Go prote(e el codigo &sta directiva se utiliza para optimizar el cdigo generado por el compilador cuando se utilizan funciones de entrada % salida

Definimos algunas etiquetas para hacer mas legible el codigo fuente

FF =ariables globales FF short antipulsacionO-,cambioO-,encendidoO-W !reacion de variables globales tipo booleana int unidadesO-,decenasO-,contadorO-W !reacion de variables globales tipo entero b%te !'G7E D17$@A^_,-` O X-#6-,-#<4,-#36,-#5-,-#,4,-#,3,-#-3,-#<>,-#--,-#,-ZW =ector de constantes FF $rototipo funciones FF void refresca)displa%.void/W FF 9uncion principal FF void main.void/ X 7&E)EL17)A.-b----,/W 7&E)EL17)?.-#--/W setup)Cdt.UDE)35-6B7/W !onfiguramos el puerto A*La- como entrada % el resto como salidas !onfiguramos el puerto ?*Eodos son salidas !onfiguramos el Catchdog para que cuente 3,5seg % reinicie !abecera para crear la funcion e#terna de refresco de displa%

encendidoO-W ?andera que indica al sistema que empieza apagado output)high.ELE)+G1/W Apagamos el digito de las unidades output)high.ELE)D&!/W Apagamos el digito de las decenas output)b.-#ff/W !argamos el puerto b todo a ,, para borrar el digito a mostrar unidades O read)&&$L'B.-/W !argamos el ultimo digito de las unidades leido desde la eeprom decenas O read)&&$L'B.,/W !argamos el ultimo digito de las decenas leido desde la eeprom if .unidadesT4 ee decenasT4/ XunidadesO-,decenasO-W Leiniciamos el sistema a cero Crite)eeprom.-,unidades/W si detectamos algun error dela%)ms.3-/W a la hora de hacer la lectura Crite)eeprom.,,decenas/W de la eeprom dela%)ms.3-/W Z Chile.true/ X ?ucle infinito restart)Cdt./W Leiniciamos el perro guardian if .input.$+@7AD'L/OO- YY antipulsacionOO- YY encendidoOO-/ X Detectamos pulsacion % comprobamos si esta encendido contadorO-W 1nicializamos el contador,cuenta 5 segundos % enciende antipulsacionO,W ?andera de antipulsacion Chile .input.$+@7AD'L/OO- YY contadorS:-/ Bientras este pulsado, cuenta hasta 84 X contadorHHW 1ncrementa en una unidad el contador dela%)ms.8-/W ?ase de tiempos de 8-ms. 8-msF:-vecesO 5 segundos restart)Cdt./W Leiniciamos perro guardian Z if .contadorOO:-/ encendidoO,W else encendidoO-W Z else if .input.$+@7AD'L/OO- YY antipulsacionOO- YY encendidoOO,/ X contadorO-W Detectamos pulsacion % comprobamos si esta encendido 1nicializamos el contador,cuenta 5 segundos % enciende 7i cumple los 5 segundos, encendemos el sistema

7i no cumple, no lo encendemos

::

7oluciones propuestas
antipulsacionO,W ?andera de antipulsacion Chile .input.$+@7AD'L/OO- YY contadorS:-/ Bientras este pulsado, cuenta hasta 84 X refresca)displa%./W Lefrescamos displa%, utilizandolo contadorHHW como base de tiempos para contar 5 seg restart)Cdt./W Leiniciamos perro guardian Z if .contadorgO:-/ X 7i contador diferente de :-, sumamos un turno if ..unidadesS4// XunidadesHHW !omprobamos que las unidades sean menor a 4 e incrementamos Crite)eeprom.-,unidades/W ;uardamos en la eeprom dela%)ms.3-/W &speramos 3-ms para que complete la escritura Z else X if .decenasS4/X !omprobamos las decenas sean menor a 4 unidadesO-W 1niciamos las unidades a decenasHHW 1ncrementamos las decenas Crite)eeprom.,,decenas/W ;uardamos en la eeprom dela%)ms.3-/W &speramos 3-ms para que complete la escritura Z else X unidadesO-W decenasO-W Z Z Z else X encendidoO-W Apagamos el sistema si pulsamos durante 5 segundos Z Z else X if .input.$+@7AD'L/OO,/ antipulsacionO-W if .encendidoOO,/ refresca)displa%./W 7i de(amos de pulsar, actualizamos la bandera de actipulsacion 7i desbordamos las unidades % las decenas, ponemos a cero los turnos.

7i esta encendido el sistema, refrescamos el displa%

else X 7i esta apagado el sistema, volvemos a apagarlo output)high.ELE)+G1/W output)high.ELE)D&!/W output)b.-#ff/W Z Z Z fin)bucle infinito Z fin)main FF 9unciones FF void refresca)displa%.void/ X if .cambioOO- YY decenasgO-/ X cambioO,W Alternamos el refresco entre unidades % decenas output)loC.ELE)+G1/W Apagamos las unidades output)loC.ELE)D&!/W Apagamos las decenas '+E$+E)?.D17$@A^_decenas`/W !argamos el puerto con el valor de las decenas output)high.ELE)D&!/W &ncendemos las decenas dela%)ms.8/W &speramos 8ms para que no ha%a parpadeo en el displa% output)loC.ELE)D&!/W Apagamos las decenas Z else X cambioO-W Alternamos el refresco entre unidades % decenas output)loC.ELE)+G1/W Apagamos las unidades output)loC.ELE)D&!/W Apagamos las decenas '+E$+E)?.D17$@A^_unidades`/W !argamos el puerto con el valor de las unidades output)high.ELE)+G1/W &ncendemos las unidades dela%)ms.8/W &speramos 8ms para que no ha%a parpadeo en el displa% output)loC.ELE)+G1/W Apagamos las unidades Z Z

:<

&ntrenador microcontroladores .@engua(e !/ Pr*ctica 3+ @recuenci%metro


$ractica 5*9recuenciometro .hasta 9req)ma#O<Ihz o E)ma#O3#:8us/ FF Directivas del microprocesador Rinclude S,:f><:.hT 1ncluimos la libreria del microcontrolador utilizado Ruse dela%.clocKO6B/ 9i(amos la frecuencia del clocK utilizado Rfuses G'UDE,VE,G'$L'E&!E G'UDE*no utilizamos Catchdog, VE*Eipo de oscilador .cuarzo/, G'$L'E&!E* no prote(e el codigo Rinclude S!*b+sersbvaleriobDesKtopb&ntrenador +$!b!!7b5N9recuenciometrob@ibreriasb@!D)$'LE!.!T @ibreria displa% Lecordar de poner bien la ruta o direccion Rdefine BAV1B' 6Definicion para m#imo de muestras FF =ariables globales FF 1nt> contadorO-,contador)3O-W =ariables tipo entera > bits .desde - a 386/ 1nt,: E9?O-,9L&!+&G!1A7_BAV1B'`W =ariables tipo entero ,: bits .desde - a :8858/ float A$O-,9LO-W =ariables tipo coma flotante 53 bits short nuevopulsoO-,cambioO-W =ariables tipo booleana , bit FF 9uncion interrupcion FF Rint)e#t 9uncion interrupcion e#terna void funcion)e#t)int./X &sta es llamada cada vez que el pin L?- tiene un flanco ascendente o descendente, dependiendo como este configurado if .cambioOO-/X !omprobamos que tipo de flanco toca .recordar ascendente o descendente/ set)timer,.-/W 1niciamos la cuenta del timer , desde e#t)int)edge.-,J)E')@/W !ambiamos el tipo de flanco de alto a ba(o, descendente cambioO,W $onemos la variable cambio a , para saber que se ha actualizado el flanco Z else X E9?Oget)timer,./W !apturamos el tiempo del timer, % la guardamos en la variable E9? e#t)int)edge.-,@)E')J/W !ambiamos el tipo de flanco de ba(o a alto, ascendente cambioO-W $onemos la variable cambio a - para saber que se ha actualizado el flanco if.nuevopulsoOO-/ nuevopulsoO,W !omprobamos que e#ista un nuevo pulso Z Z FF 9uncion principal FF void main.void/ X lcd)init./W !argamos la funcion del displa%

setup)timer),.E,)1GE&LGA@eE,)D1=)?^),/W !onfiguramos timer, con el relo( interno % un preescaler de , e#t)int)edge.-,@)E')J/W !onfiguramos el primer flanco de subida cambioO-W $onemos la variable cambio a - para saber que se ha actualizado el flanco enable)interrupts.int)e#t/W Jabilitamos las interrupciones e#ternas del pin L?enable)interrupts.global/W Jabilitamos las interrupciones globales Chile.true/ X ?ucle infinito if .nuevopulsoOO,/X !omprobamos que e#ista un pulso nuevo nuevopulsoO-W $aramos el pulso if .contadorSBAV1B'/X 'btenemos muestras hasta llegar al ma#imo contadorHHW 1ncrementamos contador en una unidad frecuencias_contador`OE9?W ;uardamos la muestra en el vector dela%)us.,/W &speramos ,us Z else X contadorO-W 1nicializamos el contador A$O-W 1nicializamos la Anchura del $ulso .A$/ for .contador)3O-Wcontador)3SBAV1B'Wcontador)3HH/ Lecorremos todo el vector X A$HOfrecuencias_contador)3`W 7umamos Z todas las frecuencias individuales A$O.A$ BAV1B'/W Dividimos entre numero ma#imo, para obtener la media aritmetica if .A$S,---/X Lepresentacion en pantalla en dos escalas Jd % IJd 9LO.A$F-.--3/W Anchura de pulso por 3 % pasado de us a ms 9LO., 9L/W 1nvertimos el periodo de la seal para obtener la frecuencia printf.lcd)putc,c$ulsoO ag u7bn9recuO ag Ihz c,A$,9L/W 1mprimimos por pantalla Z

:>

7oluciones propuestas

else X 9LO.A$F-.-----3/W Anchura de pulso por 3 % pasado de us a segundos 9LO., 9L/W 1nvertimos el periodo de la seal para obtener la frecuencia printf.lcd)putc,c$ulsoO ag u7bn9recuO ag Jz c,A$,9L/W 1mprimimos por pantalla Z Z Z else dela%)us.,/W Z fin)bucle infinito Z fin)main 9unciones

$ausa de ,us

:4

&ntrenador microcontroladores .@engua(e !/ Pr*ctica 4+ Aenerador de .recuencia


;enerador de frecuencia FF Directivas del microprocesador Rinclude S,:f><:.hT Ruse dela%.clocKO6------/ Rfuses G'UDE,VE,G'$L'E&!E,G'@=$ 1ncluimos la libreria del microcontrolador utilizado 9i(amos la frecuencia del clocK utilizado G'UDE* no utilizamos Catchdog, VE* Eipo oscilador .cuarzo/ G'$L'E&!E* no prote(e el codigo, G'@=$*Go utiliza volta(e ba(o de programacion Rdefine use)portb)Kbd EL+& Defines portb para teclado matricial Rinclude SKbd.cT 1ncluimos libreria para teclado matricial Rinclude S!*b+sersbvaleriobDesKtopb&ntrenador +$!b!!7b6N;enerador de frecuenciab@ibreriasb@!D)$'LE!.!T 1ncluimos libreria para displa% Rinclude Sstdio.hT 1ncluimos libreria estandard de entrada % salida de datos Rinclude Smath.hT 1ncluimos libreria de calculos matematicos Ruse standard)io.a/ Directiva que permite al compilador crear entradas % salidas segun convenga Definiciones Rdefine D1;1)BAV 6 Rdefine 7A@1DA $1G)AGumero de digitos ma#imos 8. Definimos pin de la salida de nuestro generador de frecuencia =ariables tipo entera > bits .desde - a 386/ =ariables tipo char, continen el codigo ascii del caracter a guardar =ariables tipo entero ,: bits .desde - a :8858/

FF =ariables globales FF int contO-,cont)3O-,cont)5O-,posicionO-,estadoO-W char pulsado,frec)individual_D1;1)BAV`W int,: au#O-,frecO-,pulsoO-W FF $rotipo funciones FF void refresca)lcd.void/W void lectura)teclado.void/W void calcula)numero.void/W void reinicia)variables.void/W FF 9uncion interrupcion FF Rint)E1B&L, void E1B&L,)isr.void/ X output)toggle.7A@1DA/W set)timer,.:8858Npulso/W Z FF 9uncion refresco displa% FF

9uncion de actualizar datos de la pantalla @!D alfanumerica 9uncion que permite leer las teclas que se presionan en el teclado matricial Aunta las 8 pulsaciones de numeros individuales en un numero unico $one cero las variables de entorno

9uncion interrupcion Eimer, 1nvierte el estado de la salida del generador de frecuencias Lecarga el timer con el valor del pulso deseado

void refresca)lcd.void/ 9uncion refresca displa% alfanumerico X sCitch .cont)3/X Bostramos por pantalla la frecuencia % los digitos introducidos hasta el momento case -* !aso printf.lcd)putc,cbf9rec*a@u.Jz/bn1ntro*)c,frec/W Gingun digito introducido breaKW Eermina la funcion case ,* printf .lcd)putc,cbf9rec*a@u.Jz/bn1ntro*ac)bnc,frec,frec)individual_-`/W breaKW !aso , ,er digito introducido. Eermina la funcion

case 3* !aso 3 printf .lcd)putc,cbf9rec*a@u.Jz/bn1ntro*acac)bnc,frec,frec)individual_-`,frec)individual_,`/W ,M % 3M introducidos. breaKW Eermina la funcion case 5* !aso 5 printf .lcd)putc,cbf9rec*a@u.Jz/bnbn1ntro*acacac)bnc,frec,frec)individual_-`,frec)individual_,`,frec)individual_3`/W ,M,3M % 5M. breaKW Eermina la funcion case 6* !aso 6 printf .lcd)putc,cbf9rec*a@u.Jz/bnbn1ntro*acacacacbnc,frec,frec)individual_-`,frec)individual_,`,frec)individual_3`,frec)individual_5`/W ,M,3M,5M % 6M. breaKW Eermina la funcion default* printf .lcd)putc,cbf&rrorgc/W Buestra error por pantalla dela%)ms.38-/W Letardo de , segundo. 38-ms F 6 dela%)ms.38-/W dela%)ms.38-/W dela%)ms.38-/W reinicia)variables./W Leinicia las variables

<-

7oluciones propuestas
breaKW Z Z 9in refresca)lcd FF 9uncion principal FF void main.void/ X !arga de funciones lcd)init./W Kbd)init./W $'LE)?)$+@@+$7.EL+&/W !arga la funcion del displa% alfanumerico !arga la funcion del teclado matricial +tilizamos las resistencias de pull)up puerto ? Bensa(e de bienvenida Letardo de , segundo. 38-ms F 6 Eermina la funcion

printf.lcd)putc,cbf;eneradorbnde funcionesc/W dela%)ms.388/W dela%)ms.38-/W dela%)ms.38-/W dela%)ms.38-/W refresca)lcd./W reinicia)variables./W setup)timer),.E,)internaleE,)D1=)?^),/W disable)interrupts.int)timer,/W enable)interrupts.global/W Chile.,/X if .estadoOO-/ lectura)teclado./W else if .estadoOO,/ calcula)numero./W else if .estadoOO3/ Xreinicia)variables./W refresca)lcd./WZ else dela%)us.,/W Z fin)Chile Z fin)main 9unciones void lectura)teclado.void/ X pulsadoOKbd)getc./W

Lefrescamos el displa% $onemos las variables a cero 1niciamos Eimer ,. 'scilador interno % preescaler por , Go habilitamos las ionterrupciones del timer, 7i habilitamos las interrupciones globales ?ucle infinito &stado -, leemos teclado matricial &stado ,, une los diferentes numeros individuales &stado 3, reinicia las variables Lefrescamos displa% &speramos ,us

9uncion lectura teclado matricial !aptura de la pulsacion % guardado para posteriormente verificar si es correcta la pulsacion dada =erificamos si es la ultima pulsacion % cambiamos de estado si es asi

if .cont)3OOD1;1)BAV/ XestadoO,Wrefresca)lcd./WZ

else if ..pulsadoOOj-j/ee.pulsadoOOj,j/ee.pulsadoOOj3j/ee.pulsadoOOj5j/ee.pulsadoOOj6j/ee.pulsadoOOj8j/ee.pulsadoOOj:j/ee.pulsadoOOj<j/ee.pulsadoOOj>j/ee .pulsadoOOj4j// 9iltramos para comprobar que sea un numero comprendido entre el , % el 4 X frec)individual_cont)3`OpulsadoW cont)3HHW refresca)lcd./W Z else if .pulsadoOOjFj/ Xif .cont)3gO-/ Xcont)3NNWrefresca)lcd./WZ Z else if .pulsadoOOjRj/ XestadoO,Wrefresca)lcd./WZ else dela%)us.,/W Z 9iltramos para comprobar que se ha pulsado la tecla cFc % retrocedemos un digito ;uardamos el dato en el vector de frecuencias individuales 1ncrementamos en una undiadd el contador 3 Lefrescamos el displa%

9iltramos para comprobar que se ha pulsado la tecla cRc % pasamos al siguiente estado $ausamos ,us

<,

&ntrenador microcontroladores .@engua(e !/

void calcula)numero.void/ X posicionO,W au#OfrecW frecO-W

!alcular frecuencia a partir de pulsaciones individuales 1niciamos las variables para hacer el calculo ;uardamos en la variable au#iliar la frecuencia anterior $onemos a cero la frecuencia Lecorrido desde - a digi)ma#O8 para colocar en el lugar correspondiente cada digito individual 9ormula para calculo de la posicion

for .cont)5O-Wcont)5SD1;1)BAVWcont)5HH/

X frecHO.frec)individual_cont)5`N6>/F.poC.,-,.D1;1)BAVNposicionN.D1;1)BAVNcont)3////W posicionHHW frec)individual_cont)5`O6>W 1nicializamos vector frec)individualW !odigo ascii.6>/ O Z estadoO3W !ambiamos el estado if .frecOO-/ Xdisable)interrupts.int)timer,/W 7i la frecuencia es - paramos la salida. output)loC.7A@1DA/WZ !olocamos la salida a nivel logico -.

9iltramos para que la frecuencia seleccionada este entre > % <IJz else if ..>SOfrec/YY.frecSO<---// X pulsoO.8----- frec/W set)timer,.:8858Npulso/W enable)interrupts.int)timer,/WZ else X frecOau#W printf .lcd)putc,cbf&rrorggbn>SO =alor SO<---c/W dela%)ms.38-/W dela%)ms.38-/W dela%)ms.38-/W dela%)ms.38-/W Z refresca)lcd./W Z void reinicia)variables.void/ X for .contO-WcontSD1;1)BAVWcontHH/X frec)individual_cont`O6>W dela%)us.,/W Z contO-W cont)3O-W cont)5O-W posicionO,W estadoO-W Z ,-k,-l: 3 $asar a u7 % hacemos dos semiperiodos 1niciamos el conteo del timer, Jabilitamos las interrupciones Devolvemos la frecuencia almacenada en la variable au#iliar Bostramos error en el displa% Letardo de , segundo. 38-ms F 6

Lefrescamos el displa% Leiniciamos las variables

<3

7oluciones propuestas

Pr*ctica 8+ 7oltBmetro
=oltimetro digital, desde N,3v hasta ,3v. FF Directivas del microprocesador Rinclude S,:f><:.hT Rdevice adcO,Ruse dela%.clocKO6------/ Rfuses G'UDE,VE,G'$L'E&!E 1ncluimos la libreria del microcontrolador utilizado !onfiguramos el convertirdor A D a modo ,- ?its 9i(amos la frecuencia del clocK utilizado G'UDE* no utilizamos Catchdog, VE* Eipo oscilador .cuarzo/ G'$L'E&!E* no prote(e el codigo Rinclude S!*b+sersbvaleriobDesKtopb&ntrenador +$!b!!7b5N9recuenciometrob@ibreriasb@!D)$'LE!.!T 1ncluimos libreria para displa% FF 9uncion principal FF void main.void/ X int,: adcO-W float voltsO-W setup)adc)ports.AG-)=L&9)=L&9/W setup)adc.AD!)!@'!I)1GE&LGA@/W lcd)init./W =ariables tipo entero ,: bits .desde - a :8858/ =ariable tipo coma flotante !onfiguramos el convertidor A D como entrada AG-, =L&9H % =L&9N para traba(ar con volta(es entre H,3= % N,3= !onfiguracin del oscilador interno del convertidor A D 1niciar @!D

Chile.true/ X ?ucle infinito set)adc)channel.-/W !onfiguramos el canal a muestrear, en este caso canal dela%)us.3-/W &speramos a que realice la muestra adc O read)adc./W ;uardamos la lectura del convertidor en la variable adc volts O.N,3.-/H.36Fadc ,-36/W Leescalamos el valor, para hacerlo inteligible printf .lcd)putc,cbfAD! O a6ldbn=oltageO af=c,adc,volts/W Bostramos por pantalla dicho volta(e % su valor de muestra Digital dela%)ms.,--/W &spera ,-- ms para realizar la siguiente muestra Z fin)bucle infinito Z fin)main

<5

&ntrenador microcontroladores .@engua(e !/ Pr*ctica 9+ Dsciloscopio di&ital con captura de seEal ( comunicaci%n por puerto FS$
'sciloscopio digital con captura de seal % comunicacion por puerto +7? FF Directivas del microprocesador FF Rinclude S,>f688-.hT 1ncluimos la libreria del microcontrolador utilizado Rdevice adcO,!onfiguramos el convertirdor A D a modo ,- ?its R9+7&7 J7$@@,$@@8,$+E,?L'UG'+E,G'UDE,!!$3!,,G'@=$,G'D&?+;,+7?D1= Ruse dela%.clocKO6>B/ 9i(amos la frecuencia del clocK utilizado Rdefine $+@7AD'L $1G)?: Rdefine +7?)!'G)7&G7&)$1G $1G)?< Rinclude Susb)cdc.hT Rinclude Sstring.hT Rinclude SJDB:6;7,3.!T Rinclude Sgraphics.cT 1ncluimos libreria para displa% matricial .,3>#:6/ 1ncluimos libreria de graficos Declaracion de variables globales $in)?< para reconcer cone#ion por hardCare @ibreria para aadir un puerto com virtual sobre +7? en modo !D!

short antipulsacionO-,modocapturaO-,pauseO-,transmitidoO-W int> contadorO-W int,: valorW float tensionW 9uncion interrupcion Rint)ad void ad)int./X valorOread)adc.AD!)L&AD)'G@^/W set)timer,.-/W Z FF 9uncion principal FF void main./ X int> #aO,3>,%aO-,captura_,3>`W !JAL te#t,_`OcBodo capturacW !JAL te#t3_`Oc$resiona pulsadorcW glcd)init.'G/W disable)interrupts.global/W setup)adc)ports.AG-/W setup)adc.AD!)!@'!I)1GE&LGA@/W set)adc)channel.-/W setup)ccp3.!!$)!'B$AL&)L&7&E)E1B&L/W setup)timer),.E,)1GE&LGA@ e E,)D1=)?^),/W set)timer,.-/W ccp)3O,---W enable)interrupts .int)ad/W enable)interrupts .global/W usb)cdc)init./W usb)init./W glcd)fillscreen.-/W glcd)line.,,:6,,,,,,/W glcd)line.,,5,,,3>,5,,,/W doX

9uncion lectura del convertidor A D ;uardamos la lectura del convertidor en la variable adc 1niciamos el timer),

Declaracion de variables locales Declaracion de te#tos a mostrar por pantalla Jabilitamos el displa% Deshabilitamos las interrupciones globales Jabilitamos el canal AG- para tomar las muestras del convertidor A D !onfiguracin del oscilador interno del convertidor A D !onfiguramos el canal a muestrear, en este caso canal !!$3 modo comparaion % disparo especial !onfiguracion timer , $uesta a Buestreo cada 3-- us a 3- BJz Jabilitamos interrupciones A D Jabilitamos interrupciones globales !onfiguramos el puerto usb en modo !D! 1niciamos el usb ?orrado de pantalla $intamos las lineas # e %

if ..input.$+@7AD'L/OO-/YY.antipulsacionOO-/YY.modocapturaOO-// X

7i pulsamos el pulsador pausaremos la seal dela%)ms.:/W if .input.$+@7AD'L/OO-/X antipulsacionO,W pauseO,W Z

<6

7oluciones propuestas

else if ..input.$+@7AD'L/OO-/YY.antipulsacionOO-/YY.modocapturaOO,//X 7i pulsamos el pulsador comenzara a dibu(ar la seal dela%)ms.:/W if .input.$+@7AD'L/OO-/X antipulsacionO,W pauseO-W modocapturaO-W transmitidoO-W Z Z else if ..input.$+@7AD'L/OO,/YY.antipulsacionOO,// antipulsacionO-W else if .modocapturaOO-/X +na vez despulsado pulsador quitamos bandera de antipulsacion

$intamos la seal si estamos en modocapturaOtensionO.valorF8.-/ ,-36.-W =in en volts .de - a 8v/ %aO,.-H,3.:FtensionW &scalado de =in, % de , a :6 .%O,H:6 8F=in/ captura_#a`O%aW $asamos dato al vector, para posterior envio del seal por usb glcd)pi#el.#a,%a,,/W $intamos el pi#el en el displa% matricial #aNNW Desplazamos el e(e V en una unidad .pintamos de derecha a izquierda/

if ..#aS3/YY.pauseOO-// X &vitamos se limpie la pantalla si habilitamos el pause #aO,3>W 1niciamos la posicion de las #js al lado derecho glcd)fillscreen.-/W ?orramos la pantalla glcd)line.,,:6,,,,,,/W $intamos las lineas de los e(es # e % glcd)line.,,5,,,3>,5,,,/W Z else if ..#aS3/YY.pauseOO,// X modocapturaO,W Z Z else if .transmitidoOO-/X glcd)te#t8<.,-,6-,te#t,,,,,/W glcd)te#t8<.,-,8-,te#t3,,,,/W usb)tasK./W if .usb)enumerated.// X for .contadorO-WcontadorS,3>WcontadorHH/X Eransmitiremos ,3> tramas printf.usb)cdc)putc,cai,aibnccontador,captura_contador`/W Z printf.usb)cdc)putc,cRbnRbnRbnRbnRbnRbnRbnRbnRbnRbnRbnRbnRbnRbnRRbnRbnRbnRbnRbnRbnRbnRbnRbnRbnRbnRbnRbnRbnR c/W Lelleno transmitidoO,W 9in de transmision Z Z ZChile .EL+&/W Z Erasmitimos los datos recopilados de la seal 1mprimimos el mensa(e te#t, 1mprimimos el mensa(e te#t3 1niciamos el usb Jabilitamos modo captura

<8

&ntrenador microcontroladores .@engua(e !/

?ibliograf"a % soporte digital

@ibro* !ompilador ! !!7 % simulador $roteus para microcontroladores $1!. 9oros de apo%o % consulta* http* CCC.gemi#studio.com forums

9orero que me a%udo a terminar la interfaz del osciloscopio del pc* &rKosone.

<:

Vous aimerez peut-être aussi