Propeller con leds RGB Display POV

Page 1

MICROCONTROLADORES AVANZADOS UNIVERSIDAD TECNICA DEL NORTE Fica- ciercom INTEGRANTES: -MARCO HIDROBO -SOLEDAD CALDERON -DANIEL CARRERA

CATEDRATICO:

PROPELLER CON

ING. DAVID NARVAEZ

LEDS RGB Marzo - Agosto 2013


INDICE CAPÍTULOS: 1. ANALISIS DE LA PROBLEMÁTICA A RESOLVER

1.1. 1.2. 1.3. 1.4. 1.5. 1.6.

Problema a resolver Objetivo General Objetivos específicos Justificación Alcance y limitaciones Solución del problema

2. MARCO TEÓRICO

2.1. Funcionamiento del Propeller 2.2. POV 2.3. Información de los materiales empleados 3. DISEÑO DEL PROPELER

3.1. 3.2. 3.3. 3.4. 3.5.

Cronograma de actividades Diagrama de bloques Flujograma Desarrollo del proyecto Código Utilizado

4. PRESUPUESTO 5. ANEXOS

5.1. Fotos de construcción del equipo 5.2. Diagrama eléctrico 6. CONCLUSIONES, RECOMENDACIONES Y BIBLIOGRAFÍA


ANALISIS DE LA PROBLEMÁTICA A RESOLVER

1.1.

PROBLEMA A RESOLVER Un propeller es un dispositivo vistoso que emplea algunos dispositivos electrónicos para su funcionamiento, que consiste en la visualización de una palabra que simula estar suspendida en el aire y el cual puede ser empleado en diversas áreas de publicidad o marketing. Por tal razón se propuso el diseñar y construir un propeller como proyecto final de la materia de microcontroladores avanzados utilizando los microcontroladores dsPIC.

1.2.

OBJETIVO GENERAL Realizar el diseño, desarrollo y montaje de un circuito para el funcionamiento de un propeller utilizando microcontroladores dsPIC y leds RGB que nos permitirán visualizar una palabra por medio del efecto POV y acelere y desacelere el motor por medio del PWM.

1.3. OBJETIVOS ESPECIFICOS  Investigar todo lo concerniente al principio de funcionamiento de un propeller, los elementos a utilizar tanto a nivel de software como a nivel de hardware para su implementación virtual y física así como la disponibilidad de estos en el mercado para generar un marco teórico que


nos sirva como ayuda y referencia para superar las diversas adversidades que se presenten a lo largo del desarrollo del proyecto.

 Establecer un cronograma de actividades el cual constara con las fechas de entrega del proyecto así como las de cada avance que se obtiene en el desarrollo del mismo.  Resolver y desarrollar progresivamente los problemas que involucran la implementación del proyecto como el funcionamiento de los diferentes dispositivos tales como el motor, su diseño mecánico, leds RGB y dispositivos extras que se requieran. 1.4.

JUSTIFICACIÓN El proyecto a realizarse nos da una pauta de iniciativa al desarrollo de un dispositivo atractivo y novedoso en el área electrónica el cual presenta un gran potencial de mercado y área de aplicación. Una de las razones principales de la iniciativa del propeller es el conocimiento y el manejo general de todo el aparataje eléctronico, y los conocimientos sobre el dspic, planteándonos nuevos retos en cada avance que se nos va presentando.

1.5.

ALCANCES Y LIMITACIONES En este proyecto se pretenden identificar los campos de aplicación que tiene un propeller así como de sus recursos tecnológicos que en él se refiere para su creación y correcto funcionamiento como es su parte mecánica y electrónica que lo integran y por medio de las cuales podremos visualizar una palabra. ALCANCES  Forma novedosa de mostrar una palabra que da el efecto de estar suspendida o plasmada en el aire.  Dispositivo ornamental que atrae la atención de las personas puede ser utilizado para publicidad o marketing.


LIMITACIONES  Está limitado a mostrar una palabra, para mostrar o cambiar la palabra se necesita cambiar el código del programa.  No posee efectos para mostrar o quitar la palabra para que así sea más llamativo o vistoso. 1.6.

SOLUCION DEL PROBLEMA Para la solución de nuestro problema emplearemos 2 microcontroladores uno para controlar el motor y así poder establecer el tamaño de nuestra palabra, y otro para generar el mensaje con los leds RGB en la placa que va a girar.


MARCO TEORICO En este capítulo procederemos a detallar todo el aspecto teórico que hemos tomado en cuenta para realizar nuestro proyecto y revisar las características de los elementos implicados en el.

2.1. FUNCIONAMIENTO DEL PROPELLER Se basa en hacer girar un conjunto o arreglos de leds que mediante el efecto POV genera una imagen o palabra que es captada por el ojo humano la cual simula estar suspendida en el aire.

Características Técnicas Este proyecto se basa en un mecanismo giratorio que consta básicamente de un motor al cual va fijada una placa electrónica que hace la función de hélice como si de un ventilador se tratase. En el extremo de esta placa va una hilera vertical formada por LEDsRGB. A través de la velocidad y de una adecuada programación del microcontrolador que maneja el encendido y apagado de los LEDs, se aprovecha de la persistencia de imagen en la retina para generar la ilusión óptica que queda representada en una imagen, en este caso el mensaje. 2.2. POV El POV (Persistence Of Vision) es un fenómeno visual descubierto por el científico belga Joseph Plateau que demuestra cómo una imagen permanece en la


retina humana una décima de segundo antes de desaparecer completamente. Esto permite que veamos la realidad como una secuencia de imágenes que el cerebro enlaza como una sola imagen visual móvil y continua. El cine aprovecha este efecto y provoca ese enlace proyectando más de diez imágenes por segundo (generalmente 24), lo que genera en nuestro cerebro la ilusión de movimiento. La persistencia retiniana es una característica de nuestro ojo que provoca que las imágenes que se observan no se borren instantáneamente. Es una característica que hace que las imágenes que vemos queden guardadas por un instante en el cerebro. Por ejemplo, al hacer girar un fósforo podemos lograr que éste parezca formar un círculo de fuego en el aire, al igual que si lo hacemos con un LED encendido.

Figura01. Efecto POV con una sola línea de leds en movimiento

Si a dicho LED o a un conjunto de ellos los activamos de manera apropiada en tiempo y forma, obtendremos, gracias a la persistencia de nuestra visión, imágenes que parecen estar flotando en el aire. 2.3. INFORMACION DE LOS MATERIALES EMPLEADOS LEDS RGB Los LEDs RGB son tres LEDs en un mimo empaque, estos LEDs están compuestos de LEDs de colores primarios: rojo (Red), verde (Green), y azul (Blue), al variar la intensidad de corriente de cada LED se producen diferentes colores. Permiten hacer en teoría toda la gama de colores hasta el blanco que es la suma de los tres.


Figura 02. Led RGB de 4 patas

Figura03. Esquema de colores

MOTOR El motor es una maquina eléctrica rotativa en diversas circunstancias tiene muchas ventajas dependiendo para la actividad q deseamos implementar, por su potencia el tamaño y el peso del motor. Su rendimiento es muy elevado (típicamente en torno al 80%, aumentando el mismo a medida que se incrementa la potencia de la máquina La gran mayoría de los motores eléctricos son máquinas reversibles pudiendo operar como generadores, convirtiendo energía mecánica en eléctrica.


Figura 04. Motor DC

La base principal para el funcionamiento se basa o depende de las revoluciones que tenga el motor, como por ejemplo si un motor tiene 1275 (RPM) entonces aplicaremos una regla de 3 simple dependiendo la cantidad de letras o caracteres que tenga la palabra 1275 đ?‘&#x;đ?‘?đ?‘š ________________ 1đ?‘šđ?‘–đ?‘› = 60 đ?‘ 1 đ?‘&#x;đ?‘?đ?‘š_____________________ ? đ?‘Ľ=

1 Ă— 60 1275

đ?‘Ľ = 47,05 đ?‘šđ?‘

Con este resultado se puede tener una palabra de 4 letras o caracteres de 10ms cada una con separaciĂłn de 1ms entre cada una utilizando 43ms en total. MICROCONTROLADOR 30F4013 Este es un dsPIC estĂĄ diseĂąado para control de motores. Es un procesador digital de seĂąales a 16 bits. Tiene una arquitectura de alto rendimiento basada en RISC


Con         

las siguientes características: Arquitectura Harvard modificada. Set de instrucciones optimizado para usarse en lenguaje ensamblador. 84 instrucciones base con métodos de direccionamiento flexibles. 16 registros de trabajo de 16 bits Operación de hasta 30MIPs Doble acumulador de hasta 40bits. Multiplicador de 17x17bits Convertidor analógico digital de 12bits 2 USART

Figura05. DsPIC30F4013 patillaje

FIN DE CARRERA En los sistemas con movimiento normalmente existen sensores que se colocan en los límites para poder detectar dichos límites y bloquear el moviente de los motores para no forzar y romper el sistema. A dicho sensor se le denomina fin de carrera (EndStop) y hay infinidad de dispositivos (mecánicos, ópticos, magnéticos, etc.). En general todos funcionan con el mismo principio y es que al llegar el dispositivo móvil al sensor este manda una señal eléctrica para indicar esta situación.


Figura06. Fin de carrera de una impresora

BAQUELITA La baquelita fue la primera sustancia plástica totalmente sintética, creada en 1907 y nombrada así en honor a su creador, el belga Leo Baekeland (el Premio Nobel en Química). Se trata de un fenoplástico que hoy en día aún tiene aplicaciones interesantes. Este producto puede moldearse a medida que se forma y endurece al solidificarse. No conduce la electricidad, es resistente al agua y los solventes, pero fácilmente mecanizable. El alto grado de entrecruzamiento de la estructura molecular de la baquelita le confiere la propiedad de ser un plástico termoestable una vez que se enfría no puede volver a ablandarse.

Figura 07. Baquelita

RESISTENCIAS La resistencia eléctrica de un objeto es una medida de su oposición al paso de corriente. La unidad de la resistencia en el Sistema Internacional de Unidades es el ohmio (Ω).Una resistencia real en corriente continua (CC) se comporta prácticamente de la misma forma que si fuera ideal, esto es, transformando la energía eléctrica en calor por efecto Joule. La variación de la temperatura produce una variación en la resistencia. En la mayoría de los metales aumenta su resistencia


al aumentar la temperatura, por el contrario, en otros elementos, como el carbono o el germanio la resistencia disminuye. El fabricante dará como dato el valor en vatios que puede disipar cada resistencia en cuestión. Este valor puede estar escrito en el cuerpo del componente o se tiene que deducir de comparar su tamaño con los tamaños estándar y sus respectivas potencias. El tamaño de las resistencias comunes, cuerpo cilíndrico con 2 terminales, que aparecen en los aparatos eléctricos domésticos suelen ser de 1/4 W, existiendo otros valores de potencias de comerciales de. W, 1 W, 2 W, etc.

Figura 08. Resistencias

INTERRUPTOR Un interruptor eléctrico es en su acepción más básica un dispositivo que permite desviar o interrumpir el curso de una corriente eléctrica. En el mundo moderno sus tipos y aplicaciones son innumerables, van desde un simple interruptor que apaga o enciende un bombillo, hasta un complicado selector de transferencia automático de múltiples capas controlado por computadora.

Figura 09. Interruptor se 2 posiciones


DISEÑO DEL PROPELLER

3.1 CRONOGRAMA DE ACTIVIDADES ANALISIS DEL SISTEMA, OBJETIVOS , FUNCIONAMIENTO DEL PROPELLER, MARCO TEORICO MOTOR

INVESTIGACION MAS CERCANA DEL INDICADOR DEL MENSAJE QUE VAMOS A MOSTRAR CARACTERISTICAS, FUNCIONAMIENTO, ACELERAMIENTO Y DESACELERAMIENTO

LEDS RGB

CARACTERISTICAS COMO SE GENERAR LOS COLORES ESTRUCTURA DE ARREGLOS DE LEDS Y DISEÑO DE LA ELICE MEJORA DE DESPERFECTOS

DISEÑO MECANICO

IMPLEMENTACIONES EXTRAS ENTREGA DEL INFORME FINAL ENTREGA DEL PROYECTO

PROBLEMA, OBJETIVOS, ALCANCES LIMITAICONES CD CON PROGRAMA

ANALIZAR COMO EMPEZAR A CONTRUIR EL MENSAJE Y SU DISEÑO REVISAR EL MOTOR LA POTENCIA Y VOLTAJES Y LAS RPM VOLTAJES, IMPLEMENTACION EN EL CIRCUITO UNIFICACION DEL MOTOR CON LOS LEDS FUNCIONAMIENTO DEL CIRCUITO DE MEJORAS MARCO TEORICO,DISEÑO, ETAPAS, PRECIO INFORME CORREGIDO

COSTOS

VIERNES 10 DE MAYO DEL 2013

CALCULOS PARA EL TAMAÑO DEL MENSAJE

VIERNES 23 DE MAYO DE 2013

CALCULOS DE AMPERAJE PARA CADA LED PRUEBAS DE FUNCIONAMIENTO POR SEPARADO EXTRAS O ADICIONES AL CIRCUITO CONCLUSIONES, RECOMENDACIONES, BIBLIOGRAFIA DEFENSA DEL PROYECTO

VIERNES 7 DE JUNIO DEL 2013 VIERNES 21 DE JUNIO DEL 2013 VIERNES 5 DE JULIO DEL 2013 LUNES 22 DE JULIO LUNES 29 DE JULIO


3.2 DIAGRAMA DE BLOQUES


3.3 FLUJOGRAMA PWM MOTOR


PWM RGB


3.4DESARROLLO DEL PROYECTO Lo primero que se realizo fue decidir que tipo de motor utilizar y que cantidad de RPMs tiene para determinar el tamaĂąo de la palabra que podemos utilizar. Decidimos mostrar la palabra UTN la cual requiere de 33ms ya que tiene 3 letras de 10ms con separacion de 1ms el cĂ lculo se muestra a continuacion. 1500 đ?‘&#x;đ?‘’đ?‘Ł ________________ 1đ?‘šđ?‘–đ?‘› = 60 đ?‘ 1 đ?‘&#x;đ?‘’đ?‘Ł_____________________ ? đ?‘Ľ=

1 Ă— 60 1500

đ?‘Ľ = 40,00 đ?‘šđ?‘

El motor que se estĂĄ utilizando es un motor de ventilador de carro el cual se alimenta con un voltaje de entre 10-15V y con una carga de 1 amperio y tiene 300 revoluciones por minuto (RPM) pero con el manejo del PWM se logrĂł reducir a 1500 revoluciones por minuto. Otro aspecto a estudiar es el manejo del pwm para porder acelar y desacelerar el motor y asĂŹ poder reducir el nĂšmero de revoluciones por minuto que nos permitiras visualizar la palabra establecida (UTN) para lo cual tenemos que dirigirnos al datasheet que contiene la informacion respectiva del manejo del PWM y de los pines que tiene esta funcion segĂşn el microcontrolador a emplear en este caso estamos utilizando el dspic30f4013. ExplicaciĂłn de PWM: La modulaciĂłn por ancho de pulsos (tambiĂŠn conocida como PWM, siglas en inglĂŠs de pulse-width modulation) de una seĂąal o fuente de energĂ­a es una tĂŠcnica en la que se modifica el ciclo de trabajo de una seĂąal periĂłdica (una senoidal o una cuadrada, por ejemplo), ya sea para transmitir informaciĂłn a travĂŠs de un canal de comunicaciones o para controlar la cantidad de energĂ­a que se envĂ­a a una carga. El ciclo de trabajo de una seĂąal periĂłdica es el ancho relativo de su parte positiva en relaciĂłn con el perĂ­odo. Expresado matemĂĄticamente:

D es el ciclo de trabajo es el tiempo en que la funciĂłn es positiva (ancho del pulso) T es el perĂ­odo de la funciĂłn


A continuacion se muestran los calculos del current duty: CĂĄlculos Para los valores del current_duty

đ?‘ƒđ?‘Šđ?‘€đ?‘?đ?‘’đ?‘&#x;đ?‘–đ?‘œđ?‘‘đ?‘œ = [(đ?‘ƒđ?‘…đ?‘Ľ ) + 1] ∗ 4 ∗ đ?‘‡đ?‘œđ?‘ đ?‘? ∗ (đ?‘‡đ?‘€đ?‘…đ?‘Ľ đ?‘?đ?‘&#x;đ?‘’đ?‘ đ?‘?đ?‘Žđ?‘™đ?‘’ đ?‘Łđ?‘Žđ?‘™đ?‘˘đ?‘’)

Para una frecuencia de 20kHz que es la que hemos utilizado para controlar el motor, la cual es una frecuencia promedio en la que los motores trabajan de manera correcta

.

Donde PR2 es el current_duty es decir mi ciclo de trabajo donde lo puedo variar desde 0-499. Debido a que el control de motor no se lo puede hacer desde el mismo microcontrolador que va a estar girando se determinĂł usar 2 microcontroladores uno para el aceleramiento y desaceleramiento del motor por medio del PWM y otro que se encontrarĂĄ en la placa o eje principal que va agirar y desde el cual se manejara los LEDs RGB y la palabra que se muestra.

Luego se procedio a la creaciĂłn de los colores con los LEDs RGB y el incoveniente que se nos presento fue que para la generaciĂłn de los colores con


los LEDs RGB se necesitan 3 pines con PWM por lo que se generó la configuración de un canal mas PWM en el dsPIC 30f4013 ya que este posee 2 pines PWM, empleando timers para su funcionamiento. Para la obtecion de colores se tuvo que tener en cuenta la estructura, forma de funcionamiento y tipo de LEDs RGB en este caso ánodo comun así como de todo lo que involucra la generacion de un determinado color en los mismos. Caracteristicas de los RGB

Figura 10. LED RGB

    

Este es un LED que unifica 3 LEDs de colores La pata mas larga es el ánodo comun y las otras 3 son los colores La siguiente es el led azul La tercera es el led verde Y la mas pequeña el led rojo

Tensiones de alimentación / consumo  LED ROJO: 2,1V / 20mA  LED VERDE: 3,3V / 20mA  LED AZUL: 3,3V / 20mA Los LEDs RGB tienen sus tres colores primarios que son el rojo, verde , azul de acuerdo a la convinación que les demos a estos colores podemos encontrar una gran gama de colores su función principal es exhibir su imágenes en sistemas eléctricos e informáticos


La intensidad de cada color en una forma decimal se logra en 255 es decir R= 255, G=0, B= 0,

R= 0, G=255, B=0,

R=0 G=0 B=255

De acuerdo a esta tabla podemos dar cualquier valor a cada letra de ahĂ­ saldran las combinacion . A continuaciĂłn de detalla los cĂĄlculos para generar los colores: CĂĄlculos para los valores de la frecuencia del PWM para los colores, para poder variar el ciclo de trabajo de 0-255 ya que se encontrĂł ejemplos de muchos colores con esa variaciĂłn de valores. đ?‘ƒđ?‘Šđ?‘€đ?‘?đ?‘’đ?‘&#x;đ?‘–đ?‘œđ?‘‘đ?‘œ = [(đ?‘ƒđ?‘…đ?‘Ľ ) + 1] ∗ 4 ∗ đ?‘‡đ?‘œđ?‘ đ?‘? ∗ (đ?‘‡đ?‘€đ?‘…đ?‘Ľ đ?‘?đ?‘&#x;đ?‘’đ?‘ đ?‘?đ?‘Žđ?‘™đ?‘’ đ?‘Łđ?‘Žđ?‘™đ?‘˘đ?‘’) 1 1   0.1ď ­s Fosc 10 Mhz

Tosc 

TMR2 prescaler value  1  Para un valor del prescaler igual 1 Si nuestro PRX va hacer 255

PWM period  ď ›ď€¨255  1ď ?* 4 * 0.1us *1

PWM period  1.024 x10 04 s

PWM period  FPWM 

FPWM 

1 FPWM

1 PWM period

1 1.024 x10 04 s

FPWM  9765.625

TABLA DE EJEMPLOS DE LOS COLORES EN HEXADECIMAL


Despues de la generacion de colores lo siguiente que se elaboro fue el diseño mecànico del propeller, debibo a que el motor que vamos a utilizar es alimentado con un rango de voltaje de 10-15V y presenta una carga de 1 amperio se diseño un circuito de potencia de manejo de motores paramanejar el motor con el voltaje del microcontrolador. Luego se procedio al diseño de nuestra elice la cual consta de un eje principal donde se encuentra el circuito que contiene al microcontrolador, y el eje secundario se encuentra el arreglo de LEDs los cuales se encuentran formando una columna de 8 leds. Las baquelitas fueron diseñadas en el programa eagle a continuacion se muestra los diagramas de las placas.


Eje pricipal

Figura 18. Esquema del eje principal en eagle

Eje secundario

Figura 21. Esquema del eje secundario en eagle

En las placas se procedio a diseñar la grabacion in circuit para no sacar el microcontrolador para la grabación. Ya armado nuestro propeller se procedió a realizar las pruebas en este caso el motor que utilizamos ya regulado a 1500 revoluciones por minuto(RPM) por lo cual se pueden visualizar 3 letras a continuacion se detalla el calculo para determinar este número de letras 1500 𝑟𝑒𝑣 ________________ 1𝑚𝑖𝑛 = 60 𝑠 1 𝑟𝑒𝑣_____________________ ? 𝑥=

1 × 60 1500


đ?‘Ľ = 40,00 đ?‘šđ?‘

Se pueden visualizar 3 letras de 10ms con separaciones de 1ms la palabra a mostrar fue UTN. A continuaciĂłn se detalla la estructuracion de la palabra:

Para generar la palabra se crea una matriz que sera proyectada en los LEDs y segĂşn el giro horario o antihorario se obtiene la matriz que no es mĂĄs que valores


hexadecimales que van a enceder o apagar los leds de una determinada forma según la estructura de la palabra, para que está pueda ser visualizada. Debido a que nuestra palabra se visualizaba de forma omnidireccional se procedio con la utilización del fin de carrera con el objetivo que nos permita detectar la posición 0 para el giro del brazo y así las letras no sean difundidas en varas direcciones y mejorar nuestro proyecto.

3.5 CÓDIGO UTILIZADO Código para el microcontrolador que acelera y desacelera el motor mediante PWM: _frecuencia: ;MOTOR CON LCD.c,23 :: void frecuencia() // Esta función nos permite que el usuario pueda varia la frecuencia ;MOTOR CON LCD.c,25 :: if (j>=0) // la frecuencia tiene que ser mayor que cero PUSH W10 PUSH W11 PUSH W12 PUSH W13 MOV _j, W0 CP W0, #0 BRA GEU L__frecuencia86 GOTO L_frecuencia0 L__frecuencia86: ;MOTOR CON LCD.c,30 :: */ BTSC RB6_bit, #6 GOTO L_frecuencia1 ;MOTOR CON LCD.c,32 :: j=j+1000; MOV #1000, W1 MOV #lo_addr(_j), W0 ADD W1, [W0], [W0] ;MOTOR CON LCD.c,33 :: do L_frecuencia2: ;MOTOR CON LCD.c,36 :: }while(RB6_bit==0); BTSS RB6_bit, #6 GOTO L_frecuencia2 ;MOTOR CON LCD.c,37 :: delay_ms(20); MOV #16666, W7 L_frecuencia5: DEC W7


BRA NZ L_frecuencia5 NOP NOP ;MOTOR CON LCD.c,38 :: } L_frecuencia1: ;MOTOR CON LCD.c,39 :: if (RB7_bit==0) BTSC RB7_bit, #7 GOTO L_frecuencia7 ;MOTOR CON LCD.c,41 :: j=j+100; MOV #100, W1 MOV #lo_addr(_j), W0 ADD W1, [W0], [W0] ;MOTOR CON LCD.c,42 :: do L_frecuencia8: ;MOTOR CON LCD.c,45 :: }while(RB7_bit==0); BTSS RB7_bit, #7 GOTO L_frecuencia8 ;MOTOR CON LCD.c,46 :: delay_ms(20); MOV #16666, W7 L_frecuencia11: DEC W7 BRA NZ L_frecuencia11 NOP NOP ;MOTOR CON LCD.c,47 :: } L_frecuencia7: ;MOTOR CON LCD.c,48 :: if (RB8_bit==0) BTSC RB8_bit, #8 GOTO L_frecuencia13 ;MOTOR CON LCD.c,50 :: if (j>=1000) MOV _j, W1 MOV #1000, W0 CP W1, W0 BRA GEU L__frecuencia87 GOTO L_frecuencia14 L__frecuencia87: ;MOTOR CON LCD.c,52 :: j=j-1000; MOV #1000, W1 MOV #lo_addr(_j), W0 SUBR W1, [W0], [W0] ;MOTOR CON LCD.c,53 :: } L_frecuencia14: ;MOTOR CON LCD.c,54 :: do L_frecuencia15:


;MOTOR CON LCD.c,57 :: }while(RB8_bit==0); BTSS RB8_bit, #8 GOTO L_frecuencia15 ;MOTOR CON LCD.c,58 :: delay_ms(20); MOV #16666, W7 L_frecuencia18: DEC W7 BRA NZ L_frecuencia18 NOP NOP ;MOTOR CON LCD.c,59 :: } L_frecuencia13: ;MOTOR CON LCD.c,60 :: if (RF2_bit==0) BTSC RF2_bit, #2 GOTO L_frecuencia20 ;MOTOR CON LCD.c,62 :: if (j>=100) MOV #100, W1 MOV #lo_addr(_j), W0 CP W1, [W0] BRA LEU L__frecuencia88 GOTO L_frecuencia21 L__frecuencia88: ;MOTOR CON LCD.c,64 :: j=j-100; MOV #100, W1 MOV #lo_addr(_j), W0 SUBR W1, [W0], [W0] ;MOTOR CON LCD.c,65 :: } L_frecuencia21: ;MOTOR CON LCD.c,66 :: do L_frecuencia22: ;MOTOR CON LCD.c,69 :: }while(RF2_bit==0); BTSS RF2_bit, #2 GOTO L_frecuencia22 ;MOTOR CON LCD.c,70 :: delay_ms(20); MOV #16666, W7 L_frecuencia25: DEC W7 BRA NZ L_frecuencia25 NOP NOP ;MOTOR CON LCD.c,71 :: } L_frecuencia20: ;MOTOR CON LCD.c,73 :: } L_frecuencia0:


;MOTOR CON LCD.c,76 :: MOV #1, W13 MOV #1, W12 MOV _j, W10 CLR W11 MOV #2, W0 PUSH W0 CALL _PWM_Init SUB #2, W15 MOV W0, _pwm_period1 ;MOTOR CON LCD.c,77 :: MOV.B #1, W10 CALL _PWM_Start ;MOTOR CON LCD.c,78 :: MOV #1, W11 MOV _current_duty, W10 CALL _PWM_Set_Duty ;MOTOR CON LCD.c,81 :: MOV.B #70, W12 MOV #1, W11 MOV #1, W10 CALL _Lcd_Chr ;MOTOR CON LCD.c,82 :: MOV.B #82, W12 MOV #2, W11 MOV #1, W10 CALL _Lcd_Chr ;MOTOR CON LCD.c,83 :: MOV.B #69, W12 MOV #3, W11 MOV #1, W10 CALL _Lcd_Chr ;MOTOR CON LCD.c,84 :: MOV.B #67, W12 MOV #4, W11 MOV #1, W10 CALL _Lcd_Chr ;MOTOR CON LCD.c,85 :: MOV _j, W0 MOV #10000, W2 REPEAT #17 DIV.U W0, W2 MOV W0, W3 MOV #lo_addr(_ch1), W0

pwm_period1 = PWM_Init(j ,1, 1, 2);

PWM_Start(1);

PWM_Set_Duty(current_duty,1);

LCD_Chr(1,1,'F');

LCD_Chr(1,2,'R');

LCD_Chr(1,3,'E');

LCD_Chr(1,4,'C');

ch1 = j / 10000;


MOV.B W3, [W0] ;MOTOR CON LCD.c,86 :: MOV #48, W2 ZE W3, W0 ADD W2, W0, W0 MOV.B W0, W12 MOV #6, W11 MOV #1, W10 CALL _Lcd_Chr ;MOTOR CON LCD.c,87 :: MOV _j, W0 MOV #1000, W2 REPEAT #17 DIV.U W0, W2 MOV #10, W2 REPEAT #17 DIV.U W0, W2 MOV W1, W3 MOV #lo_addr(_ch1), W0 MOV.B W3, [W0] ;MOTOR CON LCD.c,88 :: MOV #48, W2 ZE W3, W0 ADD W2, W0, W0 MOV.B W0, W10 CALL _Lcd_Chr_CP ;MOTOR CON LCD.c,89 :: MOV #100, W2 MOV _j, W0 REPEAT #17 DIV.U W0, W2 MOV W0, W3 MOV #10, W2 REPEAT #17 DIV.U W3, W2 MOV W1, W5 MOV #lo_addr(_ch1), W0 MOV.B W5, [W0] ;MOTOR CON LCD.c,90 :: MOV #48, W2 ZE W5, W0 ADD W2, W0, W0 MOV.B W0, W10 CALL _Lcd_Chr_CP

LCD_Chr(1,6,48+ch1);

ch1= (j /1000) % 10;

LCD_Chr_CP(48+ch1);

ch1 = (j/100) % 10;

LCD_Chr_CP(48+ch1);


;MOTOR CON LCD.c,91 :: MOV _j, W0 MOV #10, W2 REPEAT #17 DIV.U W0, W2 MOV #10, W2 REPEAT #17 DIV.U W0, W2 MOV W1, W3 MOV #lo_addr(_ch1), W0 MOV.B W3, [W0] ;MOTOR CON LCD.c,92 :: MOV #48, W2 ZE W3, W0 ADD W2, W0, W0 MOV.B W0, W10 CALL _Lcd_Chr_CP ;MOTOR CON LCD.c,93 :: MOV _j, W0 MOV #10, W2 REPEAT #17 DIV.U W0, W2 MOV W1, W3 MOV #lo_addr(_ch1), W0 MOV.B W3, [W0] ;MOTOR CON LCD.c,94 :: MOV #48, W2 ZE W3, W0 ADD W2, W0, W0 MOV.B W0, W10 CALL _Lcd_Chr_CP ;MOTOR CON LCD.c,95 :: MOV.B #72, W10 CALL _Lcd_Chr_CP ;MOTOR CON LCD.c,96 :: MOV.B #122, W10 CALL _Lcd_Chr_CP ;MOTOR CON LCD.c,97 :: L_end_frecuencia: POP W13 POP W12 POP W11 POP W10 RETURN

ch1 = (j/10) % 10;

LCD_Chr_CP(48+ch1);

ch1 = (j/1) % 10;

LCD_Chr_CP(48+ch1);

LCD_Chr_CP('H');

LCD_Chr_CP('z');

}


; end of _frecuencia _lcd: ;MOTOR CON LCD.c,99 :: ;MOTOR CON LCD.c,102 :: PUSH W10 PUSH W11 PUSH W12 MOV.B #68, W12 MOV #1, W11 MOV #2, W10 CALL _Lcd_Chr ;MOTOR CON LCD.c,103 :: MOV.B #85, W12 MOV #2, W11 MOV #2, W10 CALL _Lcd_Chr ;MOTOR CON LCD.c,104 :: MOV.B #84, W12 MOV #3, W11 MOV #2, W10 CALL _Lcd_Chr ;MOTOR CON LCD.c,105 :: MOV.B #89, W12 MOV #4, W11 MOV #2, W10 CALL _Lcd_Chr ;MOTOR CON LCD.c,106 :: MOV.B #67, W12 MOV #6, W11 MOV #2, W10 CALL _Lcd_Chr ;MOTOR CON LCD.c,107 :: MOV.B #89, W12 MOV #7, W11 MOV #2, W10 CALL _Lcd_Chr ;MOTOR CON LCD.c,108 :: MOV.B #67, W12 MOV #8, W11 MOV #2, W10 CALL _Lcd_Chr ;MOTOR CON LCD.c,109 ::

void lcd() LCD_Chr(2,1,'D');

LCD_Chr(2,2,'U');

LCD_Chr(2,3,'T');

LCD_Chr(2,4,'Y');

LCD_Chr(2,6,'C');

LCD_Chr(2,7,'Y');

LCD_Chr(2,8,'C');

LCD_Chr(2,9,'L');


MOV.B #76, W12 MOV #9, W11 MOV #2, W10 CALL _Lcd_Chr ;MOTOR CON LCD.c,110 :: MOV.B #69, W12 MOV #10, W11 MOV #2, W10 CALL _Lcd_Chr ;MOTOR CON LCD.c,111 :: MOV _current_duty, W0 MOV #10000, W2 REPEAT #17 DIV.U W0, W2 MOV W0, W3 MOV #lo_addr(_ch0), W0 MOV.B W3, [W0] ;MOTOR CON LCD.c,112 :: MOV #48, W2 ZE W3, W0 ADD W2, W0, W0 MOV.B W0, W12 MOV #12, W11 MOV #2, W10 CALL _Lcd_Chr ;MOTOR CON LCD.c,113 :: MOV _current_duty, W0 MOV #1000, W2 REPEAT #17 DIV.U W0, W2 MOV #10, W2 REPEAT #17 DIV.U W0, W2 MOV W1, W3 MOV #lo_addr(_ch0), W0 MOV.B W3, [W0] ;MOTOR CON LCD.c,114 :: MOV #48, W2 ZE W3, W0 ADD W2, W0, W0 MOV.B W0, W10 CALL _Lcd_Chr_CP ;MOTOR CON LCD.c,115 :: MOV #100, W2

LCD_Chr(2,10,'E');

ch0 = current_duty / 10000;

LCD_Chr(2,12,48+ch0);

ch0 = (current_duty /1000) % 10;

LCD_Chr_CP(48+ch0);

ch0 = (current_duty/100) % 10;


MOV _current_duty, W0 REPEAT #17 DIV.U W0, W2 MOV W0, W3 MOV #10, W2 REPEAT #17 DIV.U W3, W2 MOV W1, W5 MOV #lo_addr(_ch0), W0 MOV.B W5, [W0] ;MOTOR CON LCD.c,116 :: MOV #48, W2 ZE W5, W0 ADD W2, W0, W0 MOV.B W0, W10 CALL _Lcd_Chr_CP ;MOTOR CON LCD.c,117 :: MOV _current_duty, W0 MOV #10, W2 REPEAT #17 DIV.U W0, W2 MOV #10, W2 REPEAT #17 DIV.U W0, W2 MOV W1, W3 MOV #lo_addr(_ch0), W0 MOV.B W3, [W0] ;MOTOR CON LCD.c,118 :: MOV #48, W2 ZE W3, W0 ADD W2, W0, W0 MOV.B W0, W10 CALL _Lcd_Chr_CP ;MOTOR CON LCD.c,119 :: MOV _current_duty, W0 MOV #10, W2 REPEAT #17 DIV.U W0, W2 MOV W1, W3 MOV #lo_addr(_ch0), W0 MOV.B W3, [W0] ;MOTOR CON LCD.c,120 :: MOV #48, W2 ZE W3, W0

LCD_Chr_CP(48+ch0);

ch0 = (current_duty/10) % 10;

LCD_Chr_CP(48+ch0);

ch0 = (current_duty/1) % 10;

LCD_Chr_CP(48+ch0);


ADD W2, W0, W0 MOV.B W0, W10 CALL _Lcd_Chr_CP ;MOTOR CON LCD.c,122 :: L_end_lcd: POP W12 POP W11 POP W10 RETURN ; end of _lcd

}

_main: MOV MOV MOV MOV MOV MOV IOR

#2048, W15 #6142, W0 WREG, 32 #1, W0 WREG, 52 #4, W0 68

;MOTOR CON LCD.c,123 :: ;MOTOR CON LCD.c,125 :: PUSH W10 PUSH W11 PUSH W12 PUSH W13 MOV #65535, W0 MOV WREG, ADPCFG ;MOTOR CON LCD.c,126 :: BSET TRISB, #0 ;MOTOR CON LCD.c,127 :: BSET TRISB, #1 ;MOTOR CON LCD.c,128 :: BSET TRISB, #2 ;MOTOR CON LCD.c,129 :: BSET TRISB, #3 ;MOTOR CON LCD.c,130 :: BSET TRISB, #4 ;MOTOR CON LCD.c,131 :: BSET TRISB, #5 ;MOTOR CON LCD.c,132 :: CLR TRISD ;MOTOR CON LCD.c,133 :: CLR PORTD

void main() ADPCFG = 0xFFFF;

TRISB.F0=1; TRISB.F1=1; TRISB.F2=1; TRISB.F3=1; TRISB.F4=1; TRISB.F5=1; TRISD = 0; PORTD = 0;


;MOTOR CON LCD.c,135 :: CALL _Lcd_Init ;MOTOR CON LCD.c,136 :: MOV.B #12, W10 CALL _Lcd_Cmd ;MOTOR CON LCD.c,137 :: MOV.B #1, W10 CALL _Lcd_Cmd ;MOTOR CON LCD.c,138 :: CLR W0 MOV W0, _current_duty ;MOTOR CON LCD.c,139 :: DE PWM MOV #5000, W0 MOV W0, _j ;MOTOR CON LCD.c,140 :: MOV #1, W13 MOV #1, W12 MOV #5000, W10 MOV #0, W11 MOV #2, W0 PUSH W0 CALL _PWM_Init SUB #2, W15 MOV W0, _pwm_period1 ;MOTOR CON LCD.c,141 :: MOV.B #1, W10 CALL _PWM_Start ;MOTOR CON LCD.c,142 :: MOV #1, W11 MOV _current_duty, W10 CALL _PWM_Set_Duty ;MOTOR CON LCD.c,143 :: L_main27: ;MOTOR CON LCD.c,147 :: CALL _lcd ;MOTOR CON LCD.c,148 :: CALL _frecuencia ;MOTOR CON LCD.c,151 :: BTSC RB0_bit, #0 GOTO L_main29 ;MOTOR CON LCD.c,153 :: MOV #16666, W7 L_main30:

Lcd_Init(); LCD_Cmd(_LCD_CURSOR_OFF);

LCD_Cmd(_LCD_CLEAR);

current_duty =0;

j=5000;

// VALOR INICIAL DE LA FRECUANCIA

pwm_period1 = PWM_Init(j ,1, 1, 2);

PWM_Start(1);

PWM_Set_Duty(current_duty,1);

while (1) lcd(); frecuencia(); if (RB0_bit==0)

Delay_ms(20);


DEC W7 BRA NZ L_main30 NOP NOP ;MOTOR CON LCD.c,154 :: current_duty=current_duty+1000; MOV _current_duty, W1 MOV #1000, W0 ADD W1, W0, W1 MOV W1, _current_duty ;MOTOR CON LCD.c,155 :: if (current_duty > pwm_period1) MOV #lo_addr(_pwm_period1), W0 CP W1, [W0] BRA GTU L__main91 GOTO L_main32 L__main91: ;MOTOR CON LCD.c,157 :: current_duty = 0; CLR W0 MOV W0, _current_duty ;MOTOR CON LCD.c,158 :: } L_main32: ;MOTOR CON LCD.c,159 :: PWM_Set_Duty(current_duty, 1); MOV #1, W11 MOV _current_duty, W10 CALL _PWM_Set_Duty ;MOTOR CON LCD.c,160 :: do L_main33: ;MOTOR CON LCD.c,163 :: }while(RB0_bit==0); BTSS RB0_bit, #0 GOTO L_main33 ;MOTOR CON LCD.c,164 :: delay_ms(20); MOV #16666, W7 L_main36: DEC W7 BRA NZ L_main36 NOP NOP ;MOTOR CON LCD.c,165 :: } L_main29: ;MOTOR CON LCD.c,166 :: if (RB1_bit==0) BTSC RB1_bit, #1 GOTO L_main38 ;MOTOR CON LCD.c,168 :: Delay_ms(20); MOV #16666, W7 L_main39:


DEC W7 BRA NZ L_main39 NOP NOP ;MOTOR CON LCD.c,169 :: current_duty=current_duty+100; MOV #100, W1 MOV #lo_addr(_current_duty), W0 ADD W1, [W0], W1 MOV W1, _current_duty ;MOTOR CON LCD.c,170 :: if (current_duty > pwm_period1) MOV #lo_addr(_pwm_period1), W0 CP W1, [W0] BRA GTU L__main92 GOTO L_main41 L__main92: ;MOTOR CON LCD.c,172 :: current_duty = 0; CLR W0 MOV W0, _current_duty ;MOTOR CON LCD.c,173 :: } L_main41: ;MOTOR CON LCD.c,174 :: PWM_Set_Duty(current_duty, 1); MOV #1, W11 MOV _current_duty, W10 CALL _PWM_Set_Duty ;MOTOR CON LCD.c,175 :: do L_main42: ;MOTOR CON LCD.c,178 :: }while(RB1_bit==0); BTSS RB1_bit, #1 GOTO L_main42 ;MOTOR CON LCD.c,179 :: delay_ms(20); MOV #16666, W7 L_main45: DEC W7 BRA NZ L_main45 NOP NOP ;MOTOR CON LCD.c,180 :: } L_main38: ;MOTOR CON LCD.c,181 :: if (RB2_bit==0) BTSC RB2_bit, #2 GOTO L_main47 ;MOTOR CON LCD.c,183 :: Delay_ms(20); MOV #16666, W7 L_main48:


DEC W7 BRA NZ L_main48 NOP NOP ;MOTOR CON LCD.c,184 :: current_duty=current_duty-1000; MOV _current_duty, W1 MOV #1000, W0 SUB W1, W0, W1 MOV W1, _current_duty ;MOTOR CON LCD.c,185 :: if (current_duty > pwm_period1) MOV #lo_addr(_pwm_period1), W0 CP W1, [W0] BRA GTU L__main93 GOTO L_main50 L__main93: ;MOTOR CON LCD.c,187 :: current_duty = 0; CLR W0 MOV W0, _current_duty ;MOTOR CON LCD.c,188 :: } L_main50: ;MOTOR CON LCD.c,189 :: PWM_Set_Duty(current_duty, 1); MOV #1, W11 MOV _current_duty, W10 CALL _PWM_Set_Duty ;MOTOR CON LCD.c,190 :: do L_main51: ;MOTOR CON LCD.c,193 :: }while(RB2_bit==0); BTSS RB2_bit, #2 GOTO L_main51 ;MOTOR CON LCD.c,194 :: delay_ms(20); MOV #16666, W7 L_main54: DEC W7 BRA NZ L_main54 NOP NOP ;MOTOR CON LCD.c,195 :: } L_main47: ;MOTOR CON LCD.c,196 :: if (RB3_bit==0) BTSC RB3_bit, #3 GOTO L_main56 ;MOTOR CON LCD.c,198 :: Delay_ms(20); MOV #16666, W7 L_main57:


DEC W7 BRA NZ L_main57 NOP NOP ;MOTOR CON LCD.c,199 :: current_duty=current_duty-100; MOV #100, W1 MOV #lo_addr(_current_duty), W0 SUBR W1, [W0], W1 MOV W1, _current_duty ;MOTOR CON LCD.c,200 :: if (current_duty > pwm_period1) MOV #lo_addr(_pwm_period1), W0 CP W1, [W0] BRA GTU L__main94 GOTO L_main59 L__main94: ;MOTOR CON LCD.c,202 :: current_duty = 0; CLR W0 MOV W0, _current_duty ;MOTOR CON LCD.c,203 :: } L_main59: ;MOTOR CON LCD.c,204 :: PWM_Set_Duty(current_duty, 1); MOV #1, W11 MOV _current_duty, W10 CALL _PWM_Set_Duty ;MOTOR CON LCD.c,205 :: do L_main60: ;MOTOR CON LCD.c,208 :: }while(RB3_bit==0); BTSS RB3_bit, #3 GOTO L_main60 ;MOTOR CON LCD.c,209 :: delay_ms(20); MOV #16666, W7 L_main63: DEC W7 BRA NZ L_main63 NOP NOP ;MOTOR CON LCD.c,210 :: } L_main56: ;MOTOR CON LCD.c,211 :: if (RB4_bit==0) BTSC RB4_bit, #4 GOTO L_main65 ;MOTOR CON LCD.c,213 :: Delay_ms(20); MOV #16666, W7 L_main66:


DEC W7 BRA NZ L_main66 NOP NOP ;MOTOR CON LCD.c,214 :: current_duty=current_duty+1; MOV #1, W1 MOV #lo_addr(_current_duty), W0 ADD W1, [W0], [W0] ;MOTOR CON LCD.c,215 :: if (current_duty > pwm_period1) MOV _current_duty, W1 MOV #lo_addr(_pwm_period1), W0 CP W1, [W0] BRA GTU L__main95 GOTO L_main68 L__main95: ;MOTOR CON LCD.c,217 :: current_duty = 0; CLR W0 MOV W0, _current_duty ;MOTOR CON LCD.c,218 :: } L_main68: ;MOTOR CON LCD.c,219 :: PWM_Set_Duty(current_duty, 1); MOV #1, W11 MOV _current_duty, W10 CALL _PWM_Set_Duty ;MOTOR CON LCD.c,220 :: do L_main69: ;MOTOR CON LCD.c,223 :: }while(RB4_bit==0); BTSS RB4_bit, #4 GOTO L_main69 ;MOTOR CON LCD.c,224 :: delay_ms(20); MOV #16666, W7 L_main72: DEC W7 BRA NZ L_main72 NOP NOP ;MOTOR CON LCD.c,225 :: } L_main65: ;MOTOR CON LCD.c,226 :: if (RB5_bit==0) BTSC RB5_bit, #5 GOTO L_main74 ;MOTOR CON LCD.c,228 :: Delay_ms(20); MOV #16666, W7 L_main75:


DEC W7 BRA NZ L_main75 NOP NOP ;MOTOR CON LCD.c,229 :: current_duty=current_duty-1; MOV #1, W1 MOV #lo_addr(_current_duty), W0 SUBR W1, [W0], [W0] ;MOTOR CON LCD.c,230 :: if (current_duty > pwm_period1) MOV _current_duty, W1 MOV #lo_addr(_pwm_period1), W0 CP W1, [W0] BRA GTU L__main96 GOTO L_main77 L__main96: ;MOTOR CON LCD.c,232 :: current_duty = 0; CLR W0 MOV W0, _current_duty ;MOTOR CON LCD.c,233 :: } L_main77: ;MOTOR CON LCD.c,234 :: PWM_Set_Duty(current_duty, 1); MOV #1, W11 MOV _current_duty, W10 CALL _PWM_Set_Duty ;MOTOR CON LCD.c,235 :: do L_main78: ;MOTOR CON LCD.c,238 :: }while(RB5_bit==0); BTSS RB5_bit, #5 GOTO L_main78 ;MOTOR CON LCD.c,239 :: delay_ms(20); MOV #16666, W7 L_main81: DEC W7 BRA NZ L_main81 NOP NOP ;MOTOR CON LCD.c,240 :: } L_main74: ;MOTOR CON LCD.c,241 :: Delay_ms(5); MOV #4166, W7 L_main83: DEC W7 BRA NZ L_main83 NOP


NOP ;MOTOR CON LCD.c,242 :: GOTO L_main27 ;MOTOR CON LCD.c,243 :: L_end_main: L__main_end_loop: BRA L__main_end_loop ; end of _main

} }

C贸digo para el microcontrolador que genera los colores en los LEDs RGB mediante el PWM y que imprime la palabra a visualizar: _canal3: ;PWM.c,21 :: void canal3() ;PWM.c,24 :: current_duty3=azul[i]; PUSH W10 PUSH W11 MOV _i, W0 SL W0, #1, W1 MOV #lo_addr(_azul), W0 ADD W0, W1, W0 MOV [W0], W1 MOV #lo_addr(_current_duty3), W0 MOV.B W1, [W0] ;PWM.c,25 :: if (current_duty3 > pwm_period3) { // if we increase current_duty greater then possible pwm_period1 value MOV #lo_addr(_pwm_period3), W0 CP.B W1, [W0] BRA GTU L__canal314 GOTO L_canal30 L__canal314: ;PWM.c,26 :: current_duty3 = 0; // reset current_duty value to zero MOV #lo_addr(_current_duty3), W1 CLR W0 MOV.B W0, [W1] ;PWM.c,27 :: } L_canal30: ;PWM.c,28 :: PWM_Set_Duty(current_duty3, 3); // set newly acquired duty ratio MOV #3, W11 MOV #lo_addr(_current_duty3), W0 ZE [W0], W10 CALL _PWM_Set_Duty ;PWM.c,30 :: } L_end_canal3:


POP W11 POP W10 RETURN ; end of _canal3 _ini3: ;PWM.c,32 :: void ini3() ;PWM.c,34 :: current_duty3 = 0; PUSH W10 PUSH W11 PUSH W12 PUSH W13 MOV #lo_addr(_current_duty3), W1 CLR W0 MOV.B W0, [W1] ;PWM.c,36 :: pwm_period3 = PWM_Init(9765 , 3, 1, 3); //se inicia el pwm (frecuecia,canal,preescaler,timer) segun como se vaya a utilizar MOV #1, W13 MOV #3, W12 MOV #9765, W10 MOV #0, W11 MOV #3, W0 PUSH W0 CALL _PWM_Init SUB #2, W15 MOV #lo_addr(_pwm_period3), W1 MOV.B W0, [W1] ;PWM.c,38 :: PWM_Start(3); MOV.B #3, W10 CALL _PWM_Start ;PWM.c,40 :: PWM_Set_Duty(current_duty3, 3); // se asigna current duty para PWM1 MOV #3, W11 MOV #lo_addr(_current_duty3), W0 ZE [W0], W10 CALL _PWM_Set_Duty ;PWM.c,41 :: } L_end_ini3: POP W13 POP W12 POP W11 POP W10 RETURN


; end of _ini3 _canal2: ;PWM.c,42 :: void canal2() ;PWM.c,45 :: current_duty2=verde[i]; PUSH W10 PUSH W11 MOV _i, W0 SL W0, #1, W1 MOV #lo_addr(_verde), W0 ADD W0, W1, W0 MOV [W0], W1 MOV #lo_addr(_current_duty2), W0 MOV.B W1, [W0] ;PWM.c,47 :: if (current_duty2 > pwm_period2) { // if we increase current_duty greater then possible pwm_period1 value MOV #lo_addr(_pwm_period2), W0 CP.B W1, [W0] BRA GTU L__canal217 GOTO L_canal21 L__canal217: ;PWM.c,48 :: current_duty2 = 0; // reset current_duty value to zero MOV #lo_addr(_current_duty2), W1 CLR W0 MOV.B W0, [W1] ;PWM.c,49 :: } L_canal21: ;PWM.c,50 :: PWM_Set_Duty(current_duty2, 2); // set newly acquired duty ratio MOV #2, W11 MOV #lo_addr(_current_duty2), W0 ZE [W0], W10 CALL _PWM_Set_Duty ;PWM.c,52 :: } L_end_canal2: POP W11 POP W10 RETURN ; end of _canal2 _ini2: ;PWM.c,53 :: ;PWM.c,55 ::

void ini2() current_duty2 = 0;


PUSH W10 PUSH W11 PUSH W12 PUSH W13 MOV #lo_addr(_current_duty2), W1 CLR W0 MOV.B W0, [W1] ;PWM.c,57 :: pwm_period2 = PWM_Init(9765 , 2, 1, 3); //se inicia el pwm (frecuecia,canal,preescaler,timer) segun como se vaya a utilizar MOV #1, W13 MOV #2, W12 MOV #9765, W10 MOV #0, W11 MOV #3, W0 PUSH W0 CALL _PWM_Init SUB #2, W15 MOV #lo_addr(_pwm_period2), W1 MOV.B W0, [W1] ;PWM.c,59 :: PWM_Start(2); MOV.B #2, W10 CALL _PWM_Start ;PWM.c,61 :: PWM_Set_Duty(current_duty2, 2); // se asigna current duty para PWM1 MOV #2, W11 MOV #lo_addr(_current_duty2), W0 ZE [W0], W10 CALL _PWM_Set_Duty ;PWM.c,62 :: } L_end_ini2: POP W13 POP W12 POP W11 POP W10 RETURN ; end of _ini2 _canal1: ;PWM.c,63 :: void canal1() ;PWM.c,66 :: current_duty1=rojo[i]; PUSH W10 PUSH W11 MOV _i, W0


SL W0, #1, W1 MOV #lo_addr(_rojo), W0 ADD W0, W1, W0 MOV [W0], W1 MOV #lo_addr(_current_duty1), W0 MOV.B W1, [W0] ;PWM.c,67 :: if (current_duty1 > pwm_period1) { // if we increase current_duty greater then possible pwm_period1 value MOV #lo_addr(_pwm_period1), W0 CP.B W1, [W0] BRA GTU L__canal120 GOTO L_canal12 L__canal120: ;PWM.c,68 :: current_duty1 = 0; // reset current_duty value to zero MOV #lo_addr(_current_duty1), W1 CLR W0 MOV.B W0, [W1] ;PWM.c,69 :: } L_canal12: ;PWM.c,70 :: PWM_Set_Duty(current_duty1, 1); // set newly acquired duty ratio MOV #1, W11 MOV #lo_addr(_current_duty1), W0 ZE [W0], W10 CALL _PWM_Set_Duty ;PWM.c,73 :: } L_end_canal1: POP W11 POP W10 RETURN ; end of _canal1 _ini1: ;PWM.c,74 :: void ini1() ;PWM.c,76 :: current_duty1 = 0; PUSH W10 PUSH W11 PUSH W12 PUSH W13 MOV #lo_addr(_current_duty1), W1 CLR W0 MOV.B W0, [W1] ;PWM.c,78 :: pwm_period1 = PWM_Init(9765 , 1, 1, 2); (frecuecia,canal,preescaler,timer) segun como se vaya a utilizar

//se inicia el pwm


MOV #1, W13 MOV #1, W12 MOV #9765, W10 MOV #0, W11 MOV #2, W0 PUSH W0 CALL _PWM_Init SUB #2, W15 MOV #lo_addr(_pwm_period1), W1 MOV.B W0, [W1] ;PWM.c,80 :: PWM_Start(1); MOV.B #1, W10 CALL _PWM_Start ;PWM.c,82 :: PWM_Set_Duty(current_duty1, 1); PWM1 MOV #1, W11 MOV #lo_addr(_current_duty1), W0 ZE [W0], W10 CALL _PWM_Set_Duty ;PWM.c,83 :: } L_end_ini1: POP W13 POP W12 POP W11 POP W10 RETURN ; end of _ini1

// se asigna current duty para

_InitTimer1: ;PWM.c,84 :: ;PWM.c,85 :: MOV MOV ;PWM.c,86 :: BSET ;PWM.c,87 :: BCLR ;PWM.c,88 :: MOV MOV IOR ;PWM.c,89 :: MOV

void InitTimer1(){ //timer configurado para 500ms T1CON = 0x8020; #32800, W0 WREG, T1CON T1IE_bit = 1; T1IE_bit, #3 T1IF_bit = 0; T1IF_bit, #3 IPC0 = IPC0 | 0x1000; #4096, W1 #lo_addr(IPC0), W0 W1, [W0], [W0] PR1 = 19531; #19531, W0


MOV WREG, PR1 ;PWM.c,90 :: } L_end_InitTimer1: RETURN ; end of _InitTimer1 _Timer1Interrupt: PUSH 52 PUSH RCOUNT PUSH W0 MOV #2, W0 REPEAT #12 PUSH [W0++] ;PWM.c,92 :: void Timer1Interrupt() iv IVT_ADDR_T1INTERRUPT ;PWM.c,94 :: i++; MOV #1, W1 MOV #lo_addr(_i), W0 ADD W1, [W0], [W0] ;PWM.c,95 :: T1IF_bit = 0; BCLR T1IF_bit, #3 ;PWM.c,97 :: } L_end_Timer1Interrupt: MOV #26, W0 REPEAT #12 POP [W0--] POP W0 POP RCOUNT POP 52 RETFIE ; end of _Timer1Interrupt _main: MOV MOV MOV MOV MOV MOV IOR

#2048, W15 #6142, W0 WREG, 32 #1, W0 WREG, 52 #4, W0 68

;PWM.c,99 :: void main() { ;PWM.c,100 :: ADPCFG = 0xFFFF; MOV #65535, W0

// Configure AN pins as digital I/O


MOV WREG, ADPCFG ;PWM.c,101 :: TRISB = 0; // configure PORTB pins as input CLR TRISB ;PWM.c,102 :: TRISD = 0; // designate PORTD pins as output CLR TRISD ;PWM.c,103 :: TRISF = 0X03; MOV #3, W0 MOV WREG, TRISF ;PWM.c,104 :: PORTD = 0; // set PORTD to 0 CLR PORTD ;PWM.c,105 :: InitTimer1(); CALL _InitTimer1 ;PWM.c,106 :: ini1(); CALL _ini1 ;PWM.c,107 :: ini2(); CALL _ini2 ;PWM.c,108 :: ini3(); CALL _ini3 ;PWM.c,109 :: i=0; CLR W0 MOV W0, _i ;PWM.c,110 :: while (1) L_main3: ;PWM.c,112 :: canal1(); CALL _canal1 ;PWM.c,113 :: canal2(); CALL _canal2 ;PWM.c,114 :: canal3(); CALL _canal3 ;PWM.c,115 :: if(RF0_bit==0) //Si en fin de carrera esta en cero l贸gico BTSC RF0_bit, #0 GOTO L_main5 ;PWM.c,117 :: for(k=0;k<=17;k++) //ciclo para activar los diferentes leds cada milisegundo CLR W0 MOV W0, _k L_main6: MOV _k, W0 CP W0, #17 BRA LE L__main25 GOTO L_main7 L__main25: ;PWM.c,119 :: LATB=tabla[k]; MOV _k, W0


SL W0, #1, W1 MOV #lo_addr(_tabla), W0 ADD W0, W1, W0 MOV [W0], W0 MOV WREG, LATB ;PWM.c,120 :: delay_ms(1); MOV #833, W7 L_main9: DEC W7 BRA NZ L_main9 NOP ;PWM.c,117 :: for(k=0;k<=17;k++) //ciclo para activar los diferentes leds cada milisegundo MOV #1, W1 MOV #lo_addr(_k), W0 ADD W1, [W0], [W0] ;PWM.c,121 :: } GOTO L_main6 L_main7: ;PWM.c,123 :: } L_main5: ;PWM.c,124 :: if(RF0_bit==1) //si no se activa el sensore el puerto b permanece inactivo BTSS RF0_bit, #0 GOTO L_main11 ;PWM.c,126 :: LATB= 0; CLR LATB ;PWM.c,127 :: } L_main11: ;PWM.c,128 :: if(i>10) //la variable que controla las combinaci贸n no exceda al numero de colores que tenemos MOV _i, W0 CP W0, #10 BRA GT L__main26 GOTO L_main12 L__main26: ;PWM.c,130 :: i=0; CLR W0 MOV W0, _i ;PWM.c,131 :: } L_main12: ;PWM.c,132 :: } GOTO L_main3 ;PWM.c,133 :: }


L_end_main: L__main_end_loop: BRA L__main_end_loop ; end of _main

PRESUPUESTO EMPLEADO En este capítulo se muestran los presupuestos utilizados, donde identificaremos los recursos necesarios para llevar a cabo el proyecto, y se verá reflejado en los siguientes términos donde se especificara el equipo, los materiales, diseño esto no das como resultado el costo total del proyecto. Lista de materiales y precios:

Cantidad 2 1 1 1 1 1 1 10 8

Materiales

Valor Unitario DsPIC 30f4013 15 Motor DC 20 H21A1 10 Final de carrera 2 Estaño 1 Crema de soldar 1.5 Baquelita 1.2 Resistencias 0.10 LEDs RGB 1 Varios 20

Valor total 30 20 10 2 1 1.5 1.2 1 8 20


TOTAL

94.7

Tabla 03. Materiales y Precios

ANEXOS 5.1 DIAGRAMA ELECTRICO Microcontrolador que maneja el motor

Microcontrolador que genera los colores e imprime la palabra


5.2FOTOS DE CONSTRUCCIÓN DEL EQUIPO Prueba de los colores RGB


6

CONCLUSIONES Y RECOMENDACIONES CONCLUSIONES:  Se logró el objetivo de diseñar e implementar un propeller mediante el uso de los microcontroladores dsPIC, el cual nos permita visualizar una palabra a través del efecto POV.  Se emplearon todos los dispositivos y características establecidas como son los LEDs RGB y el manejo del motor mediante el PWM.  Se determinó la palabra UTN debido a que ocupa poco tiempo para su proyección y debido a su bajo contenido de caracteres, para lo cual se manejo el PWM para hacer que nuestro motor gire a menos revoluciones por minuto y se pueda visualizar.


 Para la generación de un determinado color se tiene que variar entre los valores de 0-255 por lo cual se calculó la frecuencia que se necesita el ciclo de trabajo para estos valores en el PWM.  Se tuvieron que tomar muchos aspectos en cuenta para el desarrollo de la hélice ya que esta debe estar equilibrada para que al momento de girar no presente inconvenientes respecto a la visualización de la palabra.  Para que nuestra palabra a mostrar no sea proyectada en varias direcciones se utilizó el fin de carrera obtenido de una impresora en desuso.  Se cumplió con el cronograma establecido tanto con los avances como con la entrega del proyecto total.

RECOMENDACIONES:  Realizar una investigación previa de todo lo que concierne a nuestro proyecto para así tener una orientación o proyección clara de hacia dónde dirigirnos y que hacer en caso de que se presente algún inconveniente.  Tener en cuenta los datasheet así como información extra para la configuración y polarización de los dispositivos a utilizarse.  Revisar y detallar el código para saber en qué parte nos quedamos pausados o tenemos errores a corregir.  Se debe ser muy precavido en el proceso de ensamblaje ya que estamos trabajando con un circuito impreso y un error por más mínimo que sea producirá errores o un mal funcionamiento del proyecto, en el proceso de elaboración tener cuidado ya que se usan herramientas que podrían causarnos algún tipo de lesión o daño citando como ejemplo el taladro o el ácido.  Comprobar que funcionen correctamente todos los dispositivos empleados para no tener errores de funcionamiento.  No energizar el circuito hasta asegurarnos que todo esté bien polarizado.

BIBLIOGRAFÍA [1]http://centros.edu.xunta.es/iesperdouro/files/H21A1-%20sensor%20optico%20barreira.pdf [2]http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en010345


[3]http://es.wikipedia.org/wiki/Interruptor [4] http://es.wikipedia.org/wiki/Resistencia_el%C3%A9ctrica [5]http://intentivas.blogspot.com/2013/05/impresora-3d-xiv-finales-de-carrera.html [6] http://www.bobblick.com/techref/projects/propclock/propclock.html [7]http://www.ucontrol.com.ar/forosmf/proyectos-con-pic/proyecto-comun-2-display-de-ledstipo-pov/ [8]http://www.ucontrol.com.ar/forosmf/proyectos-con-pic/display-pov/ [9] http://www.taringa.net/posts/hazlo-tu-mismo/15769905/Display-POV-Paso-a-paso.html [10]http://blog.bricogeek.com/noticias/electronica/pov-display-con-un-ventilador/


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.