capitulo i generalidades - Repositorio Digital-UPS

Anuncio
UNIVERSIDAD POLITÉCNICA
SALESIANA
FACULTADAD DE INGENIERÍAS
SEDE QUITO-CAMPUS SUR
CARRERA DE SISTEMAS
DISEÑO E IMPLEMENTACIÓN DE UN SISTEMA DE
COMUNICACIÓN BASADO EN MICROCONTROLADORES PARA
UNA AULA DE NIÑOS CON INSUFICIENCIA MOTRIZ
CEREBRAL DE LA FUNDACIÓN FUDRINE
TESIS PREVIA A LA OBTENCIÓN DEL TÍTULO DE INGENIERO DE
SISTEMAS MENCIÓN EN ROBÓTICA E INTELIGENCIA ARTIFICIAL
CLAVIJO PLACENCIA LUIS FERNANDO
QUILLUPANGUI VARGAS LUIS AUGUSTO
DIRECTOR: Ing. CARLOS PILLAJO
DECLARACIÓN
Nosotros, Luis Fernando Clavijo Placencia y Luis Augusto Quillupangui Vargas,
declaramos bajo juramento que el trabajo aquí descrito es de nuestra autoría,
que no ha sido previamente presentado para ningún grado o calificación
profesional y que hemos consultado las referencias bibliográficas que se
incluyen en este proyecto.
A través de la presente declaración cedemos nuestros derechos a propiedad
intelectual correspondientes a este trabajo, a la Universidad Politécnica
Salesiana, según lo establecido por la ley de propiedad intelectual, por su
reglamento y por la normativa institucional vigente.
------------------------------
---------------------------------
Luis Clavijo Placencia
Luis Quillupangui Vargas
CERTIFICACIÓN
Certifico que la presente tesis de ingeniería fue desarrollada por Luis Fernando
Clavijo Placencia y Luis Augusto Quillupangui Vargas bajo mi dirección.
----------------------------Ingeniero Carlos Pillajo
Director de Tesis
DEDICATORIA
A nuestros padres quienes con su amor y dedicación hicieron posible la
culminación de nuestra carrera convirtiéndonos no solo en profesionales sino
en personas con grandes valores y pensamientos, encaminándonos hacia una
nueva etapa en nuestras vidas, con la predisposición de utilizar de forma
correcta valores y conocimientos para el beneficio de la sociedad en que
vivimos y nuestra.
TEMARIO
Introducción
CAPITULO I Generalidades
1.1 Insuficiencia motora de origen cerebral (IMOC)
1.2 Descripción de la IMOC
CAPITULO II
Fundamentos Teóricos
2.1 Video
2.1.1 Señal de video
2.1.2 Sistema PAL
2.1.3 Sistema NTSC
2.2 Microcontroladores
2.2.1 Introducción
2.2.2 Historia de los PICs.
2.2.3 Elección del microcontrolador para nuestro sistema
2.2.4 Descripción general
CAPITULO III
Teoría
3.1 Estudio de hardware y comunicación teclado computador
3.1.1 Funcionamiento
3.1.2 Conector del teclado
3.1.3 Comunicación del teclado al computador
3.2 Como funciona la comunicación RS-232
3.2.1 Introducción
3.2.2 Norma RS-232
3.2.3 Chip MAX 232
3.3 Diseño y construcción de hardware
3.3.1 Creación de las placas del circuito impreso
3.3.2 Diseño de la placa
3.3.3 Impresión del circuito
3.3.4 Preparación de la placa
3.3.5 Planchado del diseño sobre la placa de cobre
3.3.6 Ataque químico de la placa de cobre
3.3.7 Recorte y perforado de la placa de cobre
3.4 Diseño y construcción del hardware para el teclado
3.4.1 Esquemáticos teclados
3.4.2 Esquemáticos video
CAPITULO IV
Software
4 Diseño y Construcción de Software
4.1 Compilador Pic C Compiler
4.1.1 Introducción
4.1.2 Elementos del software
4.1.3 Operadores y expresiones
4.1.4 Descripción de instrucciones
4.2 Manual WINPIC800
4.2.1 Configuración de hardware
4.2.2 Escoger hardware
4.2.3 Escoger microcontrolador
4.2.4 Cargar el archivo
4.2.5 Grabación del pic
CAPITULO V
Implementación y Resultados
5.1 Pruebas realizadas
5.2 Resultados obtenidos
5.3 Análisis de costos
5.3.1 Costos de fabricación
5.3.2 Costos de mano de obra
5.3.3 Producción en serie
CAPITULO VI
Conclusiones y Recomendaciones
6.1 Beneficio Social
6.2 Conclusiones
6.2.1 Conclusiones del proyecto
6.2.2 Conclusiones de la utilización del proyecto
6.3 Recomendaciones
6.4 Bibliografía
6.4.1 Referencias de Internet
ANEXOS
Índice de contenido
Introducción
CAPITULO I
Generalidades
1.1 INSUFICIENCIA MORIZ DE ORIGEN CEREBRAL (IMOC) .........................1
1.2 DESCRIPCIÓN DE LA IMOC.......................................................................2
CAPITULO II Fundamentos Teóricos
2.1 VIDEO
2.1.1 SEÑAL DE VIDEO ..................................................................................22
2.1.2 SISTEMA PAL ........................................................................................39
2.1.3 SISTEMA NTSC......................................................................................44
2.2 MICROCONTROLADORES
2.2.1 INTRODUCCION ....................................................................................52
2.2.2 HISTORIA DE LOS PIC's........................................................................53
2.2.3 ELECCIÓN DEL MICROCONTROLADOR PARA EL SISTEMA .............53
2.2.4 DESCRIPCIÓN GENERAL .....................................................................57
CAPITULO III
Teoría
3.1.1 FUNCIONAMIENTO ...............................................................................63
3.1.2 LOS CONECTORES DEL TECLADO .....................................................65
3.1.3 COMUNICACIÓN DEL TECLADO AL COMPUTADOR ..........................65
3.2 COMO FUNCIONA LA COMUNICACIÓN RS-232
3.2.1 INTRODUCCIÓN ....................................................................................71
3.2.2 NORMA RS232.......................................................................................72
3.2.3 El CHIP MAX 232....................................................................................74
3.3 DISEÑO Y CONSTRUCCIÓN DE HARDWARE
3.3.1 CREACIÓN DE PLACAS DE CIRCUITO IMPRESO ...............................80
3.3.2 DISEÑO DE LA PLACA ..........................................................................84
3.3.3 IMPRESIÓN DEL CIRCUITO..................................................................87
3.3.4 PREPARACIÓN DE LA PLACA ..............................................................89
3.3.5 PLANCHADO DEL DISEÑO SOBRE LA PLACA DE COBRE.................89
3.3.6 ATAQUE QUÍMICO DE LA PLACA DE COBRE .....................................92
3.3.7 PERFORADO DE LA PLACA .................................................................95
3.4 DISEÑO Y CONSTRUCCION DEL HARDWARE PARA EL TECLADO
3.4.1 ESQUEMATICOS TECLADO .................................................................97
3.4.2 ESQUEMATICO CONCENTRADOR ....................................................101
3.4.3 ESQUEMATICO VIDEO........................................................................104
3.4.4 EXPLICACACION DEL PROGRAMA DEL PROYECTO .......................107
CAPITULO IV
Software
4 DISEÑO Y CONSTRUCCIÓN DE SOFTWARE
4.1.1 MANUAL PIC C COMPILER .................................................................140
4.1.2 ELEMENTOS DEL SOFTWARE...........................................................141
4.1.3 OPERADORES Y EXPRESIONES .......................................................145
4.1.4 DESCRIPCIÓN DE INSTRUCCIONES .................................................149
4.2 MANUAL WINPIC800
4.2 OPERADORES Y EXPRESIONES ..........................................................163
4.2.1 CONFIGURACIÓN DE HARDWARE ....................................................163
4.2.2 ESCOGER HARDWARE ......................................................................164
4.2.3 ESCOGER MICROCONTROLADOR....................................................164
4.2.4 CARGAR EL ARCHIVO (.HEX).............................................................165
4.2.5 GRABACIÓN DE PIC............................................................................165
CAPITULO V
Implementación y Resultados
5.1 PRUEBAS REALIZADAS.........................................................................167
5.2 RESULTADOS OBTENDIDOS ................................................................168
5.3 ANÁLISIS DE COSTOS...........................................................................169
5.3.1 COSTOS DE FABRICACIÓN................................................................169
5.3.2 COSTOS DE MANO DE OBRA ............................................................170
5.3.3 PRODUCCIÓN EN SERIE ....................................................................170
CAPITULO VI
Conclusiones y Recomendaciones
6.1 BENEFICIO SOCIAL................................................................................172
6.2 CONCLUSIONES ....................................................................................172
6.2.1 CONCLUSIONES DEL PROYECTO.....................................................172
6.2.2 CONCLUSIONES DE LA UTILIZACIÓN DEL PROYECTO...................173
6.3 RECOMENDACIONES ............................................................................174
6.4 BIBLIOGRAFÍA ........................................................................................174
6.4.1 REFERENCAS DE INTERNET.............................................................174
ANEXOS
Índice de gráficos
CAPITULO I
Generalidades
1.1 Insuficiencia motriz de origen cerebral (IMOC)
Figura 1.1-1 Trastorno psicomotor ....................................................................1
Figura 1.1-2 Pruebas de desarrollo muscular en el cuello .................................9
Figura 1.1-3 Pruebas de elasticidad sedente (sentado) ....................................9
CAPITULO II
Fundamentos Teóricos
2.1 Video
2.1.1 Señal de video
Figura 2.1.1-1 Estructura interna de componentes de la pantalla ....................23
Figura 2.1.1-2 Barrido entrelazado líneas impares ..........................................24
Figura 2.1.1-3 Barrido entrelazado líneas pares .............................................25
Figura 2.1.1-4 Estructura interna del cañon de colores (RGB) ........................26
Figura 2.1.1-5 Escaneo progresivo ..................................................................27
Figura 2.1.1-6 Tabla de generación de barra de colores ..................................31
Figura 2.1.1-7 Escaneo del haz de electrones de la pantalla ...........................32
Figura 2.1.1-8 Parámetros de transmisión de la señal de video .......................34
Figura 2.1.1-9 Escaneo campo impar y par .....................................................35
Figura 2.1.1-10 Barrido entrelazado.................................................................36
Figura 2.1.1-11 Barrido no entrelazado............................................................36
Figura 2.1.1-12 Generador de líneas ...............................................................37
Figura 2.1.1-13 Generador de puntos ..............................................................37
Figura 2.1.1-14 Distribución mundial del sistema de televisión ........................38
2.1.2 Sistema PAL
Figura 2.1.2-1 Diagrama de tiempos del sistema PAL .....................................43
2.1.3 Sistema NTSC
Figura 2.1.3-1 Barrido impar ............................................................................46
Figura 2.1.3-2 Barrido par ................................................................................46
Figura 2.1.3-3 Combinación barrido progresivo ...............................................46
Figura 2.1.3-4 Diagrama de tiempos del sistema NTSC ..................................48
Figura 2.1.3-5 Tiempos de escaneo de la imagen............................................50
Figura 2.1.3-6 Diagrama de sincronismos........................................................51
2.2 Microcontroladores
2.2.2 Historia de los PIC’s
Figura 2.2.2-1 Arquitectura de la memoria interna del microcontrolador (pic)...53
2.2.3 Elección del microcontrolador para nuestro sistema
Figura 2.2.3-1 Segmentación de la memoria interna para la ejecución de
instruccciones …….. ........................................................................................54
2.2.4 DESCRIPCIÒN GENERAL
Figura 2.2.4-1 PIC 16F628A ............................................................................57
Figura 2.2.4-2 Distribución de pines PIC 16F628A..........................................58
Figura 2.2.4-3 PIC 18F2525.............................................................................60
Figura 2.2.4-4 Distribución de pines PIC 18F2525 ...........................................60
CAPITULO III
Teoría
3.1 Estudio de hardware y comunicación teclado computador
3.1.1 Funcionamiento
Figura 3.1.1-1 Identificación fila y columna d la tecla pulsada ..........................63
Figura 3.1.1-2 Pulsador ...................................................................................64
Figura 3.1.1-3 Pulsador de lámina de plástico .................................................64
Figura 3.1.1-4 Pulsador de bobedilla metálica .................................................64
Figura 3.1.1-5 Pulsador capacitivo...................................................................65
3.1.2 Conectores de teclado
Figura 3.1.2-1 Descripción del conector Din de 5 pines AT..............................86
Figura 3.1.2-2 Descripción del conector Mini Din de 6 pines PS/2 ...................86
3.1.2 Conectores de teclado
Figura 3.1.2-1 Descripción del conector Din de 5 pines AT..............................65
Figura 3.1.2-2 Descripción del conector Mini Din de 6 pines PS/2 ...................65
Figura 3.1.3-3 Código de escaneo interno del teclado .....................................89
Figura 3.1.3-4 Códigos de caracteres imprimibles y no imprimibles por el
teclado...............................................................................................................91
3.1.3 Comunicación teclado computador
Figura 3.1.3-1 Diagrama de sincronismos reloj y dato del teclado al host
(computador)…. ...............................................................................................66
Figura 3.1.3-2 Teclao PS/2 ..............................................................................67
Figura 3.1.3-3 Código de escaneo interno del teclado .....................................68
Figura 3.1.3-4 Códigos de caracteres imprimibles y no imprimibles por el
teclado...............................................................................................................70
3.2 Como funciona la comunicación RS-232
3.2.1 Introducción
Figura 3.2.1-1 Formato de envío de datos vía RS-232.....................................71
Figura 3.2.1-2 Visualización del envío de la trama de datos ............................72
3.2.2 Norma RS232
Figura 3.2.2-1 Conexión ordenador móden......................................................72
Figura 3.2.2-2 Esquema ilustrativo conexión pc y microcontrolador .................73
Figura 3.2.2-3 Distribución de pines conector DB9 hembra ............................73
Figura 3.2.2-4 Distribución de pines conector DB9 Macho..............................73
3.2.3 Chip MAX 232
Figura 3.2.3-1 Conexión de pines chip Max 232 ..............................................74
Figura 3.2.3-2 Distribución de pines y conexión pc a pic..................................75
Figura 3.2.3-3 Cable de conexión DB9 macho.................................................76
Figura 3.2.3-4 Conector DB9 hembra ..............................................................76
Figura 3.2.3-5 Construcción cable plano con conector DB9 .............................76
Figura 3.2.3-6 Cable de conexión telefónico RJ11 macho ...............................77
Figura 3.2.3-7 Conector telefónico RJ11 hembra .............................................77
Figura 3.2.3-8 Esquema de ponchado cable telefónico RJ11 ..........................77
Figura 3.2.3-9 Esquema de conexión conector RJ11 y conector DB9..............78
Figura 3.2.3-10 Distribución de pines conector DB9 ........................................78
Figura 3.2.3-11 Conector RJ11 ........................................................................79
Figura 3.2.3-12 Distribución de pines conector RJ11 .......................................79
3.3 Diseño y construcción de Hardware
3.3.1 Creación de placas de circuito impreso
Figura 3.3.1-1 Placa de cobre ..........................................................................80
Figura 3.3.1-2 Papel térmico ............................................................................80
Figura 3.3.1-3 Ácido cloruro férrico ..................................................................81
Figura 3.3.1-4 Recipiente de plástico ...............................................................81
Figura 3.3.1-5 Pinzas plásticas ........................................................................81
Figura 3.3.1-6 Impresora láser .........................................................................82
Figura 3.3.1-7 Plancha.....................................................................................82
Figura 3.3.1-8 Lana de acero ...........................................................................82
Figura 3.3.1-9 Lima de acero ...........................................................................83
Figura 3.3.1-10 Taladro....................................................................................83
Figura 3.3.1-11 Marcador indeleble .................................................................83
Figura 3.3.1-12 Disolvente ...............................................................................84
3.3.2 Diseño de la placa
Figura 3.3.2-1 Visualización diagrama en Proteus (ISIS) .................................85
Figura 3.3.2-2 Visualización esquema componentes en Proteus (ARES) ........85
Figura 3.3.2-3 Placa sin relleno de cobre.........................................................86
Figura 3.3.2-4 Placa con relleno de cobre........................................................86
3.3.3 Impresión del circuto
Figura 3.3.3-1 Impresión soldadura (I) y Componentes (D)..............................87
3.3.4 Preparación de la placa
Figura 3.3.4-1 Lijado de la placa de cobre .......................................................88
Figura 3.3.4-2 Placa sin lijar ............................................................................88
Figura 3.3.4-3 Placa lijada ...............................................................................88
Figura 3.3.4-4 Limpiar placa con tiñer .............................................................89
3.3.5 Planchado del diseño sobe la placa de cobre
Figura 3.3.5-1 Colocar papel térmico impreso sobre la placa de cobre ............89
Figura 3.3.5-2 Planchar el papel sobre la placa de cobre ................................90
Figura 3.3.5-3 El papel se pegara sobre el cobre.............................................90
Figura 3.3.5-4 Visualización de zonas no brillantes..........................................91
Figura 3.3.5-5 Planchado totalmente terminado...............................................91
Figura 3.3.5-6 Dejar enfriar la placa en agua ...................................................91
Figura 3.3.5-7 Retirar el papel de la placa de cobre.........................................91
Figura 3.3.5-8 Retirar los restos de papel con unasponja ................................92
Figura 3.3.5-9 Placa totalmente sin papel ........................................................92
3.3.6 Ataque químico a la placa de cobre
Figura 3.3.6-1 Recortar la placa.......................................................................92
Figura 3.3.6-2 Lijar los bordes de la placa .......................................................92
Figura 3.3.6-3 Introducir la placa de cobre en el recipiente con ácido ..............93
Figura 3.3.6-4 Lavar la placa con agua ............................................................94
Figura 3.3.6-5 Retira toner con disolvente .......................................................94
Figura 3.3.6-6 Lista la placa para la perforación ..............................................94
3.3.7 Perforado de la placa de cobre
Figura 3.3.7-1 Perforado de pad de la placa ....................................................95
Figura 3.3.7-2 Placa terminada ........................................................................95
Figura 3.3.7-3 Montaje de elementos impresos ...............................................96
Figura 3.3.7-4 Visualizción a contra luz............................................................96
3.4 Diseño y construcción de hardware para teclado
3.4.1 Esquemático teclado
Figura 3.4.1-1 Diagrama esquemático de hardware de teclado .......................97
Figura 3.4.1-2 Diagrama de bloque..................................................................98
Figura 3.4.1-3 Diagrama por módulo................................................................99
Figura 3.4.1-2 Disposición de elementos .......................................................100
Figura 3.4.1-3 Disposición de soldadura ........................................................100
3.4.2 Esquemático concentrador
Figura 3.4.2-1 Diagrama esquemático de red ................................................101
Figura 3.4.2-2 Diagrama de bloque................................................................102
Figura 3.4.2-3 Diagrama por módulo..............................................................102
Figura 3.4.2-4 Disposición de elementos de red ............................................103
Figura 3.4.2-5 Diagrama esquemático de la fuente........................................103
3.4.3 Esquemático video
Figura 3.4.3-1 Diagrama esquemático de video.............................................104
Figura 3.4.3-2 Diagrama de bloque................................................................104
Figura 3.4.3-3 Diagrama por módulo..............................................................105
Figura 3.4.3-4 Disposición de elementos de video, red y fuente ....................106
Figura 3.4.3-5 Disposición de soldadura de video, red y fuente .....................107
3.4.4 Explicación del hardware de proyecto
Figura 3.4.4-1 Tabla de imagen del carácter A ..............................................114
Figura 3.4.4-2 Tabla de almacenamiento de la imagen del carácter A en Uc.114
Figura 3.4.4-3 Diagrama de variables y funciones .........................................133
Figura 3.4.3-4 Diagrama de actividades.........................................................134
Figura 3.4.4-5 Diagrama de secuencias.........................................................135
Figura 3.4.4-6 Diagrama de funciones ...........................................................137
Figura 3.4.3-7 Diagrama de actividades.........................................................138
Figura 3.4.4-8 Diagrama de secuencias.........................................................138
CAPITULO IV
Software
4 Diseño y construcción de software
4.1 Manual compilador Pic C Compiler
4.1.1 Introducción
Figura 4.1.1-1 Pantalla inicial compilador Pic C Compiler ..............................140
4.1.2 Elementos de software
Figura 4.1.2-1 Barra de herramientas ............................................................141
Figura 4.1.2-2 Creación de un nuevo proyecto ..............................................142
Figura 4.1.2-3 Escoger donde guardar el proyecto ........................................142
Figura 4.1.2-4 Configuración de parámetros internos del código ...................143
Figura 4.1.2-5 Pestañas de configuración de parámetros ..............................143
Figura 4.1.2-6 Visualización de parámetros seteados ....................................144
Figura 4.1.2-7 Proceso de compilación de código..........................................144
4.1.3 Operadores y expresiones
Figura 4.1.3-1 Cuadro de asignación de operación .......................................145
Figura 4.1.3-2 Descripción de los operadores ................................................146
Figura 4.1.3-3 Cuadro de operadores de relación .........................................146
Figura 4.1.3-4 Cuadro de operadores lógicos ...............................................147
Figura 4.1.3-5 Cuadro de operadores de bit...................................................147
Figura 4.1.3-6 Cuadro de operadores de incremento, decremento ................148
Figura 4.1.3-7 Cuadro de desplazamiento de bit ...........................................148
Figura 4.1.3-8 Cuadro de representación de formatos ..................................148
4.1.4 Descripción de instrucciones
Figura 4.1.4-1 Instrucción es en assembler ...................................................150
Figura 4.1.4-2 Opciones de la instrucción Interrupción ..................................152
Figura 4.1.4-3 Opciones de la instrucción #USE RS232 ..............................154
Figura 4.1.4-4 Opciones de la instrucción PRINTF ......................................157
Figura 4.1.2-2 Barra de herramientas ............................................................165
Figura 4.1.2-3 Creación de un nuevo proyecto ..............................................166
Figura 4.1.2-4 Escoger donde guardar el proyecto ........................................166
Figura 4.1.2-5 Configuración de parámetros internos del código ...................167
Figura 4.1.2-6 Pestañas de configuración de parámetros ..............................167
Figura 4.1.2-7 Visualización de parámetros seteados ....................................168
Figura 4.1.2-8 Proceso de compilación de código..........................................168
4.2 Manual WINPIC 800
Figura 4.2-1 Pantalla de presentación ...........................................................163
4.2.1 Configuración de hardware
Figura 4.2.1-1 Configurar el programador .....................................................163
4.2.2 Escoger hardware
Figura 4.2.2-1 Escoger el programador..........................................................164
4.2.3 Escoger el microcontrolador
Figura 4.2.3-1 Selección del pic .....................................................................164
4.2.4 Cargar el archivo (.hex)
Figura 4.2.4-1 Barra de herramientas ............................................................165
4.2.5 Grabación de Pic
Figura 4.2.5-1 Grabación del código .hex ......................................................165
INTRODUCCIÓN
La necesidad de adquirir habilidades para desempeñar un papel útil en la
sociedad actual, pone en relieve las dificultades que padece una proporción
significativamente grande de niños en edad escolar, una de estas dificultades
es la IMOC (Insuficiencia motora de origen cerebral).
El niño con IMOC puede ser crónicamente propenso a accidentes, y también
puede ser de movimientos motores muy pobres, al niño se le puede dificultar
mucho tomar un lápiz entre sus dedos y batallar tremendamente con la
escritura, además con el continuo avance tecnológico los niños deben ir
familiarizándose con herramientas que se hacen indispensables en la
cotidianidad de la sociedad, un claro ejemplo es el continuo uso de un
instrumento como lo es el computador.
Hemos visto la necesidad de diseñar un teclado que supla las necesidades
autónomas de educación del niño con IMOC y que a su vez al ser producido en
nuestro país disminuya notablemente su precio, este teclado podrá ser utilizado
y adaptado según la necesidad que el niño con IMOC presente.
Las herramientas de tecnología que se encuentran actualmente en el mercado
presentan un alto costo y sus características nos muestran que tratan de ser de
propósito general, sin embargo esta característica impide explotar las
capacidades de los niños con IMOC para utilizar el computador como
herramienta para con su entorno.
Por tal razón decidimos crear e implementar el presente proyecto:
El dispositivo que se implementará es una herramienta diseñada para los niños
con IMOC, este dispositivo les facilitará acceder a las funciones de teclado
permitiendo al niño aprovechar las características del computador como una
herramienta de comunicación con su entorno.
La realización del presente proyecto se hace con el fin de brindarles a los niños
que padezcan de algún problema de movimientos motrices y comunicación
(lenguaje) denominado en el campo medico como Insuficiencia motora de
origen cerebral (IMOC), una herramienta de autoaprendizaje que les permita
una adquisición de conocimientos por medio de un instrumento tecnológico e
informático como lo es el televisión y el teclado.
Esta herramienta consistirá en un teclado común y corriente, un televisor con
entrada de video que le permitirá al niño un fácil acceso a las opciones
creadas, puesto que por su deficiencia en la coordinación de movimientos
motrices y lenguaje le es muy complicado acceder a esta herramienta
informática sin la ayuda de una persona que no presente este
tipo de
problema.
Para tal fin se ha propuesto el diseño y la implementación de un teclado
especialmente diseñado para niños que presenten una deficiencia en los
movimientos de sus extremidades superiores, este teclado contará con la
capacidad de generar por la presión que el niño realice sobre una tecla va a ser
transmitida a un microcontrolador que se encargara de convertir la señal de
interrupción en un código de exploración que enviará a un concentrador el que
se encargará en reconocer que tecla se presionó y posteriormente enviarlo a la
señal de video del televisor, y este a su vez visualizará el carácter oprimido en
la pantalla del televisor.
Además del teclado (que son 4 en total), el niño podrá contar con líneas de
texto independientes que le ayudará a llevar de una mejor forma su complejo
proceso de aprendizaje, este software será enfocado en el área de la escritura
(abecedario), matemáticas (las opciones básicas), que serán presentadas de
una manera didáctica para provocar un mayor grado de atención del infante,
con esto se generará un agradable ambiente educativo y un aprendizaje más
lúdico en el niño.
Por último, el diseño del teclado va a presentar características tales como la
opción de dejar la tecla “Shift” activada o desactivada, es decir solo minúsculas
o mayúsculas dependiendo de la necesidad para que el niño tenga la facilidad
de escribir sin tener que estar oprimida mecánicamente la tecla anteriormente
mencionada para cambiar el estilo de letra , esto para aquellas personas que
no puedan mantener oprimida más de una tecla al mismo tiempo.
Otra característica especial va a ser el control de la velocidad de repetición del
teclado desde este mismo, esto va a facilitar el correcto uso del teclado para
personas que se les dificulten el movimiento o el entorno dentro del sistema.
CAPÍTULO I
Generalidades
CAPITULO I GENERALIDADES
1.1 INSUFICIENCIA MOTORA DE ORIGEN CEREBRAL (IMOC)
Figura 1.1-1 Trastorno psicomotor
Los trastornos del desarrollo psicomotor son muy difíciles de definir, reflejan
siempre alteraciones en las que se ven afectados varios aspectos del
desarrollo del niño; de ahí la importancia de intervenir cuanto antes, pues el
trastorno puede ir repercutiendo negativamente en otras áreas del niño,
agravando y comprometiendo el desarrollo del niño.
Podemos decir que, de modo general, los trastornos psicomotrices están muy
ligados al mundo afectivo de la persona; de ahí, que en la valoración se deba
contemplar la globalidad del individuo.
Definiciones
•
Es un defecto o una lesión del cerebro inmaduro (0 – 5 años). No es una
enfermedad, sino, que es considerada como un conjunto de síntomas;
no es progresiva, no es genética, no ocasiona la muerte.
•
Enfermedad psico-neuromuscular, causada por una lesión motora
cerebral y ocurrida antes, durante o inmediatamente después del parto.
Incluye aislada o conjuntamente espasticidad, debilidad, incoordinación,
1
•
atetosis o temblor, con frecuencia asociado con retraso mental,
trastornos sensoriales, crisis convulsivas y trastornos visuales, auditivos
y del lenguaje.
•
La American Academy of Cerebral Palsy, la define como cualquier
alteración anormal del movimiento o de la función motora por defecto,
lesión o enfermedad del tejido nervioso contenido en la cavidad craneal,
pero esto es muy limitado para la gran complejidad etiopatogénica y
sintomatológica de este proceso. 1
1.2 DESCRIPCIÓN DE LA IMOC
Debilidad motriz
Básicamente, estos niños siempre presentan tres características:
Torpeza de movimientos (movimientos pobres y dificultad en su realización).
•
Paratonía: el niño no puede relajar el tono de sus músculos de forma
voluntaria; incluso en vez de relajarlos, los contrae exageradamente.
Este rasgo es el más característico de este trastorno.
•
Sincinesias: A veces, también presentan inestabilidad motriz, tics,
tartamudeo.
Este trastorno afecta a diferentes áreas del niño: al afectivo, la sensorial, al
psíquico y al motor.
--------------------------1 Rehabilitación Médica. Rafael González Mas. Editorial Masson, S.A..
http://www.aurasalud.com/
2
Inestabilidad motriz
El niño con inestabilidad motriz es incapaz de inhibir sus movimientos, así
como la emotividad que va ligada a éstos.
Es incapaz de mantener un esfuerzo de forma constante; se muestra muy
disperso.
Suele predominar la hiperactividad y las alteraciones en los movimientos de
coordinación motriz. Hay una constante agitación motriz.
Incidencia
Depende de la clase de cuidados prenatales, condiciones socioeconómicas de
los padres, peculiaridades del entorno y el tipo de asistencia obstétrica y
pediátrica recibida por la madre y el niño. Es 27 veces más frecuente en niños
con menos de 1500 grs. En el nacimiento, que en los que pesan más de 2500
grs.
Etiología: (Estudio de las causas de las enfermedades)
1. Prenatales: 30% según Perlstein y Hood.
•
Infección materna: cuando padecen rubéola o infecciones víricas al
comienzo del embarazo (defectos congénitos cerebrales).
•
Anoxia
prenatal:
por
intoxicación,
anemia,
hipotensión,
asfixia,
hemorragia, entre otros.
•
Trastornos metabólicos: la toxicoadicción de la madre o el padecimiento
de trastornos metabólicos como DM (Diabetes Mellitus) o trastornos de
tiroideos.
•
Embarazos múltiples: mayor incidencia. Gemelos (6%).
•
Prematuridad: en un tercio.
•
Edad de la madre: a mayor edad mayor riesgo según Yannet.
3
•
Sexo: mayor porcentaje en niños que en niñas. El 57% son niños según
Illingworth.
•
Raza: mayor en blancos.
2. Perinatales (Que precede o sigue inmediatamente al nacimiento): 60%
según Perlstein y Hood.
•
Anoxia: una tercera y la media parte nacen con signos anóxicos,
llegando al 13% los que no respiran espontáneamente durante 6
minutos o más; por obstrucción mecánica respiratoria, atelectasias,
anestésicos y drogas, placenta previa, parto de nalgas, entre otros.
•
Traumatismos y hemorragias: en el 60% de los casos son partos
complicados (aplicaciones incorrectas de forceps, inductores químicos
del parto sin suficiente control y partos prolongados.
•
Prematuridad: porque el cerebro del niño es altamente sensible a la
asfixia, lo mismo que el aparato respiratorio no es capaz de asimilar bien
el oxígeno, lo cual lleva a depresión respiratoria y ésto, a lesión del
cerebro.
3. Postnatales: 10% según Perlstein y Hood.
•
Traumatismos craneales.
•
Infecciones: meningitis tuberculosa o piógena y encefalitis (víricas).
•
Intoxicaciones: con degeneración nerviosa.
•
Accidentes vasculares: encefalopatía hipertensiva, embolias y trombosis.
•
Anoxia: por estrangulamiento, hipoglucemia, grandes alturas, entre
otros.
Clasificación:
1. Según la localización (topografía)
•
Diplejía simétrica congénita.
4
•
Paraplejía congénita.
•
Tetraplejía o hemiplejía bilateral.
•
Triplejía.
•
Hemiplejía.
2. Según el tipo de trastorno (fisiológica – tono muscular)
Espástica: daño en área 4, 4s, 5 y 6 (piramidal).
•
Reflejos patológicos (Hoffman, Clonus, Babinsky).
•
ROT (Reflejos osteotendinosos) aumentados.
•
Signo de navaja.
•
Dedo cortical.
•
Contracción excesiva de agonistas.
•
Sobreexcitación de alfa.
Rigidez: alteración del sistema extrapiramidal.
•
No reflejos patológicos.
•
ROT normales o disminuidos.
•
Signo de rueda dentada o caño de plomo.
•
Coocontracción de agonistas y antagonistas.
•
Sobreexcitación de gamma y en menor grado de alfa.
Flácido: agenesia del cuerpo calloso.
•
Disminución de la función del sistema inmunológico.
•
Dura
máximo
1
año
(incompatible
con
la
vida,
complicaciones respiratorias y procesos infecciosos).
Corea: sistema extrapiramidal (putamen y caudado).
5
mueren
por
•
Movimientos
incordiándoos,
amplios,
incontrolados,
rápidos,
de
estructuras proximales.
•
No ceden con el reposo.
Atetosis: sistema extrapiramidal (ganglios basales).
•
Movimientos lentos, de rango pequeño, de estructuras distales, ceden
con el reposo.
•
Tono fluctuante, aumento anormal de movimientos involuntarios.
•
Incoordinación en movimientos.
Ataxia: alteración del cerebelo (sistema propioceptivo).
•
No percepción de sentido de posición de articulaciones.
•
Mejor pronóstico, evoluciona más rápido.
•
Base de sustentación amplia, mirada al piso.
•
Hipotonía muscular e hipermovilidad articular.
•
Incoordinación por la alteración del sentido cinestésico o del equilibrio.
•
La acción de los antagonistas está falta de una regulación adecuada,
así, cuando se contraen agonistas, los antagonistas se relajan súbita y
totalmente, en vez de hacerlo de manera gradual (le lleva a inestabilidad
y aumento de la amplitud de movimiento).
Trastornos asociados
•
Trastornos convulsivos.
•
Deficiencia mental.
•
Trastornos auditivos.
•
Trastornos sensoriales.
•
Trastornos visuales (estrabismo, nistagmo, tics, entre otros).
•
Trastornos de percepción.
•
Trastornos dentales y de nutrición.
6
•
Trastornos de personalidad (sentimiento de inseguridad, miedos
excesivos,
•
sentimientos de inferioridad, pérdida de la motivación, entre otros).
•
Trastornos del lenguaje: 73% por afectación de músculos de laringe,
tórax, diafragma, abdomen, trastornos auditivos e intelectivos, lesión
cortical, disfunciones musculares de lengua y anomalías de diente y
paladar.
Pronóstico
•
No va a haber curación total.
•
Los patrones reflejos primitivos van desapareciendo con la maduración
del SNC (Sistema Nervioso Central), pueden persistir durante un largo
período o para toda la vida.
•
Si un niño se sienta antes de los dos años generalmente aprende a
caminar independientemente.
•
Si se sienta de 2 – 4 años, sus posibilidades son del 50%.
•
Si no se sienta antes de los 4 años, rara vez se para y camina.
•
También ayuda para la marcha, si se controla cabeza a los 9 meses y
gatea antes de 30 meses.
•
El promedio general de vida es de 20 – 30 años.
Prevención
•
Desde el proceso gestacional.
•
Educando a la madre.
•
Vacunas.
•
Alimentación.
•
Evitando infecciones.
•
Buen y adecuado control prenatal.
•
Que no consuma drogas, alcohol.
•
Que sea un niño deseado (intervención psicológica).
7
Diagnóstico
1. Pruebas en posición SUPINA (para mayores de 2 meses).
•
Miembro Superior: retracción de hombros, flexión de codo y muñeca.
•
Miembros Inferiores: extensión de cadera, plantiflexión, patrón en tijera.
No levanta brazos, no manipula objetos en línea media, no es capaz de
disociar movimientos ni de girar la cabeza.
“HIPERTONÍA EXTENSORA”
2. Pruebas en posición PRONA.
•
Miembro Superior: hombros protruídos, flexión de codo y muñeca,
cabeza fija en cama, atrapado en su propio cuerpo.
•
Si se le levanta o tracciona de los hombros, se genera la misma actitud
de los brazos y no manipula objetos.
•
Si es levantado de la pelvis, el Miembro Inferior (MI) queda en abducción
y extensión (como en el Landaw).
“HIPERTONÍA FLEXORA”
3. Pruebas en posición SEDENTE
•
No paracaídas frontal y lateral.
•
No sostiene ni adopta la posición.
•
Cuando es traccionado desde su posición supina a sedente, su cabeza
queda atrás, luego se nivela con el tronco y luego se cae (flexión).
4. Pruebas en posición de pié y suspensión vertical
•
Abducción de cadera y extensión de rodilla.
•
Pié con plantiflexión.
8
5. Para cuadriplejía atetoide
•
El tono es fluctuante (por poca inervación recíproca).
•
Instauración de la espasticidad.
•
Desarrolla el Tónico Asimétrico del Cuello (afecta Miembros Superiores
e inferiores, genera alteraciones de postura llevando a escoliosis).
•
Pruebas en supino: opistótonos (éste es de mal pronóstico)
Figura 1.1-2 Pruebas de desarrollo muscular en el cuello
•
Pruebas en prono: no levanta la cabeza, gira sin levantarla, los
hombros son protruídos.
•
Pruebas en sedente: al traccionarlo deja la cabeza atrás, se
nivela y luego cae.
Figura 1.1-3 Pruebas de elasticidad sedente (sentado)
6. Para hemiplejía
•
Asimetría de postura y movimiento.
•
Cara girada hacia el lado sano.
•
Hombro con retracción y descenso.
•
Mano cerrada y dedo cortical (pulgar en oposición).
•
Piernas en flexión, abducción y dedos en garra.
1. Pruebas en prono: no descarga peso en el lado afectado, no hay
reacción de paracaídas.
2. Pruebas en sedente: se extiende la pierna afectada.
9
7. Desarrollo de la espasticidad
•
Cuando es severa, realiza opistótonos.
1. Pruebas en supino: retracción de hombro, flexión muñeca y codo.
Espasticidad flexora (altera control de cabeza). Imposibilita
extender columna, cabeza y cadera.
2. Pruebas en sedente: cabeza y columna con inclinación anterior.
3. Pruebas en bípedo: patrón flexor en Miembro Superior
(retracción y flexión) y extensor en Miembro Inferior (rotación
interna, aducción y extensión).
Evaluación neurológica en pediatría
1. Anamnesis
•
Datos personales, antecedentes patológicos, familiares, quirúrgicos,
procedimiento del parto, si hubo complicaciones, semanas de nacido,
entre
otras
(para
reconocer
la
patología,
etiología
y
formular
posteriormente el tratamiento).
2. Diagnóstico Médico
3. Problemas asociados
•
Se toman en cuenta los que presente de los mencionados anteriormente
(lenguaje, auditivos, motores, entre otros, para tener más claro el
pronóstico y formular el tratamiento).
4. Tono Muscular
•
A la palpación, observación al movimiento, desplazamiento articular con
respecto a la gravedad.
10
•
Una forma fácil es coger el Miembro Superior (MS) como si fuéramos a
evaluar el ROT tricipital, se balancea el brazo y si hay resistencia se
considera espasticidad; cuando el AMA (amplitud de movilidad articular)
está aumentado, se siente el brazo flojo y pesado, se considera
hipotonía.
5. Inervación Recíproca
6. Actividad Refleja
Para mirar el grado de maduración.
•
Medulares: lesión en Núcleos de Daiters a ramas del vestibular
7. Son fásicos y respuestas automáticas e involuntarias
1.- Retracción Flexora (0 – 2 meses)
•
Se estimula en planta de pié, de talón a dedos y se hace presión.
•
Respuesta: flexión de MI.
•
Inhibición: rotación interna en MI y se hace el estímulo.
•
Interferencia Refleja: pataleo.
2.- Reflejo de Extensión (0 – 2 meses)
•
Se estimula en planta de pié con MI flejado.
•
Respuesta: extensión de MI.
•
Inhibición: rotación externa de MI y se hace el estímulo.
•
Interferencia Refleja: pataleo.
3.- Extensión Cruzada (0 – 2 meses)
•
Presión en tendón de aductores, parte media o proximal.
•
Respuesta: cruza el MI opuesto.
•
Inhibición: abducción, rotación externa de MMII y se estimula.
•
Interferencia: marcha y bipedestación.
11
4.- Flexo – extensión alterna (0 – 2 meses)
•
Flexión de un miembro.
•
Respuesta: extiende el otro.
•
Interferencia: pataleo.
5.- Apoyo negativo (0 – 2 meses)
•
Estímulo en planta o dorso de pié.
•
Respuesta: flexiona el MI.
•
Interferencia: bipedestación y marcha.
6.- Tónico Laberíntico en Supino (0 – 2 meses)
•
Aumento del tono extensor.
•
Inhibición: cabeza, MS e I en flexión.
•
Interferencia: trabajo en línea media.
7.- Tónico Laberíntico en Prono (0 – 2 meses)
•
Aumento del tono flexor.
•
Inhibición: extensión de MI, MS y cabeza.
8.- Tónico Asimétrico (0 – 3 o 4 meses)
•
Gira la cabeza hacia un lado.
•
Respuesta: extensión del lado rostral y flexión del craneal.
•
Inhibición: fija cabeza (se trabaja MS línea media, y MI movimientos de
flexión). Fijar MS (se trabaja cabeza y MI). Fijar MI (llevándolos a
abducción, rotación externa o flexión).
•
Interferencia: control de cabeza, tronco, sedente, giros y trabajos en
línea media.
9.- Tónico Simétrico en Flexión (0 – 3 o 4 meses)
•
Flexión de cabeza.
•
Respuesta: flexión de MS y extensión en MI.
•
Inhibición: principalmente fijar cabeza en neutro. Fijar MS (meter brazos
por debajo del cuerpo). Fijar MI (se llevan contra el pecho).
12
•
Interferencia: control cabeza, sedente, tronco, giros y trabajo en línea
media.
10.- Tónico Simétrico en Extensión (0 – 3 o 4 meses)
•
Extensión de cabeza.
•
Respuesta: extensión de MS y flexión de MI.
•
inhibición: cabeza neutro. Fijar MS en flexión y fijar MI extensión y
rotación interna para evitar que se flejen.
•
Interferencia: controles, giros y trabajos en línea media.
11.- Apoyo Positivo (0 – 6 o 7 meses)
•
Estímulo en dorso o planta del pié.
•
Respuesta: extensión de MI.
•
Inhibición: flejar rodillas, rotación externa apoyado en colchoneta y se
hace tapping de presión evitando la plantiflexión porque se fatiga la zona
donde se desencadena el reflejo.
•
Interferencia: bipedestación y marcha.
12.- Reacción de Enderezamiento Laberíntico
•
Prono: ojos cerrados, se deja caer la cabeza. Respuesta: alinea o lleva a
extensión (2 meses).
•
Supino: ojos cerrados, se deja caer la cabeza. Respuesta: alinea o lleva
a flexión (6 meses).
•
Lateral: ojos cerrados, se deja caer la cabeza. Respuesta: alinea o lleva
la cabeza a inclinación (7 meses).
13.- Reacción de Enderezamiento ópticas
•
Prono: 2 meses.
•
Supino: 6 meses.
•
Lateral: 7 meses.
NOTA: estas dos sirven para control de cabeza y equilibrio.
14.- Reacción de Enderezamiento del Cuello (0 – 6 meses)
13
•
Gira la cabeza.
•
Respuesta: gira en bloque.
•
Promoverlo: girar en ambos lados y luego el cuerpo.
•
Para rolados y giros.
15.- Reacción de Enderezamiento del Cuerpo sobre el Cuerpo (6 – 18 meses)
•
Gira la cabeza, luego cintura escapular y luego cintura pélvica.
•
Promoverlo: fijar pelvis y mover cintura escapular o viceversa.
•
Para rolados y giros.
16.- Reacciones de Equilibrio
•
Sedente: 8-10 meses. Estímulos desestabilizadores.
•
Cuadrúpedo: 10-12 meses. Estímulos desestabilizadores A-P y laterales.
•
Bípedo: 15-18 meses.
•
Dorsiflexión: 18 meses. Estimular, coger por debajo de las axilas, se
lleva a dorsiflexión y no se deja caer.
17.- Moro (0 – 3 mese)
•
Estímulo sonoro, vibración, cabeza.
•
Respuesta: abducción y llanto.
•
Inhibición: MS debajo del tronco o cadera.
•
Interferencia: bípedo, marcha, controles, giros, trabajo en línea media.
18.- Prensión Palmar (0 – 3 meses)
•
Estímulo: Presión cabeza MC (METACARPIANOS).
•
Respuesta: prensión.
•
Inhibición: antebrazo en supino, extender codo y rotación externa y se
hace el estímulo.
•
Interferencia: ausente ------ agarres.
•
Presente ----- no suelta agarres.
19.- Prensión Plantar (0 – 8 meses)
•
Estímulo: Presión en cabeza de MT (Metatarsianos).
14
•
Respuesta: prensión (fleja dedos).
•
Inhibición: extender dedos y estimular.
•
Interferencia: marcha.
20.- Landaw (6 – 18 meses)
•
En prono se deja como caer.
•
Respuesta: aumento del tono extensor.
•
Se promueve: para el control sedente y tronco.
21.- Paracaídas (6 meses en adelante)
•
En prono se deja caer sin soltar o con un objeto abajo.
•
Respuesta: extiende brazos o los apoya.
•
Promover de igual forma.
22.- Reacción Anfibia (6 – 10 meses)
•
En prono se realiza una presión en la ingle.
•
Respuesta: eleva la pelvis o cadera.
•
Inhibición: llevar a retroversión de cadera y no dejar que la levante.
•
Interferencia: arrastre y gateo.
23.- Babinsky (0 – 24 meses)
•
Se estimula el borde externo del pié hasta el hallux.
•
Respuesta: extiende el hallux y los otros dedos puede ir o no en
abanico.
•
Inhibición: flejar hallux y estimular.
•
Interferencia: marcha y bipedestación.
24.- Galant (0 – 2 meses)
•
Roce desde la 12ª costilla a cresta iliaca en prono.
•
Respuesta: inclinación a ese lado.
25.- Patrón de Marcha (9 – 12 meses)
•
Inclinar hacia delante en bípedo.
15
•
Respuesta: intenta dar pasos.
7. R.O.T. (Reflejos OsteoTendinosos)
8. A.M.A. (Amplitud de Movilidad Articular)
•
Puede estar limitado por aumento del tono muscular.
•
Atrofia o daño articular por incapacidad de movimiento o inadecuada
posición.
•
Pasivo: para mirar si necesita cirugía o aditamentos.
9. Retracciones Musculares
•
Por falta de movilidad o por tono muscular inadecuado.
10. Valoración Funcional Muscular
•
Para mirar incapacidad o dificultad para ciertos movimientos.
•
Para mirar control cortical de los movimientos a si los realiza en el patrón
normal.
11. Desarrollo Motor y Conducta Motora
12. Postura
Para deducir posibles deformidades funcionales, se observa:
•
Desviaciones posturales (asimetrías, escoliosis…).
•
Aditamentos.
•
Mediciones (cefálica, facial, torácica, MI)
13. Equilibrio
16
14. Coordinación
Habilidad para realizar conductas motoras adecuadamente de forma lenta,
rápida, gruesa y/o fina.
15. Marcha
Si la realiza.
16. Función de la Mano
Agarres, pinzas.
17. Sensibilidad
Es subjetiva.
18. Funciones Vitales
Deglución, masticación, succión, respiración, ojos.
19. Observaciones: (patrón, movimientos…)
20. Diagnóstico Fisioterapéutico: deficiencia, discapacidad y minusvalía
Como cargar los niños
•
Espástico Flexor: en prono, se coge el pecho y extender cabeza y la otra
mano extiende la pelvis.
•
Espástico extensor: manos debajo de axilas y los brazos de él en
abducción, se llevan alrededor del cuello de uno y las piernas van
abiertas a un lado.
Atetósicos: se colocan mirando hacia el frente, se fija el cuerpo y la cara.
17
Deformidades
Causas
•
Por inmovilidad.
•
Por el tono.
•
Por debilidad.
•
Por actividad refleja anormal.
•
En espásticos: escoliosis, cifoescoliosis, flexión de cadera y rodillas, pié
equino-varo o equino-valgo, subluxación de cadera por espasticidad en
aducción y rotación interna de cadera, deformidad en patrón flexor de
MS.
•
En atetósicos: tendencia a subluxaciones, dislocaciones de articulación
de mandíbula, hombro, cadera y dedos por su hipermovilidad.
Tratamiento
Objetivo General: mejorar la calidad de vida del paciente mediante diferentes
técnicas y métodos fisioterapéuticos que le ayuden al niño a obtener la mayor
independencia funcional posible en todas las actividades de la vida diaria
Objetivos específicos
•
Modular tono.
•
Mejorar propiocepción.
•
Mejorar esquema corporal.
•
Inhibir interferencias reflejas.
•
Aumentar A.M.A..
•
Evitar retracciones, contracturas y/o disminuirlas.
•
Facilitar movimientos.
•
Modular sensibilidad superficial y profunda.
•
Aumentar fuerza muscular.
•
Mejorar coordinación.
18
•
Mejorar equilibrio en diferentes posiciones.
•
Mejorar postura.
•
Adquisición de conductas motoras (rolados, sedente, bípedo, marcha…).
•
Evitar deformidades.
•
Manejar ayudas externas y/o aditamentos cuando se requieran.
Métodos utilizados
•
MÉTODO DE KABAT.
•
MÉTODO DE BOBATH.
•
MÉTODO DE ROOD.
•
MÉTODO DE TEMPLE FAY:
Utiliza reflejos patológicos para obtener esquemas de movimientos, postura,
propiocepción y estímulos periféricos.
Método de phelps
•
Educar el sistema motor para ejecutar actividades en un orden correcto,
para luego alcanzar habilidad para las AVD (Actividades de la Vida
Diaria)
•
Trabaja en este orden: relajación, modulación de tono, movimiento,
descanso, relajación, equilibrio, alcance y prensión, destreza. 1
------------------------------------------------------1 Rehabilitación Médica. Rafael González Mas. Editorial Masson, S.A..
http://www.aurasalud.com/
19
Método de pohl
Utiliza la concienciación muscular, función muscular y coordinación, con el fin
de obtener una relajación muscular, enseñar el control muscular voluntario y
construir un patrón de desarrollo. 1
Método de schwartz
Debe ser estimulado voluntariamente a intentar diversas actividades, esto
depende del nivel emocional, intelectual y físico. 2
Método de deaver
•
Máxima utilización de las manos.
•
Obtener un lenguaje adecuado.
•
Habilidad para ejecutar desplazamientos.
•
Adquirir una apariencia normal o casi normal.
•
Mantener máxima movilidad articular y preparar al niño para la ejecución
de movimientos coordinados y voluntarios, más necesarios para la vida
diaria. 3
Método de collis
•
Busca desde las edades más precoces una seguridad postural, que
sirva como base de coordinación muscular.
•
Considera que el empleo de aparatos ortopédicos es contraproducente
por interferir en el aprendizaje del equilibrio y la función motora. 4
------------------------------------------------------1,2,3,4 Rehabilitación Médica. Rafael González Mas. Editorial Masson, S.A..
http://www.aurasalud.com/
20
CAPÍTULO II
Fundamentos
Teóricos
21
CAPITULO II
FUNDAMENTOS TEÓRICOS
2.1 VIDEO
2.1.1 SEÑAL DE VIDEO
Para entender cualquier cosa sobre la generación de las señales video en
tiempo real, debemos
saber sobre las señales de video y como trabajan
detalladamente, así que antes de que miremos cualquier código tendremos que
hablar sobre el funcionamiento del televisor.
Para intentar comprender cómo se almacena y se muestra el vídeo debemos
retroceder en el tiempo y fijarnos en una tecnología muy obsoleta: la televisión
por tubo de rayos catódicos.
Un tubo de un televisor es un gran trozo de metal que no tiene aire dentro,
tenemos un cátodo que emite electrones cuando se calienta (por eso la imagen
tarda un rato en aparecer cuando se enciende la TV, el cátodo debe calentarse
primero hasta que la temperatura sea apropiada para emitir electrones), hay
también un fuerte campo electromagnético que acelera a los electrones hacia
la parte frontal del tubo, y que posiciona el haz de electrones (son muchos
electrones los que se lanzan hacia la parte frontal del tubo).
La parte frontal del tubo está cubierta de fósforo y cuando los electrones la
golpean, emite la luz hacia el otro lado (el lado en el que estarás tú). Debajo
puedes ver un esquema de un CRT (Cathodic Ray Tube, Tubo de rayos
catódicos).
22
Figura 2.1.1-1 Estructura interna de componentes de la pantalla
En un principio las televisiones eran sólo en blanco y negro, con lo que era
suficiente con un sólo haz de electrones, ahora para poder ver una película
debes escribir esta por toda la pantalla, así que el haz de electrones debe
barrer la pantalla, la frecuencia de barrido se conoce normalmente como tasa
de refresco (refresh rate). La tasa de refresco se escogió de acuerdo con los
ciclos de los sistemas eléctricos que se usaban:
•
Norteamérica y parte de Japón usan 60 Hz.
•
Europa, Oriente Medio y partes de Asia usan 50 Hz.
Esto dio lugar a dos sistemas de TV que compiten entre sí:
1.- NTSC: National Television Standard Committee
También conocido como "Never the same color" (nunca el mismo color) porque
no hay dos imágenes NTSC que se vean igual, el sistema NTSC tiene 525
líneas horizontales de las cuales apenas 487 se ven en la pantalla y tiene una
tasa de refresco de 60 Hz entrelazada (veremos esto más adelante).
23
2.- PAL: Phase Alternating Line
El sistema PAL tiene 625 líneas horizontales, de las cuales apenas 540 se ven
en la pantalla y tiene una tasa de refresco de 50 Hz entrelazada.
Ahora, en la época en la que aparecieron en el mercado las primeras TVs, la
tecnología que permitía escribir 525 líneas 60 veces por segundo, o 625 líneas
50 veces por segundo tenía un precio prohibitivo que no era adecuado para el
mercado de masas. Reducir la tasa de refresco habría requerido circuitos más
complicados y no era una opción tampoco, además la mente humana tiene un
límite inferior para lo que acepta como movimiento continuo.
Pero los ingenieros de TV tuvieron una idea: ¿Qué pasaría si escribiésemos
únicamente una de cada dos líneas en cada barrido, y escribiésemos la otra
mitad durante el siguiente barrido? De este modo sólo necesitaríamos 25/30
imágenes por segundo (lo que implica menos ancho de banda, lo que implica
más cadenas de TV en la misma banda de frecuencia), y el ojo humano
seguiría aceptando esto como movimiento continuo.
A esta idea de dividir la imagen en dos partes se la llamó entrelazado
(interlacing), ya a las imágenes divididas, campos (fields), visto de modo
gráfico, un campo es básicamente una imagen con una línea negra de cada
dos (o blanca).
Pero aquí esta una imagen para que puedan imaginar mejor lo que está
pasando:
Figura 2.1.1-2 Barrido entrelazado líneas impares
24
Figura 2.1.1-3 Barrido entrelazado líneas pares
Durante el primer barrido, el campo superior se escribe en la pantalla, como se
puede ver, se escriben las líneas 1, 3, 5, etc, y después de escribir cada línea,
el haz de electrones se mueve a la izquierda antes de escribir la siguiente
línea.
Como se ve a la izquierda, ahora la imagen muestra un efecto de "peinado",
parece que se esta viendo a través de un peine, cuando la gente habla de
artefacto entrelazado (interlacing artifacts) o dicen que su imagen está
entrelazada, se suelen referir a esto.
Una vez que se han escrito todas las líneas impares, el haz de electrones
regresa a la esquina superior izquierda de la pantalla y comienza a escribir las
pares, Como el fósforo tarda un momento en dejar de emitir luz y dado que el
cerebro humano es demasiado lento, en vez de dos campos distintos, lo que
vemos es una combinación de los dos, en otras palabras la imagen original.
Cuando finalmente llegó la TV en color, la tecnología de entrelazado siguió
siendo la misma, pero se necesitaba un tubo de rayos catódicos más
sofisticado. En vez de emitir un único haz de electrones, se emiten 3 haces de
electrones, con los colores rojo, verde y azul. Cuando colocas puntos de
distintos colores lo suficientemente cerca unos de otros, el ojo humano no verá
puntos individuales, sino un solo punto y unirá los colores para crear un nuevo
color. Debajo se puede preciar un esquema de un CRT en color.
25
Figura 2.1.1-4 Estructura interna del cañón de colores (RGB)
La pantalla se divide en tres colores: rojo, verde y azul, no obstante aquí
discutiremos El haz electrónico que dibuja la pantalla las dos imágenes de cada
parte se convierten en una imagen entera.
En el mundo del NTSC el cambio al color requirió un cambio más: la tasa de
refresco debía disminuirse ligeramente, de 60 Hz a 59.97 Hz (quedando en
29.97 imágenes por segundo) para ajustarse a los colores por este motivo
tenemos estas tasas de refresco tan extrañas en el mundo del NTSC en la
actualidad.
Ahora, antes de que procedamos a ver cómo filmaron las películas de
Hollywood, echemos un vistazo a los monitores de los PCs, el CRT tradicional
de un PC es distinto de las pantallas de TV, cuando los PCs aparecieron en el
mercado, se pudo finalmente escribir una imagen entera en un barrido, esto
también se llama escaneado progresivo (escaneado porque el haz de
electrones "escanea" cada línea de izquierda a derecha), los primeros
monitores de PC aún utilizaban modos entrelazados, pero el mayor contraste y
el brillo de los fondos nos daba tal dolor de cabeza que ahora tenemos la
suerte de que la mayoría de las pantallas ya no emplean este modo, hoy en día
todas las pantallas de PC escriben una imagen así:
26
Figura 2.1.1-5 Escaneo progresivo
Recientemente ha habido pantallas de TV que trabajan en modo de escaneo
progresivo, estos modelos sin embargo, son muy raros, y requieren una señal
distinta, ya que el modo tradicional de conectar los vídeos, reproductores de
DVD o cámaras a la TV no trabaja con imágenes progresivas, las pantallas de
LCD y de plasma sólo pueden escribir imágenes progresivas, cuando reciben
una imagen entrelazada necesitan trucos técnicos para mostrar una imagen
razonable, a estas técnicas se las llama normalmente desentrelazado
(deinterlacing).
Las TVs antiguas tenían tubos que no eran en absoluto planos, cuanto más nos
alejamos del centro del tubo (el punto en el cual el haz de electrones iría
directamente a la capa de fósforo sin desviarse), más complicado es escribir
una imagen geométricamente correcta y precisa, incluso en la actualidad no se
ve el tubo entero, las últimas pulgadas se esconden tras la carcasa de la TV,
esa es la razón por la que ambos formatos de TV tienen más líneas de las que
podemos ver, el resto de las líneas está y siempre estará escondido, pero estas
líneas se usan: los canales de TV transmiten páginas de texto en estas líneas,
pueden contener señales que estropean el amplificador (gain controller)
automático de tu aparato de vídeo (el sistema de protección anti-copia
analógico Macrovision), etc. 1
----------------------------------1
"http://es.wikipedia.org/wiki/NTSC"
Síntesis: Mtro. Jorge Arturo Pardiñas Mir.
27
La mayoría de las películas destinadas al cine se graban en un material similar
al que usamos en la fotografía tradicional, en un segundo se hace una escena
con 24 imágenes, así que en teoría podrías rodar una película con tu cámara
de fotos, sólo que tendrías que cambiar de rollo cada segundo o segundo y
medio (y normalmente las cámaras de fotos no pueden hacer 24 fotos en un
segundo;). Cuando vemos estas películas en el cine vemos 24 imágenes (o
frames) por segundo.
Pero cuando compramos estas películas en cinta de vídeo VHS, o en DVD
para verlas en nuestras pantallas de TV tenemos un problema, las pantallas
PAL necesitan 25 imágenes por segundo y cada imagen debe dividirse en 2
campos, pero dado que 25 no es mucho mayor que 24, lo que se suele hacer
en los países en los que usa PAL es tomar la película original a 24 fps (frames
por segundo) y acelerarla a 25 fps, esto implica que las voces y la música
tienen un tono más agudo y que la película es un poco más corta, pero a no ser
que compares una con otra, apenas se nota.
Ahora vamos con el NTSC. Aquí necesitamos 29.97fps, no se puede acelerar
la película ya que la diferencia de velocidad sería demasiado grande para que
la gente no la notase, así que lo que se hace es que tras dividir los frames en
campos, se repiten ciertos campos para obtener una mayor tasa de refresco,
básicamente 4 frames se convierten en 10 campos..
Generador de patrones de video
Introducción
El objetivo de este proyecto ha sido la construcción de un generador de
caracteres (letras del (abecedario, números y caracteres especiales) de video,
cuyas aplicaciones se extienden desde el campo de la enseñanza de la señal
de video hasta el ajuste de equipos receptores de televisión, no se ha
pretendido la realización de un equipo con fines comerciales, ya que no se
garantizan las especificaciones de un generador de video profesional, si bien
se a logrado un equipo de muy alta calidad.
28
Especificaciones
Patrones
: Caracteres, Raster, Cross-hatch, Puntos.
Controles
: Monocromático, luminancia, crominancia y burst de color
independientes.
Salida de video
: Video compuesto, 1 Vp-p en carga de 75 ohms.
Sistema de color : NTSC (opcional PAL-B/G/I cambiando el oscilador de
croma).
Sistema de barrido: Entrelazado (Barras y Raster), no entrelazado (Crosshatch y Puntos).
Alimentación
: 12 Vdc (Fuente de poder).
Consumo máximo : 70 mA (Raster blanco).
Aplicaciones
: Envío, recepción y visualización de caracteres por medio
del video del televisor.
Generalidades
El ojo humano es capaz de percibir imágenes mediante receptores ubicados en
la retina, hay dos tipos de receptores según su función:
Los bastones.- encargados de percibir imágenes en blanco y negro.
Los conos.- a cargo de la percepción del color.
Si nos concentramos en el estudio de los conos, veremos que hay de tres tipos:
los que reaccionan frente a la luz roja, los que lo hacen frente a luz verde y
finalmente los que son sensibles a la luz azul, solo se perciben tres colores, sin
embargo nosotros “vemos” todos los colores que nos rodean.
Aquí se hace evidente una regla básica del color:
Para conocer la información de color de un objeto basta con tener la proporción
de los tres colores básicos: Rojo, Verde y Azul, por esta razón a dichos colores
se los conoce como Colores Primarios, ya que con la combinación de los
mismos se pueden obtener todos los demás.
29
Ecuaciones
LUZ ROJA + LUZ VERDE + LUZ AZUL = LUZ BLANCA
Si los sumamos de a dos:
LUZ ROJA + LUZ VERDE = LUZ AMARILLA
LUZ ROJA + LUZ AZUL = LUZ MAGENTA
LUZ VERDE + LUZ AZUL = LUZ CIAN
CIAN + MAGENTA + AMARILLO = NEGRO
Los colores en televisión
La imagen en un televisor a colores se forma mediante la emisión de luz
resultante de la excitación de la película de fósforo, que recubre internamente
la pantalla, al ser alcanzada por un haz de electrones que barre periódicamente
la superficie visible, si hablamos de “emisión de luz”, inmediatamente debemos
pensar en procesos “aditivos”, lo cual nos lleva a concluir que en televisión los
colores primarios son el Rojo, Verde y Azul (RVA o en inglés RGB).
Efectivamente, dentro del tubo de televisión se emiten tres haces de
electrones, destinados cada uno a excitar una franja de fósforo en la pantalla,
la cual responderá emitiendo un color característico al fósforo empleado,
naturalmente como no podía ser de otro modo estos colores son Rojo, Verde y
Azul.
Todos los demás colores (y realmente “todos”) se pueden obtener combinado
estos tres primarios en distintas proporciones, un generador de barras básico
podría hacer lo siguiente:
•
Tener tres salidas, una para cada color primario
•
Cada una de estas salidas se conecta a la correspondiente entrada del
televisor
•
El equipo generará combinaciones de sus salidas, según la siguiente
tabla:
30
Figura 2.1.1-6 Tabla de generación de barra de colores
En esta tabla un “1” significa “presencia” del color, en tanto que un “0” es su
“ausencia”, en la práctica estos “unos” y “ceros” se representan por niveles de
tensión, por ejemplo 5V y 0V respectivamente.
Como se observa, es muy sencillo construir un generador de este tipo, ya que
basta un mínimo de electrónica digital para obtener estas barras, entonces,
¿por qué complicarse más?
La mayoría de los equipos de televisión y video no poseen entradas directas de
Rojo, Verde y Azul, estas quedan reservadas para monitores destinados al
campo profesional, lo habitual es que los equipos hogareños tengan una
entrada de “Video Compuesto”, denominada usualmente como “Video in”. Por
esta razón, nuestro generador debe poder convertir los componentes Rojo,
Verde y Azul en ese “Video Compuesto”.
Video compuesto
Las señales de Rojo, Verde y Azul (de ahora en más la llamaremos
simplemente RGB) contienen toda la información de la imagen, pero ocuparían
un ancho de banda considerable si se transmitieran, lo cual justamente es el
objetivo de una “transmisión” de televisión, para reducir este ancho de banda,
31
además de mantener la compatibilidad entre transmisiones en “Blanco y Negro”
y “Color”, se creó la señal de Video Compuesto.
En esta señal va la información de “luminosidad” (Luminancia) de una imagen,
su color (Crominancia), y además todos los sincronismos necesarios para
generar correctamente la imagen en la pantalla del televisor.
¿Cuáles son estos sincronismos?.
Figura 2.1.1-7 Escaneo del haz de electrones de la pantalla
Para contestar esta pregunta veamos primero como se forma una imagen en el
televisor, un haz de electrones (consideremos uno solo, sabemos que son tres)
recorre la pantalla de izquierda a derecha y de arriba a abajo, según
lo
muestra el esquema adjunto.
A medida que recorre la pantalla excita en mayor o menor grado al fósforo que
la recubre, generando una imagen, como se ve si bien la imagen aparece en
una pantalla de dos coordenadas (un plano), en realidad se genera mediante
líneas sucesivas, del mismo modo ingresa al equipo línea a línea.
Por lo tanto, es indudable que se necesita “sincronizar” el haz de electrones
que barre la pantalla con el barrido generado en el estudio de televisión, si no
se hiciera esto las imágenes aparecerían cortadas, con barras inclinadas, con
colores incorrectos (basta con ver un “canal codificado” para tener una idea de
lo que se quiere decir, ya que una manera de codificar la señal es quitarle los
sincronismos).
32
Sincronicemos entonces el barrido del haz, hay que informarle donde empieza
una nueva imagen (sincronismo Vertical o “V”) y donde comienza cada línea
(sincronismo Horizontal o “H”), evidentemente el sincronismo Horizontal es un
componente de mayor frecuencia que el Vertical, ya que dentro de cada
imagen hay muchas líneas de barrido.
¿Cuántas líneas hay dentro de una imagen? La respuesta es: “depende de la
norma de transmisión que estemos considerando”.
Normas de transmisión
Una norma es un conjunto de parámetros adoptados como regla dentro de
determinado grupo o región a fin de mantener una relación clara y sin
ambigüedades entre las partes, en televisión es exactamente eso, las normas
establecen los parámetros que deben seguir tanto los equipos transmisores de
señal como los receptores, a fin de que se establezca una comunicación
segura y sin errores entre ambos, entre los muchos parámetros que se fijan
consideraremos solo los que atañen a nuestro proyecto.
•
Frecuencia Horizontal (H): Frecuencia a la que se repiten las líneas de
imagen.
•
Sincronismo Horizontal (H Sync): Pulso que indica el comienzo de
una línea de imagen.
•
Frecuencia Vertical (V): Frecuencia a la que se repiten las imágenes
(campos).
•
Sincronismo Vertical (V Sync.): Pulso que indica el comienzo de una
imagen (campo).
•
Líneas Horizontales: cantidad de líneas que forman una imagen
completa (cuadro).
•
Subportadora de Color (SC): Frecuencia a la que se modula para
enviar la información de color.
•
“BURST” de Color: ráfaga de la SC que “sincroniza” la demodulación
del color.
33
•
“Front Porch”: intervalo de señal sin información de imagen previo al H.
Sync.
•
“Back Porch”: intervalo de señal posterior al H Sync., donde se coloca
el BURST.
Todo esto se resume en el siguiente diagrama:
Figura 2.1.1-8 Parámetros de transmisión de la señal de video
En la información anterior se hizo referencia a dos palabras que aún no han
sido definidas:
Campo y Cuadro: Para comprender su definición debemos primero aclarar el
concepto de “Barrido Entrelazado”, como ya se dijo para reconstruir la imagen
en la pantalla del televisor, el haz de electrones recorre la misma línea a línea
de arriba abajo, bastaría una pasada completa del haz de electrones para tener
una imagen formada en pantalla, sin embargo no es así, se requiere que el haz
de electrones “barra” dos veces la pantalla para formar una imagen completa.
Veamos esto con más detenimiento
Cuando la cámara de video en el estudio de televisión “escanea” la imagen que
va a transmitir, lo hace dividiendo la imagen en líneas horizontales, estas líneas
serán posteriormente transmitidas al receptor de televisión para que este las
reproduzca secuencialmente en la pantalla, sin embargo no se transmiten las
34
líneas consecutivamente (línea 1, 2, 3, 4, …) sino que primero se transmiten las
impares (línea 1, 3, 5, …) y luego las pares (línea 2, 4 ,6, …).
Del mismo modo recorre el haz de electrones la pantalla, reproduciendo
primero las líneas impares y luego las pares, por este motivo se requiere que el
haz recorra 2 veces toda la pantalla para formar una imagen completa, a las
dos “semi-imagenes” se les denomina Campos (Impar y Par respectivamente) y
a la imagen completa Cuadro, esto se esquematiza en la figura adjunta.
Figura 2.1.1-9 Escaneo campo impar y par
En esta figura se ha denominado I al Campo Impar y II al Campo Par, en el
diagrama se puede observar que el campo impar termina en media línea
horizontal y el par comienza con media línea horizontal, esta característica la
veremos a continuación cuando analicemos las dos formas de barrido que
pueden encontrarse:
35
Barrido Entrelazado y Barrido No Entrelazado
Figura 2.1.1-10 Barrido entrelazado
Figura 2.1.1-11 Barrido no entrelazado
El ejemplo que acabamos de ver corresponde a una imagen generada con
Barrido Entrelazado, su nombre proviene del “entrelazamiento” de las líneas de
barrido de dos campos sucesivos.
¿Qué ventaja tiene?, obtener una mayor frecuencia de repetición de imágenes
sin aumentar el ancho de banda.
¿Cómo es esto?, por el canal de transmisión se envían una cierta cantidad de
imágenes por segundo (digamos por ejemplo 25), en el televisor se reproducen
estas 25 imágenes por segundo, pero barriendo la pantalla 50 veces por
segundo.
Para nuestro ojo es como si se hubieran generado 50 imágenes en un
segundo, haciendo imperceptible el “parpadeo” de la imagen, como dato
adicional, en el cine ocurre lo mismo las películas antiguas corrían a 16
cuadros por segundo, y en ellas era muy notorio el parpadeo.
Actualmente se filma a 24 cuadros por segundo, y el obturador se abre dos
veces en cada cuadro durante la proyección, con el mismo propósito de
disminuir el “parpadeo”.
36
Volviendo a la televisión, si este método es tan bueno, no tiene sentido insistir
con el Barrido No Entrelazado, sin embargo, el entrelazamiento que ha probado
ser insustituible en imágenes en movimiento, falla en imágenes fijas.
¿Por qué?, Imaginemos una línea blanca horizontal quieta sobre un fondo
negro en medio de la pantalla, cuando se barre el campo impar la línea
aparecerá a determinada altura, en tanto que cuando se barra el campo par la
misma aparecerá naturalmente una línea horizontal más arriba o más abajo
que la anterior.
Al sucederse los campos, la línea se verá “temblar” en sentido vertical, en
forma poco perceptible, pero muy molesta si uno debe fijar la vista en la
pantalla.
¿Cómo se soluciona?, fácil, se utiliza el Barrido No Entrelazado. Este es mucho
más sencillo, simplemente las líneas de barrido se superponen campo tras
campo, esta técnica es muy utilizada en monitores de computación y en
generadores de patrones cuando se utilizan señales como el “Cross-hatch”
(líneas) y “Puntos”.
Figura 2.1.1-12 Generador de líneas
Figura 2.1.1-13 Generador de puntos
37
Diferentes estándares de televisión (distribución mundial)
Figura 2.1.1-14 Distribución mundial del sistema de televisión
Un el mapa se muestra los diferentes tipos de televisión usados en el mundo
estándares de vídeo: NTSC y PAL. 1
El vídeo que vemos en una pantalla de televisión sigue unas normas
establecidas en los años 50 del siglo pasado, cuando apareció la televisión en
color, los formatos más importantes utilizados hoy en día son NTSC (National
Television System Committee) y PAL (Phase Alternating Line).
En términos generales, NTSC es el estándar utilizado en América del Norte y
del Sur y en Japón, mientras que PAL se utiliza en Europa, Australia, Oriente
Medio y Asia.
Tamaño de fotogramas: NTSC y PAL tienen tamaños de imagen diferentes.
Velocidad de reproducción de fotogramas: NTSC y PAL utilizan diferentes
velocidades de reproducción de fotogramas para mostrar imágenes proporción
de aspecto de píxeles.
----------------------------------1Tutorial Pc y Pic
http://conket.com/modules.php?name=Sections&op=viewarticle&artid=14
38
Píxeles: NTSC y PAL comparten la misma proporción de aspecto de píxeles
(conocida como proporción de aspecto D1, que es básicamente rectangular).
Visualización:
NTSC
y PAL constan de
dos
campos
"entrelazados"
independientes, mientras que los monitores de equipos informáticos muestran
imágenes "progresivas".
2.1.2 SISTEMA PAL
El sistema PAL deriva directamente del NTSC con algunas correcciones
técnicas.
PAL es la sigla de Phase Alternating Line (línea alternada en fase), este es el
nombre con que se designa al sistema de codificación empleado en la
transmisión de señales de televisión en color en la mayor parte del mundo, de
origen alemán, se utiliza en la mayoría de los países africanos, asiáticos y
europeos (entre ellos España), además de Australia.
El sistema PAL surgió en el año 1963, de manos del Dr. Walter Bruch en los
laboratorios de Telefunken en su intento por mejorar la calidad y reducir los
defectos en los tonos de color que presentaba el sistema NTSC.
No obstante, los conceptos fundamentales de la transmisión de señales han
sido adoptados del sistema NTSC.
Detalles técnicos
El nombre "Phase Alternating Line" (línea alternada en fase) describe el modo
en que la información de crominancia (color) de la señal de vídeo es invertida
en fase en cada línea, permitiendo la correción automática de los posibles
errores en fase al cancelarse entre sí, en la transmisión de datos por
radiofrecuencia, los errores en fase son comunes, y se deben a retardos de la
señal en su llegada o procesado.
39
Aprovechando que habitualmente el contenido de color de una línea y la
siguiente es similar, en el receptor se compensan automáticamente los errores
de tono de color tomando para la muestra en pantalla el valor medio de una
línea y la anterior, dado que el posible error de fase existente será contrario
entre una línea y la siguiente. De esta forma dicho error, en lugar de un
corrimiento del tono como ocurriría en NTSC, queda convertido en un ligero
defecto de saturación de color que es mucho menos perceptible al ojo humano.
Esta es la gran ventaja del sistema PAL frente al sistema NTSC.
Las líneas en que la fase está invertida respecto a cómo se transmitirían en
NTSC se llaman a menudo líneas PAL, y las que coincidirían se denominan
líneas NTSC.
El funcionamiento del sistema PAL implica que es constructivamente más
complicado de realizar que el sistema NTSC, esto es debido a que si bien los
primeros receptores PAL aprovechaban las imperfecciones del ojo humano
para cancelar los errores de fase, sin la corrección electrónica explicada arriba
(toma del valor medio), esto daba lugar a un efecto muy visible de "peine" si el
error excedía los 5º, la solución fue introducir una línea de retardo en el
procesado de la señal de luminancia de aproximadamente 64 µs que sirve para
almacenar la información de crominancia de cada línea recibida; la media de
crominancia de una línea y la anterior es lo que se muestra por pantalla.
Los dispositivos que eran capaces de producir este retardo eran relativamente
caros en la época en la que se introdujo el sistema PAL, pero en la actualidad
se fabrican receptores a muy bajo costo, esta solución reduce la resolución
vertical de color en comparación con NTSC, pero como la retina humana es
mucho menos sensible a la información de color que a la de luminancia o brillo,
este efecto no es muy visible.
Los televisores NTSC incorporan un corrector de matiz de color (en inglés, tint
control) para realizar esta corrección manualmente, finalmente en el sistema
PAL es más probable que el aparato receptor malinterprete una señal de color
como señal de luminancia, o viceversa, que en el sistema NTSC, en
40
consecuencia el sistema NTSC es técnicamente superior en aquellos casos en
los que la señal es transmitida sin variaciones de fase (y, por tanto, sin los
defectos de tono de color anteriormente descritos), por ejemplo en la televisión
por cable, por satélite, en videojuegos, en reproductores de vídeo, y en general
en todas las aplicaciones en banda base.
Formatos del sistema PAL
El sistema de color PAL se usa habitualmente con un formato de vídeo de 625
líneas por cuadro (un cuadro es una imagen completa, compuesta de dos
campos entrelazados) y una tasa de refresco de pantalla de 25 cuadros por
segundo, entrelazadas, como ocurre por ejemplo en las variantes PAL-B, G, H,
I y N, algunos países del Este de Europa que abandonaron el sistema SECAM
ahora emplean PAL D o K, adaptaciones para mantener algunos aspectos
técnicos de SECAM en PAL.
Norma N
Actualmente en el mundo hay muchas normas de transmisión de televisión,
denominadas con letras desde la “A” a la “N”, algunas ya no se utilizan, pero la
mayoría siguen vigentes veamos ahora los valores que se han establecido
para los parámetros que hemos definido enla norma N, utilizada en solo tres
países del mundo: Argentina, Uruguay y Paraguay.
Frecuencia Horizontal (H)
: 15626 Hz (duración de una línea: 64
µseg.)
Sincronismo Horizontal (H Sync) : 4.8 µseg.
Frecuencia Vertical (V)
: 50 Hz (duración de un campo: 20 mseg.)
Sincronismo Vertical (V Sync.)
: 2.5 líneas horizontales
Líneas Horizontales
: 625 por cuadro (312.5 por campo)
Subportadora de Color (SC)
: 3.582056 MHz
“BURST” de Color
: 9 a 11 ciclos de SC
“Front Porch”
: 1.9 µseg.
“Back Porch”
: 5 µseg.
41
Si comparamos estos valores con normas en uso en Europa (B, G, I) veremos
que hay una gran similitud, excepto por el valor de la subportadora de color (en
estos sistemas es 4.43 MHz), para concluir con el tema de las normas, veamos
un esquema que representa una señal real de video norma N, utilizando los
dos métodos de barrido ya analizados.
Concentrémonos solamente en el método entrelazado. Se ve claramente como
el pulso de sincronismo vertical abarca 2½ líneas horizontales (la 1, 2, y mitad
de la 3 en el Campo I). Pero además se ve algo no mencionado hasta ahora:
parecieron unos pulsos de Pre y Pos-Ecualización.
¿Qué es esto?, la detección del sincronismo vertical en el televisor se realiza
integrando la señal de video que llega, y cuando esta alcanza un determinado
valor se dispara el barrido vertical, la integración se lleva a cabo mediante un
circuito RC, y se monitorea la carga del capacitor para decidir cuando disparar
el vertical.
Dependiendo de la imagen previa al pulso de sincronismo vertical, el capacitor
podrá estar más o menos cargado, haciendo que los barridos verticales no se
disparen siempre en un mismo punto, provocando inestabilidades en la imagen
(temblor vertical),
para evitar esto se colocan los pulsos de pre y pos-
ecualización, cuya función es llevar la carga del capacitor a valores fijos antes y
después del pulso vertical, el hecho de hacerlo también después evita disparos
erráticos del sistema.
Los pulsos de pre y pos-ecualización tienen una frecuencia igual al doble de la
horizontal y su duración es la mitad de la del H Sync, se aplican durante un
tiempo igual a 2½ líneas horizontales, finalmente los pulsos positivos que
aparecen dentro del pulso de sincronismo vertical se denominan “Serrated
Pulses”, y su función es mantener enganchado al oscilador horizontal durante
este período. Su duración es igual al H Sync.
42
Cuadro de pulsos
Figura 2.1.2-1 Diagrama de tiempos del sistema PAL
----------------------------------1.- Tutorial Pc y Pic
http://conket.com/modules.php?name=Sections&op=viewarticle&artid=14
43
1
2.1.3 SISTEMA NTSC
NTSC
Es un sistema de codificación y transmisión de televisión analógica
desarrollado en Estados Unidos en torno a 1940, y que se emplea en la
actualidad en la mayor parte de América y Japón, entre otros países, el nombre
viene del comité de expertos que lo desarrolló, el National Television System(s)
Committee.
Vídeo NTSC
El formato NTSC consiste en la transmisión de 29.97 cuadros de vídeo en
modo entrelazado con un total de 525 líneas de resolución y una velocidad de
actualización de 30 cuadros de vídeo por segundo y 60 campos de alternación
de líneas.
Para garantizar la compatibilidad con el sistema NTSC en blanco y negro, el
sistema NTSC de color mantiene la señal monocromática en blanco y negro
como componente de luminancia de la imagen en color, mientras que las dos
componentes de crominancia se modulan con una modulación de amplitud en
cuadratura sobre una subportadora de 3,579545 MHz.
La demodulación de las componentes de crominancia es necesariamente
síncrona, por lo tanto se envía al inicio de cada línea una señal sinusoidal de
referencia de fase conocida como "salva de color", "burst" o "colorburst".
Esta señal tiene una fase de 180º y es utilizada por el demodulador de la
crominancia para realizar correctamente la demodulación, a veces el nivel del
"burst" es utilizado como referencia para corregir variaciones de amplitud de la
crominancia. Generación de una señal eléctrica con la información de una
imagen.
44
El sistema de televisión utilizado NTSC (National Television Systems
Commitee), tiene algunos de parámetros de la señal de video definidos en el
sistema que son los siguientes:
La imagen a reproducir se confina a una forma rectangular horizontal con una
relación de dimensiones consistente en 4 unidades horizontales por 3 unidades
verticales. La imagen es proyectada hacia un dispositivo que convertirá la
información de aquella en señal eléctrica que permita su posterior
reproducción.
La información de la imagen es obtenida en el dispositivo de conversión a
través de explorar o hacer un barrido de esta por medio de líneas, de izquierda
a derecha y comenzando con la esquina superior izquierda.
La imagen se forma por el barrido de 525 líneas horizontales, estableciéndose
como distancia de observación adecuada entre 4 y 8 veces la altura de la
imagen, la continuidad del movimiento se logra presentando 30 (29.97)
imágenes por segundo.
La frecuencia de barrido de las líneas horizontales es de 525 x 29.97 =
15,734.25 Hz (Usualmente se hace referencia al valor de frecuencia obtenido
redondeando el número de imágenes por segundo a 30: 525 x 30 = 15,750 Hz.
Cada imagen se divide en dos partes denominadas campos. Cada campo es
barrido por lo tanto a una velocidad de 60 por segundo, el doble de una imagen
completa, con lo que se consigue eliminar el efecto visual de parpadeo.
Cada campo contiene únicamente 262.5 líneas, pero estas líneas no son
continuas, sino que se toman de manera entrelazada: si la imagen consiste en
525 líneas y estas se numeran consecutivamente, un campo se forma
solamente por las líneas de número impar, mientras que el otro por las líneas
de número par. A este método se le denomina barrido entrelazado el barrido
vertical se realiza de manera continua mientras se realiza el barrido horizontal.
45
La información de la imagen sólo se obtiene durante el barrido horizontal de
izquierda a derecha, el tiempo de barrido horizontal de izquierda a derecha es
mayor que el tiempo de regreso para comenzar a barrer la siguiente línea.
A continuación se muestran gráficas de los barridos realizados para formar una
imagen completa. En la primera se tiene que se ha barrido en el primer 1/60 de
segundo las líneas impares de la imagen, mientras que en la segunda gráfica
se presenta el siguiente 1/60 de segundo con el barrido de las líneas impares,
resultando la imagen completa de 525 líneas después de 1/30 de segundo.
46
Radiodifusión
Un canal de televisión transmitido en el sistema NTSC utiliza alrededor de 6
MHz de ancho de banda, para contener la señal de vídeo, más una banda de
resguardo de 250 khz entre la señal de vídeo y la de audio. Los 6 Mhz de
ancho de banda se distribuyen de la siguiente forma:
1,25Mhz para la portadora de vídeo principal con dos bandas laterales de
4,2Mhz; las componentes de color a 3,579545 Mhz sobre la portadora de vídeo
principal, moduladas en cuadratura; la portadora de audio principal de 4,5 Mhz
transmitida sobre la señal de video principal y los últimos 250 Khz de cada
canal para la señal audio estereofónica en frecuencia modulada. La señal de
crominancia en la norma NTSC se transmite en una frecuencia subportadora
FM en los 3.58 Mhz
Inconvenientes
Los problemas de transmisión e interferencia tienden a degradar la calidad de
la imagen en el sistema NTSC, alterando la fase de la señal del color, por lo
que en algunas ocasiones el cuadro pierde a su equilibrio del color en el
momento de ser recibido, esto hace necesario incluir un control de tinte, que no
es necesario en los sistemas PAL o SECAM. Por eso en broma se le denomina
"NTSC: Never The Same Color" ("NTSC: Nunca el mismo color").
Otra de sus desventajas es su limitada resolución, de solo 525 líneas de
resolución vertical, la más baja entre todos los sistemas de televisión, lo que da
lugar a una imagen de calidad inferior a la que es posible enviar en el mismo
ancho de banda con otros sistemas. Además, la conversión de los formatos
cinematográficos a NTSC requiere un proceso adicional conocido como "
pulldown de 3:2 ".
47
Ntsc digital
Lo dicho anteriormente se refiere al sistema NTSC en dispositivos analógicos.
En los dispositivos digitales, como televisión digital, consolas de videojuegos
modernas, DVD, etc., ni siquiera importa la codificación de color empleada, y
ya no hay diferencia entre sistemas, quedando el significado de NTSC reducido
a un número de líneas igual a 480 líneas horizontales (240 para mitad de
resolución, como VCD) con una tasa de refresco de la imagen de 29.97
imágenes por segundo, o el doble en campos por segundo para imágenes
entrelazadas.
Diagrama de tiempos
Figura 2.1.3-4 Diagrama de tiempos del sistema NTSC
48
Detalles de símbolos de sincronismo de video
Símbolos Características
NTSC
H
Periodo de línea (µs)
63.5555
a
Borrando (µs)
10.9±0.2
b
Tiemopo de dato (0H) y pulso de
borrado (µs)
9.2 to 10.3
c
Front porch (µs)
1.27 to 2.22
d
Synchronizing pulse (µs)
4.7±0.1
e
Borrado de pulso (µs)
<0.48
f
Sincroniza pulso (µs)
<0.25
g
Señal de portador (µs)
5.3 (4.71 to 5.71)
h
Duración de portador (µs)
2.23 to 3.11(9±1 cycles)
Descripción
Representación de la intensidad de luz en la señal eléctrica
Parte importante de la información que se obtiene de una imagen para permitir
su reproducción es la intensidad de luz de cada punto de la imagen. La señal
de video contiene la información de la intensidad de luz, siendo su amplitud
directamente proporcional a esta y de manera tal que valores de amplitud de
señal eléctrica mayor correspondan a mayores intensidades de luz.
En la señal de video sólo se incluye la información de la intensidad de luz
obtenida durante el barrido horizontal de izquierda a derecha, omitiéndose
durante el tiempo de regreso para barrer la siguiente línea horizontal y durante
el tiempo de regreso para comenzar a barrer el siguiente campo.
49
Borrado y sincronía
Durante los tiempos de retroceso horizontal y vertical la señal de video se
mantiene durante un tiempo en un estado denominado como de borrado,
correspondiendo a un valor de intensidad menor al menor valor de intensidad
posible de la imagen.
Durante otro lapso de tiempo, dentro del mismo intervalo de borrado, el
dispositivo convertidor de imagen a señal eléctrica incluye en la señal de video
que se está generando niveles de voltaje que indican el momento en que se
considera que la línea horizontal se ha terminado y debe de realizarse el
retroceso, información que se le denomina como pulso de sincronía horizontal y
vertical.
En la siguiente figura se muestra la forma de la señal de video correspondiente
a una línea horizontal, incluidos los períodos de borrado, sincronía y el inicio de
la siguiente línea, así como los valores proporcionales de tiempo y amplitud,
todos ellos de acuerdo al estándar NTSC.
Figura 2.1.3-5 Tiempos de escaneo de la imagen
50
Durante el retroceso vertical se introduce también en la señal de video un pulso
de sincronía vertical, sólo que en este caso el pulso de sincronía vertical debe
permitir que no se deje de tener sincronía horizontal, razón por la cual el pulso
de sincronía vertical tiene las siguientes características:
El intervalo de tiempo correspondiente al retroceso vertical tiene una duración
de 9 líneas horizontales, las 3 primeras líneas forman una zona denominada
como de igualación, las 3 líneas centrales son en sí el pulso de sincronía y las
últimas 3 líneas horizontales forman otra vez una zona de igualación.
En todo el intervalo de retroceso vertical los pulsos de sincronía se producen al
doble de la frecuencia: 31,468.5 Hz, en las zonas de igualación los pulsos de
sincronía son invertidos en su forma (observar detalle en figura).
Figura 2.1.3-6 Diagrama de sincronismo
51
2.2 MICROCONTROLADORES
2.2.1 INTRODUCCIÓN
La evolución de la electrónica desde la aparición del circuito integrado ha sido
constante. Actualmente podemos encontrar dispositivos cada vez más
complejos ubicados en encapsulados cada vez más pequeños, un ejemplo de
esto son los microcontroladores.
Un microcontrolador, es un dispositivo electrónico encapsulado en un chip,
capaz de ejecutar un programa. El microcontrolador reúne en un solo
integrado: microprocesador, memoria de programa, memoria de datos y
puertos de entrada/salida. Además, también suelen disponer de otras
características especiales como: puertos serie, comparadores, convertidor
analógico-digital, etc.
En el mercado existen gran variedad de
microcontroladores de marcas y
características distintas que podremos utilizar dependiendo de la aplicación a
realizar.
Un microcontrolador ejecuta instrucciones. El conjunto de instrucciones es lo
que llamamos programa. Las instrucciones son leídas de la memoria de
programa para ejecutarlas una detrás de otra. La memoria de programa
contiene las instrucciones que queremos que el microcontrolador ejecute.
Programar un microcontrolador consiste en introducir el programa en la
memoria del microcontrolador. Las instrucciones son operaciones simples
como sumar, restar, escribir en un puerto, activar un bit de un dato, etc.
Mediante estas instrucciones básicas podemos realizar operaciones más
complejas y así llegar al objetivo de la aplicación.
En este capítulo nos vamos a centrar en los microprocesadores de la casa
Microchip Technology, es decir los PICs. Este tipo de microprocesadores están
muy extendidos actualmente en el mercado gracias a su gran variedad y bajo
52
costo. Otra razón del éxito de los PICs es su utilización, ya que una vez se ha
aprendido a utilizar uno, conociendo su arquitectura y juego de instrucciones,
es muy fácil emplear otro modelo diferente.
2.2.2 HISTORIA DE LOS PIC’s
En 1965 GI formó una división de microelectrónica destinada a generar las
primeras arquitecturas viables de memoria EPROM y EEPROM. A principios de
1970 se creó el CP1600 que era un microprocesador bastante bueno pero no
manejaba muy bien los puertos de E/S, por esta razón en 1975 se creó el PIC
que era un chip que funcionaba en combinación con este microprocesador para
controlar las E/S.
Alrededor de 1980 GI reestructuró la empresa y creó la GI Micro electronics
que finalmente fue vendida a un grupo de inversores de capital de riesgo que
crearon la actual Arizona Microchip Technology y centraron su negocio en la
fabricación de PICs, memorias EEROM y EPROM. Actualmente Microchip ha
realizado un gran número de mejoras a la arquitectura original de los PICs,
adaptándola a las actuales tecnologías y al bajo costo de los semiconductores.
Figura 2.2.2-1 Arquitectura de la memoria interna del microcontrolador (pic)
2.2.3 ELECCIÓN DEL MICROCONTROLADOR PARA NUESTRO SISTEMA
Para la elección de un
microcontrolador
debemos primero conocer las
bondades de cada uno de los tipos, conociendo sus ventajas y características
que ayudarán a realizar un trabajo mucho más eficiente y reduciendo su
tamaño y principalmente el costo.
53
Características de los PICs
Las características más destacadas de los PICs las enumeramos en los
siguientes puntos:
1ª. La arquitectura del procesador sigue el modelo Harvard
Tradicionalmente, las computadoras y microprocesadores siguen el modelo
propuesto por John Von Neumann, en el cual la unidad central de proceso, o
CPU, esta conectada a una memoria única que contiene las instrucciones del
programa y los datos.
El tamaño de la unidad de datos o instrucciones esta fijado por el ancho del bus
de la memoria. Esto limita la velocidad de operación del microprocesador, ya
que no se puede buscar en la memoria una nueva instrucción, antes de que
finalicen las transferencias de datos que pudieran resultar de la instrucción
anterior.
2ª. Se aplica la técnica de segmentación ("pipe-line") en la ejecución de
las instrucciones
La segmentación permite al procesador realizar al mismo tiempo la ejecución
de una instrucción y la búsqueda del código de la siguiente. De esta forma se
puede ejecutar cada instrucción en un ciclo (un ciclo de instrucción equivale a
cuatro ciclos de reloj).
Figura 2.2.3-1 Segmentación de la memoria interna para la ejecución de instrucciones
54
3ª. El formato de todas las instrucciones tiene la misma longitud
Todas las instrucciones de los microcontroladores de la gama baja tienen una
longitud de 12 bits. Las de la gama media tienen 14 bits y más las de la gama
alta. Esta característica es muy ventajosa en la optimización de la memoria de
instrucciones y facilita enormemente la construcción de ensambladores y
compiladores.
4ª. Procesador RISC (Computador de Juego de Instrucciones Reducido)
Dependiendo de la gama del procesador (baja, media o alta) tienen más o
menos número de instrucciones. Los modelos de la gama baja disponen de un
repertorio de 33 instrucciones, 35 los de la gama media y unas 76 los de la alta.
5ª. Todas las instrucciones son ortogonales
Cualquier instrucción puede manejar cualquier elemento de la arquitectura
como fuente o como destino.
6ª. Arquitectura basada en un banco de registros
Esto significa que todos los
objetos
del sistema (puertos de
E/S,
temporizadores, posiciones de memoria, etc.) están implementados físicamente
como registros.
7ª. Diversidad de modelos de microcontroladores con prestaciones y
recursos diferentes.
Ventajas del uso de microcontroladores:
•
Gestión eficiente de procesos. (Ejemplo motores de combustión)
•
Aumento de la fiabilidad.
•
Reducción del tamaño, consumo y costo.
•
Mayor flexibilidad (Únicamente se requiere la reprogramación)
55
La única limitación en las aplicaciones es la imaginación de los diseñadores de
sistemas.
Por ejemplo en un hogar pueden encontrarse más de 200 microcontroladores
distribuidos por los aparatos de la casa.
Los campos más destacados son:
•
Periféricos y dispositivos auxiliares de computadores
•
Electrodomésticos
•
Aparatos portátiles (pda, teléfonos, tarjetas,…)
•
Máquinas expendedoras
•
Juguetes
•
Sistemas de seguridad, alarmas
•
Instrumentación
•
Automoción
•
Control industrial y robótica
•
Sistemas de navegación
•
Termorregulación: Aire acondicionado, calderas de calefacción,…
El mayor vendedor mundial de microcontroladores de 8 bits es microchip con la
familia PIC. Razones:
•
Desarrollo con bajo riesgo. Exsite una gran variedad de dispositivos pero
son totalmente compatibles pin a pin. No es necesario rediseñar el
software y un entorno de desarrollo sencillo (MPLAB, PBP, PIC C
COMPILER en nuestro caso).
•
Tiempo de desarrollo reducido. El software es reutilizable. ICSP.
•
Muy bajo costo.
•
Gran variedad de compiladores y herramientas de desarrollo.
56
Otros fabricantes:
•
Motorola: 68HC11
•
Intel, philips: 8051
•
Otros National Semiconductor, SGS-thomson, Texas-inst., Hitachi,
Analog Devices
Por tales razones hemos decidido utilizar los siguientes pic para la realización
del proyecto:
PIC 16F628A (Para el teclado, y recepción de datos).
PIC 18F2525 (Para la generación de video).
2.2.4 DESCRIPCIÒN GENERAL
Microcontrolador PIC 16F628A
Figura 2.2.4-1 PIC 16F628A
El PIC16F62A es un miembro basado en la tecnología Flash de 18 pines es
perteneciente a la familia de la serie PIC16F62x de los microcontroladores 8 bit
completamente estáticos del Cmos.
Las características incluyen un oscilador interno de 4 megahercios, memoria de
128, EEPROM, capture/compare/PWM, USART, 2 comparadores, y referencia
programable del voltaje.
57
Características Del Microcontrolador Del Microchip PIC16F62A
Figura 2.2.4-2 Distribución de pines PIC 16F628A
CPU de alto rendimiento del Risc
•
Velocidad de funcionamiento: 20 MHZ
•
Voltaje de funcionamiento: 3.0-5.5V
•
Gama de temperatura industrial (-40° a +85°C)
•
Capacidad de interrupción
•
8 niveles de stack
•
Modos de dirección directos, indirectos y relativos
•
35 instrucciones
Características Especiales Del Microcontrolador
•
Memoria : 3584 octetos (2048 palabras)
•
Datos SRAM: 224 octetos
•
Datos EEPROM: 128 octetos
•
Opciones internas y externas del oscilador
o
Oscilador interno de 4 mhz de precisión calibrado en la fábrica
hasta el ±1%
o
Oscilador interno de baja potencia de 48 kilociclos
o
Ayuda externa de oscilador
•
Modo de ahorro de energía
•
Pin Clear/Input multiplexado
58
•
Contador de tiempo, perro guardián con el oscilador independiente
para la operación confiable
•
Programación de baja tensión
•
Programación serial en el circuito (vía dos pines)
•
Protección programable de código
•
Reajuste Del Brown-out
•
Energía de reajuste
•
Contador de tiempo de ciclo inicial y contador de tiempo de inicio del
oscilador
•
Célula de la Alto-Resistencia Flash/EEPROM
o
100.000 escriben Flash
o
1.000.000 escriben EEPROM
o
Retención de los datos de 40 años.
Características Periféricas
•
16 pines de I/O con control individual de la dirección
•
Alta corriente directa para encender LED
•
Módulo de comparador análogo
o
Dos comparadores análogos
o
Módulo programable
o
Referencia interna o externa seleccionable
o
Las salidas del comparador son externamente accesibles
•
Timer0: timer/counter 8-bit con el prescaler programable 8-bit
•
Timer1: timer/counter 16-bit con capacidad externa de crystal/clock
•
Timer2: timer/counter 8-bit con el registro, el prescaler y el postscaler
8-bit del período
•
La captura, compara, módulo de PWM
o
Capture/Compare 16-bit
o
10-bit PWM
59
•
USART/SCI Direccionable
Microcontrolador PIC 18F2525
Figura 2.2.4-3 PIC 18F2525
Características Del Microcontrolador De Microchip PIC18F2525
Figura 2.2.4-4 Distribución de pines PIC 18F2525
CPU De alto rendimiento Risc
•
Velocidad de funcionamiento: 40 MHZ
•
Voltaje de funcionamiento: 4.2-5.5V
•
Gama de temperatura industrial (-40° a +85°C)
•
Memoria de programa hasta 2 MBYTES
•
Oscilador de 4-10 Mhz con PLL
•
Instrucciones amplias de16-bit
•
75 instrucciones
Características Especiales Del Microcontrolador
•
Memoria Flash: 32 kilobytes (16.384 palabras)
60
•
Datos SRAM: 1536 octetos
•
Datos EEPROM: 256 octetos
•
Opciones seleccionables de oscilador, incluyendo:
o
•
Entrada de reloj secundaria del oscilador (32 kilociclos)
Convertidor de analógico a digital con5-canales (disponible durante
ahorro de energía)
•
Modo de ahorro de energía
•
Contador de tiempo, perro guardián
•
Programación serial vía dos pines
•
Protección programable del código
•
Energía reajustale
•
Contador de tiempo de ciclo inicial y contador de tiempo del
encendido del oscilador
Características Periféricas
•
22 pines de I/O; 3 puertos de I/O
•
Alta corriente 25 mA/25 mA
•
Tres pines externos de la interrupción
•
Timer0: 8-bit/16-bit timer/counter con escala programable de 8-bit
•
Timer1: timer/counter 16-bit
•
Timer2: timer/counter 8-bit con el registro 8-bit Timer3: timer/counter
16-bit
o
Opción secundaria de reloj, oscilador -- Timer1/Timer3
•
Puerto serial síncrono principal con dos modos:
•
USART direccionables
61
CAPITULO III
Teoría
62
CAPITULO 3 TEORIA
3.1 ESTUDIO DE HARDWARE Y COMUNICACIÓN TECLADO
COMPUTADOR
3.1.1 FUNCIONAMIENTO
•
Funcionamiento interno (Hardware)
Figura 3.1.1-1 Identificación fila y columna de la tecla pulsada
Funcionamiento mecánico: cumple la tarea esencialmente de accionar un
contacto el cual envía una señal eléctrica (0 o 5 voltios) y mediante un circuito
decodificador saber en que fila o columna de la matriz interna del teclado se
encuentra para su posterior decodificación.
63
Tipos de pulsadores
Existe una diversa gama de tipos de pulsadores los cuales se han ido creando
para el mejoramiento, comodidad, elegancia y reducción de tamaño de los
primeros teclados a los teclados actuales.
Clasificación:
Funcionamiento interno (Software)
Como vamos a ver, los teclados de Pcs están íntimamente unido a su
hardware, es decir su host ,de hecho solo hay que observar que el teclado y su
host están conectados a través de 4 hilos. (Entiéndase “host” como dispositivo
que se comunica con el teclado intercambiando información con él, en el caso
de un PC, es el propio PC, en nuestro caso el microcontrolador actúa como
host) .
64
La conexión entre un teclado y el PC se realiza a o bien a través de un
conector DIN 5 puntas en 180º o a través de un conector del tipo PS/2 (mini-din
6 puntas). En ambos casos una línea transmite la señal de reloj otra la de datos
y dos más la alimentación +5V y GND.
3.1.2 LOS CONECTORES DEL TECLADO
Existen dos tipos de conectores:
•
DIN de 5 pines usado en el estándar AT
•
Mini DIN de 6 pines usado en estándares PS/2
El chasis metálico va conectado a la malla de protección del cable o un su
defecto a GND, las líneas N/C (No conectadas) se conectan a GND algunas
veces.
3.1.3 COMUNICACIÓN DEL TECLADO AL COMPUTADOR
La comunicación entre el teclado y el host es en modo serie con bit de
arranque, ocho bits de datos, paridad impar y bit de parada. Es además
bidireccional, el teclado informa al host de la actividad en las teclas y el host le
envía
comandos
para
su
configuración,
encendido
de
luces
(BloqMayusculas/BloqNum/BloqDespl), re-inicialización, re-envío etc. Esto hace
65
que la señal de datos pueda ser usada por ambas partes, mientras que el reloj
lo controla siempre el teclado.
Figura 3.1.3-1 Diagrama de sincronismos reloj y dato del teclado al host (computador)
LSB:
Less Significative Bit (Bit menos significativo)
MSB: Most Significative Bit (Bit mas significativo)
P Odd: Paridad Impar
ACK:
Acknowledge (Reconocimiento)
En el diagrama de tiempos superior podemos observar en color azul la señal
controlada por el teclado y en rojo cuando está controlada por el host.
Lo más importante para el problema que nos ocupa es qué la información nos
da el teclado respecto de las pulsaciones. Cuando se pulsa una tecla, el
teclado envía lo que se conoce como scan code, esto es un código asociado
con cada tecla a través de una tabla. Existen tres modalidades o tablas
dependiendo del tipo de teclado.
Scan Code Set 1: Es el usado en teclados del tipo XT de 83 teclas (Las teclas
de función estaban en la parte izquierda).
Scan Code Set 2: Propio de teclados AT de 102 teclas, es el más usado.
Scan Code Set 3: Sólo usado en teclados del tipo PS/2.
66
Formato del teclado
T eclado Multifunción (101 teclas) ó PS/2
Figura 3.1.3-2 Teclado PS/2
El Set 1 se considera obsoleto, aunque algunos controladores de teclado
transforman los scan codes 2 y 3 a este set por compatibilidad con software
escrito para XTs. Lo más común, aunque varía según el fabricante, es que el
teclado acepte trabajar con el Set 2 y 3.
El Set 3 permite además configurar el teclado en una modalidad de respuesta
más afín con las necesidades de nuestro adaptador, por consiguiente es el
modo de funcionamiento que hemos elegido.
Aquí tienes un resumen de los Scan Codes del Set 3 útiles para nuestro
teclado:
67
Códigos de rastreo del teclado
Figura 3.1.3-3 Código de escaneo interno del teclado
Las teclas marcadas con 'Ex' son exclusivas de teclados expandidos; generan
los mismos códigos de rastreo que sus correspondientes teclas «no
expandidas», aunque precedidos de un código de rastreo adicional 0E0h como
mínimo.
Códigos secundarios
A continuación se listan los códigos secundarios. Estos se producen al pulsar
ciertas combinaciones especiales de teclas, a las que el controlador de INT 9
responde colocando un código ASCII 0 en el buffer, a menudo junto al código
de rastreo, para identificarlas; las teclas expandidas provocan frecuentemente
la inserción de un ASCII 0E0h o bien 0F0h. Estos códigos secundarios son el
valor devuelto en AH por las funciones 0, 1, 10h y 11h de la BIOS, cuando
éstas devuelven un carácter ASCII 0 ó 0E0h en AL.
68
Ha de tenerse en cuenta que la BIOS modifica en ocasiones el valor leído del
buffer del teclado, aunque en la siguiente tabla hay pautas para detectar esta
circunstancia si fuera necesario. En primer lugar, cuando se invoca a la BIOS
con las funciones 0 y 1, éste se encarga de simular las teclas normales con las
expandidas,
así
como
de
ocultar
las
combinaciones
exclusivamente
expandidas. Aquellos códigos precedidos de (*) en la tabla son ocultados por la
BIOS (como si no se hubiera pulsado las teclas) al emplear las funciones 0 y 1,
sacándolos del buffer e ignorándolos. En concreto, estos códigos son
almacenados con un código ASCII 0F0h en el buffer del teclado.
Lógicamente, para las funciones 10h y 11h sí existen, aunque la BIOS
devuelve un 0 en AL (y no un 0F0h). A los códigos precedidos por (#) les
sucede lo mismo: sólo existen para las funciones 10h y 11h, al emplear dichas
funciones la BIOS devuelve en AL el valor 0 (el auténtico contenido del buffer
en esta ocasión, sin necesidad de transformarlo). Por último, los códigos
precedidos por (@) existen tanto para las funciones 0 y 1 como para la 10h y la
11h: la ventaja de usar las dos últimas es que devuelven en AL el auténtico
código ASCII del buffer (0E0h), permitiendo diferenciar entre la pulsación de
una tecla normal y su correspondiente expandida.
En general, quien no desee complicarse la vida (debido a una evidente falta de
previsión en el diseño del primer teclado) puede limitarse a emplear las
combinaciones normales (las no marcadas con #, # ni *). Por otra parte, para
emplear las combinaciones señaladas con (#), (@) o (*) hay que asegurarse
previamente de que la BIOS soporta teclado expandido
Para diferenciar las teclas repetidas, en la tabla siguiente, las teclas
entrecomilladas se suponen expandidas o, en su defecto, ubicadas en el
teclado numérico. Por ejemplo: "5" es el 5 del teclado numérico, "<-" es el
cursor izquierdo expandido y <- a secas el normal (esto es, la tecla 4 del
teclado numérico con Num Lock inactivo). Se emplea la notación anglosajona:
Ctrl (Control), Alt (Alt o AltGr), Shift (Mays), Ins (Insert), Del (Supr), Home
(Inicio), End (Fin), PgUp (RePág), PgDn (AvPág).
69
* 01 Alt ESC
58 Shift F5
7F Alt 8
03 Ctrl 2, NUL
* 0E Alt ß
37 Alt -*3B r1
59 Shift F6
5A Shift F7
80 Alt 9
81 Alt 0
0F Shift Tab
10 Alt Ω
11 Alt W
12 Alt E
13 Alt R
14 Alt T
15 Alt Y
16 Alt U
17 Alt I
18 Alt O
19 Alt F
3C r2
3D r3
3E r4
3F r5
40 R6
41 R7
42 R8
43 R9
44 R10
47 None
@ 47 “None”
5B Shift F8
5C Shift F9
5D Shift F10
5E Ctrl F1
5F Ctrl F2
60 Ctrl F3
61 Ctrl F4
62 Ctrl F5
63 Ctrl F6
64 Ctrl F7
65 Ctrl F8
82 Alt ‘
83 Alt ¡
84 Ctrl PgUp
# 85 F11
# 86 F12
# 87 Shift F11
# 88 Shift F12
# 89 Ctrl F11
# 8A Ctrl F12
# 8B Alt F11
# 8C Alt F12
48 ↑
@ 48 “↑”
49 PgUp
@ 49 “PgUp”
* 4A Alt “-“
4B ß
@ 4B “ß”
* 4C “5”
4D à
@ 4D “à”
* 4E Alt “+”
4F End
@ 4F “End”
50 ↓
@ 50 “↓”
51 PgDn
@ 51 “PgDn”
52 Ins
@ 52 “Ins”
53 Del
@ 53 “Del”
54 Shift F1
55 Shift F2
66 Ctrl F9
67 Ctrl F10
68 Alt F1
69 Alt F2
6A Alt F3
6B Alt F4
6C Alt F5
6D Alt F6
6E Alt F7
6F Alt F8
70 Alt F9
71 Alt F10
72 Ctrl Ptr
73 Ctrl ß
74 Ctrl à
75 Ctrl End
76 Ctrl PgDn
77 Ctrl Home
78 Alt 1
79 Alt 2
7A Alt 3
7B Alt 4
7C Alt 5
# 8D Ctrl “↑”
# 8E Ctrl “-”
# 8F Ctrl “‫”ﺬ‬
# 90 Ctrl “↑”
# 91 Ctrl “↓”
# 92 Ctrl “Ins”
# 93 Ctrl “Del”
# 94 Ctrl Tab
# 95 Ctrl “/”
# 96 Ctrl “*”
# 97 Ctrl “Home”
# 98 Ctrl “ß”
# 99 Ctrl “à”
# 9F Ctrl “End”
# A0 Ctrl “↓”
# A1 Ctrl “PgDn”
# A2 Ctrl “Ins”
# A3 Ctrl “Del”
# A4 Ctrl “/”
# A5 Ctrl Tab
# A6 Ctrl “Intro”
* 1A Alt [
* 1B Alt ]
* 1C Alt Intro
1E Alt A
1F Alt S
20 Alt D
21 Alt r
22 Alt G
23 Alt H
24 Alt J
25 Alt K
26 Alt L
* 27 Alt Ñ
* 28 Alt {
* 29 Alt \
* 2B Alt }
2C Alt z
2E Alt x
2F Alt c
30 Alt v
31 Alt N
32 Alt M
* 33 Alt ,
* 34 Alt .
* 35 Alt -
56 Shift F3
57 Shift F4
7D Alt 6
7E Alt 7
Figura 3.1.3-4 Códigos de caracteres imprimibles y no imprimibles por el teclado
Excepciones
Hay un par de teclas que sin tener un código ASCII 0, 0E0h ni 0F0h reciben un
tratamiento especial por parte de la BIOS, que provoca que el código
secundario no sea el de rastreo acostumbrado: el Intro del teclado numérico
genera un código ASCII 0Dh, como cabría esperar, pero su código secundario
es 0E0h; lo mismo sucede con el '/' del teclado numérico. Las funciones 0 y 1
de la BIOS traducen este 0E0h al valor correspondiente a la tecla Intro principal
y al '-' del teclado principal (tecla que ocupa la posición del '/' en los teclados
norteamericanos), para compatibilizar con los teclados no expandidos.
70
3.2 COMO FUNCIONA LA COMUNICACIÓN RS-232
3.2.1 INTRODUCCIÓN
Una manera de conectara dos dispositivos es mediante comunicaciones serie
asíncronas. En ellas los bits de datos se transmiten "en serie" (uno de tras de
otro) y cada dispositivo realiza tiene su propio reloj. Previamente se ha
acordado que ambos dispositivos transmitirán datos a la misma velocidad.
En el documento se muestran los fundamentos de estas comunicaciones, los
pines empleados y ejemplos de los circuitos para conectar el PC con un
microcontrolador, además de mostrar los cables que se pueden emplear.
Comunicaciones serie asíncronas
Los datos serie se encuentran encapsulados en tramas de la forma:
Figura 3.2.1-1 Formato de envío de datos vía RS-232
Primero se envía un bit de start, a continuación los bits de datos (primero el bit
de mayor peso) y finalmente los bits de STOP.
El número de bits de datos y de bits de Stop es uno de los parámetros
configurables, así como el criterio de paridad par o impar para la detección de
errores. Normalmente, las comunicaciones serie tienen los siguientes
parámetros: 1 bit de Start, 8 bits de Datos, 1 bit de Stop y sin paridad.
En esta figura se puede ver un ejemplo de la transmisión del dato binario
10011010. La línea en reposo está a nivel alto:
71
Figura 3.2.1-2 Visualización del envío de la trama de datos
3.2.2 NORMA RS232
La Norma RS-232 fue definida para conectar un ordenador a un modem.
Además de transmitirse los datos de una forma serie asíncrona son necesarias
una serie de señales adicionales, que se definen en la norma. Las tensiones
empleadas están comprendidas entre +15/-15 voltios.
Figura 3.2.2-1 Conexión ordenador móden
Conexión de un microcontrolador al puerto serie del PC
Para conectar el PC a un microcontrolador por el puerto serie se utilizan las
señales Tx, Rx y GND. El PC utiliza la norma RS232, por lo que los niveles de
tensión de los pines están comprendidos entre +15 y -15 voltios. Los
microcontroladores normalmente trabajan con niveles TTL (0-5v). Es necesario
por tanto intercalar un circuito que adapte los niveles:
72
Figura 3.2.2-2 Esquema ilustrativo conexión pc y microcontrolador
Uno de estos circuitos, que se utiliza mucho, es el MAX232.
El conector DB9 del PC
En los PCS hay conectores DB9 macho, de 9 pines, por el que se conectan los
dispositivos al puerto serie. Los conectores hembra que se enchufan tienen una
colocación de pines diferente, de manera que se conectan el pin 1 del macho
con el pin 1 del hembra, el pin2 con el 2, etc.
La información asociada a cada uno de los pines es la siguiente:
Número de pin
Señal
1
DCD (Data Carrier Detect)
2
RX
3
TX
73
4
DTR (Data Terminal Ready)
5
GND
6
DSR (Data Sheet Ready)
7
RTS (Request To Send)
8
CTS (Clear To Send)
9
RI (Ring Indicator)
3.2.3 El chip MAX 232
Este chip permite adaptar los niveles RS232 y TTL, permitiendo conectar un
PC con un microcontrolador. Sólo es necesario este chip y 4 condensadores
electrolíticos de 1UF a 50v. El esquema es el siguiente:
Figura 3.2.3-1 Conexión de pines chip Max 232
Descripción: El MAX232 dispone internamente de 4 conversores de niveles
TTL al bus standard rs232 y viceversa, para comunicación serie como los
usados en los ordenadores y que ahora están en desuso, el Com1 y Com2.
Funcionamiento: El circuito integrado lleva internamente 2 conversores de nivel
de TTL a rs232 y otros 2 de rs232 a TTL con lo que en total podremos manejar
4 señales del puerto serie del PC, por lo general las mas usadas son; TX, RX,
74
RTS, CTS, estas dos ultimas son las usadas para el protocolo handshaking
pero no es imprescindible su uso. Para que el max232 funcione correctamente
deberemos de poner unos condensadores externos, todo esto lo podemos ver
en la siguiente figura en la que solo se han cableado las líneas TX y RX que
son las más usualmente usadas para casi cualquier aplicación.
Usos: Este integrado es usado para comunicar un microcontrolador o sistema
digital con un PC o sistema basado en el bus serie rs232.
Conexión a PC
Figura 3.2.3-2 Distribución de pines y conexión pc a pic
Cable de conexión (I)
Para realizar la conexión entre el PC y nuestro circuito podemos usar diferentes
alternativas. Una manera es utilizar un cable serie macho-hembra no cruzado,
y en el circuito un conector hembra DB9 para circuito impreso:
75
Figura 3.2.3-3 Cable de conexión DB9 macho
Figura 3.2.3-4 Conector DB9 hembra
Cuando conectamos un micro al PC normalmente sólo usamos los pines TX,
RX y GND, sin embargo en este tipo de cables se llevan los 9 pines.
También se puede fabricar un cable serie utilizando cable plano de bus,
conectantando un conector db9 hembra para bus:
Figura 3.2.3-5 Construcción cable plano con conector DB9
Cable de conexión (II): Cable telefónico
Puesto que en la conexión del PC con un micro sólo se usan las señales TX,
RX y GND se puede emplear un cable telefónico, que es sencillo de construir,
fácil de conectar y desconectar y las conexiones son muy fiables. Es necesario
cable telefónico y un conversor de teléfono a DB9:
76
Figura 3.2.3-6 Cable de conexión telefónico RJ11 macho
Figura 3.2.3-7 Conector telefónico RJ11 hembra
El cable de teléfono se tiene que construir o adquirir se esquematiza a
continuación:
Figura 3.2.3-8 Esquema de ponchado cable telefónico RJ11
Este cable tiene una muesca que diferencia las dos caras del cable. La correcta
posición de los conectores telefónicos es como se ha indicado en la figura, con
la muesca del cable hacia arriba.
El conector db9-teléfono que se conecta al PC se compra desmontado. Por un
lado se encuentra la carcasa con el conector hembra de teléfono y por otro lado
el conector DB9 hembra. Los 4 cables que salen de la carcasa se conectan al
DB9 hembra, en los pines que vayamos a utilizar. Como para las conexiones
con los micros sólo usaremos los pines RX, TX y GND (Pines 2,3 y 5).
77
Figura 3.2.3-9 Esquema de conexión conector RJ11 y conector DB9
La manera en la que se conecten estos cables es indiferente, sin embargo,
para tener compatibilidad con el cable de la CT6811, hay que hacerlo de la
siguiente manera:
Figura 3.2.3-10 Distribución de pines conector DB9
El cable que lleva la señal de DTR es opcional, y en la CT6811 se usa para
hacer reset.
Para la conexión al micro se usa un conector telefónico hembra para circuito
impreso:
78
Figura 3.2.3-11 Conector RJ11
Los pines del conector hembra son los siguientes, vistos desde abajo:
Figura 3.2.3-12 Distribución de pines conector RJ11
79
3.3 DISEÑO Y CONSTRUCCIÓN DE HARDWARE
3.3.1 CREACIÓN DE PLACAS DE CIRCUITO IMPRESO
En este documento se explica paso a paso el proceso de creación de placas de
circuito impreso (CI). Es un proceso completamente probado, fiable, con
resultados impecables y sobre todo ¡BARATO!. Se ha intentado describir el
proceso para que sea reproducido sin problemas.
1.- Material.
•
Placa de CI normal de cobre de una o dos caras. Costo: $ 0.80
Figura 3.3.1-1 Placa de cobre
•
Papel térmico Costo: $ 2.40
Figura 3.3.1-2 Papel térmico
80
•
Cloruro Férrico para atacar la placa. Costo: $ 0.50
Figura 3.3.1-3 Ácido cloruro férrico
•
Cubeta de plástico, de 500cc o más. Costo: $ 1
Figura 3.3.1-4 Recipiente de plástico
•
Pinzas de plástico. Costo: $ 1
Figura 3.3.1-5 Pinzas plásticas
81
•
Impresora láser. Samsung ML-1250. Costo: $ 105
Figura 3.3.1-6 Impresora láser
•
Plancha. Costo: $15
Figura 3.3.1-7 Plancha
•
Lana de acero. Costo: $ 0.50
Figura 3.3.1-8 Lana de acero
82
•
Lima. Cost0: 0.50
Figura 3.3.1-9 Lima de acero
•
Mini taladro tipo Dremel mas brocas de 0.8 mm. Costo: $ 30
Figura 3.3.1-10 Taladro
•
Rotulador indeleble. Como el de rotular Cd's. Costo: $ 1.5
Figura 3.3.1-11 Marcador indeleble
83
•
Disolvente universal. Costo: $ 2
Figura 3.3.1-12 Disolvente
3.3.2 DISEÑO DE LA PLACA
Utilizamos el programa ISIS de PROTEUS, El programa no es demasiado
complicado de utilizar, pero te aconsejamos que te leas el manual del proteus
adjunto en los Anexos.
Básicamente con el "ISIS" pones los componentes y los conectas entre si,
chips, resistencias, condensadores etc. Y con el "ARES" enrutas las líneas, y
colocas los componentes en su sitio sobre la placa:
84
Ejemplo vista ISIS
Figura 3.3.2-1 Visualización diagrama en Proteus (ISIS)
Ejemplo vista ARES
Figura 3.3.2-2 Visualización esquema componentes en Proteus (ARES)
85
Placa sin GND
Figura 3.3.2-3 Placa sin relleno de cobre
Placa con GND ¡Recomendado!
Figura 3.3.2-4 Placa con relleno de cobre
86
Consejos: al acabar la placa, crea un polígono que incluya todas las pistas y
componentes, y le asignas la señal de masa, GND, de esta forma, la parte que
deberá ser atacada por el Cloruro Férrico (ClFe) será mínima y el proceso es
mas rápido. Además el resultado es mucho mas profesional.
Fíjate en el botón resaltado en ambas imágenes para saber como crear la
capa GND.
3.3.3 IMPRESIÓN DEL CIRCUITO
Al imprimir sólo necesitas que sean visibles las capas Botton, Pads, Vías y
dimensión. Si haces la placa a dos caras, en la segunda necesitarás imprimir
sólo las capas Top, Pads, Vías y dimensión.
La placa impresa queda tal que así:
Figura 3.3.3-1 Impresión soldadura (I) y Componentes (D)
A la izquierda las pistas, a la derecha la serigrafía. Para un resultado
profesional imprimiremos también la serigrafía de la posición de los
componentes, luego la colocación de los componentes es mucho más sencilla.
Te recomendamos que pongas siempre algún texto en el layout de la placa,
recuerda que al imprimir las letras deberán verse como reflejadas en un espejo,
si no es así no sigas adelante, también que señales las líneas de alimentación
y las líneas de señal mas importantes, para el testeo posterior de la placa.
87
Imprime al máximo de calidad en la impresora láser, si no tienes láser, imprime
en un folio normal y fotocopia este folio sobre la hoja de papel satinado. OJO, a
veces puede atascar la fotocopiadora y en muchos sitios no te hacen las
copias.
3.3.4 PREPARACIÓN DE LA PLACA
Pulir la placa de cobre con la lana de acero.
Figura 3.3.4-1 Lijado de la placa de cobre
Observa la diferencia, la placa debe quedar completamente pulida (parte de la
derecha).
Figura 3.3.4-2 Placa sin lijar Figura
3.3.4-3 Placa lijada
No está de más limar los bordes.
88
Figura 3.3.4-4 Limpiar placa con tiñer
3.3.5 PLANCHADO DEL DISEÑO SOBRE LA PLACA DE COBRE
Mediante el calor de la plancha, trasferiremos el fotolito del papel al cobre.
Figura 3.3.5-1 Colocar papel térmico impreso sobre la placa de cobre
Alinea el papel con la placa, lo ideal es hacerlo en un ángulo recto. NO
RECORTES la placa todavía, debes planchar el papel sobre un trozo de placa
grande, si no es muy difícil conseguir que no se mueva al planchar.
89
Figura 3.3.5-2 Planchar el papel sobre la placa de cobre
Calienta la plancha, la mía sólo tiene 1 y 2, yo la pongo al 2. Aplica la plancha
sobre el papel firmemente, NO MUEVAS EL PAPEL, es muy importante. Con 2
ó 3 pasadas es suficiente, y no es necesario que apretes mucho. Si la plancha
está muy calientes, o pasas muchas veces sobre el mismo sitio o presionas
demasiado, las pistas se deforman. Yo he hecho placas haciendo una única
pasada.
Figura 3.3.5-3 El papel se pegara sobre el cobre
Inspecciona la placa por si hay alguna parte que no se ha pegado. Lo ideal es
que quede bien a la primera, si no es así, tienes muchas posibilidades de que
no salga bien, sin embargo, no todo está perdido. Una forma de saber si se ha
pegado bien, a priori, es mirar la placa de forma que la luz refleje, verás que
donde hay pista, es más brillante. CUIDADO, la placa puede quemar un poco.
90
Deja enfriar la placa, hasta que la toques y no queme, unos minutos. Debe
quedar más o menos como las fotos. Puedes volver a planchar alguna zona,
pero ya no suele pegarse.
Figura 3.3.5-4 Visualización de zonas no brillantes
Figura 3.3.5-5 Planchada totalmente terminada
Para retirar el papel de la placa, debes introducirla en AGUA CALIENTE, es
muy importante, porque mejora los resultados al hacer que el papel se
despegue sin dificultad. Deja la placa unos minutos en remojo, luego el papel
se despega sólo prácticamente. En las fotos no se utilizó agua caliente, por eso
no se despega muy bien. Además, si logramos despegar el papel de una pieza,
podremos ver si hay alguna pista que no se ha pegado bien. Todas las partes
negras que veas en el papel despegado, no se han pegado en el cobre y
deberás dibujarlas con un rotulador indeleble.
Figura 3.3.5-6 Dejar enfriar la placa en agua
Figura 3.3.5-7 Retirar el papel de la placa de cobre
91
Elimina con un trapo los restos de papel adherido al circuito, no te preocupes,
las pistas ya no se despegan, observa como debe quedar. Revisa las pistas y
repasa con rotulador indeleble las que no hayan quedado bien. Si alguna pista
se comunica, utiliza un cuter para rascarla un poco.
Figura 3.3.5-8 Retirar los restos de papel con una esponja
Figura 3.3.5-9 Placa totalmente sin papel
3.3.6 ATAQUE QUÍMICO DE LA PLACA DE COBRE
Recorta la placa, yo utilizo una sierra de metal, porque tiene unos dientes muy
finos.
Figura 3.3.6-1 Recortar la placa
Figura 3.3.6-2 Lijar los bordes de la placa
92
Ya estamos preparados para atacar la placa con Cloruto Férrico (ClFe). Si no
has hecho la mezcla todavía, llena el bote de ClFe con agua y agita hasta que
se disuelvan las bolitas, luego llena el recipiente donde atacarás la placa. En
este recipiente se ha pegado en el fondo un par de difusores de aire de acuario
y mediante un tubo de silicona, se conecta al compresor. El oxígeno y la
temperatura facilitan la reacción, te recomiendo calentar la disolución de ClFe,
al baño María, por ejemplo tengo un calentador de acuario, pero es algo lento...
Coloca el compresor por encima, del recipiente de ClFe, para evitar que el
líquido entre en el compresor. He descubierto, que estrangulando un poco el
tubo, las burbujas salen con mas potencia (con una pinza, pro ejemplo, fíjate en
la primera foto). En unos 5-10 minutos, la placa estará lista. Debes irla
vigilando, porque el cobre se desprende mas de unos sitios que por otros,
debido al flujo de burbujas, por lo que deberás irla moviendo de vez en cuando,
colocándola en distintas posiciones.
Figura 3.3.6-3 Introducir la placa de cobre en el recipiente con ácido
Si tienes buen pulso, puedes dejar la placa flotando justo encima de las
burbujas.
93
Una vez que la placa está lista, limpia el recipiente y los difusores de burbujas,
una vez aclarado el recipiente, lo lleno de nuevo con agua y dejo el compresor
enchufado, para limpiar los difusores. Si no lo haces, los difusores no te
durarán ni dos días.
Comprueba que no quedan restos de cobre en la placa a la vista, métela en
agua para eliminar los restos del ClFe y utiliza un trapo con disolvente para
retirar el toner de la placa.
Figura 3.3.6-4 Lavar la placa con agua
Figura 3.3.6-5 Retira el toner con disolvente
Figura 3.3.6-6 Lista la placa para la perforación
94
3.3.7 PERFORADO DE LA PLACA
Taladramos la placa, al contraluz puedes ver si te has dejado algún pad.
Figura 3.3.7-1 Perforado de pad de la placa
Figura 3.3.7-2 Placa terminada
Procedemos con la serigrafía de la capa superior, el sistema para placas de
doble cara es el mismo, solo que primero se plancha una cara, se agujerea
para alinear la segunda cara, se plancha la segunda cara y luego se ataca con
la disolución de ClFe.
Una vez lista la capa inferior, planchamos la serigrafía en la capa superior.
Ayúdate una vez mas del contraluz para, esta vez, alinear las dos capas. En las
placas de doble cara esto es IMPORTANTÍSIMO, para la serigrafía no tanto.
Una vez planchada la serigrafía, deja enfriar e introduce la placa en agua
caliente, si has sido rápido, todavía estará caliente el agua que has utilizado
antes. Retira el papel adherido y limpia con un trapo los restos de papel de la
placa, puedes utilizar alcohol, tranquilo, a no ser que utilices disolvente, no
borrarás las pistas.
95
Figura 3.3.7-3 Montaje de elementos impresos
Figura 3.3.7-4 Visualización a contra luz
96
3.4 DISEÑO Y CONSTRUCCION DEL HARDWARE PARA EL
TECLADO
3.4.1 ESQUEMATICOS TECLADO
Figura 3.4.1-1 Diagrama esquemático de hardware de teclado
Descripción del circuito
El circuito está compuesto por un PIC16F628A que oscila a 20Mhz, los pines
RB0 y RB7 (de los pic’s correspondientes) se encuentran configurados como
entradas, las cuales reciben las señales provenientes del teclado PS/2.
97
Las señales provenientes son:
•
Clock que se conecta al pin RB0.
•
Data que se conecta al pin RB7.
Y como salida del microcontrolador el pin RB2 (de los pic’s correspondientes),
el cual se conecta al pin 10 ó 11 del circuito integrado MAX232 que son
entradas para la conversión de señales TTL a señal RS232.
Y por último la salida del MAX232 son los pines 14 y 7, los cuales se encargar
de enviar la señal RS232 al módulo concentrador (recepción de datos).
Además el módulo consta de una fuente de voltaje estable regulada a 5v.
Diagrama de bloque
Figura 3.4.1-2 Diagrama de bloque
98
Diagrama por módulo
Figura 3.4.1-3 Diagrama por módulo
Elementos del Módulo
Materiales para Módulos TECLADO – RS232
4 Resistencias
Cantidad: Referencias
4
R1-P1, R1-P2, R2-P1, R2-P2
Valor
330
10 Condensadores
1
4
4
1
C1-F
100uF
C1-MAX, C2-MAX, C3-MAX, C41uF
MAX
C1-P1, C1-P2, C2-P1, C2-P2
33pF
C2-F
10uF
19 Diferentes dispositivos
1
3
2
CI7805
CONN-RJ11,CONN-TECLADO1,
CONN-TECLADO2
CONN-VDD-F, CONN-VDD-PIC
CRYSTAL-P1, CRYSTAL-P2
2
99
7805
CONN-H4
CONN-H2
20Mhz
5
1
2
2
1
LED-F,
LED1-P2,
LED2-P1, LED2-P2
LED1_P1, DIODE-LED
MAX232
PIC_1, PIC_2
R-MCLR_1, R-MCLR_2
RES_LED
MAX232
PIC16F628A
330 Ω
Elementos del módulo teclado- RS232 (Vista de componentes)
Figura 3.4.1-2 Disposición de elementos
Esquema módulo teclado- RS232 (Vista de soldadura)
Figura 3.4.1-3 Disposición de soldadura
100
3.4.2 ESQUEMATICO CONCENTRADOR
Figura 3.4.2-1 Diagrama esquemático de red
Descripción del circuito
El circuito está compuesto por circuito integrado MAX232 el cual por medio de
sus pines de recepción de datos 8 y 13 se encargan de recibir la señal RS232
provenientes del módulo teclado.
Y por medio de los pines de salida 9 y 12, se encargan de transformar las
señales RS232 a señales TTL, que serán entregadas al PIC16F628A.
El PIC16F628A oscila a 20Mhz los pines RA0 (de cada pic), se encuentran
configurados como entradas y tienen la tarea de codificar la señal TTL y
codificarlos a 1 y 0.
101
Para luego enviarlos por medio de los pines RB1 – RB7, que son los
encargados de entregar los datos suficientes para que el pic de video
(PIC18F2525) pueda interpretarlos y presentarlos al video del televisor.
El circuito también consta de una fuente de voltaje regulada a 5v.
Diagrama de bloque
Módulo teclado
MAX232
Entrada de
señal
Señal RS232
Concentrador PIC16F628A
Señal TTL
Señal de
habilitación
Video
Figura 3.4.2-2 Diagrama de bloque
Diagrama por módulo
Figura 3.4.2-3 Diagrama por módulo
102
Elementos del módulo recibir datos de red
Figura 3.4.2-4 Disposición de elementos de red
Módulo fuente
Figura 3.4.2-5 Diagrama esquemático de la fuente
103
3.4.3 ESQUEMATICO VIDEO
Figura 3.4.3-1 Diagrama esquemático de video
Diagrama de bloque
Figura 3.4.3-2 Diagrama de bloque
104
Diagrama por módulo
Receptor
PIC18F2525
Concentrador
PIC 16F628A
Salidas
---------------------RBO
|
RB7
--------------------Entrada
---------------------RB0 (Control)
señales
control
RBO de cada pic
Entradas
---------------------RB0
|
RB6
RB7 (GND)
---------------------Salidas
---------------------RA1
|
RA4
---------------------RA0 + RC0
Televisor
Video
RA0 + RC0
Figura 3.4.3-3 Diagrama por módulo
Elementos del módulo
Materiales para MODULOS VIDEO – FUENTE - RECIBIR DATO DE
RED
8 Resistencias
Cantidad
4
1
1
1
1
Referencia
R1, R1-P1, R1-P2, R2
R1-F
R1-V
R2-V
R3-V
Valor
1k
330
910
450
78
20 Condensadores
8
C1, C1-M, C2, C2-M, C3, C3-M, C4, C4-M
10
1
1
C1-P1, C1-P2, C1-V, C2-P1, C2-P2, C2-V, C5C8
33pF
C1_F
47uF
C2-F
100uF
2 Diodos
105
1uF
1
1
D2
D2-F
1N4148
LED
30 Dispositivos diferentes
1
7805
CI-7805
CONECTOR_VIDEO,CONN-RA1-RA2,
CONN-SIL2
CONN-RS232,
FUENTE,
FUENTE_VIDEO,
PIN-RA1-RA2, PIN-RA3-RA4, VOLTAJE VDD-F,
VOLTA_12V
CONN-SIL1
CONN-12V
5
CONN-PUER-B,
PUER-B4
5
1
2
1
4
1
20MHZ
CRYSTAL-PIC1, CRYSTAL-PIC2, CRYSTAL-V,
X1, X2
1N5357BRL
DZ_5.1V
MAX232-2, MAX232_1
MAX232
MRCL-V
1k
PIC-1, PIC-2, PIC3, PIC4
PIC16F628A
VIDEO
PIC18F2525
1
9
CONN-PUER-B1-CONN- CONN-SIL7
Esquema módulo recibir datos, video (vista componentes)
Figura 3.4.3-4 Disposición de elementos de video, red y fuente
106
Esquema módulo recibir datos, video (vista soldadura)
Figura 3.4.3-5 Disposición de soldadura video, video y red
3.4.4 EXPLICACACION DEL PROGRAMA DEL PROYECTO
Diseño
El problema planteado es el siguiente:
Se debe controlar un monitor de TV analógico mediante un microcontrolador
PIC18F2525 y Dibujar en pantalla el abecedario, números 0 al 9 y operaciones
básicas.
Las especificaciones del problema son las siguientes:
•
Al encender el sistema el monitor de TV debe estar presentando la
pantalla de bienvenida.
•
El
microcontrolador
PIC18F2525
se
comunicará
con
cuatro
PIC16F628A los cuales almacenaran los datos provenientes de un
teclado.
107
Al recibir alguno de las letras del alfabeto minúsculas, mayúsculas, números o
alguno de los comandos de control, transmitida desde uno de los teclados, el
microcontrolador PIC18F2525 deberá desplegar en la pantalla de TV
comenzando desde el extremo superior izquierdo de la pantalla. Se deberá
pasar de línea cada vez que hay 16 caracteres en una línea de texto. Hay 5
líneas de texto como máximo de escritura para cada niño. Existen comandos
de control para el uso del controlador, recordar los comandos de control son
para cada teclado de los 4 existentes.
Los comandos de control son los siguientes:
•
TAB: Limpiar la pantalla.
•
ß: Borrar un carácter.
•
BARRA ESPACIADORA: espacio en blanco.
Por tanto el problema se puede dividir en cuatro problemas más elementales,
los cuales se resolverán separadamente. Estos son:
•
Generación de la señal de sincronización.
•
Generación del video.
•
Lectura de datos del puerto B del PIC que son enviados
por el
teclado.
•
Modificación de la información a desplegar en la TV como función de
lo que se recibe en la puerto B
Generación de la señal de sincronización
Esta señal consta de una sincronización vertical y horizontal.
Sincronización vertical
La sincronización se obtiene mediante la función Pulsos_Campo(), la cual
genera las señales de sincronización vertical tanto para el campo 1 como del
108
campo 2 para lo cual utilizamos la variable int campo para conocer si estamos
en el campo 1 o 2. Además, en esta subrutina se debe recalcar que se dibujan
las líneas de video de 1 a 9.2
Además la señal de sincronización es de 0.3V. El uno en la salida del micro es
de 5V, para bajar ese voltaje se realizará un divisor de tensión, como la
impedancia característica de una línea de coaxial es de 75 ohms, se colocará
la entrada coaxial de la TV en paralelo con una resistencia de 75 ohms.
Entonces con una resistencia de 1K al pin del micro se tendrá el divisor de
tensión.
Para hacer esto se presenta el siguiente código en C:
#use delay(clock=20000000)
#use fast_io(A)
#use fast_io(B)
//Declaración de variables
int8 i,p;
int8 Campo=0;//valor inicial es 0
void Pulsos_Campo_I(){
//6 post-sync
/* pulso bajo = 2,2
pulso alto = 29,2
*/
if(campo==1){
//2,6 sale de tiempo en el if(campo==1)(7 Instrucciones) F+entrara al for(5
Intrucciones )
delay_us(2); //necesito 2,6us para formar el pulso de la linea 262
delay_cycles(1);
output_low(pin_a0); //Sincro //2,6-0,4(2Inst)=2,2 us
//Aqui formamos el primer pulso de sincronismo vertical
delay_us(4); //4,4 genera tiempo para sincro
delay_cycles(2);
output_high(pin_a0); //Negro
109
delay_us(25);//27,2 - 0,6(3 Instr de la variable p y campo )-0,4(Goto else) 1(entrada al for)-= 25,2
delay_cycles(1);//27,2=tiempo de la linea de video(63,6)/2 y restado tiempo de
sincro h y resta 0,2 output
p=4;//p=4 para dibujar 4 pulsos cunado es el campo 2
campo=0;//campo =0 para activar el campo
}
else{
p=5; //p=5 para dibujar 5 pulsos cunado es el campo 1
campo=1;//campo = 1 para activar el campo
}
for(i=1;i<=6;i++){//6
output_low(pin_a0); //Sincro
delay_us(2);
//2,2us para sincro
delay_cycles(1);
output_high(pin_a0); //Negro
delay_us(28);//29,2 - 1,2(Ciclo Intermedio del For)= 28
}
//6 sincros verticales
/* pulso bajo = 26,8
pulso alto = 4,6
*/
output_low(pin_a0); //sincro
delay_us(26);
delay_cycles(4);
output_high(pin_a0); //negro
delay_us(3);
delay_cycles(3); //4,6-1(Ciclo Entrada al For)= 3,6
for(i=1;i<=5;i++){ //5
output_low(pin_a0); //sincro
delay_us(26);
delay_cycles(4);
output_high(pin_a0); //negro
110
delay_us(3);
delay_cycles(2); //4,6-1,2(Ciclo Intermedio del For)=3,4
}
//6 post-sync para los campos
/* pulso alto = 2,2
pulso bajo = 29,2
*/
output_low(pin_a0); //sincro
delay_us(2);
delay_cycles(1);
output_high(pin_a0); //negro
delay_us(28);
//29,2-1(Ciclo Entrada al For)=28,2
delay_cycles(1);
for(i=1;i<=p;i++){
output_low(pin_a0); //sincro
delay_us(2);
delay_cycles(1);
output_high(pin_a0); //negro
delay_us(28); //29,2 - 1,2(Ciclo Intermedio del For)= 28
}
output_low(pin_a0); //sincro
if(campo==0){
delay_us(1); //2,2 -0,4(0,2*2(instruciones entrar if(campo==0) en condicion V))
=1,8
delay_cycles(4);
//Aqui formamos completamente la linea de video 9
output_high(pin_a0); //negro
delay_us(60); //60,8
delay_cycles(4);
output_low(pin_a0); //sincro
111
//Este delay_cycles(3) uso para completar el tiempo de sincronizacion
horizontal para linea 10
delay_cycles(3);//Compenso los 3(Instruc) que usa el if(campo==0) en falso
}
}//Goto 0,4 us
Sincronización horizontal
La sincronización horizontal se a implementado en cada función, es decir cada
función será una línea de video en la cual ya esta implementado sincronismo
horizontal y Front Porch.
Para hacer esto se presenta el siguiente código en C:
Void Draw_Letras(){
//x=numero de líneas a repetir
#endasm
//Sincronización Horizontal (4.4us)+0,2(output)=4,6us
output_low(pin_a0); //sincronismo
delay_us(4);
delay_cycles(2);
//Back porch =4,8us +0,2(output)=5us
output_high(pin_a0); //negro
delay_us(4);
delay_cycles(4);
//Front Porch + 0,2(Output)= 2,2us
output_high(pin_a0); //negro
delay_us(10);// tiempo sobrante o disponible + 1 del //Front Porch
delay_cycles(3);//2us-0,6(Decfsz y Goto)=1,4us
}
112
Generación de video
Una vez que la señal de sincronización se ha dado, el microcontrolador debe
poner en el Pin_C0 del puerto C los píxeles3 correspondientes a la línea i de la
imagen4 del dato entrante por el puerto B. La imagen que representa al dato
serán guardados en un banco de memoria de impresión, cada una compuesto
de 256 registro.
Imagen de un carácter
La imagen que representa a cada dato que ingresa por el puerto B están
almacenados en matrices. Estas matrices se definen así:
•
int8 Matrix_Mayusculas[27][8]
•
int8 Matrix_Numeros04[5][8]
•
int8 Matrix_Minusculas[27][8]
•
int8 Matrix_Numeros59[5][8]
Cada imagen esta compuesta por 8 píxeles de ancho y 8 registros de cada
matriz de alto. Así en una matriz como: Matrix_Mayusculas[27][8] se podrá
almacenar la imagen de 27 caracteres del alfabeto. Por ejemplo el carácter A
utilizara
la fila 0 y las columnas 0 al 7 para guardar la imagen de dicho
carácter.
Entonces lo que hay que guardar en los registros por ejemplo para el carácter
A, en binario, sería:
Fila
columna
Valor Binario
Valor
Bits 765 43210
Hexadecimal
Ancho
1
0
00000000
0x00
1
00011000
0x1C
A
2
00100010
0x22
L
113
3
01000001
0x41
T
4
01111111
0x7F
O
5
01000001
0x41
6
01000001
0x41
7
01000001
0x41
Figura 3.4.4-1 Tabla de imagen del carácter A
Es decir los datos que representan a la imagen del carácter A en la memoria
del microcontrolador se guardarían Así:
Dirección de la memoria de Uc Valor
D00
0x00
D01
0x1C
D02
0x22
D03
0x41
D04
0x7F
D05
0x41
D06
0x41
D07
0x41
Figura 3.4.4-2 Tabla de almacenamiento de la imagen del carácter A en la memoria del Uc
Para hacer esto se presenta el siguiente código en C:
//Declaracion dela Matrix Direccion D00H
int8 Matrix_Mayusculas[27][8]={
//A
0x0,0x1C,0x22,0x41,0x7F,0x41,0x41,0x41
//B
0x00,0x3F,0x63,0x63,0x3F,0x63,0x63,0x3F,
//C
0x00,0x7E,0x7F,0x3,0x3,0x3,0x7F,0x7E,
114
//D
0x00,0x3F,0x43,0x43,0x43,0x43,0x43,0x3F
//E
0x00,0x7F,0x3,0x3,0x3F,0x3,0x3,0x7F,
//F
0x00,0x7F,0x3,0x3,0x3F,0x3,0x3,0x3,
//G
0x00,0x7E,0x43,0x3,0x7B,0x5B,0x43,0x7E,
//H
0x00,0x3,0x63,0x63,0x7F,0x63,0x63,0x63,
//I
0x00,0x7F,0x8,0x8,0x8,0x8,0x8,0x7F,
//J
0x00,0x7E,0x18,0x18,0x18,0x1B,0x1B,0x1E,
//K
0x00,0x63,0x33,0x1F,0xF,0x1F,0x33,0x63,
//L
0x00,0x3,0x3,0x3,0x3,0x3,0x3,0x7F,
};
#Locate Matrix_Mayusculas=0xD00
Y esto seria la imagen para el carácter A.
Por tanto la información sobre los valores que deben cargarse en los bancos
de memoria de impresión para formar un carácter, por ejemplo una ‘a’ o un ‘A’,
será guardada en una matriz de 27 o 5 filas y ocho columnas llamada
Matriz_xxxxx. Cada fila tiene la información para formar cada una de las 27
letras del alfabeto mayúsculas y minúsculas, los 10 dígitos decimales y el
espacio en blanco. Para cada carácter se necesitan, como se vio, 8 elementos
de la matriz.
115
Almacenamiento de la imagen en el banco de memoria de impresión
Ahora que se tiene la forma de desplegar la imagen del carácter guardada en
una matriz, se necesita saber cómo y en qué orden deben ir guardados los
píxeles del carácter en el registro del banco de memoria de impresión para
formar los caracteres, que se introducen por medio del teclado en la pantalla.
Ahora indicaremos la forma como se guardaran las imágenes en el banco de
memoria de impresión.
En pantalla se mostrara 5 líneas de texto que contendrá 16 imágenes de los
caracteres. Las líneas de texto se forma con los primeros 128 registros de uno
de los bancos de memoria de impresión5, obteniendo por cada banco de
memoria de impresión de 256 registros dos líneas de Texto. Por tanto para
obtener 5 líneas de texto utilizaremos 2 ½ Bancos de memoria de impresión del
microcontrolador.
Cada registro se guarda 8 bits. Cada bit será un píxel, por lo que se pueden
guardar 8 píxeles de la imagen total por cada registro. Como se despliegan 16
letras por cada línea de texto, cada línea de texto tendrá 128 registros y por
tanto 1024 píxeles. Una línea de texto esta formada por 8 líneas de video, es
decir cada línea de video imprimirá los primeros 16 registros del Banco de
memoria de impresión, la segunda línea de video imprimirá las siguientes 16
registros del Banco de memoria de impresión y así hasta las 8 líneas de video
en donde abra impreso en pantalla los 128 registros.
Aquí se guardara la imagen actual del dato que ingresa. Para modificar
cualquier píxel de esta imagen se debe alterar el correspondiente registro de
estos bancos de memorias.
Como la matriz tiene guardado en orden cada uno de los píxeles de la imagen
desde el primero al extremo superior izquierdo de la pantalla hasta el último en
el extremo inferior derecho, se debe guardar cada letra que sea parte de la
imagen actual en ese mismo orden.
116
Las imágenes son de ocho píxeles de ancho y además se define que una
imagen tiene ocho líneas de alto, se puede formar los píxeles de una imagen
en la pantalla, guardándolos en el Banco de memoria de impresión. Cada una
de las líneas de video que forman a la imagen están una directamente debajo
de la otra, los píxeles que forman a la imagen deben ser guardados cada 16
registros del Banco de memoria de impresión. Los primeros píxeles (registro)
de la imagen ocupara uno de los registros, de los 16 registros que posee la
primera línea de video, 16 registros después, se tendrá el que tiene los píxeles
de la segunda línea del imagen y así consecutivamente. Entonces, por ejemplo,
si el carácter a desplegar empieza en el registro 0, se necesita guardar las
siguientes los píxeles de la imagen en los siguientes registros del Banco de
memoria de impresión 16,32,64,80,96,112 .
Imagen
Para hacer esto se presenta el siguiente código:
Void LlenarScreen(){
#ASM
CLRF FSR0H
CLRF FSR0L
CLRF FSR1H
CLRF FSR1L
//Cargamos
a
los
registros
los
numeros
base
1=banco1....15=banco 15
//PARA SELECCIONAR EL BANCO SCREEN
MOVLB 0
MOVF DIRi_MATRIX,w //movemos 1 al registro W
MOVWF FSR1H //movemos el registro W a FSR1H
//PARA SELECCIONAR EL BANCO LETRAS y NUMEROS
CLRF W
117
0=banco
0
--
MOVF n_DIRi_SCREEN ,W //movemos EL CONTENIDO DE DIRECCION DEL
BANCO al registro W
MOVWF FSR0H //movemos w al registro FSR0H
//*******************************0****************************************
//INGRESO direccion del VECTOR screen a FSR0
MOVLW 0 //Cargamos el registro w con el valor de 16(ver vector screen)
ADDWF POS_LETRA_SCREEN,W //sumamos W+J
MOVWF FSR0L//movemos el valor de W a FSR0L
//INGRESO la direccion de la matrix a FSR1
MOVF POS_LETRA_MATRIX,W //Movemos el valor de POS _LETRA a W
MOVWF FSR1L
//Movemos W a FSR1L
MOVFF INDF1,INDF0
//*******************************1*****************************************
//INGRESO direccion del VECTOR screen a FSR0
MOVLW 16 //Cargamos el registro w con el valor de 16(ver vector screen)
ADDWF POS_LETRA_SCREEN,W //sumamos W+J
MOVWF FSR0L//movemos el valor de W a FSR0L
//INGRESO la direccion de la matrix a FSR1
INCF FSR1L,F
MOVFF INDF1,INDF0
...
...
Código completo en anexos
}
Por tanto para generar todas las imágenes ya en pantalla de TV, se deben
poner en el Pin 0 del puerto C cada uno de los bits de cada uno de los píxeles
118
del Banco de memoria de impresión. Para hacer esto se presenta el siguiente
código en C:
Void Draw_Letras(){ //x=numero de lineas a repetir
#asm
CLRF FSR0H
CLRF FSR0L
CLRF PORTC
CLRF W
MOVF DIRi_SCREEN ,W //movemos EL CONTENIDO DE DIRECCION DEL
BANCO al registro W
MOVWF FSR0H //movemos w al registro FSR0H
MOVLW
0 //movemos EL CONTENIDO DE DIRECCION DEL BANCO al
registro W
MOVWF FSR0L //movemos w al registro FSR0H
//total = 8(instrucciones de ingreso)
//*************************** INICIO DEL BUCLE *********************************
Loop:
#endasm
//Sincronización Horizontal (4.4us)+0,2(output)=4,6us
output_low(pin_a0); //sincronismo
delay_us(4);
delay_cycles(2);
//Back porch =4,8us +0,2(output)=5us
output_high(pin_a0); //negro
delay_us(4);
delay_cycles(4);
//63,4-4,4-4,8-0,4-2,2=51,6us
119
//******************IMAGEN********** Tiempo disponible = 51,6
delay_us(7);
#asm
//Letra 1
MOVFF INDF0,PORTC //2 ciclos
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
INCF FSR0L,F //total 11(Instrucciones)=
//Letra 2
MOVFF INDF0,PORTC //2 ciclos
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
INCF FSR0L,F //total 11(Instrucciones)=
…………..
#asm
DECFSZ N_LineasVideo,F
GOTO Loop
BCF
0xF89.0 // enceramos pin_a0 sincronismo
CLRF FSR0H
CLRF FSR0L
120
#endasm
DIRi_SCREEN++;
//Tiempo de Salid 7(Instrucciones)=7*0,2=1,4 us
}
Lectura de datos del puerto B introducidos por el teclado
Los datos serán leídos en una variable llamada ‘Dato’.
Debido a que la
mayoría del tiempo el micro esta ocupado generando los píxeles de la imagen
actual, se debe dividir toda esta tarea en segmentos cortos, los cuales el micro
debe ejecutar en menos de 63,4us tiempo máximo del que se puede disponer
mientras el haz de electrones del tubo pinta una línea de video en la pantalla
El código en C para leer un dato se describe a continuación.
La función int LeerDato() permite leer un dato que se encuentre en el puerto B
del Microcontrolador y la almacena en la variable Dato. Esta función
básicamente lee el puerto B por cuarenta 40 us,
void int LeerDato(){
i1=40;//40 valor 2(Inst)
PORTA=U1;//2
//delay_us(4);//quitar
#asm
Loop1:
MOVFF PORTB , DATO //2
DECFSZ i1,F
//1
BRA Loop1
//2
#endasm
//Tiempo
Total=
5(Instruccione)*0.2*i1(=40)
+0,4us(PORTA=U1)+0,4(PORTA=1) =41,2us
//41,2-0,4(Dato1=Dato;)=40,8-4(delay_us(4))=36,8us
PORTA=1;
Dato1=Dato;
}
121
+
0,4us(i1=40)
Traducción del Dato ingresado
Si el dato que esta guardado en la variable Dato es una letra o un dígito
decimal, el mismo deberá ser traducido, para conocer el Banco de memoria
donde esta guardado y su registro de inicio dentro del banco, para lo cual
utilizamos las variables
DIRi_MATRIX y POS_LETRA_MATRIX. El arreglo
matriz contiene la información para formar la imagen de un carácter en cada fila
en el siguiente orden: ‘a’ en la fila 0, ‘b’ en la fila 1, ‘c’ en la fila 2 y así hasta
llegar al ‘z’ en la fila 28. Entonces, si el dato recibido del teclado es un 3, se
debe decodificar en un 24. Esa es la posición donde se encuentra los primeros
píxeles para formar una imagen que se encuentran guardados en matriz. Ese
número (24) se guarda en la variable POS_LETRA_MATRIX.
El código para realizar esta función se muestra a continuación.
Función ClasificarLetra
La función int ClasificarLetra() se emplea para calcular la posición de la letra
en el banco de memoria de letras y números. Recibe como entrada a la
variable Dato y entrega la dirección del banco de memoria y la posición de
inicio de registro donde se encuentra la letra deseada.
void int ClasificarLetra(){
//Clasificacion del dato
//LOS numeros 1 al 1f(32) son la codificacion 0 = A 1=B.....30=/ 31 = *
//Las letras A a la Z y Signos estan en Banco de memoria 6
//LOS numeros 0x20(32 d) al 0x29(41 ) son la codificacion 32 = 0 33=1.....40=8
41 = 9
//Las letras A a la Z y Signos estan en Banco de memoria 6
//********************************************************************
if(DATO >=0x01){
122
if(DATO <=0x20){
Bandera_N_Letra=0;
DIRi_MATRIX=13;
DATO=DATO-1;
POS_LETRA_MATRIX=8*DATO;
}
else{
//total=19(Istrucciones)-9(Instruccinoes)=10(Instrucciones)*0,2=2us
delay_us(2);
}
}
else{
//total=19(Istrucciones)-4(Instruccinoes)=15(Instrucciones)*0,2=3us
delay_us(3);
}//Total=19(Instrucciones)*0,2=3,8us
}
Modificación de la información a desplegar en la TV como función de lo
que se recibe en la Puerto B
Una vez se tiene el valor de el dato se deben tomar decisiones sobre que se
debe hacer, basadas en ese dato leído.
Se debe escoger entre tres posibilidades: Poner un carácter inmediatamente a
la derecha del último carácter introducido, (siempre y cuando no se hallan
escrito 16 caracteres antes en la misma línea de texto), borrar el último carácter
introducido o limpiar la pantalla completamente. Debe haber diferencia al hablar
de línea de pantalla y línea de texto, pues las primeras son las que forman la
imagen, y las segundas son relevantes al tamaño y forma de las letras que se
están visualizando. Recordando los caracteres de control se tiene:
•
TAB: Limpiar la pantalla.
123
•
ß: Borrar un carácter.
•
BARRA ESPACIADORA: espacio en blanco.
Si el dato recibido es un TAB, se debe limpiar la pantalla. Para hacer esto, se
debe cargar 0x00 en los 3 Bancos de memoria de impresión. Para hacer esto
se define las funciones.
void int Borrar_Screen11() //Carga con 0 los registros del banco de memoria
0x100
void int Borrar_Screen12() //Carga con 0 los registros del banco de memoria
0x200
void int Borrar_Screen13() //Carga con 0 los registros del banco de memoria
0x300
La definición de una de esta función se presenta a continuación:
void int Borrar_Screen13(){
//Inico del tiempo de la imagem
if( BorrarScreen==0){
//emplea 3(Ins) el if para entrar en V
int8 Ce[256]={0x0};
#Locate Ce=0x300 //Ocupamos todos los registros del Banco1
//tiempo total=257+3(inicio if)+2(Bra)=262*0,2us=52,4us
BorrarScreen=1;
//delay_cycles(1);
}
else{
//emplea 4(Ins) el if para entrar en F
delay_us(51); //262 - 4 = 258*0,2us=51,6us
delay_cycles(3);
}
}
124
Guardando un carácter en el Banco de memoria de impresión
Si el dato introducido es un carácter válido, el mismo debe ser desplegado
según el orden y lugar ya descrito. Los cambios al Banco de memoria de
impresión deben ser hechos en un orden según la posición final que cada
carácter tendrá en la pantalla. Ya se discutió que las imágenes del Banco de
memoria de impresión asociados a la información de un carácter están
separadas cada 16 imágenes, pues es así como se podrá tener el efecto de
proyectar una línea de píxeles del carácter inmediatamente debajo del anterior.
Dicho espaciamiento entre elementos debe permanecer constante sin importar
la posición del carácter en la pantalla. Sin embargo, de que depende la
posición de un carácter en la pantalla?. La posición de un carácter en la
pantalla depende de cuál es el número de registro que guarda la primera línea
de 8 píxeles del mismo. Por ejemplo, si el primer registro que guarda la
información de un carácter cualquiera es 0x100, ese carácter cualquiera estará
ubicado en la esquina superior izquierda de la pantalla. Una carácter que esté a
su lado derecho sobra la misma línea de texto, tendrá almacenado en 0x101 de
su primer línea de píxeles. Además, un carácter que esté inmediatamente
debajo del carácter correspondiente a 0x100, tendrá su primer registro en
0x110.
Dicho patrón se aplica para hallar la posición de cualquier letra en la pantalla.
Si ubicamos la posición de una letra mediante las variables N_LINEA_TEXTO1
y N_Letra1, donde N_Letra1 contabiliza el número de letras por línea de texto
y N_LINEA_TEXTO1 representa la línea de texto en la cual se encuentra la
letra, se puede calcular el número que corresponde al primer registro
relacionado a un imagen mediante la fórmula:
POS_LETRA_SCREEN=N_LINEA_TEXTO1*128+N_Letra1;
Formula para calcular la última posición de una letra escrita
125
Donde POS_LETRA_SCREEN representa el registro que contiene la primera
línea de píxeles de una letra cualquiera. Los siguientes 7 elementos que
contienen
el
resto
de
la
información
están
en
las
posiciones
POS_LETRA_SCREEN +16, …, POS_LETRA_SCREEN +112. Entonces,
N_LINEA_TEXTO1 y N_Letra1 tienen el registro de la posición de la última
letra escrita.
El código en C que realiza las decisiones sobre cómo calcular y cuándo activar
las banderas de control para la llamada a las funciones anteriores se presenta
a continuación.
Función Tratar_Letra()
La función int Tratar_Letra() se emplea para calcular la posición de la letra en
el banco de memoria de letras y números. Recibe como entrada a la variable
Dato y entrega la dirección del banco de memoria y la posición de inicio de
registro donde se encuentra la letra deseada
void int Tratar_Letraxx(){
//tiene 4(ifs en V)+9(inst)+4(2 BRA) en V=17(Ins)
//tiene 3(if en F)
if(CondisionPresentacion==0){
if(DATO1 == 0){
POS_LETRA_SCREEN =N_LINEA_TEXTO4*128+N_Letra4;
POS_LETRA_MATRIX=0;// posicion del caracter en la memoria 15
DIRi_MATRIX=15;//15
}
else{
//17-5=12*0,2 = 2,4us
delay_us(2);
delay_cycles(2);
}
}
126
else{
//17-3=14*0,2 = 2,8us
delay_us(2);
delay_cycles(4);
}
//*************************If para Borrar screen *****************************
//Este rutina se demora 16(Inst)
//ESTA RUTINA SE ME DEMORA 16 INSTRUCIONES EN V O f tiempo total =
16*0,2=
3,2 us//
if(Borrar4==0){
if(Bandera_N_Letra==0){
//entrar los 2 if en v se demora 4(Inst)
//Borro vector
BorrarScreen4=0;
N_Letra4=0;
N_LINEA_TEXTO4=0;
TN_LINEA_TEXTO4=0; //_aumentado
POS_LETRA_SCREEN=0;
Bandera_N_Letra=1;
Borrar4=1;
}
else{
//entrar los 1 if en v y otro if en f se demora 5(Inst)+2(BRA)=7(Ins)
//16-7=9(Ins)*0,2=1,8
Bandera_N_Letra=1; //2(Ins)*0,2=0,4
delay_us(1);
delay_cycles(2);
}
}
else{
//entrar los primer if en f se demora 3(Inst)=3(Ins)
////16-3=13(Ins)*0,2=2,6
Bandera_N_Letra=1;
delay_us(2);
127
delay_cycles(1);
}
//La variables DIRi_SCREEN se cambia a 4 ,7 o 10 para los demas personajes
DIRi_SCREEN=10;//0,4us
}
La función para poner un carácter en la pantalla se llama LlenarScreen(). Se le
deben pasar los valores de
DIRi_MATRIX: Dirección del Banco de memoria donde se encuentra la
imagen
n_DIRi_SCREEN: Dirección del Banco de memoria donde se guarda la
imagen
POS_LETRA_SCREEN: Posición de inicio de la imagen en el Banco
de memoria de imagen
POS_LETRA_MATRIX : Posición de inicio de registro de una imagen en
matriz
Borrar un carácter
En el caso de que el comando introducido por el teclado sea el de borrar el
último carácter (DATO1 = 127), se mantendrán sin cambio los valores de
N_LINEA_TEXTO1 y N_Letra1 y se grabarán ceros en el Banco de memoria
de imagen
partiendo del valor calculado de POS_LETRA_SCREEN. Se
utilizará la función Tratar_Letra() solamente que se tendrá el valor
que
corresponde al espacio en blanco en la matriz y la función LlenarScreen()
llenara con ceros los registros pertenecientes a esa imagen del carácter.
El código en C que realiza las decisiones:
//*********************BORRAR
UNA
LETRA******************************
if (DATO1 == 127){
//cuando if (DATO == 127) V 3(Ins)
//cuando if (DATO == 127) F 4(Ins)
//********** esta codigo ocupa 17(ins) *******************
128
POS_LETRA_SCREEN=N_LINEA_TEXTO4*128+N_Letra4;
if(TN_LINEA_TEXTO4!=0){//3(Ins) en F
//2(ins) en verdad
if(N_LINEA_TEXTO4==0){//3(Ins) en F
//2(ins) en verdad
if(N_Letra4==0){//3(Ins) en F
//2(ins) en verdad
//6(ins) en verdad todo los if
N_Letra4=16;
N_LINEA_TEXTO4=1;
TN_LINEA_TEXTO4--;
}
else{
//17(Ins)-11(Ins)=6*0,2=1,2us
delay_us(1);
delay_cycles(1);
}
}
else{
//17(Ins)-7(Ins)=10*0,2=2us
delay_us(2);
}
}
else{
//17(Ins)-3(Ins)=14*0,2=2,8us
delay_us(1);
delay_cycles(4);
}
//************************************************************************
if (N_LINEA_TEXTO4==0){
if (N_Letra4==0){//14-8=6(Ins)*0,2)1,2
129
delay_us(1);
delay_cycles(1);
}
else if(N_Letra4!=0){
N_Letra4=N_Letra4-1;
POS_LETRA_MATRIX=8;
DIRi_MATRIX=15;
}
}
else if(N_Letra4==0){
N_LINEA_TEXTO4=N_LINEA_TEXTO4-1;
N_Letra4=15;
POS_LETRA_MATRIX=8;
DIRi_MATRIX=15;
}
else if(N_Letra4!=0){
N_Letra4=N_Letra4-1;
POS_LETRA_MATRIX=8;
DIRi_MATRIX=15;
delay_cycles(1);
}
El código en C que realiza cómo cuándo hacer las llamadas a las funciones
anteriores se presenta a continuación.
Programa principal
Esta rutina permite ejecutar las funciones para generar la señal de video NTSC
de televisión.
Dentro de función principal main se a implementado un while, dentro del este
while se a implementado las funciones que permiten generar las señal de
video, las funciones de lectura del puerto B, los comandos de control para los
cuatro teclados y las funciones que son necesarias para realizar la escritura
en la pantalla de televisión.
130
Toda función se ejecuta en un tiempo aproximado de 63.4us que es el tiempo
que se tarda en dibujar en pantalla una línea horizontal (Ver teoría de video).
Para la lectura de los datos de cada teclado se a utilizado la variable U1 la cual
toma valores de:
•
3:
Activa la interrupción de PIC Teclado 1
•
5:
Activa la interrupción de PIC Teclado 1
•
9:
Activa la interrupción de PIC Teclado 1
•
17: Activa la interrupción de PIC Teclado 1
Con el fin de obtener salidas por el puerto A para activar la interrupción
RB0/INT de cada PIC16F628, el cual le indica que tiene que enviar un dato.
El código en C que realiza estas acciones son:
Se comienza con la definición de las librerías utilizadas y las variables globales.
#include <18F2525.h>
//#fuses
HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP
//
Opciones de configuración
#fuses
NOWDT,NOWDT,HS,
NOPROTECT,
NOIESO,
NOBROWNOUT,
BORV21, NOPUT, NOCPD, NOSTVREN, NODEBUG, NOLVP, NOWRT,
NOWRTD, NOEBTR, NOCPB, NOEBTRB, NOWRTC, NOWRTB, NOFCMEN,
NOXINST, NOPBADEN, NOLPT1OSC, NOMCLR
#use delay(clock=20000000)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#include<Cargar_Datos.h> //Cargamos Todas Los Datos de las Matrix y Screen
#include<Cargar_Presentacion.h>
#include <Sincronismov1.h>
#include <Video.h>
#include <Funciones.h>
131
//********************
PROGRAMA PRINCIPAL ***********************************
Void Main() {
set_tris_A (0b00000000);
set_tris_C (0b00000000);
set_tris_B (0b11111111);
output_A(0);
output_B(0);
delay_us(200);
While(TRUE){
//Linea 1 - 9
Pulsos_Campo_I();//Goto usa 0,4 us entrar
//Goto usa 0,4 us salir
//******************************* VIDEO ********************
//LINEA 10
delay_us(3);
//4,4 -0,6(0,2*3(Intruciones del IF(campo==0) en falso)) -
GotoSalir(0,4) =3,4
delay_cycles(2);
output_high(pin_a0); //negro
delay_us(56); //58,6 -entrar funcionLineasBoN(0,8)-entradao for(1) = 56,8
delay_cycles(4);//4
//LINEA 11 - 25
LineasNegras(15);//usa 0,8 /15
//*********************Impresion del 1 niño*****************************
//Linea 26
delay_us(4); //4,4 - GotoSalir(0,4) =4
output_high(pin_a0); //negro
delay_us(57); //58,6 -(0,4)goto funcion LerrDato-0,4(U1=3)=57,8us
delay_cycles(2);//2
U1=3; //esta variable controla las INT 3=PIC1 , 5=PIC2 , 9==PIC3 ,17=PIC4
//Llamada a las funciones
//Cada función es una línea
//Linea 27 a 33
132
LeerDato();
ClasificarLetra();
Tratar_Letra();
Borrar_Screen11();
Borrar_Screen12();
Borrar_Screen13();
LlenarScreen();
//Linea 34
delay_us(4); //4,4 - GotoSalir(0,4) =4
output_high(pin_a0); //negro
delay_us(56); //58,6 -((0,4)goto funcion Draw_Letras+0,2*8(Inst de inicio de la
funcion Draw Letras))=56,6us
delay_cycles(2);
N_LineasVideo=16;
//Linea 35 a la 50
Draw_Letras();//forma 16 lineas
} }
Diagramas
Diagramas del variables y funciones
Figura 3.4.4-3 Diagrama de variables y funciones
133
Diagrama de Actividades
Figura 3.4.4-4 Diagrama de actividades
134
Diagrama de secuencia
Figura 3.4.4-5 Diagrama de secuencias
Lectura de los datos de la señal RS 232 enviados por el teclado
Para comunicarse con el teclado, el microcontrolador PIC16F628 debe
conectarse a través de un chip max232 para acoplar los voltajes. Una vez que
se ha conectado el micro con el teclado, los datos serán leídos en una variable
llamada Dato.
135
El código en C para leer un dato RS-232 se describe a continuación.
#use rs232(baud=57600,rcv=PIN_A0) //Encabezado
dato=getc();
El dato obtenido se recibe en código ASCII.
El dato obtenido lo transformamos para enviarlo al PIC de video, este dato
transformado es el que es utilizado por la función ClasificarLetra() de PIC video
para encontrar la poción que ocupa la letra en matriz.
El código para realizar esta transformación se muestra a continuación.
switch (dato) //Identifica el dato de la entrada y lo relaciona con la variable
matriz
{
case 'A':
c=1;
break;
case 'B':
c=2;
break;
case 'C':
c=3;
break;
case 'D':
c=4;
break; }
Envió del un dato transformado
El envió del dato se lo realiza cada petición de la interrupción RB0/INT
El código para realizar esta el envió del dato es:
#int_EXT
136
EXT_isr(){
set_tris_b(0b00000001);
//SEDEMORA 15(iNS) PARA LLEGAR AL output_B(dato1);
delay_us(1);
delay_cycles(3);
if(i!=0){
output_B(dato1);
delay_us(70);
output_B(0);
i=0;
}
else{
output_B(0);
delay_us(70);
}
set_tris_b(0b11111111);
}
Diagramas
Diagramas del variables y funciones
Figura 3.4.4-6 Diagrama de de funciones
137
Diagrama de Actividades
Figura 3.4.4-7 Diagrama de actividades
Diagrama de secuencia
Figura 3.4.4-8 Diagrama de secuencias
138
CAPITULO IV
Software
139
CAPITULO IV SOTWARE
4 DISEÑO Y CONSTRUCCIÓN DE SOFTWARE
4.1 MANUAL PIC C COMPILER
Índice
•
1.INTRODUCCIÓN
•
2.ELEMENTOS DEL SOTWARE
•
3.OPERADORES Y EXPRESIONES
•
4. DESCRIPCIÓN DE INSTRUCCIONES
4.1.1 INTRODUCCIÓN
Figura 4.1.1-1 Pantalla principal
Si queremos realizar la programación de los microcontroladores PIC en un
lenguaje como el C, es preciso utilizar un compilador de C.
Dicho compilador nos genera ficheros en formato hexadedimal, que es el
necesario
para
programar
(utilizando
microcontrolador de 6, 8, 18 ó 40 pines.
140
un
programador
de
PIC)
un
El compilador de C que vamos a utilizar es el PCW de la casa CCS Inc. A su
vez, el compilador lo integraremos en un entorno de desarrollo integrado (IDE)
que nos va a permitir desarrollar todas y cada una de las fases que se compone
un proyecto, desde la edición hasta la compilación pasando por la depuración
de errores. La última fase, a excepción de la depuración y retoques hardware
finales, será programar el PIC.
Al igual que el compilador de Turbo C, éste "traduce" el código C del archivo
fuente (.C) a lenguaje máquina para los microcontroladores PIC, generando así
un archivo en formato hexadecimal (.HEX). Además de éste, también genera
otros seis ficheros, tal como se observa en la figura de la siguiente página.
Finalmente, presentaremos apuntes en soporte electrónico, es una experiencia
nueva y que como toda prueba tiene sus riesgos, aunque esperamos y
deseamos que, de una u otra forma logremos prender la llama de la ilusión, o
por lo menos despertar el interés por el estudio de la electrónica y en particular
de este mundo maravilloso de la programación en C y los microcontroladores.
4.1.2. ELEMENTOS DEL SOFTWARE
Figura 4.1.2-1 Barra de herramientas
Posee elementos básicos fáciles de manipular como abrir un archivo guardado,
pero unas de las grandes ventajas es la creación rápida, clara y e manera
sencilla de un nuevo proyecto, el compilador es
capaz de setear
automáticamente los parámetros de inicio o cabecera del programa.
141
Crear un nuevo archivo
Figura 4.1.2-2 Creación de un nuevo proyecto
1.- El programa pedirá l ubicación de donde se desee grabar el archivo.
Figura 4.1.2-3 Escoger donde guardar el proyecto
142
2.- Aparece una segunda pantalla que permite definir:
Figura 4.1.2-4 Configuración de parámetros internos del código
•
Pic
•
Oscilador (interno(si el pic posee), externo)
•
Seteos en general
3. En la parte inferior se muestran unas pestañas que permiten ir cambiando
sus valores como por ejemplo:
Figura 4.1.2-5 Pestañas de configuración de parámetros
•
Comunicación RS 232
•
Definir pines del pic (entradas, salidas)
•
Librerías que se puedan incluir.
143
4. Finalmente aceptados, y se mostrará la siguiente cabecera.
Figura 4.1.2-6 Visualización de parámetros seteados
Depuración de código
Figura 4.1.2-7 Proceso de compilación de código
144
Una de las principales características que posee el compilador es la posibilidad
de realizar una depuración fácil y sencilla, también tiene la capacidad de
mostrar la capacidad actual de la memoria interna del microcontrolador y saber
si hay o no espacio para que pueda ser grabado el programa en el pic.
De tal manera se puede saber antes de comprar el microcontrolador si este
tiene la capacidad suficiente y evitar que se pueda hacer una mala elección y
pérdida de dinero.
4.1.3. OPERADORES Y EXPRESIONES
• Operadores de asignación
Una expresión de asignación tradicional es de la forma:
expr1 = expr1 operador expr2 , es decir, i = i + 5
Esta expresión se puede representar por otra forma más corta:
expr1 operador= expr2
siguiendo con el mismo ejemplo i += 5.
Es en las expresiones complejas, y no en una tan simple como la del ejemplo,
donde se puede apreciar la conveniencia de usar esta notación. La siguiente
tabla resume los operadores de asignación compuesta y su significado.
Operador Descripción
Figura 4.1.3-1 Cuadro de asignación de operación
145
Los operadores aritméticos se usan para realizar operaciones matemáticas.
Se listan en la siguiente tabla:
Operador Descripción
Ejemplo
Figura 4.1.3-2 Descripción de los operadores
• Operadores relacionales
Su misión es comparar dos operandos y dar un resultado entero:
1 (verdadero); 0 (falso).
La siguiente tabla ilustra estos operadores:
Figura 4.1.3-3 Cuadro de operadores de relación
146
• Operadores lógicos
Al igual que los operadores relacionales, éstos devuelven 1 (verdadero), 0
(falso) tras la evaluación de sus operandos. La tabla siguiente ilustra estos
operadores.
Figura 4.1.3-4 Cuadro de operadores lógicos
• Operadores de manejo de bits
Estos operadores permiten actuar sobre los operandos a nivel de bits y sólo
pueden ser de tipo entero (incluyendo el tipo char). Son los que siguen:
Figura 4.1.3-5 Cuadro de operadores de bit
• Operadores de incremento y decremento
Aunque estos operadores forman parte del grupo de operadores de
asignación, hemos preferido separarlos en aras a una mayor claridad. Su
comportamiento se asemeja a las instrucciones de incremento incf f,d del
ensamblador del µcontrolador PIC 16F84 o inc variable del Intel 8051.
147
Operador Descripción
Figura 4.1.3-6 Cuadro de operadores de incremento, decremento
• Operadores de desplazamiento de bits
Los operadores de desplazamiento otorgan al C capacidad de control a bajo
nivel similar al lenguaje ensamblador. Estos operadores utilizan dos operandos
enteros (tipo int): el primero es el elemento a desplazar y el segundo, el
número de posiciones de bits que se desplaza. Se resumen en la siguiente
tabla:
Operador Descripción
Figura 4.1.3-7 Cuadro de desplazamiento de bit
• Expresiones
Figura 4.1.3-8 Cuadro de representación de formatos
148
4.1.4 DESCRIPCIÓN DE INSTRUCCIONES
A continuación se describen todas y cada una de las directivas del compilador
que utilizaremos para programar los microcontroladores PIC.
•
#ASM
#ENDASM
Las líneas entre #ASM y #ENDASM se tratan como código ensamblador. La
variable predefinida _RETURN_ puede utilizarse para asignar un valor de
retorno a la función desde el código en ensamblador, hay que tener presente
que cualquier código C después de ^I^B #ENDASM ^i^b y antes del final de la
función puede falsear el valor de retorno. La sintaxis de los comandos en
ensamblador se describen en la tabla.
Ejemplo:
int paridad (int dato) {
int contador;
#asm
movlw 8
movwf contador
movlw 0
lazo:
xorwf dato,w
rrf dato,f
decfsz contador,f
goto lazo
movwf _return_
#endasm }
149
Figura 4.1.4-1 Instrucción es en assembler
•
#ZERO_RAM
Directiva que pone a cero todos los registros internos que pueden usarse para
mantener variables, antes de que comience la ejecución del programa.
•
#IF expresión_constante
#ELSE
#ENDIF
El pre-procesador evalúa la expresión_constante y si es distinta de cero
procesará las líneas hasta el #ELSE que es opcional o en su defecto hasta el
#ENDIF.
150
Ejemplo:
#if (a + b + c) > 8
printf(" Demasiados parámetros ");
#endif
•
#INCLUDE <Nombre_Fichero>
#INCLUDE “Nombre_Fichero”
Esta directiva hace que el compilador incluya en el fichero fuente el texto que
contiene el archivo especificado en <Nombre_Fichero>.
Si el nombre del fichero se incluye entre los símbolos '< >' el compilador busca
el fichero en el directorio INCLUDE.
Si se pone entre comillas dobles " " el compilador busca primero en el directorio
actual o directorio de trabajo y si no lo encuentra, entonces lo busca en los
directorios INCLUDE del compilador.
Ejemplo:
#include <16F54.H>
#include "reg_C84.h"
•
#INT_xxx función_de_interrupción
Estas directivas especifican que la función que le sigue es una función de
interrupción. Las funciones de interrupción no pueden tener ningún parámetro.
Como es natural, no todas las directivas pueden usarse con todos los
dispositivos. Las directivas de este tipo que disponemos son:
151
Figura 4.1.4-2 Opciones de la instrucción Interrupción
El compilador salta a la función de interrupción cuando se detecta una
interrupción. Es el propio compilador el encargado de generar el código para
guardar y restaurar el estado del procesador.
También es el compilador quien borrará la interrupción (el flag). Sin embargo,
nuestro
programa
es
el
encargado
de
llamar
a
la
función
ENABLE_INTERRUPT() para activar previamente la interrupción junto con el
señalizador (flag) global de interrupciones.
•
#USE DELAY (CLOCK=frecuencia)
Esta directiva indica al compilador la frecuencia del procesador, en ciclos por
segundo, a la vez que habilita el uso de las funciones DELAY_MS() y
DELAY_US(). Opcionalmente podemos usar la función restart_WDT() para
que el compilador reinicie el WDT durante el retardo.
Ejemplos:
#use delay (clock=20000000)
#use delay (clock=32000, RESTART_WDT)
152
•
#USE FAST_IO (puerto)
Esta directiva afecta al código que el compilador generará para las instrucciones
de entrada y salida. Este método rápido de hacer I/O ocasiona que el
compilador realice I/O sin programar el registro de dirección. El puerto puede
ser A-G.
Ejemplo:
#use fast_io(A)
•
#USE FIXED_IO (puerto_OUTPUTS=pin_x#, pin_x#...)
Esta directiva afecta al código que el compilador generará para las instrucciones
de
entrada y salida. El método fijo de hacer I/O causará que el compilador genere
código para hacer que un pin de I/O sea entrada o salida cada vez que se
utiliza. Esto ahorra el byte de RAM usado en I/O normal.
Ejemplo:
#use fixed_io(a_outputs=PIN_A2 ,PIN_A3)
•
# USE RS232 (BAUD=baudios, XMIT=pin, RCV=pin)
Esta directiva le dice al compilador la velocidad en baudios y los pines
utilizados para la I/O serie. Esta directiva tiene efecto hasta que se encuentra
otra directiva RS232.
La directiva #USE DELAY debe aparecer antes de utilizar #USE RS232. Esta
directiva habilita el uso de funciones tales como GETCH, PUTCHAR y
PRINTF. Si la I/O no es estándar es preciso poner las directivas FIXED_IO o
FAST_IO delante de #USE RS232
153
Opciones:
Figura 4.1.4-3 Opciones de la instrucción #USE RS232
* #USE STANDARD IO (puerto)
Esta directiva afecta al código que el compilador genera para las instrucciones
154
de entrada y salida. El método estándar de hacer I/O causará que el
compilador genere código para hacer que un pin de I/O sea entrada o salida
cada vez que se utiliza. En los procesadores de la serie 5X esto necesita un
byte de RAM para cada puerto establecido como I/O estándar.
Ejemplo:
#use standard_io(A)
•
c= GETC()
c= GETC()
c= GETC()
Estas funciones esperan un carácter por la patilla RCV del dispositivo RS232 y
retorna el carácter recibido.
Es preciso utilizar la directiva #USE RS232 antes de la llamada a esta función
para que el compilador pueda determinar la velocidad de transmisión y la
patilla utilizada. La directiva #USE RS232 permanece efectiva hasta que se
encuentre otra que anule la anterior.
Los procedimientos de I/O serie exigen incluir #USE DELAY para ayudar a
sincronizar de forma correcta la velocidad de transmisión. Recordad que es
necesario adaptar los niveles de voltaje antes de conectar el PIC a un
dispositivo RS-232.
Ejemplo:
printf("Continuar (s,n)?");
do {
respuesta=getch();
} while(respuesta!='s'&& respuesta!='n');
);
155
•
GETS(char *string)
Esta función lee caracteres (usando GETC()) de la cadena (string) hasta que
encuentra un retorno de carro(valor ASCII 13). La cadena se termina con un 0.
•
PUTC()
PUTCHAR()
Estas funciones envían un carácter a la patilla XMIT del dispositivo RS232. Es
preciso utilizar la directiva #USE RS232 antes de la llamada a esta función para
que el compilador pueda determinar la velocidad de transmisión y la patilla
utilizada. La directiva #USE RS232 permanece efectiva hasta que se encuentre
otra que anule la anterior.
Ejemplo:
if (checksum==0)
putchar(ACK);
else
putchar(NAK); // NAK carácter de respuesta negativa
•
PUTS(string)
Esta función envía cada carácter de string a la patilla XMIT del dispositivo
RS232. Una vez concluido el envío de todos los caracteres la función envía un
retorno de carro CR o RETURN (ASCII 13) y un avance de línea LF o LINE FEED (ASCII 10).
Ejemplo:
puts( " ---------- " );
puts( " | HOLA |" );
puts( " ---------- " );
156
•
PRINTF([function],string,[values])
La función de impresión formateada PRINTF saca una cadena de caracteres al
estándar serie RS-232 o a una función especificada.
El formato está
relacionado con el argumento que ponemos dentro de la cadena (string).
Cuando se usan variables, string debe ser una constante. El carácter % se pone
dentro de string para indicar un valor variable, seguido de uno o más caracteres
que dan formato al tipo de información a representar.
Si ponemos %% obtenemos a la salida un solo %. El formato tiene la forma
genérica %wt, donde w es optativo y puede ser 1,2,...,9. Esto es para
especificar cuántos caracteres son representados; si elegimos el formato
01,...,09 indicamos ceros a la izquierda, o también 1.1 a 9.9 para representación
en punto flotante.
t es el tipo de formato y puede ser uno de los siguientes:
Figura 4.1.4-4 Opciones de la instrucción PRINTF
Ejemplos:
byte x,y,z;
printf (" Hola ");
printf("RTCCValue=>%2x\n\r",get_rtcc());
printf("%2u %X %4X \n\r",x,y,z);
printf(LCD_PUTC, "n=%c",n);
157
•
KBHIT()
Esta función devuelve TRUE si el bit que se está enviando al pin RCV de un
dispositivo RS232, es el bit de inicio de un carácter. Es preciso utilizar la
directiva #USE RS232 antes de la llamada a esta función para que el
compilador pueda determinar la velocidad en baudios y la patilla utilizada. La
directiva #USE RS232 permanece efectiva hasta que se encuentre otra que
anule la anterior.
Ejemplo:
keypress=' ';
while ( keypress!='Q' ) {
// entramos al bucle while
if ( kbhit () )
keypress=getc();
if (!input(PIN_B2))
// en la variable keypress se guardan los caracteres
// inicio del envío de un byte
output_high(PIN_B3);
else
output_low(PIN_B3)
}
•
INPUT(pin)
Devuelve el estado '0' o '1' de la patilla indicada en pin. El método de acceso de
I/O depende de la última directiva #USE *_IO utilizada. El valor de retorno es un
entero corto.
Ejemplo:
while ( !input(PIN_B1) );
•
OUTPUT_BIT(pin,value)
158
Esta función saca el bit dado en value(0 o 1) por la patilla de I/O especificada en
pin. El modo de establecer la dirección del registro, está determinada por la
última directiva #USE *_IO.
Ejemplo:
output_bit( PIN_B0, 0);
// es lo mismo que output_low(pin_B0);
output_bit( PIN_B0,input( PIN_B1 ) );
// pone B0 igual que B1
output_bit( PIN_B0, shift_left(&data, 1, input(PIN_B1)));
// saca por B0 el MSB de 'data' y al mismo tiempo
// desplaza el nivel en B1 al LSB de data.
•
OUTPUT_FLOAT(pin)
Esta función pone la patilla especificada como pin en el modo de entrada.
Esto
permitirá que la patilla esté flotante para representar un nivel alto en una
conexión de tipo colector abierto.
Ejemplo:
// guardamos la lectura del port A en dato
if( (dato & 0x80)==0 )
output_low(pin_A0);
// comprobamos si es '1' el MSB
// si es '1' ponemos a cero el pin A0
else
output_float(pin_A0);
•
// de lo contrario, ponemos el pin A0 a uno
OUTPUT_HIGH(pin)
Pone a 'uno' el pin indicado. El método de acceso de I/O depende de la última
directiva #USE *_IO utilizada.
159
Ejemplo:
output_high(PIN_A0);
•
OUTPUT_LOW (pin)
Pone a 'cero' el pin indicado. El método de acceso de I/O depende de la última
directiva #USE *_IO.
Ejemplo:
output_low(PIN_A0);
•
DELAY_CYCLES(count)
Esta función realiza retardos según el número de ciclos de instrucción
especificado en count; los valores posibles van desde 1 a 255. Un ciclo de
instrucción es igual a cuatro periodos de reloj.
Ejemplo:
delay_cycles( 3 ); // retardo de 3ciclos instrucción; es igual que un NOP
•
DELAY_MS(time)
Esta función realiza retardos del valor especificado en time. Dicho valor de
tiempo es en milisegundos y el rango es 0-65535.
Para obtener retardos más largos así como retardos 'variables' es preciso
hacer llamadas a una función separada; véase el ejemplo siguiente.
Es preciso utilizar la directiva #use delay(clock=frecuencia) antes de la
llamada a esta función, para que el compilador sepa la frecuencia de reloj.
160
Ejemplos:
#use delay (clock=4000000)
delay_ms( 2 );
// reloj de 4MHz
// retardo de 2ms
void retardo_segundos(int n) {
// retardo de 'n' segundos; 0 <= n => 255
for (; n!=0; n--)
delay_ms( 1000 );
// 1 segundo
}
•
DELAY_US(time)
Esta función realiza retardos del valor especificado en time. Dicho valor es en
microsegundos y el rango va desde 0 a 65535. Es necesario utilizar la directiva
#use delay antes de la llamada a esta función para que el compilador sepa la
frecuencia de reloj.
Ejemplos:
#use delay(clock=20000000)
delay_us(50);
int espera = 10;
delay_us(espera);
•
DISABLE_INTERRUPTS(level)
Esta función desactiva la interrupción del nivel dado en level. El nivel GLOBAL
prohíbe todas las interrupciones, aunque estén habilitadas o permitidas. Los
niveles de interrupción son:
Ejemplo:
disable_interrupts(GLOBAL);
/* prohíbe todas las interrupciones */
161
•
ENABLED INTERRUPTS(level)
Esta función activa la interrupción del nivel dado en level. Queda a cargo del
técnico definir un procedimiento o rutina de atención, para el caso que se
produzca la interrupción indicada. El nivel GLOBAL permite todas las
interrupciones que estén habilitadas de forma individual. Véase también
DISABLE_INTERRUPTS.
Ejemplo:
disable_interrupts(GLOBAL).- Prohíbe todas las interrupciones
enable_interrupts(INT_AD).- Quedan habilitadas estas dos interrupciones,
enable_interrupts(INT_I2C).- Pero hasta que no se habilite GLOBAL, no
podrán activarse.
enable_interrupts(GLOBAL).-Ahora sí se pueden producir las interrupciones
anteriores.
•
EXT_INTEDGE(edge)
Esta función determina el flanco de activación de la interrupción externa. El
flanco puede ser de subida (L_TO_H) o de bajada (H_TO_L).
Ejemplo:
ext_int_edge( L_TO_H );
162
4.2 MANUAL WINPIC800
Figura 4.2-1 Pantalla de presentación
4.2.1 CONFIGURACIÓN DE HARDWARE
Figura 4.2.1-1 Configurar el programador
Uno de los primeros pasos el configurar el hardware del programador que
vamos utilizar par l grabación del código (.HEX) que es generado por el
programa Pic C Compiler.
163
4.2.2 ESCOGER HARDWARE
Figura 4.2.2-1 Escoger el programador
Aquí podemos observar la gran gama de programadores de microcontroladores
que soporta el hardware sea vía serial, puerto paralelo ó usb, en nuestro caso
utilizamos el hardware Polivalente que es vía puerto paralelo y que soporta una
la gama de microcontroladores PIC18FXX.
4.2.3 ESCOGER MICROCONTROLADOR
Figura 4.2.3-1 Selección del pic
Como podemos observar en el sub-cuadro de la derecha la gama de pics que
posee además de la capacidad de su memoria interna.
164
4.2.4 CARGAR EL ARCHIVO (.HEX)
Figura 4.2.4-1 Barra de herramientas
Un de sus facilidades es que evita que carguemos programas que no coincidan
con el pic seleccionado.
4.2.5 GRABACIÓN DE PIC
Figura 4.2.5-1 Grabación del código .hex
Y por último se procede a la carga del archivo (.HEX) al pic.
165
CAPITULO V
Implementación
y Resultados
166
5.1 PRUEBAS REALIZADAS
El cronograma de evaluación que se presenta a continuación se desarrolló de
una forma muy práctica y sencilla con el fin de comprender y visualizar la
magnitud de coordinación motriz y comprensión del operador (niños), que van a
trabajar con el proyecto (pizarra electrónica), que han sido realizado con los
Pic’s 16F628A y 18F2525.
Fechas:
Enero 2006
•
Análisis de necesidades de los niños con IMOC.
•
Pruebas de motricidad de los niños.
•
Disponibilidad de elementos a utilizar.
Febrero 2006
•
Presentación de elementos de escritura.
•
Presentación de elementos de visualización.
Marzo - Abril 2006
•
Presentación del primer prototipo.
Mayo 2006
•
Pruebas realizadas proyecto final.
167
5.2 RESULTADOS OBTENDIDOS
Fechas:
Enero 2006
•
Se obtuvo el resultado de que los niños y los profesores requerían una
forma eficiente de comunicación, pasar de la escritura simbólica del un
tablero a un formato visual legible y entendible por ambos (profesor,
alumno).
•
El resultado de las pruebas de motricidad de los niños se obtuvo las
mejores resultados, ya que los niños tienen una gran capacidad
intelectual que facilita las cosas (comprensión), y la capacidad de un
buen movimiento en alguno a varios de sus dedos que facilitarán la
manipulación de elemento de escritura.
•
Por tal razón se realizó la búsqueda de elementos fáciles de manipular y
que se encuentren con facilidad en el mercado.
Febrero 2006
•
Después de analizar se escogió de un elemento de escritura (teclado del
computador), como la opción más factible y fácil de conseguir y sin
necesidad de modificaciones.
•
Y como elemento de visualización se optó por la televisión que brinda la
capacidad de visualización ideal fácil de conseguir y utilizando la entrada
de video, y sin adaptación alguna.
Marzo - Abril 2006
•
Con los elementos escogidos se elaboró el primer prototipo que
constaba con un solo teclado, televisor, software, hardware de
168
adaptación, el cual constaba con la capacidad de escritura, lectura de
letras mayúscula que se visualizaban el en televisor.
•
Pero surgió la necesidad de expandirlo a 4 en total y que se utilizara un
solo televisor por necesidad de costos.
Mayo 2006
•
Por lo tanto se realizó el proyecto final (pizarra electrónica), el cuál ya
constaba de 4 teclados independientes, un televisor, hardware (módulos
teclado, red, video), software (cuatro líneas de texto independientes,
letras minúsculas, mayúsculas, números, operaciones básicas).
•
El proyecto satisfizo las necesidad planteadas y por lo tanto se prosiguió
y su implementación.
5.3 ANÁLISIS DE COSTOS
5.3.1 COSTOS DE FABRICACIÓN
El costo de desarrollo del proyecto (pizarra electrónica), se describe a
continuación, en la tabla se describe los gastos realizados.
PRECIO
DESCRIPCIÓN
COSTO
CANTIDAD TOTAL
PIC 16F628A
3,5
8
28
PIC 18F2525
35
1
35
MAX232
3
4
12
ZOCALO 14 PINES 0,5
4
2
ZOCALO 16 PINES 0,5
8
4
ZOCALO 28 PINES 0,7
1
0,7
BAQUELITA
0,8
6
4,8
PAPEL TERMICO
2,4
3
7,2
ACIDO FERRICO
0,5
6
3
169
CAJAS TECLADO
4
2
8
CAJAS VIDEO
7
1
7
RESISTENCIAS
0,25
20
5
0,5
4
2
CONECTORES
PS/2
TOTAL
118,7
Figura 5.3.1-1 Tabla de costos
Así se define el costo del prototipo desarrollado, cabe recalcar que se obvió la
compra de teclados y televisor los cuales los tenemos en el hogar, lo que
facilitó l reducción de los costos de fabricación.
5.3.2 COSTOS DE MANO DE OBRA
El costo de mano de obra del proyecto y tomando en cuenta, los gastos de
ensayos es el siguiente:
COSTOS DE ENSAYOS
COSTOS
DE
MANO
150
DE
OBRA
250
TOTAL
400
Figura 5.3.1-2 Tabla de costos
Costo total de la fabricación del proyecto $520.
5.3.3 PRODUCCIÓN EN SERIE
Sí el objetivo posterior es la producción en serie, se debe tomar en cuenta que
se deberá comprar los teclados, y el televisor si esto hubiera sido en nuestro
caso el costo subiría a unos $ 800.
170
CAPITULO VI
Conclusión
171
6.1 BENEFICIO SOCIAL
El desarrollo de la tesis (Pizarra electrónica), nace por la necesidad de construir
un
dispositivo útil, que facilite las actividades de educación, trabajo y
entretenimiento a personas que se les dificulta la utilización del computador
debido a la imprecisión de sus movimientos, causada por descoordinación
motriz y factores externos que producen la pérdida de regularidad para realizar
una actividad (escritura).
El hecho de desarrollar un dispositivo que aún siendo sencillo, contribuye con
facilitar y beneficiar a personas que padezcan IMOC, es gratificante saber que
la aplicación que desarrollamos no solo ayudará a una sola persona sino que
ayudará a muchas más personas, facilitando su desarrollo intelectual.
La construcción de este proyecto no tiene fines de lucro, sin embargo si el
prototipo fuera producido en grandes cantidades, debiera orientarse a fines
específicos es decir tomando en cuenta el problema de coordinación de la
persona.
6.2 CONCLUSIONES
6.2.1 CONCLUSIONES DEL PROYECTO
Se ha optado por la utilización de los PIC 16F628A y PIC 18F2525 para el
diseño de nuestro sistema por sus ventajas sobre otros pic.
•
Para el manejo de los teclados, y recepción de datos se optó por la
elección del PIC 16F628A por su tamaño, espacio en memoria 2K y su
capacidad de soportar un cristal oscilador de 20Mhz y su bajo costo.
•
La elección del pic para el manejo video se optó por la elección del PIC
18F2525 por su capacidad de memoria ya que es una nueva gama de
172
pic y dispone de 4.900 K de memoria y soporta un cristal oscilador de
20Mhz.
•
Para el tema de tesis se planteó la re utilización teclado (ps/2), televisor
(video in) y mediante los microcontroladores para su manejo, evitando la
construcción en totalidad de nuevos elementos, debido a que se puede
utilizar sin problemas cualquier teclado común y corriente al igual del
televisor,
estas
características
nos
brindan
la
capacidad
de
transportailidad y fácil manejo.
6.2.2 CONCLUSIONES DE LA UTILIZACIÓN DEL PROYECTO
Es importante indicar que el proyecto satisfizo las expectativas planteadas por
los directivos de la fundación.
•
Una de las principales bondades del proyecto es su capacidad de
emular al computador, es decir, capacidad de escribir el abecedario
completo (mayúsculas y minúsculas), números y operaciones básicas y
poderlos visualizar en un monitor el cual es el televisor.
•
La capacidad de pasar de un tipo de escritura manual como es indicar
letra por letra en un tablero y la poca capacidad de recordancia de los
escrito a una forma más tecnológica como es la visualización de lo que
se escribe y su posterior modificación en casos de errores.
•
El mejor control por parte de los profesores que pueden monitorear
visualmente en conjunto a los niños por medio de las líneas de texto y
evitando estar mucho tiempo con cada niño y optimizar el tiempo para
mejorar la enseñanza.
•
Y por último la felicidad de los niños que un mucho de los casos no está
en las posibilidades de manipular un computador por cuestiones de
costo, aquí lo pueden hacer y mejorar tanto en su motricidad, su
intelecto y muy importante su comunicación.
173
6.3 RECOMENDACIONES
•
Para la utilización del proyecto desarrollado en la tesis se recomienda un
área de trabajo (aula), normal debido a que no se hicieron
modificaciones algunas a los elementos ya descritos (teclado y
televisor), y los módulos que no representan un gran consumo de
espacio, puesto
que están debidamente colocados
en lugares
estratégicos y con la capacidad de ser unidos mediante una red que
puede alcanzar una longitud de hasta 8 metros sin pérdida de
información.
•
Pero uno de los elementos principales del sistema es el PIC18F2525 el
cuál es encargado del manejo del módulo video y es en ocas palabras el
cerebro del proyecto, el inconveniente en casos de fabricación de
nuevos módulos o daño de este es su dificultad de comprar el pic, en
nuestro caso se tuvo que importar desde USA, desde la compañía
Microchip que es l encargada de l fabricación y venta de estos
elementos.
6.5 BIBLIOGRAFÍA
6.4.1 REFERENCAS DE INTERNET
Foro especializado en presentación de artículos, proyectos, información sobre
mcrocontroladores.
•
http://conket.com
1.- Tutorial Pc y Pic
http://conket.com/modules.php?name=Sections&op=viewarticle&artid=14
174
En esta página se puede observar y conocer como es una señal de video, sus
elementos, diagrama de tiempos.
2.- Interfaz teclado y Pc
http://conket.com/modules.php?name=Sections&op=viewarticle&artid=39
En esta dirección podemos conocer como se realiza la conexión básica entre el
teclado y pc, con diagramas de conexión, información de sincronismos de
pulsos y ejemplos aplicativos.
•
Página electrónica proyectos de Richard
Este sitio web es otro foro abierto de proyectos, mucho más completa ya que
consta de foro no solo de pic’s , también con foros de electrónica, y sistios de
descargas.
3.- Manual de usuario del compilador PCW (Compilador de pic’s)
http://conket.com/modules.php?name=Downloads&d_op=viewdownload&cid=3
En la sección download se puede descargar varias cosas en nuestro caso
nosotros se descargó el manual para el compilador Pic C Compiler.
4.- Señales de video
http://216.239.39.104/translate_c?hl=es&u=http://www.rickard.gunee.com/proje
cts/video/pic/howto.php&prev=/search%3Fq%3Dsignal%2Bvideo%2Bmicrocont
roller%26hl%3Des%26lr%3D%26sa%3DG
En este artículo se puede encontrar información sobre la señal de video,
ejemplos, programas aplicativos básicos que facilitarán la iniciación de la
programación en C.
•
Comunidad Modding
175
Este sitio ofrece artículos sobre distintos proyectos con pic’s.
5.- Como es una señal de video
http://www.hardcoremodding.com/modules.php?name=Forums&file=viewtopic&t=26933&postdays=
0&postorder=asc&start=15
•
wikipedia
Enciclopedia en Internet donde podemos consultar conceptos y ver información
de distintas ramas.
http://es.wikipedia.org/wiki
En nuestro caso consultamos sobre sistemas de televisión PAL, NTSC.
•
IMOC documentos
http://www.aurasalud.com/
En esta página podemos encontrar un artículo completo sobre causas
problemas, prevenciones que se deben tener con niños que sufren de
Insuficiencia Motriz de Origen Cerebral.
176
ANEXOS
177
Aquí se presentan los códigos completos de los módulos teclado, red, video,
con su respectiva explicación.
CÓDIGO DEL TECLADO
#include <16F628A.h>
#fuses HS, NOWDT, NOPROTECT, PUT, BROWNOUT, NOLVP
#use Delay(Clock=20000000)
#use standard_io(A)
#use standard_io(B)
#usefixed_io(a_outputs=PIN_A0,PIN_A1,PIN_A2,PIN_A3)
#use fixed_io(b_outputs=PIN_B5)
#users232(baud=57600,parity=N,xmit=PIN_b2,rcv=PIN_b1,bits=8)
#zero_ram
//----------------------------------------------------------------------------// Definiciones globales
//----------------------------------------------------------------------------unsigned char edge, bitcount;
char got_interrupt;
char interrupt_count;
char status_b7;
#bit INTF_BIT = 0x0B.1
//-------- Tabla de caracteres correspondientes a la pulsación de la tecla
//-------- en modalidad normal (sin pulsar SHIFT)
unsigned char const unshifted[68][2] = {
0x0d,9,
0x0e,'º',
0x15,'q',
0x16,'1',
0x1a,'z',
0x1b,'s',
0x1c,'a',
0x1d,'w',
0x1e,'2',
0x21,'c',
0x22,'x',
0x23,'d',
0x24,'e',
0x25,'4',
0x26,'3',
0x29,' ',
0x2a,'v',
0x2b,'f',
0x2c,'t',
0x2d,'r',
0x2e,'5',
0x31,'n',
0x32,'b',
0x33,'h',
0x34,'g',
0x35,'y',
0x36,'6',
.
0x39,',',
0x3a,'m',
0x3b,'j',
0x3c,'u',
0x3d,'7',
0x3e,'8',
0x41,',',
0x42,'k',
0x43,'i',
0x44,'o',
0x45,'0',
0x46,'9',
0x49,'.',
0x4a,'-',
0x4b,'l',
0x4c,'ñ',
0x4d,'p',
0x4e,''',
0x52,'´',
0x54,'`',
0x55,'¡',
0x5a,13,
0x5b,'+',
0x5d,'ç',
0x61,'<',
0x66,8,
0x69,'1',
0x6b,'4',
0x6c,'7',
0x70,'0',
0x71,'.',
0x72,'2',
0x73,'5',
0x74,'6',
0x75,'8',
0x79,'+',
0x7a,'3',
0x7b,'-',
0x7c,'*',
0x7d,'9',
0,0
};
//----------------------------------------------------------------------------// Definición de protipos
//----------------------------------------------------------------------------void init_kb(void);
void decode(unsigned char sc);
#int_ext
void int_ext_isr(void);
//----------------------------------------------------------------------------// Main
//----------------------------------------------------------------------------void main(void)
.
{
init_kb();
//-------- Los pins indicados (B0 y B7) son configurados como entradas.
output_float(PIN_B0);
output_float(PIN_B7);
//-------- Activa pullups sobre todos los pins del puerto B.
port_b_pullups(TRUE);
//-------- Espera a que se activen.
delay_us(5);
//-------- Inicializa las variables usadas por la rutina de interrupción
//-------- antes de activar las interrupciones
interrupt_count = 0;
got_interrupt = FALSE;
status_b7 = 0;
//-------- Desde que se activó el modo PULLUPS del puerto B, el estado
//-------- normal del pin B0 es ALTO. La gestión de la interrupción externa
//-------- se gestiona cuando se produce un cambio de nivel ALTO a BAJO.
ext_int_edge(H_TO_L);
//-------- Asegurarse de que el el bit de flag de la interrupción externa
//-------- es borrado antes de activar la gestión de dicha interrupción
//-------- externa.
INTF_BIT = 0;
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
//-------- Bucle principal.
//-------- Chequear si se produce alguna interrupción (got_interrupt). Si es así, contar, borrar
//-------- el flag y esperar 50 ms, reactivando la gestión de las interrupciones
while(1)
{
//-------- Chequear si se produce alguna interrupción (got_interrupt).
if(got_interrupt == TRUE)
{
//-------- Borrar el flag global que se inicio en la rutina de servicio
//-------- de interrupciones externas.
got_interrupt = FALSE;
//-------- Esperar 50 ms para evitar rebotes en los contactos de las teclas.
//delay_ms(50);
//-------- Borrar cualquier interrupción producida durante el periodo de espera.
INTF_BIT = 0;
//-------- Reactivar interrupciones
enable_interrupts(INT_EXT);
} // --- End If ---
.
} // --- End While --} // --- End MAIN ---
//----------------------------------------------------------------------------// Funciones
//----------------------------------------------------------------------------//----------------------------------------------------------------------------// Inicialización de teclado.
//----------------------------------------------------------------------------void init_kb(void)
{
//-------- Longitud de la trama para cada pulsación y mensaje de bienvenida
bitcount = 11;
printf("\n\rPC AT Keyboard Interface Ver 1.0 by XP8100");
printf("\n\rDecoder for 16F877 connected ...\n\r\n\r");
}
//----------------------------------------------------------------------------// Decodificación de pulsaciones
//----------------------------------------------------------------------------void decode(unsigned char sc)
{
static unsigned char is_up=0, shift = 0, mode = 0;
unsigned char i;
//-------- El último dato recibido fue el identificador de Up-Key
if (!is_up)
{
switch (sc)
{
//-------- Identificador de Up-Key
case 0xF0 :
is_up = 1;
break;
//-------- SHIFT Izquierdo
case 0x12 :
shift = 1;
break;
//-------- SHIFT Derecho
case 0x59 :
shift = 1;
break;
//-------- ENTER
case 0x5A :
shift = 0;
printf("\n\r");
break;
//-------- Si no es ninguno de los identificadores especiales, procesar
//-------- pulsación, localizando caracter en tabla de caracteres.
default:
//-------- Pulsación normal
if(!shift)
{
for(i = 0; shifted[i][0]!=sc && shifted[i][0]; i++);
.
if (shifted[i][0] == sc)
{
printf("%c", shifted[i][1]);
}
}
else
//-------- Pulsación + SHIFT presionado
{
for(i = 0; shifted[i][0]!=sc && shifted[i][0]; i++);
if (shifted[i][0] == sc)
{
printf("%c", shifted[i][1]);
}
}
break;
} // --- End Switch
}
else
{
//-------- No se permiten 2 0xF0 en una fila
is_up = 0;
switch (sc)
{
//-------- SHIFT Izquierdo
case 0x12 :
shift = 0;
break;
//-------- SHIFT Derecho
case 0x59 :
shift = 0;
break;
} // --- End Switch
}
}
//----------------------------------------------------------------------------// Rutina de gestión de interrupciones
//----------------------------------------------------------------------------#int_ext
void int_ext_isr(void)
{
unsigned char data;
//-------- Los bit 3 a 10 se considerran datos. Paridad, start y stop
//-------- son ignorados
if(bitcount < 11 && bitcount > 2)
{
data = (data >> 1);
status_b7 = input(PIN_B7);
if((status_b7) == 1)
data = data | 0x80;
}
//-------- Todos los bits se han recibido
if(--bitcount == 0)
{
.
decode(data);
data = 0;
bitcount = 11;
got_interrupt = TRUE;
}
got_interrupt = TRUE;
interrupt_count++;
disable_interrupts(INT_EXT);
}
CÓDIGO DEL CONCENTRADOR
#include <16F628A.h>
#fuses NOWDT,HS, NOPUT, NOPROTECT, NOBROWNOUT, MCLR, NOLVP, NOCPD //
Opciones de configuración
#use delay(clock=20000000)
#use rs232(baud=57600,rcv=PIN_A0)
#use fast_io(A)
#use fast_io(B)
int dato=0;
#Locate dato=0x69
int dato1=0;
#Locate dato1=0x6A
int c=0;
#Locate c=0x6B
int i=0;
#Locate i=0x6C
#int_EXT
EXT_isr()
.
{
set_tris_b(0b00000001);
//SEDEMORA 15(iNS) PARA LLEGAR AL output_B(dato1);
delay_us(1);
delay_cycles(3);
if(i!=0){
output_B(dato1);
delay_us(70);
output_B(0);
i=0;
}
else{
output_B(0);
delay_us(70);
}
set_tris_b(0b11111111);
}
Void Main() {
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
set_tris_a(0b00000001);
set_tris_b(0b11111111);
output_A(0);
while(true){
dato=getc();
c=0;
switch (dato) //Identifica el dato de la entrada y lo relaciona con la
//variable matriz
{
case 'A':
c=1;
break;
case 'B':
c=2;
break;
case 'C':
c=3;
break;
case 'D':
c=4;
break;
case 'E':
c=5;
break;
case 'F':
c=6;
break;
case 'G':
c=7;
break;
case 'H':
.
c=8;
break;
case 'I':
c=9;
break;
case 'J':
c=10;
break;
case 'K':
c=11;
break;
case 'L':
c=12;
break;
case 'M':
c=13;
break;
case 'N':
c=14;
break;
case 'Ñ':
c=15;
break;
case 'O':
c=16;
break;
case 'P':
c=17;
break;
case 'Q':
c=18;
break;
case 'R':
c=19;
break;
case 'S':
c=20;
break;
case 'T':
c=21;
break;
case 'U':
c=22;
break;
case 'V':
c=23;
break;
case 'W':
c=24;
break;
case 'X':
c=25;
break;
case 'Y':
c=26;
break;
case 'Z':
c=27;
.
break;
case '0':
c=28;
break;
case '1':
c=29;
break;
case '2':
c=30;
break;
case '3':
c=31;
break;
case '4':
c=32;
break;
//*******************************************************
case ' ':
c=66;
break;
case '+':
c=67;
break;
case '-':
c=68;
break;
case '*':
c=69;
break;
case '/':
c=70;
break;
case '=':
c=71;
break;
case 9:
c=126;
break;
case 8:
c=127;
}//fin swith
if(c!=0){
i=1;
c=c<<1;
dato1=c;
}
}
}
.
CÓDIGO DEL VIDEO
Codigo de archivo .h
FUNCIONES.h
#DEFINE FSR0L 0xFE9
#DEFINE INDF0 0xFEF
#DEFINE FSR1L 0xFE1
#DEFINE INDF1 0xFE7
//*****************************************************************
//Variables para la Funcion Llenar Screen
int8 POS_LETRA_SCREEN=0; //Variable utilizada como auxiliar paralas fuciones
#Locate POS_LETRA_SCREEN =0x80
int8 POS_LETRA_MATRIX=0;//Variable utilizada para hallar la direccionen de la letra en la
matrix
#Locate POS_LETRA_MATRIX =0x81
int8 DIRi_SCREEN=1;//Variable
#Locate DIRi_SCREEN =0x82
int8 n_DIRi_SCREEN=1;//Variable
#Locate n_DIRi_SCREEN =0x83
int8 DIRi_MATRIX=10;//14 por apunta al banco de memoria 14
#Locate DIRi_MATRIX =0x84 //Variable declarada Banco de memoria 6
//TOMA SOLO VALORES DE
//***********************************************************************
//variables Para la funcion Draw Letras
int8 N_LineasVideo=48;
#Locate N_LineasVideo =0x85
.
//***********************************************************************
int8 DATO=0;//DATO QUE INGRESA DEL PUERTO C
#Locate DATO =0x86
int8 DATO1=0;//DATO QUE INGRESA DEL PUERTO C
#Locate DATO1 =0x87
int8 Bandera_N_Letra=1; //ocupa el registro 0x8A bandera que me indica para incrementar N_
#Locate Bandera_N_Letra =0x88//valores 0=Incrementa y 1=Nada
//*****************************************************************
int8 i1=40;//variable para controlar el numero de repeticones en la funcion Leer Dato
#Locate i1=0x89
//Variables que me controlan el la interupciones INT de cada 16F628
int8 U1=3;
#Locate U1=0x8A
int8 contador=0;
#Locate contador=0x8B
int8 CondisionPresentacion=1;
#Locate CondisionPresentacion=0x8C
//SOBRAN VARIABLES 8D 8E 8F
//Estas Variables son individuales para cada niño
//*****************Variables del niño 1*******************************
int8 Borrar1=1;//Bander para Borra el vector de nino 1
#Locate Borrar1=0x90//valores 1= falso y 0 = verdad
int8 BorrarScreen=1;//Me Borra el vector de nino
#Locate BorrarScreen=0x91//valores 1= falso y 0 = verdad
int8 N_Letra1=0;
#Locate N_Letra1 =0x92
int8 N_LINEA_TEXTO1=0;
#Locate N_LINEA_TEXTO1 =0x93
int8 TN_LINEA_TEXTO1=0;
#Locate TN_LINEA_TEXTO1=0x94
//*****************Variables del niño 2*******************************
int8 Borrar2=1;//Bander para Borra el vector de nino 1
#Locate Borrar2=0x95//valores 1= falso y 0 = verdad
int8 BorrarScreen2=1;//Me Borra el vector de nino
#Locate BorrarScreen2=0x96//valores 1= falso y 0 = verdad
int8 N_Letra2=0;
#Locate N_Letra2 =0x97
int8 N_LINEA_TEXTO2=0;
#Locate N_LINEA_TEXTO2=0x98
int8 TN_LINEA_TEXTO2=0;
#Locate TN_LINEA_TEXTO2=0x99
.
//*****************Variables del niño 3*******************************
int8 Borrar3=1;//Bander para Borra el vector de nino 1
#Locate Borrar3=0x9A//valores 1= falso y 0 = verdad
int8 BorrarScreen3=1;//Me Borra el vector de nino
#Locate BorrarScreen3=0x9B//valores 1= falso y 0 = verdad
int8 N_Letra3=0;
#Locate N_Letra3 =0x9C
int8 N_LINEA_TEXTO3=0;
#Locate N_LINEA_TEXTO3=0x9D
int8 TN_LINEA_TEXTO3=0;
#Locate TN_LINEA_TEXTO3=0x9E
//*****************Variables del niño 4*******************************
int8 Borrar4=1;//Bander para Borra el vector de nino 1
#Locate Borrar4=0x9F//valores 1= falso y 0 = verdad
int8 BorrarScreen4=1;//Me Borra el vector de nino
#Locate BorrarScreen4=0xA0//valores 1= falso y 0 = verdad
int8 N_Letra4=0;
#Locate N_Letra4 =0xA1
int8 N_LINEA_TEXTO4=0;
#Locate N_LINEA_TEXTO4=0xA2
int8 TN_LINEA_TEXTO4=0;
#Locate TN_LINEA_TEXTO4=0xA3
//********************************************************
int FSR0H=1;
#Locate FSR0H =0xFEA
int FSR1H=1;
#Locate FSR1H =0xFE2
int8 PORTA=0;
#Locate PORTA=0xF89
int8 PORTB=0;
#Locate PORTB=0xF81
int8 PORTC=0;
#Locate PORTC=0xF8B
int8 LATC=0;
#Locate LATC=0xF82
//_____________________________FUNCIONES___________________________________
____
.
void int LeerDato(){
//Sincronización Horizontal (4.4us)
output_low(pin_a0); //sincro
delay_us(4);
delay_cycles(2);
output_high(pin_a0); //negro
//lineas de imagen + black porch 58,6
i1=40;//40 valor 2(Inst)
PORTA=U1;//2
//delay_us(4);//quitar
#asm
Loop1:
MOVFF PORTB , DATO //2
DECFSZ i1,F
//1
BRA Loop1
//2
#endasm //Tiempo Total= 5(Instruccione)*0.2*i1(=40) + 0,4us(i1=40)
+0,4us(PORTA=U1)+0,4(PORTA=1) =41,2us
//41,2-0,4(Dato1=Dato;)=40,8-4(delay_us(4))=36,8us
PORTA=1;
Dato1=Dato;
//tiempo sobrante
delay_us(17);//58,6-36,8=21,8us//21
delay_cycles(3);///modificar 4
output_low(pin_a0); //sincro
//ya Terminado y corregido
}
//___________________________________________________________________________
___
void int ClasificarLetra(){
//VARIABLES
//Clasificamos..
//Las letras Mayusculas A a la Z
//y los signos de + , - , *, / , espacio blanco
//Las letras se Encuentran en el Banco 6
//Sincronización Horizontal (4.4us)-goto funcion leer Dato -goto(entra fun clasif)
//4,4-0,4-0,4 = 3,6us
delay_us(3);
delay_cycles(3);
output_high(pin_a0); //negro
//Clasificacion del dato
//LOS numeros 1 al 1f(32) son la codificacion 0 = A 1=B.....30=/ 31 = *
//Las letras A a la Z y Signos estan en Banco de memoria 6
//LOS numeros 0x20(32 d) al 0x29(41 ) son la codificacion 32 = 0 33=1.....40=8 41 = 9
//Las letras A a la Z y Signos estan en Banco de memoria 6
//********************************************************************
if(DATO >=0x01){
if(DATO <=0x20){
.
Bandera_N_Letra=0;
DIRi_MATRIX=13;
DATO=DATO-1;
POS_LETRA_MATRIX=8*DATO;
}
else{
//total=19(Istrucciones)-9(Instruccinoes)=10(Instrucciones)*0,2=2us
delay_us(2);
}
}
else{
//total=19(Istrucciones)-4(Instruccinoes)=15(Instrucciones)*0,2=3us
delay_us(3);
}//Total=19(Instrucciones)*0,2=3,8us
//********************************************************************
//Clasificamos..
//Los numeros 0 al 9 se entran en el Banco 7
if(DATO >=0x21){
if(DATO <=0x40){
Bandera_N_Letra=0;
DIRi_MATRIX=14;
DATO=DATO-33;//(33 = 0x21)
POS_LETRA_MATRIX=8*DATO;
}
else{
//total=19(Istrucciones)-9(Instruccinoes)=10(Instrucciones)*0,2=2us
delay_us(2);
}
}
else{
//total=19(Istrucciones)-4(Instruccinoes)=15(Instrucciones)*0,2=3us
delay_us(3);
}//Total=19(Instrucciones)*0,2=3,8us
//********************************************************************
//Clasificamos..
//Los caracteres + - * / = en el Banco 7
if(DATO >=0x41){
if(DATO <=0x47){
Bandera_N_Letra=0;
DIRi_MATRIX=15;
DATO=DATO-65;//(33 = 0x21)
POS_LETRA_MATRIX=8*DATO;
}
else{
//total=19(Istrucciones)-9(Instruccinoes)=10(Instrucciones)*0,2=2us
delay_us(2);
}
}
.
else{
//total=19(Istrucciones)-4(Instruccinoes)=15(Instrucciones)*0,2=3us
delay_us(3);
}//Total=19(Instrucciones)*0,2=3,8us
//tiempo sobrante
delay_us(47); //58,6 - 3,8 - 3,8 -3,8 = 47,2 us
delay_Cycles(1);
output_low(pin_a0); //sincro
//ya Terminado la modificacion
}
//________________________________NIÑO
1________________________________________
void int Tratar_Letra(){
//Sincronización Horizontal (4.4us)-goto funcion ClasificarLetra -goto(entra fun Tratar_Letra)
//4,4-0,4-0,4 = 3,6us
delay_us(3);
delay_cycles(3);
output_high(pin_a0); //negro
//_***********************************************************************************
//ESTA RUTINA SE ME DEMORA 17 INSTRUCIONES EN V O f tiempo total = 17*0,2=
3,4 us//
if(N_LINEA_TEXTO1==0){//en v 2(ins) f 3(Ins) //ojo cambie 0 por 1
if(N_Letra1==16){//en v 3(ins) f 4(Ins)
if(TN_LINEA_TEXTO1==2){//en v 3(ins) f 4(Ins)
N_Letra1=15;
Borrar1=0;//0
//Entra a los 3(Bra)=2(ins)*3(Bra)=6(ins)*0,2=1,2
}
else{
//17 - 13(Inst cuando el if(N_LINEA_TEXTO1==1) es F)=4(Inst)*0,2=0,8 us
delay_cycles(4);
}
}
else{
//17 - 8(Inst cuando el if(N_Letra1 ==16) es F)=9(Inst)*0,2=1,8 us
delay_us(1);
delay_cycles(4);
}
}
else{
//17-3=14*0,2=2,8us
delay_us(2);
delay_cycles(4);
}
//_*****************************************************************************************************
.
//ESTA RUTINA SE ME DEMORA 12 INSTRUCIONES EN V O f tiempo total = 12*0,2=
2,4 us//
if(N_Letra1==16){
if(N_LINEA_TEXTO1==1){
N_Letra1 = 0;
N_LINEA_TEXTO1=0;
TN_LINEA_TEXTO1++;
}
else{
//12 - 8(Inst cuando el if(N_LINEA_TEXTO1==1) es F)=4(Inst)*0,2=0,8 us
delay_cycles(4);
}
}
else{
//12 - 4(Inst cuando el if(N_Letra1 ==16) es F)=8(Inst)*0,2=1,6 us
delay_us(1);
delay_cycles(3);
}
//******************************************************************************************************
//esta rutina se demora 7 intruciones tiempo total = 7*0,2=
1,4 us//
if (N_Letra1 == 16){
N_Letra1 = 0;
N_LINEA_TEXTO1++;
}
else{
//7-4(Instr cuando el if(N_Letra1 ==16) es F)=3(Instru)*0,2= 0,6us
delay_cycles(3);
}
//******************************************************************************************************
//ESTA RUTINA SE ME DEMORA 14 INSTRUCIONES EN V O f tiempo total = 14*0,2=
2,8 us//
if(CondisionPresentacion==0){
if(Bandera_N_Letra==0){
POS_LETRA_SCREEN=N_LINEA_TEXTO1*128+N_Letra1 ;//ocupa 5(Instrucciones)*0,2 =1 us
N_Letra1++;
}
else{
delay_us(1);
delay_cycles(4); //14-5(Instr cuando if(Bandera_N_Letra==0) es F) = 9(Inst)*0,2=1,8 us
}
}
else{
POS_LETRA_MATRIX=0;// posicion del caracter en la memoria 15
DIRi_MATRIX=1;//15
delay_us(1);
delay_cycles(3); //14-3(Instr cuando if(Bandera_N_Letra==0) es F) = 11(Inst)*0,2=2,2 us
}
//*********************************************************************************************
if(DATO1==126){//13(INS)*0,2=
2,6us
if(CondisionPresentacion==1){
BorrarScreen=0;
.
BorrarScreen2=0;
BorrarScreen3=0;
BorrarScreen4=0;
}
else{
//13 - 6 = 7*0,2=1,4
delay_us(1);
delay_cycles(2);
}
}
else{
//13 -4 = 9*0,2=1,8
delay_us(1);
delay_cycles(4);
}
//******************************BORRA todo POR UNA LETRA**************************************
//Esta rutina se demora 11 instrucciones en v o f tiempo total = 11*0,2 =
2,2us//
if(DATO1==126){//3(Ins) cuando if(DATO==126) v
//4(Ins) cuando if(DATO==126) F
BorrarScreen=0;
N_Letra1=0;
POS_LETRA_SCREEN=0;
N_LINEA_TEXTO1=0;
TN_LINEA_TEXTO1=0;
CondisionPresentacion=0;
// delay_Cycles(1);
}
else{
//11(Ins)-4(Ins)=6(Ins)*0,2=1,4us
delay_us(1);
delay_cycles(2);
}
if( TN_LINEA_TEXTO1==2){//Ocupa 7 Ins en V
tiempo total = 7*0,2= 1,4 us
n_DIRi_SCREEN=3; //2(Inst)*0,2=0,4 us
}
else{
//7(Ins)-4(Ins)=3*0,2=0,6us
delay_cycles(3);
//tiempo total = 1,2+1,2+1,4= 3,8 us//
}
//*********************BORRARUNA LETRA*************************************************
//
esta funcion tiempo de duracion 24+17(ins)=41*0,2
8,2us//
if (DATO1 == 127){//cuando if (DATO == 127) V 3(Ins)
//cuando if (DATO == 127) F 4(Ins)
//********** esta codigo ocupa 17(ins) *******************
POS_LETRA_SCREEN=N_LINEA_TEXTO1*128+N_Letra1;
if(TN_LINEA_TEXTO1!=0){//3(Ins) en F
//2(ins) en verdad
if(N_LINEA_TEXTO1==0){//3(Ins) en F
//2(ins) en verdad
if(N_Letra1==0){//3(Ins) en F
.
//2(ins) en verdad
//6(ins) en verdad todo los if
N_Letra1=16;
N_LINEA_TEXTO1=1;
TN_LINEA_TEXTO1--;
}
else{
//17(Ins)-11(Ins)=6*0,2=1,2us
delay_us(1);
delay_cycles(1);
}
}
else{
//17(Ins)-7(Ins)=10*0,2=2us
delay_us(2);
}
}
else{
//17(Ins)-3(Ins)=14*0,2=2,8us
delay_us(1);
delay_cycles(4);
}
//************************************************************************
if (N_LINEA_TEXTO1==0){
if (N_Letra1==0){//14-8=6(Ins)*0,2)1,2
delay_us(1);
delay_cycles(1);
}
else if(N_Letra1!=0){
N_Letra1=N_Letra1-1;
POS_LETRA_MATRIX=8;
DIRi_MATRIX=15;
}
}
else if(N_Letra1==0){
N_LINEA_TEXTO1=N_LINEA_TEXTO1-1;
N_Letra1=15;
POS_LETRA_MATRIX=8;
DIRi_MATRIX=15;
}
else if(N_Letra1!=0){
N_Letra1=N_Letra1-1;
POS_LETRA_MATRIX=8;
DIRi_MATRIX=15;
delay_cycles(1);
}
//14+3+5+2(BRA else)=24
}
else{
//41-4=37*0,2=7,4
.
delay_us(7);
delay_cycles(2);
}
//********************************************************************************
//La variables DIRi_SCREEN se cambia a 4 ,7 o 10 para los demas personajes
DIRi_SCREEN=1;//0,4us
//tiempo sobrante
//58,6 - (2,6+4,8+ 2 + 2,4 + 1,4 + 3 )(total=16,6) = 42us-(1,8us)=40,6us-3,8=36,8-0,4us=36,4
//36,4-3,4=33us-0,2(sale 3,2(If para Borrar screen)-3)=32,8-0,2=32,6-3,4=29,2us
//29,2-0,8=28,4-0,2=28,2-0,8=27,4-2,6=24,8
delay_us(24);
delay_cycles(4);
output_low(pin_a0); //sincro
//revisar
//todo esta calculado solo falta probar
}
//___________________________________________________________________________
___
void int Borrar_Screen11(){
//Sincronización Horizontal (4.4us)-goto funcion Tratar_Letra -goto(entra fun Borrar_Screen)
//4,4-0,4-0,4 = 3,6us
delay_us(3);
delay_cycles(3);
output_high(pin_a0); //negro
//Inico del tiempo de la imagem
if( BorrarScreen==0){
//emplea 3(Ins) el if para entrar en V
//**************************************************************
int8 Ced[256]={0x0};
#Locate Ced=0x100 //Ocupamos todos los registros del Banco1
//tiempo total=257+3(inicio if)+2(Bra)=262*0,2us=52,4us
//BorrarScreen=1;
delay_cycles(1);
}
else{
//emplea 4(Ins) el if para entrar en F
delay_us(51); //262 - 4 = 258*0,2us=51,6us
delay_cycles(3);
}
//tiempo sobrante
delay_us(6); //58,6-52,4 = 6,2us
delay_cycles(1);
output_low(pin_a0); //sincro
//___________________________________________________________________________
___
}
void int Borrar_Screen12(){
//Sincronización Horizontal (4.4us)-goto funcion Tratar_Letra -goto(entra fun Borrar_Screen)
.
//4,4-0,4-0,4 = 3,6us
delay_us(3);
delay_cycles(3);
output_high(pin_a0); //negro
//Inico del tiempo de la imagem
if( BorrarScreen==0){
//emplea 3(Ins) el if para entrar en V
int8 Ce[256]={0x0};
#Locate Ce=0x200 //Ocupamos todos los registros del Banco1
//tiempo total=257+3(inicio if)+2(Bra)=262*0,2us=52,4us
//BorrarScreen=1;
delay_cycles(1);
}
else{
//emplea 4(Ins) el if para entrar en F
delay_us(51); //262 - 4 = 258*0,2us=51,6us
delay_cycles(3);
}
//tiempo sobrante
delay_us(6); //58,6-52,4 = 6,2us
delay_cycles(1);
output_low(pin_a0); //sincro
}
//___________________________________________________________________________
___
void int Borrar_Screen13(){
//Sincronización Horizontal (4.4us)-goto funcion Tratar_Letra -goto(entra fun Borrar_Screen)
//4,4-0,4-0,4 = 3,6us
delay_us(3);
delay_cycles(3);
output_high(pin_a0); //negro
//Inico del tiempo de la imagem
if( BorrarScreen==0){
//emplea 3(Ins) el if para entrar en V
int8 Ce[256]={0x0};
#Locate Ce=0x300 //Ocupamos todos los registros del Banco1
//tiempo total=257+3(inicio if)+2(Bra)=262*0,2us=52,4us
BorrarScreen=1;
//delay_cycles(1);
}
else{
//emplea 4(Ins) el if para entrar en F
delay_us(51); //262 - 4 = 258*0,2us=51,6us
delay_cycles(3);
}
//tiempo sobrante
delay_us(6); //58,6-52,4 = 6,2us
delay_cycles(1);
output_low(pin_a0); //sincro
}
_______________________________NIÑO
2________________________________________
.
void int Tratar_Letra2(){
//Sincronización Horizontal (4.4us)-goto funcion ClasificarLetra -goto(entra fun Tratar_Letra)
//4,4-0,4-0,4 = 3,6us
delay_us(3);
delay_cycles(3);
output_high(pin_a0); //negro
//_***********************************************************************************
//ESTA RUTINA SE ME DEMORA 17 INSTRUCIONES EN V O f tiempo total = 17*0,2= 3,4
us//
if(N_LINEA_TEXTO2==0){//en v 2(ins) f 3(Ins) //ojo cambie 0 por 1
if(N_Letra2==16){//en v 3(ins) f 4(Ins)
if(TN_LINEA_TEXTO2==2){//en v 3(ins) f 4(Ins)
N_Letra2=15;
Borrar2=0;
//Entra a los 3(Bra)=2(ins)*3(Bra)=6(ins)*0,2=1,2
}
else{
//17 - 13(Inst cuando el if(N_LINEA_TEXTO2==1) es F)=4(Inst)*0,2=0,8 us
delay_cycles(4);
}
}
else{
//17 - 8(Inst cuando el if(N_Letra2 ==16) es F)=9(Inst)*0,2=1,8 us
delay_us(1);
delay_cycles(4);
}
}
else{
//17-3=14*0,2=2,8us
delay_us(2);
delay_cycles(4);
}
//_*****************************************************************************************************
//ESTA RUTINA SE ME DEMORA 12 INSTRUCIONES EN V O f tiempo total = 12*0,2=
2,4
us//
if(N_Letra2==16){
if(N_LINEA_TEXTO2==1){
N_Letra2 = 0;
N_LINEA_TEXTO2=0;
TN_LINEA_TEXTO2++;
}
else{
//12 - 8(Inst cuando el if(N_LINEA_TEXTO2==1) es F)=4(Inst)*0,2=0,8 us
delay_cycles(4);
}
}
else{
//12 - 4(Inst cuando el if(N_Letra2 ==16) es F)=8(Inst)*0,2=1,6 us
delay_us(1);
delay_cycles(3);
}
.
//******************************************************************************************************
//esta rutina se demora 7 intruciones tiempo total = 7*0,2=
1,4 us//
if (N_Letra2 == 16){
N_Letra2 = 0;
N_LINEA_TEXTO2++;
}
else{
//7-4(Instr cuando el if(N_Letra2 ==16) es F)=3(Instru)*0,2= 0,6us
delay_cycles(3);
}
//********************************8******************************************************
//
esta funcion tiempo de duracion 17*0,2 =
//tiene 4(ifs en V)+9(inst)+4(2 BRA) en V=17(Ins)
//tiene 3(if en F)
if(CondisionPresentacion==0){
if(DATO1 == 0){
POS_LETRA_SCREEN=N_LINEA_TEXTO2*128+N_Letra2;
POS_LETRA_MATRIX=0;// posicion del caracter en la memoria 15
DIRi_MATRIX=15;//15
}
else{
//17-5=12*0,2 = 2,4us
delay_us(2);
delay_cycles(2);
}
}
else{
//17-3=14*0,2 = 2,8us
delay_us(2);
delay_cycles(4);
}
3,4us//
//******************************************************************************************************
//ESTA RUTINA SE ME DEMORA 14 INSTRUCIONES EN V O f tiempo total = 14*0,2= 2,8
us//
if(CondisionPresentacion==0){
if(Bandera_N_Letra==0){
POS_LETRA_SCREEN=N_LINEA_TEXTO2*128+N_Letra2 ;//ocupa 5(Instrucciones)*0,2 =1 us
N_Letra2++;
}
else{
delay_us(1);
delay_cycles(4); //14-5(Instr cuando if(Bandera_N_Letra==0) es F) = 9(Inst)*0,2=1,8 us
}
}
else{
delay_us(2);
delay_cycles(1); //14-3(Instr cuando if(Bandera_N_Letra==0) es F) = 11(Inst)*0,2=2,2 us
}
//*********************************************************************************************
if(DATO1==126){//13(INS)*0,2=
2,6us
if(CondisionPresentacion==1){
.
BorrarScreen=0;
BorrarScreen2=0;
BorrarScreen3=0;
BorrarScreen4=0;
}
else{
//13 - 6 = 7*0,2=1,4
delay_us(1);
delay_cycles(2);
}
}
else{
//13 -4 = 9*0,2=1,8
delay_us(1);
delay_cycles(4);
}
//******************************BORRA todo POR UNA LETRA**************************************
//Esta rutina se demora 11 instrucciones en v o f tiempo total = 11*0,2 =
2,2us//
if(DATO1==126){//3(Ins) cuando if(DATO==126) v
//4(Ins) cuando if(DATO==126) F
BorrarScreen2=0;
N_Letra2=0;
POS_LETRA_SCREEN=0;
N_LINEA_TEXTO2=0;
TN_LINEA_TEXTO2=0;
CondisionPresentacion=0;
}
else{
//11(Ins)-4(Ins)=6(Ins)*0,2=1,4us
delay_us(1);
delay_cycles(2);
}
//*************************If para Borrar screen ********************************************************
//Este rutina se demora 16(Inst)
//ESTA RUTINA SE ME DEMORA 16 INSTRUCIONES EN V O f tiempo total = 16*0,2=
3,2 us//
if(Borrar2==0){
if(Bandera_N_Letra==0){
//entrar los 2 if en v se demora 4(Inst)
//Borro vector
BorrarScreen2=0;
N_Letra2=0;
N_LINEA_TEXTO2=0;
TN_LINEA_TEXTO2=0; //_aumentado
POS_LETRA_SCREEN=0;
Bandera_N_Letra=1;
Borrar2=1;
}
else{
//entrar los 1 if en v y otro if en f se demora 5(Inst)+2(BRA)=7(Ins)
//16-7=9(Ins)*0,2=1,8
.
Bandera_N_Letra=1; //2(Ins)*0,2=0,4
delay_us(1);
delay_cycles(2);
}
}
else{
//entrar los primer if en f se demora 3(Inst)=3(Ins)
////16-3=13(Ins)*0,2=2,6
Bandera_N_Letra=1;
delay_us(2);
delay_cycles(1);
}
//*************************Selecion del banco de DIRi_SCREEN********************
if( TN_LINEA_TEXTO2==0){//Ocupa 6Inst en V
tiempo total = 6*0,2= 1,2 us
n_DIRi_SCREEN=4; //2(Inst)*0,2=0,4 us
}
else{
//6(Ins)-4(Ins)=2*0,2=0,4us
delay_cycles(2);
}
if( TN_LINEA_TEXTO2==1){//Ocupa 6 Ins en V
tiempo total = 6*0,2= 1,2 us
n_DIRi_SCREEN=5; //2(Inst)*0,2=0,4 us
}
else{
//6(Ins)-4(Ins)=2*0,2=0,4us
delay_cycles(2);
}
if( TN_LINEA_TEXTO2==2){//Ocupa 7 Ins en V
tiempo total = 7*0,2= 1,4 us
n_DIRi_SCREEN=6; //2(Inst)*0,2=0,4 us
}
else{
//7(Ins)-4(Ins)=3*0,2=0,6us
delay_cycles(3);
//tiempo total = 1,2+1,2+1,4= 3,8 us//
}
//*********************BORRARUNA LETRA*************************************************
//
esta funcion tiempo de duracion 24+17(ins)=41*0,2
8,2us//
if (DATO1 == 127){//cuando if (DATO == 127) V 3(Ins)
//cuando if (DATO == 127) F 4(Ins)
//********** esta codigo ocupa 17(ins) *******************
POS_LETRA_SCREEN=N_LINEA_TEXTO2*128+N_Letra2;
if(TN_LINEA_TEXTO2!=0){//3(Ins) en F
//2(ins) en verdad
if(N_LINEA_TEXTO2==0){//3(Ins) en F
//2(ins) en verdad
if(N_Letra2==0){//3(Ins) en F
//2(ins) en verdad
//6(ins) en verdad todo los if
N_Letra2=16;
N_LINEA_TEXTO2=1;
TN_LINEA_TEXTO2--;
}
else{
//17(Ins)-11(Ins)=6*0,2=1,2us
.
delay_us(1);
delay_cycles(1);
}
}
else{
//17(Ins)-7(Ins)=10*0,2=2us
delay_us(2);
}
}
else{
//17(Ins)-3(Ins)=14*0,2=2,8us
delay_us(1);
delay_cycles(4);
}
//************************************************************************
if (N_LINEA_TEXTO2==0){
if (N_Letra2==0){//14-8=6(Ins)*0,2)1,2
delay_us(1);
delay_cycles(1);
}
else if(N_Letra2!=0){
N_Letra2=N_Letra2-1;
POS_LETRA_MATRIX=8;
DIRi_MATRIX=15;
}
}
else if(N_Letra2==0){
N_LINEA_TEXTO2=N_LINEA_TEXTO2-1;
N_Letra2=15;
POS_LETRA_MATRIX=8;
DIRi_MATRIX=15;
}
else if(N_Letra2!=0){
N_Letra2=N_Letra2-1;
POS_LETRA_MATRIX=8;
DIRi_MATRIX=15;
delay_cycles(1);
}
//14+3+5+2(BRA else)=24
}
else{
//41-4=37*0,2=7,4
delay_us(7);
delay_cycles(2);
}
//_****************************************************************************
//********************************************************************************
//La variables DIRi_SCREEN se cambia a 4 ,7 o 10 para los demas personajes
DIRi_SCREEN=4;//0,4us
//tiempo sobrante
.
//58,6 - (2,6+4,8+ 2 + 2,4 + 1,4 + 3 )(total=16,6) = 42us-(1,8us)=40,6us-3,8=36,8-0,4us=36,4
//36,4-3,4=33us-0,2(sale 3,2(If para Borrar screen)-3)=32,8-0,2=32,6-3,4=29,2us
//29,2-0,8=28,4-0,2=28,2-0,8=27,4-2,6=24,8
delay_us(24);
delay_cycles(4);
output_low(pin_a0); //sincro
//revisar
//todo esta calculado solo falta probar
}
}
void int Borrar_Screen22(){
//Sincronización Horizontal (4.4us)-goto funcion Tratar_Letra -goto(entra fun Borrar_Screen)
//4,4-0,4-0,4 = 3,6us
delay_us(3);
delay_cycles(3);
output_high(pin_a0); //negro
//Inico del tiempo de la imagem
if( BorrarScreen2==0){
//emplea 3(Ins) el if para entrar en V
int8 Ce[256]={0x0};
#Locate Ce=0x500 //Ocupamos todos los registros del Banco1
//tiempo total=257+3(inicio if)+2(Bra)=262*0,2us=52,4us
//BorrarScreen=1;
delay_cycles(1);
}
else{
//emplea 4(Ins) el if para entrar en F
delay_us(51); //262 - 4 = 258*0,2us=51,6us
delay_cycles(3);
}
//tiempo sobrante
delay_us(6); //58,6-52,4 = 6,2us
delay_cycles(1);
output_low(pin_a0); //sincro
}
//___________________________________________________________________________
___
void int Borrar_Screen23(){
//Sincronización Horizontal (4.4us)-goto funcion Tratar_Letra -goto(entra fun Borrar_Screen)
//4,4-0,4-0,4 = 3,6us
delay_us(3);
delay_cycles(3);
output_high(pin_a0); //negro
//Inico del tiempo de la imagem
if( BorrarScreen2==0){
//emplea 3(Ins) el if para entrar en V
int8 Ce[256]={0x0};
#Locate Ce=0x600 //Ocupamos todos los registros del Banco1
//tiempo total=257+3(inicio if)+2(Bra)=262*0,2us=52,4us
BorrarScreen2=1;
//delay_cycles(1);
.
}
else{
//emplea 4(Ins) el if para entrar en F
delay_us(51); //262 - 4 = 258*0,2us=51,6us
delay_cycles(3);
}
//tiempo sobrante
delay_us(6); //58,6-52,4 = 6,2us
delay_cycles(1);
output_low(pin_a0); //sincro
}
//________________________________NIÑO
3________________________________________
void int Tratar_Letra3(){
//Sincronización Horizontal (4.4us)-goto funcion ClasificarLetra -goto(entra fun Tratar_Letra)
//4,4-0,4-0,4 = 3,6us
delay_us(3);
delay_cycles(3);
output_high(pin_a0); //negro
//_***********************************************************************************
//ESTA RUTINA SE ME DEMORA 17 INSTRUCIONES EN V O f tiempo total = 17*0,2=
3,4 us//
if(N_LINEA_TEXTO3==0){//en v 2(ins) f 3(Ins) //ojo cambie 0 por 1
if(N_Letra3==16){//en v 3(ins) f 4(Ins)
if(TN_LINEA_TEXTO3==2){//en v 3(ins) f 4(Ins)
N_Letra3=15;
Borrar3=0;
//Entra a los 3(Bra)=2(ins)*3(Bra)=6(ins)*0,2=1,2
}
else{
//17 - 13(Inst cuando el if(N_LINEA_TEXTO3==1) es F)=4(Inst)*0,2=0,8 us
delay_cycles(4);
}
}
else{
//17 - 8(Inst cuando el if(N_Letra3 ==16) es F)=9(Inst)*0,2=1,8 us
delay_us(1);
delay_cycles(4);
}
}
else{
//17-3=14*0,2=2,8us
delay_us(2);
delay_cycles(4);
}
//_*****************************************************************************************************
//ESTA RUTINA SE ME DEMORA 12 INSTRUCIONES EN V O f tiempo total = 12*0,2=
2,4 us//
.
if(N_Letra3==16){
if(N_LINEA_TEXTO3==1){
N_Letra3 = 0;
N_LINEA_TEXTO3=0;
TN_LINEA_TEXTO3++;
}
else{
//12 - 8(Inst cuando el if(N_LINEA_TEXTO3==1) es F)=4(Inst)*0,2=0,8 us
delay_cycles(4);
}
}
else{
//12 - 4(Inst cuando el if(N_Letra3 ==16) es F)=8(Inst)*0,2=1,6 us
delay_us(1);
delay_cycles(3);
}
//******************************************************************************************************
//esta rutina se demora 7 intruciones tiempo total = 7*0,2=
1,4 us//
if (N_Letra3 == 16){
N_Letra3 = 0;
N_LINEA_TEXTO3++;
}
else{
//7-4(Instr cuando el if(N_Letra3 ==16) es F)=3(Instru)*0,2= 0,6us
delay_cycles(3);
}
//******************************************************************************************************
//ESTA RUTINA SE ME DEMORA 14 INSTRUCIONES EN V O f tiempo total = 14*0,2=
2,8 us//
if(CondisionPresentacion==0){
if(Bandera_N_Letra==0){
POS_LETRA_SCREEN=N_LINEA_TEXTO3*128+N_Letra3 ;//ocupa 5(Instrucciones)*0,2 =1 us
N_Letra3++;
}
else{
delay_us(1);
delay_cycles(4); //14-5(Instr cuando if(Bandera_N_Letra==0) es F) = 9(Inst)*0,2=1,8 us
}
}
else{
delay_us(2);
delay_cycles(1); //14-3(Instr cuando if(Bandera_N_Letra==0) es F) = 11(Inst)*0,2=2,2 us
}
//*********************************************************************************************
if(DATO1==126){//13(INS)*0,2=
2,6us
if(CondisionPresentacion==1){
BorrarScreen=0;
BorrarScreen2=0;
BorrarScreen3=0;
BorrarScreen4=0;
}
.
else{
//13 - 6 = 7*0,2=1,4
delay_us(1);
delay_cycles(2);
}
}
else{
//13 -4 = 9*0,2=1,8
delay_us(1);
delay_cycles(4);
}
//******************************BORRA todo POR UNA LETRA**************************************
//Esta rutina se demora 11 instrucciones en v o f tiempo total = 11*0,2 =
2,2us//
if(DATO1==126){//3(Ins) cuando if(DATO==126) v
//4(Ins) cuando if(DATO==126) F
BorrarScreen3=0;
N_Letra3=0;
POS_LETRA_SCREEN=0;
N_LINEA_TEXTO3=0;
TN_LINEA_TEXTO3=0;
CondisionPresentacion=0;
}
else{
//11(Ins)-4(Ins)=6(Ins)*0,2=1,4us
delay_us(1);
delay_cycles(2);
}
//*************************If para Borrar screen ********************************************************
//Este rutina se demora 16(Inst)
//ESTA RUTINA SE ME DEMORA 16 INSTRUCIONES EN V O f tiempo total = 16*0,2=
3,2 us//
if(Borrar3==0){
if(Bandera_N_Letra==0){
//entrar los 2 if en v se demora 4(Inst)
//Borro vector
BorrarScreen3=0;
N_Letra3=0;
N_LINEA_TEXTO3=0;
TN_LINEA_TEXTO3=0; //_aumentado
POS_LETRA_SCREEN=0;
Bandera_N_Letra=1;
Borrar3=1;
}
else{
//entrar los 1 if en v y otro if en f se demora 5(Inst)+2(BRA)=7(Ins)
//16-7=9(Ins)*0,2=1,8
Bandera_N_Letra=1; //2(Ins)*0,2=0,4
delay_us(1);
delay_cycles(2);
}
.
}
else{
//entrar los primer if en f se demora 3(Inst)=3(Ins)
////16-3=13(Ins)*0,2=2,6
Bandera_N_Letra=1;
delay_us(2);
delay_cycles(1);
}
//*************************Selecion del banco de DIRi_SCREEN********************
if( TN_LINEA_TEXTO3==0){//Ocupa 6Inst en V
tiempo total = 6*0,2= 1,2 us
n_DIRi_SCREEN=7; //2(Inst)*0,2=0,4 us
}
else{
//6(Ins)-4(Ins)=2*0,2=0,4us
delay_cycles(2);
}
if( TN_LINEA_TEXTO3==1){//Ocupa 6 Ins en V
tiempo total = 6*0,2= 1,2 us
n_DIRi_SCREEN=8; //2(Inst)*0,2=0,4 us
}
else{
//6(Ins)-4(Ins)=2*0,2=0,4us
delay_cycles(2);
}
if( TN_LINEA_TEXTO3==2){//Ocupa 7 Ins en V
tiempo total = 7*0,2= 1,4 us
n_DIRi_SCREEN=9; //2(Inst)*0,2=0,4 us
}
else{
//7(Ins)-4(Ins)=3*0,2=0,6us
delay_cycles(3);
//tiempo total = 1,2+1,2+1,4= 3,8 us//
}
//*********************BORRARUNA LETRA*************************************************
//
esta funcion tiempo de duracion 24+17(ins)=41*0,2
8,2us//
if (DATO1 == 127){//cuando if (DATO == 127) V 3(Ins)
//cuando if (DATO == 127) F 4(Ins)
//********** esta codigo ocupa 17(ins) *******************
POS_LETRA_SCREEN=N_LINEA_TEXTO3*128+N_Letra3;
if(TN_LINEA_TEXTO3!=0){//3(Ins) en F
//2(ins) en verdad
if(N_LINEA_TEXTO3==0){//3(Ins) en F
//2(ins) en verdad
if(N_Letra3==0){//3(Ins) en F
//2(ins) en verdad
//6(ins) en verdad todo los if
N_Letra3=16;
N_LINEA_TEXTO3=1;
TN_LINEA_TEXTO3--;
}
else{
//17(Ins)-11(Ins)=6*0,2=1,2us
delay_us(1);
delay_cycles(1);
}
}
.
else{
//17(Ins)-7(Ins)=10*0,2=2us
delay_us(2);
}
}
else{
//17(Ins)-3(Ins)=14*0,2=2,8us
delay_us(1);
delay_cycles(4);
}
//************************************************************************
if (N_LINEA_TEXTO3==0){
if (N_Letra3==0){//14-8=6(Ins)*0,2)1,2
delay_us(1);
delay_cycles(1);
}
else if(N_Letra3!=0){
N_Letra3=N_Letra3-1;
POS_LETRA_MATRIX=8;
DIRi_MATRIX=15;
}
}
else if(N_Letra3==0){
N_LINEA_TEXTO3=N_LINEA_TEXTO3-1;
N_Letra3=15;
POS_LETRA_MATRIX=8;
DIRi_MATRIX=15;
}
else if(N_Letra3!=0){
N_Letra3=N_Letra3-1;
POS_LETRA_MATRIX=8;
DIRi_MATRIX=15;
delay_cycles(1);
}
//14+3+5+2(BRA else)=24
}
else{
//41-4=37*0,2=7,4
delay_us(7);
delay_cycles(2);
}
//_****************************************************************************
//********************************************************************************
//La variables DIRi_SCREEN se cambia a 4 ,7 o 10 para los demas personajes
DIRi_SCREEN=7;//0,4us
//tiempo sobrante
//58,6 - (2,6+4,8+ 2 + 2,4 + 1,4 + 3 )(total=16,6) = 42us-(1,8us)=40,6us-3,8=36,8-0,4us=36,4
//36,4-3,4=33us-0,2(sale 3,2(If para Borrar screen)-3)=32,8-0,2=32,6-3,4=29,2us
//29,2-0,8=28,4-0,2=28,2-0,8=27,4-2,6=24,8
delay_us(24);
delay_cycles(4);
.
output_low(pin_a0); //sincro
//revisar
//todo esta calculado solo falta probar
}
//___________________________________________________________________________
___
void int Borrar_Screen31(){
//Sincronización Horizontal (4.4us)-goto funcion Tratar_Letra -goto(entra fun Borrar_Screen)
//4,4-0,4-0,4 = 3,6us
delay_us(3);
delay_cycles(3);
output_high(pin_a0); //negro
//Inico del tiempo de la imagem
if( BorrarScreen3==0){
//emplea 3(Ins) el if para entrar en V
int8 Ce[256]={0x0};
#Locate Ce=0x700 //Ocupamos todos los registros del Banco1
//tiempo total=257+3(inicio if)+2(Bra)=262*0,2us=52,4us
//BorrarScreen=1;
delay_cycles(1);
}
else{
//emplea 4(Ins) el if para entrar en F
delay_us(51); //262 - 4 = 258*0,2us=51,6us
delay_cycles(3);
}
//tiempo sobrante
delay_us(6); //58,6-52,4 = 6,2us
delay_cycles(1);
output_low(pin_a0); //sincro
//___________________________________________________________________________
___
}
void int Borrar_Screen32(){
//Sincronización Horizontal (4.4us)-goto funcion Tratar_Letra -goto(entra fun Borrar_Screen)
//4,4-0,4-0,4 = 3,6us
delay_us(3);
delay_cycles(3);
output_high(pin_a0); //negro
//Inico del tiempo de la imagem
if( BorrarScreen3==0){
//emplea 3(Ins) el if para entrar en V
int8 Ce[256]={0x0};
#Locate Ce=0x800 //Ocupamos todos los registros del Banco1
//tiempo total=257+3(inicio if)+2(Bra)=262*0,2us=52,4us
//BorrarScreen=1;
delay_cycles(1);
}
else{
//emplea 4(Ins) el if para entrar en F
.
delay_us(51); //262 - 4 = 258*0,2us=51,6us
delay_cycles(3);
}
//tiempo sobrante
delay_us(6); //58,6-52,4 = 6,2us
delay_cycles(1);
output_low(pin_a0); //sincro
}
//___________________________________________________________________________
___
void int Borrar_Screen33(){
//Sincronización Horizontal (4.4us)-goto funcion Tratar_Letra -goto(entra fun Borrar_Screen)
//4,4-0,4-0,4 = 3,6us
delay_us(3);
delay_cycles(3);
output_high(pin_a0); //negro
//Inico del tiempo de la imagem
if( BorrarScreen3==0){
//emplea 3(Ins) el if para entrar en V
int8 Ce[256]={0x0};
#Locate Ce=0x900 //Ocupamos todos los registros del Banco1
//tiempo total=257+3(inicio if)+2(Bra)=262*0,2us=52,4us
BorrarScreen3=1;
//delay_cycles(1);
}
else{
//emplea 4(Ins) el if para entrar en F
delay_us(51); //262 - 4 = 258*0,2us=51,6us
delay_cycles(3);
}
//tiempo sobrante
delay_us(6); //58,6-52,4 = 6,2us
delay_cycles(1);
output_low(pin_a0); //sincro
}
//_*****************************************************************************************************
//ESTA RUTINA SE ME DEMORA 12 INSTRUCIONES EN V O f tiempo total = 12*0,2=
2,4 us//
if(N_Letra4==16){
if(N_LINEA_TEXTO4==1){
N_Letra4 = 0;
N_LINEA_TEXTO4=0;
TN_LINEA_TEXTO4++;
}
else{
//12 - 8(Inst cuando el if(N_LINEA_TEXTO4==1) es F)=4(Inst)*0,2=0,8 us
delay_cycles(4);
}
}
.
else{
//12 - 4(Inst cuando el if(N_Letra4 ==16) es F)=8(Inst)*0,2=1,6 us
delay_us(1);
delay_cycles(3);
}
//******************************************************************************************************
//esta rutina se demora 7 intruciones tiempo total = 7*0,2=
1,4 us//
if (N_Letra4 == 16){
N_Letra4 = 0;
N_LINEA_TEXTO4++;
}
else{
//7-4(Instr cuando el if(N_Letra4 ==16) es F)=3(Instru)*0,2= 0,6us
delay_cycles(3);
}
//********************************8******************************************************
//
esta funcion tiempo de duracion 17*0,2 =
//tiene 4(ifs en V)+9(inst)+4(2 BRA) en V=17(Ins)
//tiene 3(if en F)
if(CondisionPresentacion==0){
if(DATO1 == 0){
POS_LETRA_SCREEN=N_LINEA_TEXTO4*128+N_Letra4;
POS_LETRA_MATRIX=0;// posicion del caracter en la memoria 15
DIRi_MATRIX=15;//15
}
else{
//17-5=12*0,2 = 2,4us
delay_us(2);
delay_cycles(2);
}
}
else{
//17-3=14*0,2 = 2,8us
delay_us(2);
delay_cycles(4);
}
3,4us//
//******************************************************************************************************
//ESTA RUTINA SE ME DEMORA 14 INSTRUCIONES EN V O f tiempo total = 14*0,2=
2,8 us//
if(CondisionPresentacion==0){
if(Bandera_N_Letra==0){
POS_LETRA_SCREEN=N_LINEA_TEXTO4*128+N_Letra4 ;//ocupa 5(Instrucciones)*0,2 =1 us
N_Letra4++;
}
else{
delay_us(1);
delay_cycles(4); //14-5(Instr cuando if(Bandera_N_Letra==0) es F) = 9(Inst)*0,2=1,8 us
}
}
else{
POS_LETRA_MATRIX=0;// posicion del caracter en la memoria 15
DIRi_MATRIX=10;//15
.
delay_us(1);
delay_cycles(3); //14-3(Instr cuando if(Bandera_N_Letra==0) es F) = 11(Inst)*0,2=2,2 us
}
//*********************************************************************************************
if(DATO1==126){//13(INS)*0,2=
2,6us
if(CondisionPresentacion==1){
BorrarScreen=0;
BorrarScreen2=0;
BorrarScreen3=0;
BorrarScreen4=0;
}
else{
//13 - 6 = 7*0,2=1,4
delay_us(1);
delay_cycles(2);
}
}
else{
//13 -4 = 9*0,2=1,8
delay_us(1);
delay_cycles(4);
}
//******************************BORRAtodo POR UNA LETRA**************************************
//Esta rutina se demora 11 instrucciones en v o f tiempo total = 11*0,2 =
2,2us//
if(DATO1==126){//3(Ins) cuando if(DATO==126) v
//4(Ins) cuando if(DATO==126) F
BorrarScreen4=0;
N_Letra4=0;
POS_LETRA_SCREEN=0;
N_LINEA_TEXTO4=0;
TN_LINEA_TEXTO4=0;
CondisionPresentacion=0;
}
else{
//11(Ins)-4(Ins)=6(Ins)*0,2=1,4us
delay_us(1);
delay_cycles(2);
}
//*************************If para Borrar screen ********************************************************
//Este rutina se demora 16(Inst)
//ESTA RUTINA SE ME DEMORA 16 INSTRUCIONES EN V O f tiempo total = 16*0,2=
3,2 us//
if(Borrar4==0){
if(Bandera_N_Letra==0){
//entrar los 2 if en v se demora 4(Inst)
//Borro vector
BorrarScreen4=0;
N_Letra4=0;
N_LINEA_TEXTO4=0;
.
TN_LINEA_TEXTO4=0; //_aumentado
POS_LETRA_SCREEN=0;
Bandera_N_Letra=1;
Borrar4=1;
}
else{
//entrar los 1 if en v y otro if en f se demora 5(Inst)+2(BRA)=7(Ins)
//16-7=9(Ins)*0,2=1,8
Bandera_N_Letra=1; //2(Ins)*0,2=0,4
delay_us(1);
delay_cycles(2);
}
}
else{
//entrar los primer if en f se demora 3(Inst)=3(Ins)
////16-3=13(Ins)*0,2=2,6
Bandera_N_Letra=1;
delay_us(2);
delay_cycles(1);
}
//*************************Selecion del banco de DIRi_SCREEN********************
if( TN_LINEA_TEXTO4==0){//Ocupa 6Inst en V
tiempo total = 6*0,2= 1,2 us
n_DIRi_SCREEN=10; //2(Inst)*0,2=0,4 us
}
else{
//6(Ins)-4(Ins)=2*0,2=0,4us
delay_cycles(2);
}
if( TN_LINEA_TEXTO4==1){//Ocupa 6 Ins en V
tiempo total = 6*0,2= 1,2 us
n_DIRi_SCREEN=11; //2(Inst)*0,2=0,4 us
}
else{
//6(Ins)-4(Ins)=2*0,2=0,4us
delay_cycles(2);
}
if( TN_LINEA_TEXTO4==2){//Ocupa 7 Ins en V
tiempo total = 7*0,2= 1,4 us
n_DIRi_SCREEN=12; //2(Inst)*0,2=0,4 us
}
else{
//7(Ins)-4(Ins)=3*0,2=0,6us
delay_cycles(3);
//tiempo total = 1,2+1,2+1,4= 3,8 us//
}
//*********************BORRARUNALETRA*************************************************
//
esta funcion tiempo de duracion 24+17(ins)=41*0,2
8,2us//
if (DATO1 == 127){//cuando if (DATO == 127) V 3(Ins)
//cuando if (DATO == 127) F 4(Ins)
//********** esta codigo ocupa 17(ins) *******************
POS_LETRA_SCREEN=N_LINEA_TEXTO4*128+N_Letra4;
if(TN_LINEA_TEXTO4!=0){//3(Ins) en F
//2(ins) en verdad
if(N_LINEA_TEXTO4==0){//3(Ins) en F
//2(ins) en verdad
if(N_Letra4==0){//3(Ins) en F
.
//2(ins) en verdad
//6(ins) en verdad todo los if
N_Letra4=16;
N_LINEA_TEXTO4=1;
TN_LINEA_TEXTO4--;
}
else{
//17(Ins)-11(Ins)=6*0,2=1,2us
delay_us(1);
delay_cycles(1);
}
}
else{
//17(Ins)-7(Ins)=10*0,2=2us
delay_us(2);
}
}
else{
//17(Ins)-3(Ins)=14*0,2=2,8us
delay_us(1);
delay_cycles(4);
}
//************************************************************************
if (N_LINEA_TEXTO4==0){
if (N_Letra4==0){//14-8=6(Ins)*0,2)1,2
delay_us(1);
delay_cycles(1);
}
else if(N_Letra4!=0){
N_Letra4=N_Letra4-1;
POS_LETRA_MATRIX=8;
DIRi_MATRIX=15;
}
}
else if(N_Letra4==0){
N_LINEA_TEXTO4=N_LINEA_TEXTO4-1;
N_Letra4=15;
POS_LETRA_MATRIX=8;
DIRi_MATRIX=15;
}
else if(N_Letra4!=0){
N_Letra4=N_Letra4-1;
POS_LETRA_MATRIX=8;
DIRi_MATRIX=15;
delay_cycles(1);
}
//14+3+5+2(BRA else)=24
}
else{
//41-4=37*0,2=7,4
delay_us(7);
delay_cycles(2);
.
}
//_****************************************************************************
//********************************************************************************
//La variables DIRi_SCREEN se cambia a 4 ,7 o 10 para los demas personajes
DIRi_SCREEN=10;//0,4us
//tiempo sobrante
//58,6 - (2,6+4,8+ 2 + 2,4 + 1,4 + 3 )(total=16,6) = 42us-(1,8us)=40,6us-3,8=36,8-0,4us=36,4
//36,4-3,4=33us-0,2(sale 3,2(If para Borrar screen)-3)=32,8-0,2=32,6-3,4=29,2us
//29,2-0,8=28,4-0,2=28,2-0,8=27,4-2,6=24,8
delay_us(24);
delay_cycles(4);
output_low(pin_a0); //sincro
//revisar
//todo esta calculado solo falta probar
}
//___________________________________________________________________________
___
void int Borrar_Screen41(){
//Sincronización Horizontal (4.4us)-goto funcion Tratar_Letra -goto(entra fun Borrar_Screen)
//4,4-0,4-0,4 = 3,6us
delay_us(3);
delay_cycles(3);
output_high(pin_a0); //negro
//Inico del tiempo de la imagem
if( BorrarScreen4==0){
//emplea 3(Ins) el if para entrar en V
int8 Ce[256]={0x0};
#Locate Ce=0xA00 //Ocupamos todos los registros del Banco1
//tiempo total=257+3(inicio if)+2(Bra)=262*0,2us=52,4us
//BorrarScreen=1;
delay_cycles(1);
}
else{
//emplea 4(Ins) el if para entrar en F
delay_us(51); //262 - 4 = 258*0,2us=51,6us
delay_cycles(3);
}
//tiempo sobrante
delay_us(6); //58,6-52,4 = 6,2us
delay_cycles(1);
output_low(pin_a0); //sincro
//___________________________________________________________________________
___
}
void int Borrar_Screen42(){
//Sincronización Horizontal (4.4us)-goto funcion Tratar_Letra -goto(entra fun Borrar_Screen)
//4,4-0,4-0,4 = 3,6us
delay_us(3);
delay_cycles(3);
.
output_high(pin_a0); //negro
//Inico del tiempo de la imagem
if( BorrarScreen4==0){
//emplea 3(Ins) el if para entrar en V
int8 Ce[256]={0x0};
#Locate Ce=0xB00 //Ocupamos todos los registros del Banco1
//tiempo total=257+3(inicio if)+2(Bra)=262*0,2us=52,4us
//BorrarScreen=1;
delay_cycles(1);
}
else{
//emplea 4(Ins) el if para entrar en F
delay_us(51); //262 - 4 = 258*0,2us=51,6us
delay_cycles(3);
}
//tiempo sobrante
delay_us(6); //58,6-52,4 = 6,2us
delay_cycles(1);
output_low(pin_a0); //sincro
}
//___________________________________________________________________________
___
void int Borrar_Screen43(){
//Sincronización Horizontal (4.4us)-goto funcion Tratar_Letra -goto(entra fun Borrar_Screen)
//4,4-0,4-0,4 = 3,6us
delay_us(3);
delay_cycles(3);
output_high(pin_a0); //negro
//Inico del tiempo de la imagem
if( BorrarScreen4==0){
//emplea 3(Ins) el if para entrar en V
int8 Ce[256]={0x0};
#Locate Ce=0xC00 //Ocupamos todos los registros del Banco1
//tiempo total=257+3(inicio if)+2(Bra)=262*0,2us=52,4us
BorrarScreen4=1;
}
else{
//emplea 4(Ins) el if para entrar en F
delay_us(51); //262 - 4 = 258*0,2us=51,6us
delay_cycles(3);
}
//tiempo sobrante
delay_us(6); //58,6-52,4 = 6,2us
delay_cycles(1);
output_low(pin_a0); //sincro
}
//___________________________________________________________________________
___
//
FIN
.
//___________________________________________________________________________
___
Void LlenarScreen(){
//Sincronización Horizontal (4.4us)-goto funcion ClasificarLetra -goto(entra fun Tratar_Letra)
//4,4-0,4-0,4-0,4 = 3,6us
delay_us(3);
delay_cycles(3);
output_high(pin_a0); //negro
/*
Duracion de la funcion es:
17(Instruciones) al inicar la funcion
(7*6(Inst))=42(Istrucciones) de repeticiones
9(Instrucciones) de terminado la funcion
Tiempo total=68(Ins)*0,2=13,6 us
Variables a ingresar a la funcion
DIR_MATRIX = Controla la posicion de inicio del banco donde se encuentra guardadas las
letras o numeros
Valores a tomar (Matrix Letras Mayusculas = 600 -- 6D7
Matrix Numeros 0 4=6D8--- 6FF
MAtrix Letras Minusculas = )
n_DIR_SCREEN = Controla la posicion de inicio de los vectores screen
Valores a tomar (Screen1=100h
Screen2=200h
Screen3=300h
Screen4=400h )
POS_LETRA_SCREEN = de acuedo a la formula 128*(Numero de Texto)+Numero de Letras
digitadas
Valores atomar (Numero de Letras digitadas=0....15
Numero de Lineas de Texto = 0 y 1 )
POS_LETRA_MATRIX = Indica la direccion donde comienza la letra en la matrix
Codigos de POS_LETRA_MATRIX
A
0X6 00
B
0X6 08
C
0X6 10
D
0X6 18
E
0X6 20
F
0X6 28
G
0X6 30
H
0X6 38
I
0X6 40
J
0X6 48
K
0X6 50
L
0X6 58
M
0X6 60
N
0X6 68
Ñ
0X6 70
O
0X6 78
.
P
0X6 80
Q
0X6 88
R
0X6 90
S
0X6 98
T
0X6 A0
U
0X6 A8
V
0X6 B0
W
0X6 B8
X
0X6 C0
Y
0X6 C8
Z
0X6 D0
FSR0 usamos para manipular las direcciones del vector
FSR1 usamos para manipular las direcciones del la Matrix
*/
#ASM
CLRF
CLRF
CLRF
CLRF
FSR0H
FSR0L
FSR1H
FSR1L
//Cargamos a los registros los numeros base 0=banco 0 --1=banco1....15=banco 15
//PARA SELECCIONAR EL BANCO SCREEN
MOVLB 0
MOVF DIRi_MATRIX,w //movemos 1 al registro W
MOVWF FSR1H //movemos el registro W a FSR1H
//PARA SELECCIONAR EL BANCO LETRAS y NUMEROS
CLRF W
MOVF n_DIRi_SCREEN ,W //movemos EL CONTENIDO DE DIRECCION DEL BANCO al
registro W
MOVWF FSR0H //movemos w al registro FSR0H
//*******************************0****************************************
//INGRESO direccion del VECTOR screen a FSR0
MOVLW 0 //Cargamos el registro w con el valor de 16(ver vector screen)
ADDWF POS_LETRA_SCREEN,W //sumamos W+J
MOVWF FSR0L//movemos el valor de W a FSR0L
//INGRESO la direccion de la matrix a FSR1
MOVF POS_LETRA_MATRIX,W //Movemos el valor de POS _LETRA a W
MOVWF FSR1L //Movemos W a FSR1L
MOVFF INDF1,INDF0
//*******************************1*****************************************
//INGRESO direccion del VECTOR screen a FSR0
MOVLW 16 //Cargamos el registro w con el valor de 16(ver vector screen)
ADDWF POS_LETRA_SCREEN,W //sumamos W+J
MOVWF FSR0L//movemos el valor de W a FSR0L
//INGRESO la direccion de la matrix a FSR1
INCF FSR1L,F
MOVFF INDF1,INDF0
.
//********************************2****************************************
//INGRESO direccion del VECTOR screen a FSR0
MOVLW 32 //Cargamos el registro w con el valor de 32 (ver vector screen)
ADDWF POS_LETRA_SCREEN,W //sumamos W+J
MOVWF FSR0L//movemos el valor de W a FSR0L
//INGRESO la direccion de la matrix a FSR1
INCF FSR1L,F
MOVFF INDF1,INDF0
//********************************3****************************************
//INGRESO direccion del VECTOR screen a FSR0
MOVLW 48 //Cargamos el registro w con el valor de 48(ver vector screen)
ADDWF POS_LETRA_SCREEN,W //sumamos W+J
MOVWF FSR0L//movemos el valor de W a FSR0L
//INGRESO la direccion de la matrix a FSR1
INCF FSR1L,F
MOVFF INDF1,INDF0
//********************************4****************************************
//INGRESO direccion del VECTOR screen a FSR0
MOVLW 64 //Cargamos el registro w con el valor de 16(ver vector screen)
ADDWF POS_LETRA_SCREEN,W //sumamos W+J
MOVWF FSR0L//movemos el valor de W a FSR0L
//INGRESO la direccion de la matrix a FSR1
INCF FSR1L,F
MOVFF INDF1,INDF0
//********************************5****************************************
//INGRESO direccion del VECTOR screen a FSR0
MOVLW 80 //Cargamos el registro w con el valor de 16(ver vector screen)
ADDWF POS_LETRA_SCREEN,W //sumamos W+J
MOVWF FSR0L//movemos el valor de W a FSR0L
//INGRESO la direccion de la matrix a FSR1
INCF FSR1L,F
MOVFF INDF1,INDF0
//********************************6****************************************
//INGRESO direccion del VECTOR screen a FSR0
MOVLW 96 //Cargamos el registro w con el valor de 16(ver vector screen)
ADDWF POS_LETRA_SCREEN,W //sumamos W+J
MOVWF FSR0L//movemos el valor de W a FSR0L
//INGRESO la direccion de la matrix a FSR1
INCF FSR1L,F
MOVFF INDF1,INDF0
//********************************7****************************************
//INGRESO direccion del VECTOR screen a FSR0
MOVLW 112 //Cargamos el registro w con el valor de 16(ver vector screen)
ADDWF POS_LETRA_SCREEN,W //sumamos W+J
MOVWF FSR0L//movemos el valor de W a FSR0L
.
//INGRESO la direccion de la matrix a FSR1
INCF FSR1L,F
MOVFF INDF1,INDF0
//7 por el tamano de la letra es de 8 pixeles
//********************************FIN****************************************
CLRF FSR0H
CLRF FSR0L
CLRF FSR1H
CLRF FSR1L
CLRF INDF0
CLRF INDF1
CLRF POS_LETRA_MATRIX
CLRW
CLRF POS_LETRA_SCREEN
#ENDASM
//tiempo sobrante
delay_us(45); //58,6 - 13,6us = 45 us
output_low(pin_a0); //sincro
//ya Terminado
}
//___________________________________________________________________________
___
Void Draw_Letras(){ //x=numero de lineas a repetir
/*
DIRi_SCREEN =
*/
#asm
CLRF FSR0H
CLRF FSR0L
CLRF PORTC
CLRF W
MOVF DIRi_SCREEN ,W //movemos EL CONTENIDO DE DIRECCION DEL BANCO al
registro W
MOVWF FSR0H //movemos w al registro FSR0H
MOVLW 0 //movemos EL CONTENIDO DE DIRECCION DEL BANCO al registro W
MOVWF FSR0L //movemos w al registro FSR0H
//total = 8(instrucciones de ingreso)
//*************************** INICIO DEL BUCLE *********************************
Loop:
#endasm
//Sincronización Horizontal (4.4us)+0,2(output)=4,6us
output_low(pin_a0); //sincronismo
delay_us(4);
.
delay_cycles(2);
//Back porch =4,8us +0,2(output)=5us
output_high(pin_a0); //negro
delay_us(4);
delay_cycles(4);
//63,4-4,4-4,8-0,4-2,2=51,6us
//******************IMAGEN********** Tiempo disponible = 51,6
delay_us(7);
#asm
//Letra 1
MOVFF INDF0,PORTC //2 ciclos
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
INCF FSR0L,F //total 11(Instrucciones)=
//Letra 2
MOVFF INDF0,PORTC //2 ciclos
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
INCF FSR0L,F //total 11(Instrucciones)=
//Letra 3
MOVFF INDF0,PORTC //2 ciclos
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
INCF FSR0L,F //total 11(Instrucciones)=
//Letra 4
MOVFF INDF0,PORTC //2 ciclos
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
.
INCF FSR0L,F //total 11(Instrucciones)=
//Letra 5
MOVFF INDF0,PORTC //2 ciclos
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
INCF FSR0L,F //total 11(Instrucciones)=
//Letra 6
MOVFF INDF0,PORTC //2 ciclos
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
INCF FSR0L,F //total 11(Instrucciones)=
//Letra 7
MOVFF INDF0,PORTC //2 ciclos
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
INCF FSR0L,F //total 11(Instrucciones)=
//Letra 8
MOVFF INDF0,PORTC //2 ciclos
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
INCF FSR0L,F //total 11(Instrucciones)=
//Letra 9
MOVFF INDF0,PORTC //2 ciclos
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
.
rrcf PORTC,F
rrcf PORTC,F
INCF FSR0L,F //total 11(Instrucciones)=
//Letra 10
MOVFF INDF0,PORTC //2 ciclos
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
rrcf PORTC,F
INCF FSR0L,F //total 11(Instrucciones)=
// Total = 11(instrucciones)*16= (176+1(clrf PORTC))=177*0,2=35,4
//tiempo disponible =51,6-35,4=16,2us
//16,2-7=9,2
nop
#endasm
//Front Porch + 0,2(Output)= 2,2us
//9,2+1,4(Front Porch)=10,6us
output_high(pin_a0); //negro
delay_us(10);// tiempo sobrante o disponible + 1 del //Front Porch
delay_cycles(3);//2us-0,6(Decfsz y Goto)=1,4us
#asm
DECFSZ N_LineasVideo,F
GOTO Loop
BCF 0xF89.0 // enceramos pin_a0 sincronismo
CLRF FSR0H
CLRF FSR0L
#endasm
DIRi_SCREEN++;
//Tiempo de Salid 7(Instrucciones)=7*0,2=1,4 us
}
CARGAR_DATOS.H
//Declaracion dela Matrix Direccion D00H
int8 Matrix_Mayusculas[27][8]={
//A
0x0,0x1C,0x22,0x41,0x7F,0x41,0x41,0x41
//B
0x00,0x3F,0x63,0x63,0x3F,0x63,0x63,0x3F,
//C
0x00,0x7E,0x7F,0x3,0x3,0x3,0x7F,0x7E,
//D
.
0x00,0x3F,0x43,0x43,0x43,0x43,0x43,0x3F
//E
0x00,0x7F,0x3,0x3,0x3F,0x3,0x3,0x7F,
//F
0x00,0x7F,0x3,0x3,0x3F,0x3,0x3,0x3,
//G
0x00,0x7E,0x43,0x3,0x7B,0x5B,0x43,0x7E,
//H
0x00,0x3,0x63,0x63,0x7F,0x63,0x63,0x63,
//I
0x00,0x7F,0x8,0x8,0x8,0x8,0x8,0x7F,
//J
0x00,0x7E,0x18,0x18,0x18,0x1B,0x1B,0x1E,
//K
0x00,0x63,0x33,0x1F,0xF,0x1F,0x33,0x63,
//L
0x00,0x3,0x3,0x3,0x3,0x3,0x3,0x7F,
//M
0x00,0x63,0x77,0x7F,0x6B,0x63,0x63,0x63,
//N
0x00,0x63,0x67,0x6F,0x7B,0x73,0x63,0x63,
//Ñ
0x00,0x18,0x63,0x67,0x6F,0x7B,0x73,0x63,
//O
0x00,0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,
//P
0x00,0x3F,0x63,0x63,0x3F,0x3,0x3,0x3,
//Q
0x00,0x1E,0x21,0x21,0x21,0x29,0x31,0x5E
//R
0x00,0x3F,0x43,0x43,0x3F,0x1B,0x33,0x63
//S
0x00,0x3E,0x63,0x3,0x3E,0x60,0x63,0x3E,
//T
0x00,0x7F,0x8,0x8,0x8,0x8,0x8,0x8,
//U
0x00,0x63,0x63,0x63,0x63,0x63,0x7F,0x3E,
//V
0x00,0x63,0x63,0x63,0x63,0x63,0x3E,0x1C,
//W
0x00,0x63,0x63,0x6B,0x6B,0x77,0x77,0x63,
//X
0x00,0x41,0x22,0x14,0x8,0x14,0x22,0x41,
//Y
0x00,0x41,0x22,0x1C,0x8,0x8,0x8,0x8,
//Z
0x00,0x7F,0x21,0x10,0x8,0x4,0x42,0x7F,
//27 Letras OCUPA MEMORIA DE D00 HASTA DD7
//OCUPA HASTA LA DIRECCION DD7
//SOBRAN 40 espacios de memoria
};
#Locate Matrix_Mayusculas=0xD00
/////////////////Matrix Numeros59/////////////////
int8 Matrix_Numeros04[5][8]={
.
//0
0x00,0x3E,0x71,0x59,0x4D,0x45,0x47,0x3E
//1
0X00,0X38,0X3C,0X36,0X30,0X30,0X30,0X30,
//2
0X00,0X3E,0X63,0X63,0X30,0XC,0X6,0X7F,
//3
0X00,0X3E,0X63,0X60,0X7C,0X60,0X63,0X3E,
//4
0x00,0x33,0x33,0x33,0x7E,0x60,0x60,0x60,
};
#Locate Matrix_Numeros04=0xDD8 //OCUPA MEMORIA DE DD8 -- DFF
int8 Matrix_Numeros59[5][8]={
//5
0X00,0X7F,0X3,0X3,0X3E,0X00,0X63,0X3E,
//6
0X00,0X7C,0X6,0X3,0X3F,0X63,0X63,0X3E,
//7
0X00,0X7E,0X60,0X60,0XFC,0X60,0X60,0X60,
//8
0x00,0x3E,0x63,0x63,0x3E,0x63,0x63,0x3E,
//9
0x00,0x3E,0x63,0x63,0x7E,0x60,0x63,0x3E,
};
#Locate Matrix_Numeros59=0xED8 //OCUPA MEMORIA DE ED8 -- EFF
/////////////////Matrix Caracteres especiales/////////////////
int8 Matrix_Caracteres[7][8]={
//"Guion "
0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x7F,
//" "
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
// +
0x00,0x18,0x18,0x7E,0x7E,0x18,0x18,0x00
// 0x00,0x00,0x00,0x7E,0x7E,0x00,0x00,0x00
// *
0x00,0x49,0x2A,0x1C,0x1C,0x1C,0x2A,0x49
// /
0x00,0x60,0x70,0x38,0x1C,0x0E,0x07,0x03
// =
0x00,0x00,0x7F,0x7F,0x00,0x7F,0x7F,0x00
};
#Locate Matrix_Caracteres=0xF00 //OCUPA MEMORIA DE F00 en adelante
.
SINCRONISMOV1.H
#use delay(clock=20000000)
#use fast_io(A)
#use fast_io(B)
int8 i,p;
int8 Campo=0;//valor inicial es 0 recu
void Pulsos_Campo_I(){
/* Ingresar al for ocupa =5(Inst) =1 us
Ciclo intermedio
=6(Inst)=1,2 us
Salir del for ocupa =7(Inst)=1,4 us
Los output ocupan = 0,2 us
*/
//6 post-sync
/* pulso bajo = 2,2
pulso alto = 29,2
*/
if(campo==1){
//if(campo==1) V ocupa 2(Ins) para entrar
//if(campo==1) F ocupa 3(Ins) para saltar
//2,6 sale de tiempo em el if(campo==1)(7 Instrucciones) F+entrara al for(5 Intrucciones )
delay_us(2); //necesito 2,6us para formar el pulso de la linea 262
delay_cycles(1);
output_low(pin_a0); //Sincro //2,6-0,4(2Inst)=2,2 us
//Aqui formamos el primer pulso de sicronismo vertical ver grafico
delay_us(4); //4,4 genera tiempo para sincro
delay_cycles(2);
output_high(pin_a0); //Negro
delay_us(25);//27,2 - 0,6(3 Instr de la variable p y campo )-0,4(Goto else) - 1(entrada al for)-=
25,2
delay_cycles(1);//27,2=tiempo de la linea de video(63,6)/2 y restado tiempo de sincro h y resta
0,2 output
p=4;//p=4 para dibujar 4 pulsos cunado es el campo 2
campo=0;//campo =0 para activar el campo
}
else{
p=5; //p=5 para dibujar 5 pulsos cunado es el campo 1
campo=1;//campo = 1 para activar el campo
}
for(i=1;i<=6;i++){//6
output_low(pin_a0); //Sincro
delay_us(2); //2,2us para sincro
delay_cycles(1);
output_high(pin_a0); //Negro
delay_us(28);//29,2 - 1,2(Ciclo Intermedio del For)= 28
}
//6 sincros verticales
/* pulso bajo = 26,8
pulso alto = 4,6
*/
.
output_low(pin_a0); //sincro
delay_us(26);
delay_cycles(4);
output_high(pin_a0); //negro
delay_us(3);
delay_cycles(3); //4,6-1(Ciclo Entrada al For)= 3,6
for(i=1;i<=5;i++){ //5
output_low(pin_a0); //sincro
delay_us(26);
delay_cycles(4);
output_high(pin_a0); //negro
delay_us(3);
delay_cycles(2); //4,6-1,2(Ciclo Intermedio del For)=3,4
}
//6 post-sync para los campos
/* pulso alto = 2,2
pulso bajo = 29,2
*/
output_low(pin_a0); //sincro
delay_us(2);
delay_cycles(1);
output_high(pin_a0); //negro
delay_us(28); //29,2-1(Ciclo Entrada al For)=28,2
delay_cycles(1);
for(i=1;i<=p;i++){
output_low(pin_a0); //sincro
delay_us(2);
delay_cycles(1);
output_high(pin_a0); //negro
delay_us(28); //29,2 - 1,2(Ciclo Intermedio del For)= 28
}
output_low(pin_a0); //sincro
if(campo==0){
delay_us(1); //2,2 -0,4(0,2*2(instruciones entrar if(campo==0) en condicion V)) =1,8
delay_cycles(4);
//Aqui formamos completamente la linea de video 9
output_high(pin_a0); //negro
delay_us(60); //60,8
delay_cycles(4);
output_low(pin_a0); //sincro
//Este delay_cycles(3) uso para completar el tiempo de sincronizacion horizontal para linea 10
delay_cycles(3);//Compenso los 3(Instruc) que usa el if(campo==0) en falso
}
}//Goto 0,4 us
//esto ya esta terminado
VIDEO.H
#use delay(clock=20000000)
#use fast_io(A)
#use fast_io(B)
.
int8 i,p;
int8 Campo=0;//valor inicial es 0 recu
void Pulsos_Campo_I(){
/* Ingresar al for ocupa =5(Inst) =1 us
Ciclo intermedio
=6(Inst)=1,2 us
Salir del for ocupa =7(Inst)=1,4 us
Los output ocupan = 0,2 us
*/
//6 post-sync
/* pulso bajo = 2,2
pulso alto = 29,2
*/
if(campo==1){
//if(campo==1) V ocupa 2(Ins) para entrar
//if(campo==1) F ocupa 3(Ins) para saltar
//2,6 sale de tiempo em el if(campo==1)(7 Instrucciones) F+entrara al for(5 Intrucciones )
delay_us(2); //necesito 2,6us para formar el pulso de la linea 262
delay_cycles(1);
output_low(pin_a0); //Sincro //2,6-0,4(2Inst)=2,2 us
//Aqui formamos el primer pulso de sicronismo vertical ver grafico
delay_us(4); //4,4 genera tiempo para sincro
delay_cycles(2);
output_high(pin_a0); //Negro
delay_us(25);//27,2 - 0,6(3 Instr de la variable p y campo )-0,4(Goto else) - 1(entrada al for)-=
25,2
delay_cycles(1);//27,2=tiempo de la linea de video(63,6)/2 y restado tiempo de sincro h y resta
0,2 output
p=4;//p=4 para dibujar 4 pulsos cunado es el campo 2
campo=0;//campo =0 para activar el campo
}
else{
p=5; //p=5 para dibujar 5 pulsos cunado es el campo 1
campo=1;//campo = 1 para activar el campo
}
for(i=1;i<=6;i++){//6
output_low(pin_a0); //Sincro
delay_us(2); //2,2us para sincro
delay_cycles(1);
output_high(pin_a0); //Negro
delay_us(28);//29,2 - 1,2(Ciclo Intermedio del For)= 28
}
//6 sincros verticales
/* pulso bajo = 26,8
pulso alto = 4,6
*/
for(i=1;i<=5;i++){ //5
output_low(pin_a0); //sincro
delay_us(26);
delay_cycles(4);
output_high(pin_a0); //negro
.
delay_us(3);
delay_cycles(2); //4,6-1,2(Ciclo Intermedio del For)=3,4
}
//6 post-sync para los campos
/* pulso alto = 2,2
pulso bajo = 29,2
*/
output_low(pin_a0); //sincro
delay_us(2);
delay_cycles(1);
output_high(pin_a0); //negro
delay_us(28); //29,2-1(Ciclo Entrada al For)=28,2
delay_cycles(1);
for(i=1;i<=p;i++){
output_low(pin_a0); //sincro
delay_us(2);
delay_cycles(1);
output_high(pin_a0); //negro
delay_us(28); //29,2 - 1,2(Ciclo Intermedio del For)= 28
}
output_low(pin_a0); //sincro
if(campo==0){
delay_us(1); //2,2 -0,4(0,2*2(instruciones entrar if(campo==0) en condicion V)) =1,8
delay_cycles(4);
//Aqui formamos completamente la linea de video 9
output_high(pin_a0); //negro
delay_us(60); //60,8
delay_cycles(4);
output_low(pin_a0); //sincro
//Este delay_cycles(3) uso para completar el tiempo de sincronizacion horizontal para linea 10
delay_cycles(3);//Compenso los 3(Instruc) que usa el if(campo==0) en falso
}
}//Goto 0,4 us
//esto ya esta terminado
#use delay(clock=20000000)
#use fast_io(A)
#use fast_io(B)
int n1;
Void LineasNegras(int x){
For(n1=1;n1<=x;++n1){
//Sincronización Horizontal (4.4us)
output_low(pin_a0); //sincro
delay_us(4);
delay_cycles(2);
//lineas de imagen + black porch 58,6-1,2(Ciclo Intermedio for)=57,4 us
output_high(pin_a0); //negro
delay_us(57);
.
delay_cycles(2);
}
output_low(pin_a0); //sincro
}
//_________________________LineasBlancas______________________________________
__
Void LineasBlancas(int x){
for(n1=1;n1<=x;++n1){
//Sincronización Horizontal (4.4us)
output_low(pin_a0); //sincro
delay_us(4);
delay_cycles(2);
//Back porch =4,8us +0,2(output)=5us
output_high(pin_a0); //negro
delay_us(4);
delay_cycles(4);
//Imagen = 63,4-4,4-4,8-0,4-2,2=51,6us
output_high(pin_a0); //negro
delay_us(51);
delay_cycles(3);
output_high(pin_a0); //negro
delay_cycles(4);// tiempo sobrante o disponible + 1 del //Front Porch
//2-1,2
}
output_low(pin_a0); //sincro
}
//_________________________LineasBlancas______________________________________
__
Void LineasBlancasNegras(int x){
for(n1=1;n1<=x;++n1){
//Sincronización Horizontal (4.4us)
output_low(pin_a0); //sincro
delay_us(4);
delay_cycles(2);
//Back porch =4,8us +0,2(output)=5us
output_high(pin_a0); //negro
delay_us(4);
delay_cycles(4);
//Imagen = 63,4-4,4-4,8-0,4-2,2=51,6us
output_high(pin_a0); //negro
delay_us(51);
delay_cycles(3);
.
output_high(pin_a0); //negro
delay_cycles(4);// tiempo sobrante o disponible + 1 del //Front Porch
//2-1,2
}
output_low(pin_a0); //sincro
}
VIDEO_PRINCIPAL_TERMINADO18F2525V116.C
#include <Sincronismov1.h>
#include <Video.h>
#include <Funciones.h>
//******************** PROGRAMA PRINCIPAL ***********************************
Void Main() {
set_tris_A (0b00000000);
set_tris_C (0b00000000);
set_tris_B (0b11111111);
output_A(0);
output_B(0);
delay_us(200);
.
While(TRUE){
//4,4 para sincro horizontal
//58,6 para imagen incluido fron o porch y blak porch
//_________________________________VIDEO____________________________________
__
//Linea 1 - 9
Pulsos_Campo_I();//Goto usa 0,4 us entrar
//Goto usa 0,4 us salir
//******************************* VIDEO ********************
//LINEA 10
delay_us(3); //4,4 -0,6(0,2*3(Intruciones del IF(campo==0) en falso)) -GotoSalir(0,4) =3,4
delay_cycles(2);
output_high(pin_a0); //negro
delay_us(56); //58,6 -entrar funcionLineasBoN(0,8)-entradao for(1) = 56,8
delay_cycles(4);//4
//LINEA 11 - 25
LineasNegras(15);//usa 0,8 /15
//**********************************Impresion del 1
niño********************************************************
//Linea 26
delay_us(4); //4,4 - GotoSalir(0,4) =4
output_high(pin_a0); //negro
delay_us(57); //58,6 -(0,4)goto funcion LerrDato-0,4(U1=3)=57,8us
delay_cycles(2);//2
U1=3; //esta variable controla las INT 3=PIC1 , 5=PIC2 , 9==PIC3 ,17=PIC4
//Cada funcion es una linea
//Linea 27 a 33
LeerDato();
ClasificarLetra();
Tratar_Letra();
Borrar_Screen11();
Borrar_Screen12();
Borrar_Screen13();
LlenarScreen();
//Linea 34
delay_us(4); //4,4 - GotoSalir(0,4) =4
output_high(pin_a0); //negro
delay_us(56); //58,6 -((0,4)goto funcion Draw_Letras+0,2*8(Inst de inicio de la funcion Draw
Letras))=56,6us
delay_cycles(2);
N_LineasVideo=16;
//Linea 35 a la 50
Draw_Letras();//forma 16 lineas
//Linea 51
delay_us(2); //4,4 - GotoSalir(0,4)-1,4(Salir de la funcion Draw_Letras() ) =2,6 us
delay_cycles(3);//3
output_high(pin_a0); //negro
delay_us(56); //58,6 -((0,4)goto funcion Draw_Letras+0,2*8(Inst de inicio de la funcion Draw
Letras))=56,6us
.
delay_cycles(1);//5
N_LineasVideo=16;
//Linea 52 a la 67
Draw_Letras();//forma 16 lineas
//Linea 69 a la 76
Draw_Letras();//forma 8 lineas
//77
delay_us(2); //4,4 - GotoSalir(0,4)-1,4(Salir de la funcion Draw_Letras() ) =2,6 us
delay_cycles(3);
output_high(pin_a0); //negro
delay_us(56); //58,6 -entrar funcionLineasBoN(0,8)-entradao for(1) = 56,8
delay_cycles(4);
//Linea 78 - 82
LineasNegras(5);//
//************************************NIÑO2*******************************************
//Linea 83
delay_us(4); //4,4 - GotoSalir(0,4) =4
output_high(pin_a0); //negro
delay_us(57); //58,6 -(0,4)goto funcion LerrDato-0,4(U1=3)=57,8us
delay_cycles(2);//2
U1=5; //esta variable controla las INT 3=PIC1 , 5=PIC2 , 9==PIC3 ,17=PIC4
//Cada funcion es una linea
//Linea 84 a 90
LeerDato();
ClasificarLetra();
Tratar_Letra();
Borrar_Screen11();
Borrar_Screen12();
Borrar_Screen13();
LlenarScreen();
//Linea 91
delay_us(4); //4,4 - GotoSalir(0,4) =4
output_high(pin_a0); //negro
delay_us(56); //58,6 -((0,4)goto funcion Draw_Letras+0,2*8(Inst de inicio de la funcion Draw
Letras))=56,6us
delay_cycles(2);
N_LineasVideo=16;
//107
Draw_Letras();//forma 16 lineas
//108
delay_us(2); //4,4 - GotoSalir(0,4)-1,4(Salir de la funcion Draw_Letras() ) =2,6 us
delay_cycles(3);//3
output_high(pin_a0); //negro
delay_us(56); //58,6 -((0,4)goto funcion Draw_Letras+0,2*8(Inst de inicio de la funcion Draw
Letras))=56,6us
delay_cycles(1);//5
N_LineasVideo=16;
.
//124
Draw_Letras();//forma 16 lineas
//125
delay_us(2); //4,4 - GotoSalir(0,4)-1,4(Salir de la funcion Draw_Letras() ) =2,6 us
delay_cycles(3);
output_high(pin_a0); //negro
delay_us(56); //58,6 -((0,4)goto funcion Draw_Letras+0,2*8(Inst de inicio de la funcion Draw
Letras))=56,6us
delay_cycles(1);
N_LineasVideo=8;
//133
Draw_Letras();//forma 8 lineas
//134
delay_us(2); //4,4 - GotoSalir(0,4)-1,4(Salir de la funcion Draw_Letras() ) =2,6 us
delay_cycles(3);
output_high(pin_a0); //negro
delay_us(56); //58,6 -entrar funcionLineasBoN(0,8)-entradao for(1) = 56,8
delay_cycles(4);
//135
LineasNegras(6);
//*************************************************************************************************
//************************************NIÑO 3*******************************************
//140
delay_us(4); //4,4 - GotoSalir(0,4) =4
output_high(pin_a0); //negro
delay_us(57); //58,6 -(0,4)goto funcion LerrDato-0,4(U1=3)=57,8us
delay_cycles(2);//2
U1=9; //esta variable controla las INT 3=PIC1 , 5=PIC2 , 9==PIC3 ,17=PIC4
//Cada funcion es una linea
//Linea 141 a 147
LeerDato();
ClasificarLetra();
Tratar_Letra();
Borrar_Screen11();
Borrar_Screen12();
Borrar_Screen13();
LlenarScreen();
//Linea 148
delay_us(4); //4,4 - GotoSalir(0,4) =4
output_high(pin_a0); //negro
delay_us(56); //58,6 -((0,4)goto funcion Draw_Letras+0,2*8(Inst de inicio de la funcion Draw
Letras))=56,6us
delay_cycles(2);
N_LineasVideo=16;
Draw_Letras();//forma 16 lineas
delay_us(2); //4,4 - GotoSalir(0,4)-1,4(Salir de la funcion Draw_Letras() ) =2,6 us
delay_cycles(3);//3
.
output_high(pin_a0); //negro
delay_us(56); //58,6 -((0,4)goto funcion Draw_Letras+0,2*8(Inst de inicio de la funcion Draw
Letras))=56,6us
delay_cycles(1);//5
N_LineasVideo=16;
Draw_Letras();//forma 16 lineas
delay_us(2); //4,4 - GotoSalir(0,4)-1,4(Salir de la funcion Draw_Letras() ) =2,6 us
delay_cycles(3);
output_high(pin_a0); //negro
delay_us(56); //58,6 -((0,4)goto funcion Draw_Letras+0,2*8(Inst de inicio de la funcion Draw
Letras))=56,6us
delay_cycles(1);
N_LineasVideo=8;
Draw_Letras();//forma 8 lineas
delay_us(2); //4,4 - GotoSalir(0,4)-1,4(Salir de la funcion Draw_Letras() ) =2,6 us
delay_cycles(3);
output_high(pin_a0); //negro
delay_us(56); //58,6 -entrar funcionLineasBoN(0,8)-entradao for(1) = 56,8
delay_cycles(4);
//192
LineasNegras(6);//usa 0,8 176
//*************************************************************************************************
//Linea 205
delay_us(4); //4,4 - GotoSalir(0,4) =4
output_high(pin_a0); //negro
delay_us(56); //58,6 -((0,4)goto funcion Draw_Letras+0,2*8(Inst de inicio de la funcion Draw
Letras))=56,6us
delay_cycles(2);
N_LineasVideo=16;
Draw_Letras();//forma 16 lineas
delay_us(2); //4,4 - GotoSalir(0,4)-1,4(Salir de la funcion Draw_Letras() ) =2,6 us
delay_cycles(3);//3
output_high(pin_a0); //negro
delay_us(56); //58,6 -((0,4)goto funcion Draw_Letras+0,2*8(Inst de inicio de la funcion Draw
Letras))=56,6us
delay_cycles(1);//5
N_LineasVideo=16;
Draw_Letras();//forma 16 lineas
delay_us(2); //4,4 - GotoSalir(0,4)-1,4(Salir de la funcion Draw_Letras() ) =2,6 us
delay_cycles(3);
.
output_high(pin_a0); //negro
delay_us(56); //58,6 -((0,4)goto funcion Draw_Letras+0,2*8(Inst de inicio de la funcion Draw
Letras))=56,6us
delay_cycles(1);
N_LineasVideo=8;
Draw_Letras();//forma 8 lineas
//248
delay_us(2); //4,4 - GotoSalir(0,4)-1,4(Salir de la funcion Draw_Letras() ) =2,6 us
delay_cycles(3);
output_high(pin_a0); //negro
delay_us(56); //58,6 -entrar funcionLineasBoN(0,8)-entradao for(1) = 56,8
delay_cycles(4);
//249
LineasNegras(14);//
//*************************************************************************************************
//Linea 262
delay_us(4); //4,4 - GotoSalir(0,4) =4
output_high(pin_a0); //negro
delay_us(55); //58,6 -0,4(goto while)-0,4(goto funcion Pulsos)-1,4(7inst if(campo==1)con F) 1(entradao for funcion Pulso) = 55,4
delay_cycles(2);//=55,2*/
}
}
.
Descargar