Sistema Remoto para la captación masiva de...

198
Sistema Remoto para la captación masiva de Información Titulació: Enginyeria Tècnica Industrial en Electrònica Industrial AUTOR: Oriol Monclús Sánchez. DIRECTOR: Esteban del Castillo DATA: Juny de 2005.

Transcript of Sistema Remoto para la captación masiva de...

Sistema Remoto para la captación masiva de Información

Titulació: Enginyeria Tècnica Industrial en Electrònica Industrial

AUTOR: Oriol Monclús Sánchez. DIRECTOR: Esteban del Castillo

DATA: Juny de 2005.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 2 -

1. Índice

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 3 -

Página:

1. Índice 2 2. Memoria Descriptiva 5

2.1. Objetivos del proyecto 5 2.2. Problemas, alternativas y solución adoptada 5

2.2.1. Problemática 5 2.2.2. Posibles Soluciones 6 2.2.3. Solución adoptada 13

2.3. El Hardware 17

2.3.1. Generalidades 17 2.3.2. El microcontrolador 17 2.3.3. Sistema de adquisición de datos 20 2.3.4. Sistema de almacenamiento 23 2.3.5. Interfaz con el usuario (visualización) 25 2.3.6. Fuente de alimentación 27 2.3.7. Placa de circuito impreso 29

2.4. El Software 30

2.4.1. Adquisición 30 2.4.2. Almacenamiento (Estructura FAT 16) 36

2.4.2.1. La Estructura FAT 37 2.4.2.2. Procedimiento de Almacenamiento 41

2.4.3. Transmisión de la información 47 2.4.4. Programa Principal (PFC.ASM) 48

3. Memoria de Cálculo 54

3.1. Tiempo mínimo de muestreo de los canales 54 3.2. Fuente de alimentación 61

4. Planos 66

4.1. Placa de control 66

4.1.1. Esquema eléctrico 66 4.1.2. Layout 67

4.2. Fuente de alimentación 68

4.2.1. Esquema eléctrico 68

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 4 -

5. Presupuesto 69

5.1. Placa de control 69 5.2. Fuente de alimentación 70

6. Pliego de Condiciones 71

6.1. Condiciones Técnicas 71

6.1.1. Generalidades 71 6.1.2. Resistencias 71 6.1.3. Condensadores 72 6.1.4. Inductores 73 6.1.5. Transistores y Diodos 73 6.1.6. Placas de Circuito Impreso 74 6.1.7. Especificaciones Mecánicas 74 6.1.8. Interface 75 6.1.9. Suministro 75 6.1.10. El Microcontrolador 75 6.1.11. Montaje y Cableado Interior 75

7. Anexo 76

7.1. Código fuente comentado 76

7.1.1. pfc.asm 76 7.1.2. delay.inc 103 7.1.3. disco.inc 104 7.1.4. enables.inc 147 7.1.5. fat16.inc 148 7.1.6. latches.inc 168 7.1.7. lcd.inc 168 7.1.8. mates.inc 176 7.1.9. memorias.inc 178 7.1.10. monitor.inc 183 7.1.11. pila.inc 188 7.1.12. rs232.inc 191 7.1.13. sistem.inc 194

8. Referencias 198

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 5 -

2. Memoria descriptiva 2.1. Objetivos del proyecto El objetivo de este proyecto es diseñar e implementar un sistema de adquisición y

almacenamiento masivo de información.

Dicho sistema (unidad), será capaz de recoger datos de diferentes magnitudes a través

de captadores (sensores), esta información será almacenada en una unidad de

almacenamiento.

Dicha unidad será de gran capacidad, de este modo se podra recoger información

durante más tiempo o con una frecuencia más elevada (recoger los datos de forma más

seguida).

Para ello se va a implementar una tarjeta de control, el “firmware” adecuado para su

funcionamiento y una fuente de alimentación.

Más adelante se verá como, mediante un sistema específico, se solucionan todas

nuestras necesidades.

2.2. Problemas, alternativas y solución adoptada 2.2.1. Problemática.

- Suministro de energía.

El suministro de energía es, en muchas veces, un problema; ya que en ocasiones hay

sistemas que no pueden ser conectados a cualquier sistema de alimentación, ya sea por

el coste que supondría el montaje energético o bien por los recursos tecnológicos de hoy

en día.

Para ello se deberá diseñar un sistema donde el problema de la fuente energética se

minimice al máximo. Por este motivo, se deberá intentar que el sistema no tenga un

excesivo consumo para poder operar, si fuera necesario, con baterías.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 6 -

- Robustez.

El sistema deberá asegurar una cierta robustez, ya que tendrá que funcionar en lugares

remotamente aislados, en zonas donde las condiciones ambientales sean duras y donde

la presencia humana para su verificación será casi nula.

- Almacenamiento.

Al sistema de adquisición de datos se le deberá proveer de una unidad de

almacenamiento, y como nombre que recibe el proyecto, deberá ser de gran capacidad;

ya que esta dependerá de la frecuencia de recogida de datos, la calidad de estos y del

tiempo que deseemos estar recogiéndolos.

Un ejemplo numérico es el que se muestra a continuación:

Supongamos que tenemos un sistema del cual queremos recoger datos desde 5 puntos a

la vez, donde a cada punto se le denomina canal, donde la calidad de cada dato es de 8

bits (1 byte) y de los cuales queremos estar captando durante un año.

MbytesbytescanalestotalCapacidadbytesBytes

segundosañoSegundos

3003153600005*63072000_5__630720002*31536000

3153600060*60*24*365_

=====

==

El resultado de los cálculos realizados reafirma la necesidad de utilizar una unidad de

almacenamiento con una capacidad lo suficientemente grande.

2.2.1. Posibles soluciones. En este apartado se viene a redactar las posibles soluciones para resolver la siguiente

problemática:

- Suministro de energía.

- Robustez.

- Unidad de almacenamiento para los datos suficientemente grandes.

- Sistema de bajo consumo, para poder bajar el coste del sistema de

almacenamiento de energía.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 7 -

Teniendo en cuenta que los apartados de:

- robustez

- unidad de almacenamiento para los datos suficientemente grande

- sistema de bajo consumo para poder bajar el coste del sistema de

almacenamiento de energía

deben ser satisfechos por un mismo dispositivo, se pasa a nombrar primero algunas

soluciones posibles para el suministro de energía.

Fuente de Alimentación: - Sistema de alimentación mediante pilas

Método de alimentación no viable por la poca autonomía que presentaría una fuente de

energía mediante pilas.

Dicha autonomía podría ser incrementada mediante la interconexión serie/paralelo de

acumuladores pero el sistema se vería afectado por el volumen y el peso.

Por otra parte, una pila no puede ser recargada teniéndose que sustituir necesariamente

una vez finalizada su autonomía.

- Sistema de alimentación mediante grupo electrógeno.

Un sistema de alimentación mediante grupo electrógeno podría ser una solución, gracias

a su capacidad para suministrar una gran cantidad de energía, pero viéndose afectado

por la necesidad de estar consumiendo combustible (gasolina o gasoleo)

constantemente.

Podría ser un método válido para alimentar sistemas donde el tiempo de utilización sea

corto -horas o días- pero en ningún caso de meses o años, ya que se debería rellenar el

depósito habitualmente, no siendo viable para sistemas remotos y de difícil acceso.

Un sistema alimentado mediante un grupo electrógeno podría ser el mostrado en el

diagrama de bloques que se muestra acontinuación:

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 8 -

- Sistema de alimentación mediante baterías recargables

Un sistema de alimentación mediante baterías recargables puede ser un sistema viable

gracias a la posibilidad de almacenar gran cantidad de energía y de recarga.

Un inconveniente que presenta este método es que debe ser recargada una vez concluida

la autonomía, siendo inviable para instalaciones en lugares remotos o de difícil acceso.

Este sistema puede ser combinado para llegar a ser un sistema de alimentación

autónomo, por ejemplo, paneles solares.

- Sistema de alimentación mediante paneles solares y grupo de

baterías de reserva.

Un sistema de alimentación mediante paneles solares y baterías de reserva es el más

indicado para instalaciones remotas o de difícil acceso.

El sistema deberá funcionar de forma autónoma, de tal manera que, durante las horas de

sol los paneles solares suministran energía al sistema y a la vez recargan baterías, y

durante las horas nocturnas las baterías suministran energía al sistema.

Una ventaja de este sistema es que no requiere mantenimiento alguno durante la primera

etapa de vida de las baterías, que es del orden de años.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 9 -

Un sistema de alimentación mediante paneles solares y baterías es el que se muestra en

la siguiente figura:

El funcionamiento del sistema mostrado en la figura anterior es el siguiente:

1. Los paneles solares suministran energía para la recarga de las

baterías y el consumo que haya en ese momento. Si el panel

no suministra suficiente energía, esta se extraerá de las

baterías.

2. Las baterías son recargadas a través de la energía

suministrada por los paneles mediante el regulador de carga.

3. Los puntos de consumo se conectan directamente a las

baterías, siempre y cuando, sean del tipo corriente continua.

En el caso de ser de corriente alterna se deberán de conectar a

las baterías mediante un modulador.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 10 -

Sistema de Captación.

A continuación se pretende exponer algunas de las posibilidades, a fin de resolver el

problema del sistema de captación de datos.

El sistema debe cumplir, como sistema único, los siguientes requisitos:

- Robustez

-Unidad de almacenamiento para los datos suficientemente

grande

- Sistema de bajo consumo para poder bajar el coste del

sistema de almacenamiento de energía

A continuación se exponen algunas posibilidades:

- PC personal recogiendo datos analógicos mediante una tarjeta de

captación conectada a uno de sus puertos.

Un sistema de captación de datos mediante PC personal (sobremesa) es un sistema que

puede ser utilizado teniendo en cuenta que no cumple algunas de los puntos expuestos

en el apartado “problemática”, concretamente la parte de ser un sistema de bajo

consumo.

Un PC de sobremesa necesita al menos de 50W de potencia eléctrica a la entrada para

poder funcionar, teniendo en cuenta que la alimentación debe de ser alterna, no siendo

posible su conexión a baterías sino es a través de un conversor o modulador.

Un sistema de captación de datos mediante un PC de sobremesa sería como el que

muestra en el diagrama de bloques siguiente:

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 11 -

- PC portátil recogiendo datos analógicos mediante un sistema externo

de captación conectado a uno de sus puertos Serie o USB

Un sistema de captación de información mediante PC portátil, es un sistema que puede

ser utilizado teniendo en cuenta que pose gran capacidad de almacenamiento gracias a

su disco duro interno; es más robusto por construcción que un PC de sobremesa, puede

ser conectado directamente a un sistema de alimentación por baterías (eliminando la

batería interna o directamente al conector de carga).

La problemática es que no cumple con el apartado de bajo consumo, ya que un PC

portátil consume alrededor de 2A para poder funcionar correctamente.

A continuación se muestra en forma de diagrama de bloques como sería el conexionado

de un sistema de captación de datos mediante un PC portátil.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 12 -

- Sistema Hardware diseñado para este fin en concreto, con la

posibilidad de poder operar con baterías y/o placas solares

Se puede optar por el diseño e implementación de un sistema especifico para este fin.

Mediante este diseño se podrían cubrir todas las necesidades y resolver los problemas

descritos en el apartado anterior.

El sistema estaría diseñado para:

- poder operar con baterías optimizando el consumo;

- poseer una unidad de almacenamiento de datos suficientemente grande;

- ser un sistema robusto.

El sistema estaría compuesto por una unidad de control adquisición y almacenamiento,

todo en uno, y una fuente de alimentación, diseñada específicamente para este sistema,

teniendo en cuenta la fuente de energía.

El diagrama de bloques que se presenta a continuación, muestra como sería un sistema

de adquisición de datos diseñado especialmente:

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 13 -

2.2.3. Solución Adoptada.

En el apartado anterior se informó de las diferentes soluciones existes para llevar

a cabo el objetivo global del proyecto.

El presente apartado se constituye de dos partes: la primera, pretende explicar

los procesos necesarios para llevar a cabo el diseño de la tarjeta de adquisición de datos;

la segunda muestra la solución para el suministro de energía.

En apartado se dividirse en diferentes niveles:

1. Adquisición de datos.

2. Tratamiento de la información.

3. Almacenamiento.

4. Alimentación.

1. Adquisición de datos:

La adquisición de datos se llevará a cabo mediante un conversor A/D, el

conversor utilizado será el que incorpora el microcontrolador utilizado para

el control.

2. Tratamiento de la información:

Una se recoge la información del conversor A/D, esta debe ser tratada para

su posterior almacenamiento.

Dicho tratamiento será ejecutado por el microcontrolador. El

microcontrolador recogerá el dato de forma digital del registro de salida

del A/D y lo depositará en el registro de entrada del último nivel

(Almacenamiento).

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 14 -

3. Almacenamiento. La unidad de almacenamiento utilizada en este proyecto será un disco

duro.

Se utiliza un disco debido a su una gran capacidad de almacenamiento;

puede ser conectado con facilidad a un sistema microcontrolador de 8 bits.

Se va a utilizar un disco duro de ordenador, ya que una vez concluida la

etapa de muestreo, este puede ser conectado a un PC para su posterior

recogida y tratamiento de los datos.

4. Alimentación.

Para la alimentación del sistema se optará por un sistema mediante placas

fotovoltaicas y una/s batería/s de reserva.

Teniendo en cuenta que nuestro sistema funciona mediante corriente

continua, es innecesario instalar un modulador; únicamente se necesita una

fuente de alimentación que proporcione la tensión para la placa de control

y el disco duro.

Se deberá asegurar que la fuente de alimentación absorba sin dificultad el

incremento de consumo que el disco duro necesita inicialmente para

arrancar; este incremento puede llegar a ser hasta 10 veces superior.

Se optará por una fuente de alimentación conmutada, porque tiene una

eficacia mucho mayor que una fuente lineal, alrededor del 90%.

Se debe prever un margen de tensión de entrada suficientemente grande

para poder suministrar la tensión correctamente, teniendo en cuenta las

diferentes fases de descarga de una batería.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 15 -

5. Robustez El sistema deberá asegurar cierta robustez para poder funcionar en lugares

remotos sin problema alguno.

Por esto, se ha optado por un sistema diseñado para este fin, ya que

únicamente dispone de lo esencial, y el porcentaje de fallos será inferior,

esto lo convierte en más fiable.

La siguiente figura muestra mediante bloques el montaje del sistema:

Figura 1.

La figura 1 muestra, a grandes rasgos, las partes constitutivas del sistema una

vez ensamblado.

El diagrama mostrado anteriormente, a su vez, puede ser desglosado en otro

diagrama mostrando las partes implicadas, como se muestra a continuación:

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 16 -

Figura 2.

Como se puede observar el microcontrolador es el encargado de muestrear

(recoger) los datos, tratarlos y almacenarlos en un BUFFER de memoria intermedia.

Por otra parte el disco duro es el encargado de almacenar los datos. Este se

utiliza como memoria no volátil.

La fuente de alimentación es la encargada de suministrar la energía procedente

de las baterías hasta la placa de control y el disco duro.

Dicha fuente de alimentación deberá ser capaz de soportar las necesidades

energéticas del disco en los momentos del arranque.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 17 -

2.3. El Hardware. 2.3.1. Generalidades.

En este apartado se detallaran todas las partes hardware que componen el

sistema, tal y como muestra la figura 2.1.

Figura 2.1

La figura anterior muestra las partes que componen el montaje, así como su

interconexión.

2.3.2. El Microcontrolador.

El microcontrolador, como se ha visto en el apartado anterior, será el encargado

de muestrear (recoger) los datos del exterior, para posteriormente ser tratados.

Una vez tratados, estos serán enviados a un BUFFER de memoria intermedia y a

su vez reenviados en paquetes a la unidad de almacenamiento (disco duro).

Dicho controlador poseerá el hardware necesario para llevar a cabo dicha tarea,

donde se ha optado por la utilización de un Microcontrolador de la casa Arizona

Microchip modelo PIC16F877, funcionando a 20 Mhz (2 Mhz en la demostración).

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 18 -

El Hardware que lleva internamente este controlador es:

• 2 Contadores Internos de 8 bits

• 1 Contador Interno de 16 bits.

• 2 Módulos generadores / comparadores PWM

• 1 Conversor A/D de 6 canales y 10 bits de resolución por canal.

• 1 Interfaz serie síncrono.

• 1 Interfaz serie asíncrono.

De todo el hardware mostrado en la lista anterior, solo va a ser utilizado el

siguiente:

• 1 Contador de 8 bits.

• 1 Conversor A/D de 6 canales y 10 bits de resolución por canal.

El diagrama interno del microcontrolador, así cómo la interconexión interna de

sus periféricos, es el que se muestra en la siguiente figura (figura 3).

Figura 3.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 19 -

Como se puede ver en la figura 3, todos los dispositivos están interconectados

entre si mediante un BUS, y a su vez conectados al núcleo del microcontrolador.

Al mismo tiempo este microcontrolador posee diferentes utilidades para su

programación y depuración en circuito.

Dicha programación y depuración se lleva a cabo mediante dos pins ubicados en

el puerto B del microcontrolador, exactamente los pins 6 y 7.

Dicho micro posee también 8KB de memoria FLASH, como memoria de

almacenamiento de programa, así como 256 bytes de memoria EEPROM, para

almacenar variables del programa.

El núcleo microcontrolador puede funcionar bien con una red RC o con un reloj

de cuarzo; la frecuencia puede ir desde los 300 Khz hasta los 20 Mhz.

Es capaz de funcionar mediante interrupciones, las cuales pueden ser provocadas

por los periféricos internos (Ej. Conversor A/D) o bien por la línea Int. Exterior.

Una de las herramientas más utilizada, y la que se ha utilizado para programar y

depurar este proyecto, es el software suministrado por Microchip de forma gratuita y

denominado como MPLAB, del cual se muestra una pantalla en la figura 4.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 20 -

Figura 4.

El programa puede ser descargado de forma gratuita desde el web del fabricante,

www.microchip.com.

2.3.3. Sistema de adquisición de datos.

La adquisición de datos se lleva a cabo mediante el conversor A/D que posee el

microcontrolador.

A continuación se hará referencia al funcionamiento del conversor A/D y como

realiza las conversiones.

Conversor A/D.

El conversor A/D será el encargado de transformar la información en la entrada

analógica a información digital.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 21 -

Dicha información será referenciada a un nivel de tensión, que en nuestro caso,

será la tensión de alimentación (5V).

Vamos a ver como es el diagrama interno del conversor A/D:

Figura 5.

Como se puede ver en la figura 5 el conversor es único para los 6 canales

analógicos.

Dichos canales son multiplexados a la entrada del conversor mediante un

multiplexor analógico.

Para seleccionar el canal que se debe convertir a digital, se debe introducir en

formato binario el número de canal en los bits del registro interno denominados como

CHS0:CHS2.

A su vez se debe definir la tensión de referencia del conversor A/D mediante los

conmutadores analógicos Vref+ y Vref- , los cuales son gobernados por los bits

PCGF0:PCFG3, los cuales en nuestro proyecto, están ajustados de tal forma que la

tensión de referencia sea la de alimentación (0 y 5V).

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 22 -

Se debe tener en cuenta que una vez realizada la múltiplexion de los canales de

entrada, cabe esperar un tiempo prudencial para llevar a cabo una conversión correcta.

Sería bueno reslatar que para llevar a cabo una conversión satisfactoria se debe

tener en cuenta la impedancia de entrada del conversor, dicha impedancia debe ser igual

o mayor a 100 ohmios según fabricante.

Dicha impedancia es necesaria para poder cargar el condensador de entrada del

conversor de forma segura, si la impedancia fuera cercana a cero, el condensador se

cargaría excesivamente rápido, provocando errores de conversión.

En la figura 6 se muestra el funcionamiento, en pequeña señal, del conversor

A/D viéndose la utilidad de la impedancia de entrada.

Figura 6.

Como puede verse en la figura anterior la tensión de entrada carga un

condensador de memorización a través de la impedancia de entrada.

Una vez el condensador es cargado se coge una muestra de la tensión mediante

un interruptor de muestreo y queda memorizada en el condensador Chold.

A continuación se lleva a cabo la conversión mediante la tensión almacenada en

dicho condensador.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 23 -

Mediante esta pequeña explicación se puede ver que si el condensador de

entrada es demasiado pequeño, la tensión obtenida en el condensador de entrada no es

correcta a causa de una carga excesivamente rápida, y si es demasiado grande, la tensión

se ve afectada por no poder cargar el condensador a tiempo.

En el montaje de demostración se utiliza una resistencia de 100 ohmios.

2.3.4. Sistema de Almacenamiento.

La unidad de almacenamiento como bien se ha dicho en el apartado 2.2. es un

disco duro IDE (ATAPI).

Este sistema de almacenamiento se conforma de un soporte magnético para

almacenar la información, así como de una parte electrónica encargada de gestionar el

posicionamiento del brazo cabezal.

Un disco duro, tal y como se muestra en la figura 7, está formado por 3 partes

fundamentales:

• Interfase con el exterior mediante un bus denominado IDE.

• Gestión del cabezal y motor.

• Plato giratorio (soporte magnético).

La interfase es la encargada de recibir las órdenes del Host o unidad de control y

tratarlas debidamente para, a continuación, enviar la posición del sector que se quiere

leer al controlador del cabezal.

Una vez el controlador del cabezal esta debidamente situado, este envía la

información desde el bus IDE al plato magnético.

A continuación se puede ver de forma dimensionada la distribución interna de un

disco duro.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 24 -

Figura 7.

El acceso a un disco duro se lleva a cabo mediante la selección de la dirección

lógica del sector a escribir, o bien como antiguamente operaban los ordenadores,

seleccionando cabeza, cilindro y sector.

Por lo que hace referencia a la alimentación de un disco duro, ésta se lleva a

cabo mediante corriente continua y dos niveles de tensión, 5 y 12V. La corriente

absorbida por un disco duro está alrededor de los 800mA en la línea de 5V y de 400mA

en la línea de 12V.

Para poder minimizar el consumo del disco en momentos de inactividad, este

puede detener el plato giratorio, de tal forma que podría llegar a consumir 50 mA en

modo de reposo.

La figura 8 muestra la vista posterior de un disco duro donde se puede ver la

entrada de alimentación, el conector del bus IDE, así como unos puentes de

configuración.

Dichos puentes estarán configurados en modo maestro para poder funcionar en

la demostración.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 25 -

Figura 8.

En la figura anterior se muestra la parte posterior de un disco duro, cortesía de

SEAGATE Technology.

2.3.5. Interfaz con el usuario.

En este apartado se va a detallar el funcionamiento del dispositivo que va a ser

utilizado como interfase con el usuario, el cual será una pantalla LCD de 4x20

caracteres con interfase paralela.

Dicha pantalla puede ser conectada como si de una memoria se tratara, pero

pudiendo funcionar con buses de 4 o 8 bits.

Una pantalla LCD se compone de 4 partes fundamentales:

• Controlador. • Drivers para los segmentos. • Panel LCD • Iluminación (Opcional).

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 26 -

En la figura 9 se muestra el diagrama de conexionado interno de una pantalla

LCD.

Figura 9.

Como puede verse en la figura anterior, el controlador es el encargado de recibir

los datos desde el bus exterior, controlar los drivers de los segmentos y el panel LCD.

Para poder escribir un dato en la pantalla LCD, primero debe ser inicializada de

la misma forma que muestra el fabricante, figura 10.

Figura 10.

Una vez la pantalla esta debidamente inicializada, debe seleccionarse mediante

la línea RS si el dato que se le va a enviar es un comando o un carácter.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 27 -

Una vez seleccionada esta línea, se pasará a colocar el dato en el bus y a generar

un impulso en el pin W.

A continuación el carácter aparecerá en la posición del cursor en pantalla.

A su vez las pantallas LCD disponen de un juego de instrucciones tipo comando

para poder borrar, posicionar, etc., los caracteres que se escribiran posteriormente.

Unos de los comandos más utilizados para el control de una pantalla LCD son

los mostrados en la figura 11. Esta tabla es cortesía de RS Amidata.

Figura 11.

Las pantallas LCD son alimentadas mediante una alimentación única de 5V,

consumiendo alrededor de 2.5 mA.

2.3.6. Fuente de alimentación.

La fuente de alimentación es la encargada de transformar la tensión de entrada a

una tensión fija y estabilizada con niveles de 5 y 12V.

Para poder generar dos niveles de tensión se ha montado 2 fuentes

independientes en el mismo PCB.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 28 -

Las fuentes serán de tipo conmutado para poder reducir las pérdidas y así

aumentar la eficacia.

La fuente deberá de poder soportar los incrementos de consumo que provoca el

disco duro en el momento de los arranques, que en ocasiones es 10 veces superior.

Para llevar a cabo este diseño se ha optado por un montaje básico, que muestra

el fabricante del chip controlador en su “datasheet” mostrado en la figura 12.

El margen de tensión de entrada será de 14 a 40V, de esta forma será capaz de

proporcionar una tensión estabilizada a la salida, aunque la tensión se vea afectada a

causa de la descarga de las baterías.

Figura 12.

Como se puede ver en la figura anterior, el núcleo de la fuente es el núcleo

integrado LM2576 de la casa “Nacional Semiconductors”. Este integrado es el

encargado de generar las conmutaciones a la salida, ya que incorpora el interruptor

integrado. Dicho interruptor se controla mediante la tensión recibida desde la línea de

realimentación.

El circuito integrado utilizado es capaz de suministrar una tensión fija a la salida

con un nivel de intensidad continuado de 3A.

Para poder generar los 2 niveles de tensión se han montado 2 fuentes de

alimentación idénticas, únicamente cambiando el integrado regulador, LM2576-5.0 para

la fuente de 5V y LM2576-12.0 para la de 12V.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 29 -

También se deberá prever un refrigerador para el circuito integrado; se ha optado

por el montaje de ambos chips en un mismo radiador ya que la potencia que disipan a la

vez es pequeña.

Para el procedimiento de cálculo del radiador y de los componentes que lo

rodean, ver el apartado Anexo.

2.3.7. Placa de circuito impreso.

La placa de circuito impreso es la encargada de interconectar todos los

componentes y circuitos integrados mediante pistas de cobre.

La placa de circuito impreso que se utiliza en este proyecto es de doble cara

(pista en cada lado de la fibra) para la placa de control, y de cara simple (pistas de cobre

en un solo lado de la fibra) para la placa de alimentación.

Para la interconexión de los componentes se ha utilizado una topología bus,

topología típicamente utilizada por los micros 8051 de Intel.

La placa de circuito impreso esta fabricada con una base de fibra de vidrio, con

capas de cobre de 35 µM en cada lado.

Los orificios practicados en la placa son de 0.5 mm para las vías y de 0.8 mm

para los pads (patas de componente).

El proceso de fabricación del prototipo se ha llevado a cabo por el método de

insolación. Este proceso se lleva a cabo exponiendo cada cara de la placa debidamente

fotosensibilizada a una luz fluorescente de color 33, durante 5 minutos.

Una vez las caras han sido debidamente insoladas, esta se pasa por un baño de

sosa cáustica con el fin de eliminar todos los restos de fotosensibilizador que a sido

expuesto a la luz.

Una vez se a eliminado todo el fotosensibilizador se puede ver ya el trazado de

las pistas por la parte de cobre.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 30 -

Con el fin de eliminar todo el cobre que no esta por debajo de las pistas, se

deberá de exponer la placa a un baño de acido clorhídrico y perborato de sodio con una

relación del 75/25% respectivamente, durante aproximadamente 40 minutos.

Una vez el cobre que no esta debajo de las pistas se ha eliminado por completo,

solo queda limpiar la placa con disolvente, con el fin de eliminar los restos de

sensibilizador.

A continuación solo queda perforar.

2.4. Software.

2.4.1. Adquisición.

En este apartado se va a detallar la parte del código encargada de la adquisición

de los datos analógicos recogidos desde el exterior.

La misión fundamental de esta parte del código es la de recoger la información

procedente del exterior a través de los canales analógicos y transformarla a digital para

su posterior almacenamiento.

Antes de pasar a detallar el código en si, vamos a hacer hincapié en como se

hace esta adquisición.

Procedimiento:

La información que se pretende adquirir está en todo momento presente en los

canales analógicos del micro. Esta información se debe muestrear a una frecuencia

establecida por el usuario, de tal forma que la información analógica presente pase a ser

una señal muestreada a una frecuencia fija.

Una vez muestreada esta señal analógica pasa a ser almacenada en unos

BUFFER de almacenamiento temporal, los cuales son de 1KB por cada canal, de tal

forma que al tener 5 canales a muestrear, se nos presenta la necesidad de tener 5

BUFFER de KB cada uno, en total 5KB necesarios en memoria RAM.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 31 -

Por lo que hace referencia al muestreo de los canales analógicos, estos se

muestran a un tiempo prefijado por el usuario mediante un software de configuración a

través de la interfase serie (RS 232).

Por lo que hace referencia a nivel de software, este entenderá que el tiempo

introducido por el usuario, es el tiempo que se debe esperar entre canales. Como se

puede entender, el tiempo que transcurrirá entre que se muestrea el canal 1 y se vuelve a

muestrear el mismo canal, será el tiempo introducido por el usuario multiplicado por 5,

ya que tenemos 5 canales a muestrear.

NOTA: el software de configuración, haciendo uso de esta información, puede

presentar por pantalla el tiempo real entre muestreos del mismo canal.

Una vez los BUFFER de almacenamiento temporal se han llenado en un 50% en

cuanto a capacidad (512 bytes), tamaño mínimo a transferir al disco, este se deberá

colocar en su correcto sector del disco duro. Para esta transferencia se encargan las

rutinas de manejo de la FAT (Apartado 2.4.2. del mismo capítulo).

Durante la fase de transmisión de la información al disco duro, el sistema de

muestro continua muestreando la información procedente del exterior y almacenándola

en el 50% restante del BUFFER. Una vez la segunda mitad del BUFFER se a llenado,

se vuelve a hacer la operación de volcado a disco.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 32 -

A continuación en la figura 13 se muestra en forma de diagrama circular el

proceso de adquisición.

Figura 13.

El diagrama circular mostrado anteriormente, muestra de forma muy

simplificada el proceso de adquisición de los valores analógicos y su posterior envio a

las rutinas de almacenamiento.

A continuación se muestra, mediante la figura 14 el diagrama de bloques, el

funcionamiento de la rutina de adquisición de datos.

Almacenar Valores en los

Búferes Intermedios

Si el Buffer esta lleno, se levanta la bandera para que las rutinas de la FAT almacenen los datos al disco

Muestrear Canales

Analógicos

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 33 -

Figura 14.

A continuación se pasa a detallar el procedimiento de la rutina.

Funcionamiento:

Esta parte del código se ejecuta a cada interrupción provocada por el TMR0 del

micro, y se encarga de muestrear los canales de forma consecutiva, pero no todos a la

vez en el mismo ciclo de interrupción. De tal forma que el modo de funcionamiento del

código es el siguiente: a cada interrupción provocada por el TIMER 0 se escanea un

canal y se almacena en un registro de memoria el número de canal que se ha

muestreado, de forma que la próxima vez que se entra en la rutina por interrupción, se

escaneara el siguiente canal.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 34 -

Una vez escaneado el canal adecuado, la información recogida de éste se

almacena en un BUFFER reservado para él; la posición de memoria en la cual se debe

de almacenar el dato viene representada por la posición de inicio del BUFFER en

memoria, sumándole un desplazamiento referente al número de posiciones ya

almacenadas.

Haciendo cálculos, recordando que los BUFFER de memoria son de 1KB y que

la resolución del conversor A/D es de 10 bits, tenemos que el número máximo de

conversiones que se podrán almacenar son 512 muestras, ya que cada conversión ocupa

2 bytes.

Una vez el dato ha sido almacenado en el BUFFER se comprueba si se a llegado a

la última posición del BUFFER 1 ó del 2. Esta comprobación se lleva a cabo mirando

el valor del registro que apunta al BUFFER; si es así, se levanta una bandera interna, la

cual es utilizada para que la parte de software encargada del almacenamiento a disco

sepa cuando tendrá que volcar los 5 sectores, uno referente a cada canal analógico.

Una vez terminada la rutina de adquisición, esta pasa a la espera de una nueva

interrupción.

La velocidad máxima de muestreo de cada canal viene dada por la velocidad del

reloj y el tiempo mínimo de adquisición del conversor A/D.

Para la placa de demostración, y a fin de conseguir muestreos a diferentes

velocidades, se ha introducido un registro de 16 bits que contiene el número de

interrupciones del TIMER 0 que se deben probar antes de ejecutar la interrupción

asociada.

Este registro puede contener valores desde 1 hasta 65.536, que multiplicándolo a la

base de tiempo del TIMER 0, nos da que el tiempo entre interrupciones reales. Este

puede ir desde 10 ms hasta 65.536 ms (1 min.)

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 35 -

Las diferentes formas de trabajar que tiene la interrupción son las mostradas en la

figura 15.

Figura 15.

En la figura anterior puede verse la forma de actuar de la rutina de servicio a la

interrupción del TIMER 0, dependiendo de si ha sido cargado o no el registro encargado

de multiplicar el tiempo entre interrupciones.

El diagrama A de la figura muestra como la rutina de servicio no se ejecuta

mientras el registro “Count” no llegue a cero, mientras que en el diagrama B de la rutina

de servicio se ejecuta a cada interrupción del TIMER 0.

Para ver el valor mínimo que puede tener el TIMER 0 para un reloj de cuarzo de

2Mhz ver el apartado 3.1. de la Memoria de Cálculo.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 36 -

2.4.2. Almacenamiento (Estructura FAT 16).

Las rutinas de almacenamiento son las encargadas de recoger los datos

depositados en el BUFFER por las rutinas de adquisición, y almacenarlas al disco en

formato FAT 16.

La forma de actuar de estas rutinas son:

1. Comprobar las banderas de llenado de BUFFER.

2. Recoger los datos del BUFFER lleno.

3. Calcular el sector de destino en la FAT.

4. Grabar el sector a disco.

A continuación se verá como es la estructura FAT y a después como trabaja el

código para almacenar datos en una estructura FAT fija.

Se a utilizado como estructura de almacenamiento en disco una FAT 16, por ser

mucho más fácil de desarrollar mediante un procesador de 8 bits mediante fórmulas

matemáticas fijas.

Una ventaja de utilizar el FAT en el sistema de almacenamiento es recoger los

datos de disco mediante un PC, ya que no es necesario la utilización de ningún software

especializado para entender los datos almacenados, únicamente es necesario leer el

fichero relacionado con el canal.

A partir de la información almacenada en el fichero relacionado con el canal se

pueden generar historiales, gráficas o simplemente listar los datos para, a posteriori,

detectar una posible anomalía del sistema muestreado.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 37 -

2.4.2.1. La Estructura FAT. Que es una partición y para que sirve:

Al igual que un CD AUDIO se fabrica estructurado en pistas, siendo cada pista

una canción grabada, un disco duro debe estructurarse de forma que pueda grabarse la

información en su interior de forma ordenada para poder ser recuperada, leerla, borrarla

o modificarla cuando sea necesario.

Imaginemos que cuando sale un disco duro de la fábrica éste tiene el mismo

aspecto interno que una casa en la que se han construido solamente las paredes y el

tejado. Dentro de la casa es necesario levantar paredes y puertas que delimiten las

diferentes habitaciones y estancias para que pueda ser habitable.

De igual forma es necesario estructurar el disco duro en su interior para que la

información se grabe correctamente.

Un disco duro se estructura a base de PARTICIONES.

Cuando particionamos un disco duro lo que hacemos es informar a nuestro

sistema operativo que el disco duro que hay instalado es de una capacidad ‘X’, por

ejemplo 500 MB.

Antes de ser particionado, el PC sabe que tiene instalado un disco duro pero no

sabe de qué capacidad es. Para entenderlo mejor supongamos el siguiente ejemplo: Para

particiónar un disco usaremos el programa FDISK que se distribuye con Windows 95,

98 y ME.

Una vez ejecutado el sistema operativo podrá obtener la información necesaria

del disco para saber:

1. El número de particiones creadas

2. El tamaño de cada partición

3. Si es primaria o lógica

4. Tipo de partición (FAT, Linux,…)

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 38 -

El sistema FAT:

La palabra FAT, que viene del inglés "File Allocation Table", es el espacio del

disco duro destinado a guardar las direcciones de los CLUSTERS donde se guardan

nuestros ficheros, tanto programas como archivos, o sea todo cuanto hay en el disco

duro, para que sea fácil su localización, algo así como el índice alfabético de nuestra

agenda de teléfonos.

Hasta la aparición del Windows95 OSR2, el tamaño de la máximo de la FAT era

de 16 bits, solamente, de ahí su nombre FAT16, y nos indicaba el tamaño máximo en

megas que podía tener nuestro disco duro, ya que al estar delimitado el tamaño del

índice de "cosas" a guardar, estábamos limitando su tamaño.

Haciendo unos cálculos matemáticos que no se describen, tenemos que el

tamaño máximo de un disco que usará FAT16 era de 2GB. En la actualidad

disponemos de discos duros del doble o más capacidad. Es aquí donde aparece FAT32,

permitiéndonos instalar discos duros de hasta 2 Terabytes sin tener que particionarlos.

El tamaño de CLUSTER se ha reducido a 4 KB, con el consiguiente ahorro de espacio

en disco duro que esto supone. En los discos duros de gran tamaño, con FAT16

teníamos un CLUSTER de unos 32 KB, por lo que cualquier archivo de 1KB realmente

estaría ocupando 32KB.

Se puede experimentar que un disco duro de 1GB con CLUSTERS de 32KB en

FAT16 y unas 600MB ocupadas, al convertirlo a FAT32 se puede ganar unos 70MB de

espacio.

Una vez visto un poco de historia, vamos a pasar a ver como es internamente la

estructura FAT.

Una estructura FAT son unos sectores con una información en concreto

colocados en una posición en concreto.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 39 -

La estructura FAT se divide en 4 zonas bien diferenciadas:

1. Sector de Arranque ( MBR )

2. FAT 1 y FAT 2

3. Directorio

4. Datos

El Sector de Arranque: El sector de arranque se crea siempre como primer

sector del volumen, para que sea fácil de localizar por el sistema operativo. En él se

encuentra información acerca del tamaño, la estructura del volumen y sobre todo del

BOOTSTRAP-LOADER, mediante el cual se puede arrancar el PC.

A ésta parte se le llama sector de arranque (BOOT).

La FAT (File Allocation Table): Si el sistema operativo quiere crear nuevos

archivos, o ampliar archivos existentes, ha de saber qué sectores del volumen

correspondiente quedan libres, Estas informaciones las toma la llamada FAT.

Cada entrada a esta tabla se corresponde con un número determinado de

sectores, que son adyacentes en el volumen. Cada uno de estos grupos de sectores se

llama CLUSTER.

El número de CLUSTERS que puede direccionar una partición FAT16 es de 2

elevado a 16 CLUSTERS, esto es igual a 65.536 CLUSTERS a disco.

En el sector de la FAT se definen las direcciones de CLUSTERS en la zona de

datos, de tal forma que un determinado fichero con una capacidad superior a 32KB

(tamaño de un CLUSTER) deberá ocupar como mínimo 2 CLUSTERS, pues la

dirección del segundo CLUSTER ocupado por el supuesto fichero estará contenido en

la tabla FAT, ver figura 16.

F1 F2 F3 F4 F5 F1 F2 F3 F4 F5 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0A 00 0B

Figura 16.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 40 -

La FAT2 es una copia idéntica a la FAT1 y la utiliza el sistema operativo en

caso de detectar defectos en la información de la primera FAT.

El directorio: El directorio es la zona de la FAT donde se almacena toda la

información referente a los ficheros credos, borrados o modificados en la zona de datos.

En el directorio reside toda la información que aparece al hacer un simple “DIR”

con cualquier sistema operativo de Microsoft.

La información más importante para nosotros que contiene el directorio es:

1. Nombre del fichero

2. Tipo de fichero

3. Atributos (lectura, escritura, oculto…)

4. Fecha de creación

5. Fecha de modificación

6. Primer CLUSTER en la zona de datos

7. Tamaño en bytes

La cantidad máxima de entradas en el directorio raíz se limita por su tamaño,

que se fija en el sector de arranque. El directorio raíz representa una estructura de datos

estática, que no crece si se guardan más y más archivos o subdirectorios. De aquí que,

dependiendo del tamaño, bien un disco duro o bien de volumen, se selecciona el tamaño

del directorio raíz en relación al volumen.

La Zona de Datos: Es la parte del disco duro en la que se almacena los datos de

un archivo. Esta zona depende en casi su totalidad de las interrelaciones entre las

estructuras de datos que forman el sistema de archivos, y del camino que se sigue desde

la FAT hacia los diferentes sectores de un archivo.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 41 -

2.4.2.2. Procedimiento de almacenamiento.

En este apartado se pasa a detallar el procedimiento que se sigue en nuestro

proyecto en el momento de almacenar datos en la estructura FAT creada en nuestro

disco duro.

En la figura 16 se muestra mediante un diagrama de estados el procedimiento

que sigue el software.

Figura 16.

Una vez arrancado el sistema por primera vez, el disco debe ser formateado

mediante la utilidad almacenada en memoria. Esta utilidad es simplemente un conjunto

de rutinas encargadas de limpiar el disco y volcar la información residente en la

EEPROM externa al disco. Una vez volcada esta información, el disco queda con una

estructura FAT16 máxima (2GB) y 5 ficheros creados.

Para poder reanudar el almacenamiento en disco después de un corte de

alimentación o parada voluntaria del sistema, se almacenan en EEPROM interna del

micro 3 registros, los cuales contienen información necesaria para poder continuar

desde donde se había quedado el sistema.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 42 -

Estos registros contienen:

• Número de sectores almacenados por CLUSTER

• Número de CLUSTERS ocupados

• Número del último fichero que se ha accedido

Para poder facilitar el manejo del sistema de archivos se han desarrollado unas

fórmulas a partir de las fórmulas principales de manejo de la estructura FAT16 para que

sea más fácil operar en un micro de 8 bits.

Para saber la dirección del sector al cual se debe acceder en el momento de

almacenar un paquete de 512 bytes en el disco correspondiente a un canal se ha

desarrollado la formula siguiente:

[ ][ ][ ] NSectorNFicheroNClusterectorDireccionS +++= 6085* (1)

Donde: NCluster = Número de clusters ocupados por fichero. NFichero = Número de fichero al cual se quiere acceder NSector = Número de sectores ocupados por cluster

Si recordamos que en el momento de formatear el disco los registros

almacenados en la EEPROM del micro, los cuales almacenan datos de acceso para los

ficheros que han sido borrados tenemos que:

NCluster = NFichero = NSector = 0.

de tal forma que al querer almacenar el primer sector del primer canal, el cual se debe

de almacenar en el primer CLUSTER tenemos que:

NFichero = 0 NCluster = 0 NSector = 0

Resolviendo la fórmula tenemos que la dirección del sector donde se debe

almacenar el sector es el 608, primer sector en la zona de datos.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 43 -

Una vez almacenado este sector se debe, a continuación, almacenar el siguiente

sector del segundo fichero, el cual debe resolver la misma fórmula pero con los

siguientes datos en sus registros:

NFichero = 1 NCluster = 0 NSector = 0

Resolviendo la fórmula con los siguientes valores, da que el sector en el cual se

deben de almacenar los datos es el 672, lo cual es obvio, ya que si los CLUSTERS son

correlativos, este sector deberá estar 64 sectores más adelante del primer sector.

Una vez almacenado los 5 sectores, uno por cada canal, el sistema deberá de

incrementar en 1 el valor del registro NSector de tal forma que, en el momento de

almacenar el siguiente sector los valores contenidos en los registros serán:

NFichero = 0 (Para el primer canal) NCluster = 0

NSector = 1 (Indicando que ya hay un sector ocupado en el primer CLUSTER)

Si se resuelve la fórmula a modo de ejemplo nos da que, para almacenar otro

sector en el disco la dirección del sector en el primer fichero, es la 609 y la 673 para el

segundo fichero.

Una vez el contador de sectores ocupados (NSector) llegue a 64 el sistema

deberá de reservar un nuevo CLUSTER. Para poder llevar a cabo esta operación se a

desarrollado otra fórmula la cual da la dirección de CLUSTER que debe colocar en la

estructura FAT16.

La fórmula que se ha desarrollado es:

[ ] NFicheroNClusterlusterDireccionC ++= 25* (2)

Donde: NCluster = Número de CLUSTERS ocupados por fichero.

NFichero = Número de fichero para el cual se debe reservar CLUSTER.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 44 -

En este caso si debemos reservar 5 nuevos CLUSTERS para continuar

almacenando información en disco, se debe resolver la fórmula (2) para cada fichero.

Por ejemplo, si se quiere reservar otro CLUSTER para el fichero 1, el cual ya

tiene un CLUSTER ocupado, la fórmula se deberá resolver con los siguientes datos:

NCluster = 1

NFichero = 0

Resolviendo nos da que la dirección del CLUSTER es: 7 (0007) esta dirección

será la nueva dirección de salto para el siguiente CLUSTER del fichero 0.

Si resolvemos la fórmula para el resto de ficheros se obtienen las siguientes

direcciones: 00 08, 00 09, 00 0A, 00 0B.

Quedando así la nueva estructura FAT:

F8 FF FF FF 07 00 08 00 09 00 0A 00 0B 00 FF FF FF FF FF FF FF FF FF FF

Esta estructura nos indica que, por ejemplo para el fichero 0 después de la

información almacenada en la dirección CLUSTER indicada en el directorio, hay más

información almacenada en el CLUSTER con dirección 00 07, pero que este cluster ya

es final.

A continuación y mediante el diagrama de estados de la figura 17 se va a detallar

el software encargado de almacenar los datos en el disco.

Esta rutina arranca en el momento en que una de las banderas que indican que el

BUFFER 1 ó 2 se han llenado se levanta.

Una vez detectado este estado, se llama a la rutina encargada de llevar a cabo el

almacenamiento a disco.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 45 -

Figura 17.

Una vez detectada la bandera que se ha levantado se procede a la escritura de la

información en el disco duro.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 46 -

El procedimiento es el mismo para ambos BUFFER, pero en el caso del

BUFFER 2, se debe de sumar un desplazamiento de 512 posiciones ya que reside por

encima del primer BUFFER que ya es de 512 bytes.

Una vez posicionado el apuntador a los BUFFER adecuados se calcula el sector

de destino mediante la formula (1) anteriormente mencionada. Una vez se a calculado la

dirección del sector en formato LBA (Logic Branch Adress), se llama a la rutina que

graba el sector al disco. Esta rutina lo que hace es básicamente transferir 512 bytes a

partir de donde apunta el apuntador a memoria intermedia donde apunta la dirección

LBA.

Una vez grabado el sector, se le suma un desplazamiento de 512 posiciones al

apuntador a memoria intermedia, ya que necesitamos pasar al principio del BUFFER

del segundo canal.

En este punto se genera un bucle de 5 iteraciones hasta completar la

transferencia de los 5 BUFFER.

Una vez terminada la transferencia se pasa a incrementar el valor del registro

que indica la capacidad de un fichero en el Directorio. Para llevar a cabo este cambio lo

que se hace es transferir la totalidad del sector del directorio al sector de uso general que

reside en la memoria RAM intermedia.

Una vez allí se le suma al valor ya existente de cada fichero, 512 bytes, ya que es

el número de bytes por transferencia (1 sector = 512 bytes). Una vez realizados los

cambios se vuelve a escribir el sector del directorio al disco.

A continuación se comprueba si el número de sectores ya escritos en disco es de

64, si es así se deberá reservar un nuevo CLUSTER en disco. El método para reservar

CLUSTER se basa en la ejecución de la formula (2) anteriormente mencionada para

saber los valores de las direcciones a CLUSTER que se deben poner en la tabla FAT.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 47 -

Una vez terminada la operación de incrementar la capacidad de los ficheros o de

reservar un nuevo CLUSTER, en caso necesario, se procede a almacenar los registros

de control en la EEPROM interna del micro.

2.4.3. Transmisión de la Información.

En este apartado se va a detallar la transmisión de información para la interfaz

serie (RS232).

En este proyecto la USART RS232 solo se utiliza para la configuración del

sistema, y no para la descarga de la información almacenada en disco, ya que sería una

tarea muy lenta.

Ejemplo: Si tenemos una capacidad máxima de 2.0GB en disco, pero la tenemos

repartida en 5 ficheros tenemos que la capacidad máxima por fichero es de 400MB. Si

se pretende transferir toda esta información a través de una USART de 2400bps, el

tiempo que se tardaría sería mayor o igual a :

HorasSegTiempo 55.48.1747622400

1024*1024*400=== (3)

Para esta justificación no se ha implementado la transferencia de ficheros a

través de la USART.

Teniendo en cuenta que la USART utilizada en este proyecto es una USART

programada, y no es la que el micro ya tiene implementada por Hardware -ya que no se

ha optado para su utilización por motivos de configuración de pines-, esta solo se podrá

conectar de forma controlada no por interrupción.

Una vez sabido esto, se comentará el método mediante el cual el sistema pueda

conectar ON-LINE con el PC. Para poder conectar satisfactoriamente se deberá tener el

PC conectado a la placa de control y el programa corriendo en el momento del arranque,

ya que es el momento en que la placa busca el Terminal PC.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 48 -

Una vez conectado el sistema entra en modo monitor y a la espera de recibir

instrucciones. Las instrucciones que puede aceptar la placa de demostración del

proyecto son las representadas en la tabla de la figura 17.

Id. Instrucción Descripción Entrada Salida 0x01 Petición del estado

del sistema y del disco duro

- 11 bytes

0x02 Petición de formateo del disco

duro

- -

0x03 Petición de los valores de tensión

- 10 bytes

0x04 Reset de la CPU - - 0x05 Petición de volcado

del sector 3 bytes ( LBA ) 512 bytes

0x06 Petición de volcado de un sector de

RAM

2 bytes ( Dirección en la RAM )

512 bytes

0x07 Carga de la estructura FAT en

EEPROM

2 KB 1 byte por byte enviado

0x08 Configuración de la placa

3 bytes -

Figura 17.

Para ver el procedimiento de utilización de estos comandos se deberá ver la

segunda parte de este proyecto.

2.4.4. Programa Principal (PFC.asm)

El programa principal (PFC.ASM) es el encargado de inicializar todos los

dispositivos para que puedan funcionar en este proyecto, el programa principal entra en

un bucle de espera una vez se hayan inicializado las interrupciones y los periféricos

(disco duro, memorias, LCD).

En la figura 18 de a continuación se muestra mediante diagramas de bloques el

funcionamiento del programa principal.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 49 -

Figura 18.

El programa principal tiene como misión principal inicializar los dispositivos y

comprobar que todo esté correcto para que el sistema pueda funcionar sin problemas.

Una vez llevadas a cabo todas las comprobaciones, el programa principal entra en un

bucle de espera infinito que solo se sale con reset en hardware.

En el momento de dar la alimentación al sistema el puntero de código es lanzado

a la dirección 0x0000 y de allí relanzado a la primera línea del código que forma el

programa principal.

En primer paso es configurar los puertos de entrada y salida del

microcontrolador, para que no haya ninguna mala inicialización.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 50 -

Una vez inicializados los puertos se pasa a inicializar los periféricos internos del

micro, ya sean TIMERS, Conversores A/D, etc….

En este sistema se inicializan dos de los TIMERS internos y el conversor A/D.

Una vez inicializados los periféricos se pasa a inicializar las variables del

programa, estas se utilizan como variables temporales durante la ejecución del

programa.

A continuación se pasa a inicializar la pila software, esta pila esta ubicada en la

segunda página de la memoria de datos. Esta pila es usada por las rutinas, cada vez que

se entra en una rutina se guarda el valor de las variables comunes y del estado de los

puertos, de tal forma que una vez se sale, todo vuelve a estar como estaba al entrar.

A continuación se pasan a restaurar los valores de las variables contenidas en la

EEPROM interna del PIC, estas variables son utilizadas mayoritariamente para el

manejo de la estructura FAT16 y no se debe de perder el valor que contienen en caso de

fallo de la alimentación o apagada voluntaria.

En los peores casos la información que se perdería en caso de fallo de la

alimentación seria de 256 muestras, el tamaño de un sector.

Seguidamente se pasa a inicializar la LCD, la forma de inicializarla es mediante

el código proporcionado por el fabricante del chip, en este caso Hitachi.

A continuación se pasa a comprobar la disponibilidad del disco duro. Lo que

hace esta rutina es leer el registro de estado del disco hasta un máximo de 10 veces con

una pausa de 1 segundo, hasta que la bandera de READY se levanta, en el caso de que

no se levante esto querrá decir que no existe disco duro o bien que esta bloqueado.

Inmediatamente después se pasa a comprobar si están las memorias insertadas en

sus zócalos, para llevar a cabo esta comprobación lo que se hace es grabar un dato

conocido en la última posición de cada memoria. A continuación se pasa a leer el

contenido de dicha posición para saber si cuadra. En caso contrario se comprueba si la

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 51 -

memoria que falta es la EEPROM o la RAM, en el caso de que sea la memoria RAM el

sistema se detendrá, ya que es la memoria que se utiliza para el almacenamiento

intermedio de la información, y en el caso de que sea la EEPROM y el disco duro no se

deba de formatear el sistema podrá avanzar.

A continuación se pasa a configurar el disco para transferencias modo PIO 0.

Las transferencias PIO son transferencias programadas por el usuario, y el 0 significa

que la velocidad de transferencia va a ser la más baja posible, ver la tabla de la figura

19.

MODO DE TRANSFERENCIA MB DE TRANSFERENCIA (PICOS)

PIO 0 2/3 Mb/s PIO 1 y 2 4 Mb/s PIO 3 11 Mb/s PIO 4 16 Mb/s MultiWord DMA 1 13 Mb/s MultiWord DMA 2 16,6 Mb/s Ultra DMA 33 33 Mb/s Ultra DMA 66 66 Mb/s

Figura 19.

En la tabla anterior se pueden observar las velocidades máximas de transferencia

dependiendo de la configuración del disco. Cabe decir que no todos los discos duros

aceptan todos los modos de transferencia; por ejemplo un disco antiguo no acepta

transferencia Ultra DMA 66 pero un disco nuevo si acepta transferencias PIO 0.

A continuación se lee el sector de identificación del disco duro, este sector nos

indica los sectores reales del disco, el número de sectores direccionales, la marca,

modelo, número de serie, etc. Una vez leído el sector de identificación la información

más necesaria pasa a ser representada por pantalla como si de la BIOS de un PC se

tratara.

Mediante la información obtenida del sector de identificación se determina si el

disco colocado es lo suficientemente grande como para generar una partición FAT16

máxima, o sea 2.1GB, si lo es el sistema avanza sin problemas, en caso contrario se

detiene presentando un mensaje de error por pantalla.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 52 -

A continuación se cargan en la RAM externa del micro los sectores del

directorio y de la FAT que se esten utilizando en este momento partiendo de la

información almacenada en la EEPROM del micro. Por ejemplo si la última vez que se

utilizó el sistema ya se habían completado 3 sectores de la FAT, en esta rutina se carga

el tercer sector de la FAT, ya que es a partir de allí donde se deberá de escribir la

información de direccionamiento de CLUSTERS.

Una vez cargados los sectores se pasa a comprobar si el PC esta conectado al

puerto de comunicación serie. Para llevar a cabo esta comprobación el sistema envía 2

caracteres consecutivos con un intervalo de espera de 1 segundo a través de la interfaz

serie, la placa de control envía el carácter “0xAA” y si el PC esta conectado, este deberá

de responder “0xBB” antes de 1 segundo. Si esto se hace correctamente, el sistema

quedará “ON-LINE” pasando a la rutina de monitorización a través del PC. Si no se

detecta respuesta en menos de 1 segundo el sistema continúa el arranque normal

pasando a funcionar de forma autónoma con los datos obtenidos del disco duro y la

configuración de la EEPROM interna del micro.

Si el arranque se ejecuta de forma automática este pasa a comprobar si el sector

del directorio es la misma que contiene la estructura FAT fija en la EEPROM externa

del micro. Esto se hace para saber si la información ha sido modificada mediante un PC,

ya que el sistema no modifica la fecha de escritura de los ficheros contenidos en el

disco, pero cualquier sistema operativo si lo hace, de tal forma que mediante la fecha de

modificación se puede detectar si los datos del disco se han modificado.

Si se detecta que los datos del disco han sido modificados, el sistema pasa a

formatear el disco duro y a restablecer la estructura FAT fija que contiene la EEPROM

externa al micro, este formateo automático se lleva a cabo solo si el usuario lo permite

mediante la configuración cargada anteriormente (ajustes del sistema).

Si el usuario no permite que el disco duro no se formatee de forma automática,

el sistema presenta un mensaje de advertencia a través de la pantalla LCD y se detiene.

Si el usuario ha permitido que el disco duro se formatee de forma automática el

sistema pasa a borrar: primero los sectores del disco duro, solo borrara los sectores que

van desde el sector de arranque hasta el ultimo sector de la FAT2 (copia de la FAT1)

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 53 -

para ahorrar en tiempo. A continuación se vuelcan los sectores contenidos en la

EEPROM externa del micro a sus respectivos lugares en el disco duro, restableciendo

así el sistema de archivos de nuevo.

El siguiente paso que hace es comprobar si el usuario a permitido que el disco

pase a modo STANBY de forma automática cuando esté más de 30 segundos sin

actividad. Esta configuración se ha introducido para poder ahorrar energía.

Si el usuario lo permite se pasa a programar el disco para que pase a modo

STANBY y pare el plato giratorio si no se ha producido actividad en más de 30

segundos.

Si el usuario no lo permite, el programa saltará la rutina de configuración del

STANBY del disco y éste nunca parará.

Una vez ejecutados estos pasos, el programa principal (PFC.ASM) pasa a un

bucle de espera infinito, del que solo se podrá salir a partir de un reset por hardware.

Una vez arrancado el sistema, si se quisiera entrar en modo ON-LINE, se

debería conectar el PC a la placa y ejecutar un reset por hardware. La situación del

pulsador de reset se muestra en la figura 20.

Figura 20.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 54 -

3. Memoria de Cálculo.

En este apartado se demostraran matemáticamente algunos de los parámetros y

decisiones tomadas en este proyecto, ya sean en componentes electrónicos como en

rutinas software.

3.1. Tiempo Mínimo de muestreo de los canales.

En este apartado se pasa a calcular matemáticamente el tiempo mínimo que se

puede establecer como muestreo de los canales analógicos para que el sistema funcione

correctamente y no provoque fallos en el hardware ni bloqueos en el firmware interno al

micro.

Partimos de la rutina que nos recoge la información de los canales analógicos de

entrada, la cual se ejecuta a través de interrupción provocada por el TIMER 0 (TMR0)

del micro.

Esta rutina muestra la parte del firmware interno al micro que se encarga de

recoger el valor digital del conversor A/D y almacenarla en el BUFFER

correspondiente, esta parte de código es la que más tarda, pues es la que marcará el

tiempo mínimo de conversión.

A cada interrupción provocada por el TIMER 0 se recoge el valor de uno de los

conversores internos al micro, de tal forma que si se provocara una interrupción ahora

mismo y el canal que tocara recoger la información fuera el canal 1 el recorrido del

código seria:

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 55 -

; == INTERRUPCION DE SERVICIO AL CONVERSOR A/D == CONVERSOR NOP BCF PIR1,ADIF ;BAJO LA BANDERA BTFSS CANAL0 ;MIRO SI SE A ESCANEADO EL CANAL 0 GOTO CONVERSOR1 ;INSTRUCCIONS ASOCIADES AL CANAL0 MOVLW high FILE1 ;CALCULO LA POSICION RELATIVA EN RAM MOVWF DIREC_H CLRF DIREC_L MOVF OFFSET_H,W ADDWF DIREC_H,F MOVF OFFSET_L,W ADDWF DIREC_L,F RLF CANAL,F ;INCREMENTO EL CANAL MUESTREADO MOVLW B'11001001' ;CONFIGURO EL A/D PARA EL CANAL 1 MOVWF ADCON0 GOTO GUARDA_FIN CONVERSOR1 BTFSS CANAL1 GOTO CONVERSOR2 ;INSTRUCCIONS ASOCIADES AL CANAL1 MOVLW high FILE2 ;CALCULO LA POSICION RELATIVA EN RAM MOVWF DIREC_H CLRF DIREC_L MOVF OFFSET_H,W ADDWF DIREC_H,F MOVF OFFSET_L,W ADDWF DIREC_L,F RLF CANAL,F ;INCREMENTO EL CANAL MUESTREADO MOVLW B'11010001' ;CONFIGURO EL A/D PARA EL CANAL 2 MOVWF ADCON0 GOTO GUARDA_FIN CONVERSOR2 BTFSS CANAL2 GOTO CONVERSOR3 ;INSTRUCCIONS ASOCIADES AL CANAL2 MOVLW high FILE3 ;CALCULO LA POSICION RELATIVA EN RAM MOVWF DIREC_H CLRF DIREC_L MOVF OFFSET_H,W ADDWF DIREC_H,F MOVF OFFSET_L,W ADDWF DIREC_L,F RLF CANAL,F ;INCREMENTO EL CANAL MUESTREADO MOVLW B'11011001' ;CONFIGURO EL A/D PARA EL CANAL 3 MOVWF ADCON0 GOTO GUARDA_FIN CONVERSOR3 BTFSS CANAL3 GOTO CONVERSOR4 ;INSTRUCCIONS ASOCIADES AL CANAL4 MOVLW high FILE4 ;CALCULO LA POSICION RELATIVA EN RAM MOVWF DIREC_H CLRF DIREC_L MOVF OFFSET_H,W ADDWF DIREC_H,F MOVF OFFSET_L,W ADDWF DIREC_L,F RLF CANAL,F ;INCREMENTO EL CANAL MUESTREADO MOVLW B'11100001' ;CONFIGURO EL A/D PARA EL CANAL 4 MOVWF ADCON0 GOTO GUARDA_FIN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 56 -

CONVERSOR4 MOVLW 0X01 ;INSTRUCCIONS ASOCIADES AL CANAL4 MOVWF CANAL ;COLOCO COMO QUE EL PROXIMO CANAL ;QUE SE ESCANEARA SERA EL 1 MOVLW high FILE5 ;CALCULO LA POSICION RELATIVA EN RAM MOVWF DIREC_H CLRF DIREC_L MOVF OFFSET_H,W ADDWF DIREC_H,F MOVF OFFSET_L,W ADDWF DIREC_L,F MOVLW B'11000001' ;CONFIGURO EL A/D PARA EL CANAL 0 MOVWF ADCON0 MOVLW 0X02 ;INCREMENTO EL OFFSET EN 2 POSICIONES ADDWF OFFSET_L,F ;SOLO CUANDO SE HAN MUESTREADO LOS BTFSC STATUS,C ;5 CANALES INCF OFFSET_H,F DECF PACK_EVENT,F ;DESCUENTO EL NUMERO DE PAQUETES DE BTFSS STATUS,Z ;CANALES MUESTREADOS GOTO NO_PACK_EVENT MOVLW low PACK_POR_REPRESENTACION MOVWF PACK_EVENT BSF PACK_MUESTREADO NO_PACK_EVENT MOVF OFFSET_L,W ;COMPRUEBO SI A LLEGADO A LLENARSE BTFSS STATUS,Z ;EL BUFFER 1 GOTO NO_BUFFER_1 ;DIRECCION 0X0200 MOVLW 0X02 XORWF OFFSET_H,W BTFSS STATUS,Z GOTO NO_BUFFER_1 BSF BUFFER1_FULL

BSF BUFFER_ACTIVO ;CAMBIO DE BUFFER NO_BUFFER_1 MOVF OFFSET_L,W ;COMPRUEBO SI A LLEGADO A LLENARSE BTFSS STATUS,Z ;EL BUFFER 2 GOTO GUARDA_FIN ;DIRECCION 0X03FF MOVLW 0X04 XORWF OFFSET_H,W BTFSC STATUS,Z BSF BUFFER2_FULL ;========================================================================== GUARDA_FIN NOP BANKSEL ADRESL MOVF ADRESL,W ;GUARDO LA PARTE BAJA EN RAM BANKSEL DAT MOVWF DAT PAGESEL W_MEM_EX CALL W_MEM_EX INCF DIREC_L,F ;INCREMENTO LA DIRECCION DE LA RAM BTFSC STATUS,Z INCF DIREC_H,F MOVF ADRESH,W ;GUARDO LA PARTE ALTA EN RAM MOVWF DAT PAGESEL W_MEM_EX CALL W_MEM_EX PAGESEL V_INT GOTO FIN_INT

Como se puede comprobar, no se podrá provocar otra interrupción del TIMER 0

antes de que transcurra el tiempo necesario para completar la rutina de almacenaje en

los BUFFER, ya que el PIC no permite reentrada.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 57 -

El número de instrucciones que hay en este recorrido son de: 51 instrucciones +

2 llamadas a la rutina W_MEM_EX.

El número de instrucciones que ejecuta la rutina W_MEM_EX tal y como se

puede ver en el trozo de código siguiente son:

W_MEM_EX NOP

PAGESEL SALVA CALL SALVA PAGESEL W_MEM_EX BANKSEL TRISD CLRF TRISD CLRF TRISC BANKSEL PORTD MOVF DIREC_L,W MOVWF PORTD CALL ALE MOVF DIREC_H,W MOVWF PORTC MOVF DAT,W MOVWF PORTD CALL WE PAGESEL RESTAURA CALL RESTAURA PAGESEL W_MEM_EX RETURN

El número de instrucciones que ejecuta son: 38 instrucciones + 1 llamada a la

rutina SALVA + 1 llamada a la rutina ALE + 1 llamada a la rutina WE + 1 llamada a la

rutina RESTAURA.

Por otra parte el número de instrucciones de las rutinas llamadas por la rutina

W_MEM_EX son:

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 58 -

Rutina SALVA:

SALVA NOP BANKSEL TRISC MOVF TRISC,W MOVWF STACK PAGESEL G_PILA CALL G_PILA PAGESEL SALVA ADDLW 0X01 BTFSC STATUS,Z GOTO ERROR_PILA BANKSEL TRISD MOVF TRISD,W MOVWF STACK PAGESEL G_PILA CALL G_PILA PAGESEL SALVA ADDLW 0X01 BTFSC STATUS,Z GOTO ERROR_PILA BANKSEL PORTE MOVF PORTE,W MOVWF STACK PAGESEL G_PILA CALL G_PILA PAGESEL SALVA ADDLW 0X01 BTFSC STATUS,Z GOTO ERROR_PILA BANKSEL PORTD RETURN

Como se puede ver, esta rutina hace llamadas consecutivas a la rutina G_PILA,

encargada de almacenar el dato en la pila software, el número de instrucciones que

ejecuta son:

G_PILA NOP MOVLW TOP XORWF FSR,W BTFSC STATUS,Z RETLW 0XFF BANKSEL STACK MOVF STACK,W BANKSEL PORTD MOVWF INDF DECF FSR,F RETLW 0X00

El número de instrucciones que ejecuta la rutina SALVA son 108 instrucciones.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 59 -

El número de instrucciones ejecutadas por la rutina ALE son:

ALE MOVLW 0X06 MOVWF PORTE BSF PORTB,1 NOP NOP BCF PORTB,1 RETURN

El número de instrucciones que ejecuta son 7. El número de instrucciones que ejecuta la rutina WE son:

WE MOVLW 0X04 MOVWF PORTE BSF PORTB,1 NOP NOP BCF PORTB,1 RETURN

Esta rutina ejecuta 7 instrucciones.

Por ultimo vamos a calcular el número de instrucciones que ejecuta la rutina

RESTAURA:

RESTAURA NOP PAGESEL R_PILA CALL R_PILA PAGESEL RESTAURA ADDLW 0X01 BTFSC STATUS,Z GOTO ERROR_PILA BANKSEL STACK MOVF STACK,W BANKSEL PORTE MOVWF PORTE PAGESEL R_PILA CALL R_PILA PAGESEL RESTAURA ADDLW 0X01 BTFSC STATUS,Z GOTO ERROR_PILA BANKSEL STACK MOVF STACK,W MOVWF TRISD PAGESEL R_PILA CALL R_PILA PAGESEL RESTAURA ADDLW 0X01 BTFSC STATUS,Z GOTO ERROR_PILA BANKSEL STACK MOVF STACK,W MOVWF TRISC BANKSEL PORTD RETURN

Como pasa con la rutina encargada de salvar los datos en pila, esta también

ejecuta una rutina que se encarga de extraer un dato de la pila software, de la cual

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 60 -

debemos saber el número de instrucciones que ejecuta para saber el número de

instrucciones de la rutina RESTAURA.

La rutina R_PILA es: R_PILA NOP MOVLW BOTOM XORWF FSR,W BTFSC STATUS,Z RETLW 0XFF INCF FSR,F MOVF INDF,W BANKSEL STACK MOVWF STACK BANKSEL PORTD RETLW 0X00

El número de instrucciones que ejecuta la rutina RESTAURA son 115.

Una vez detallado el número de instrucciones que ejecuta cada rutina, que son

llamadas por la rutina W_MEM_EX, solo nos queda contar el total de instrucciones que

ejecuta.

El numero de rutinas son: 51 + 2x (W_MEM_EX) à

à 51 + 2 x (38 + SALVA + ALE + WE + RESTAURA) à 51 + 2 x (38 + 108 + 7 + 7 + 115 ) à El total de instrucciones son: 601 instrucciones.

Teniendo en cuenta que cada instrucción son 4 ciclos máquina en el PIC o que es

lo mismo que cada instrucción se ejecuta en 12.5 µS (ya que el reloj de cuarzo es de 2

Mhz), tenemos que el tiempo necesario para ejecutar la interrupción es de:

mssSTiempo 5.75.7512601*5.12 →== µµ (4)

Este tiempo es el que tarda en almacenarse un valor obtenido del conversor A/D

a su BUFFER correspondiente, pero a nosotros lo que nos interesa es saber el tiempo

mínimo que podemos obtener muestreando el mismo canal. Una forma más clara sería

ver el siguiente diagrama:

Canal 1 à Canal 2 à Canal 3 à Canal 4 à Canal 5

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 61 -

Como podemos ver, para obtener el tiempo que necesita el sistema para volver a

obtener una muestra del mismo canal es el tiempo mínimo que se necesita para pasar de

canal a canal multiplicado por 5, así que el tiempo mínimo de muestreo es:

msmsoCanalTiempoMism 5.375*5.7 == (5)

A nota informativa, la frecuencia más elevada que podemos muestrear es: 13Hz

3.2. Fuente de Alimentación.

Para este proyecto se ha diseñado una fuente de alimentación de tipo conmutada,

para poder mejorar en rendimiento y operar con baterías y paneles solares.

La fuente que se ha diseñado dispone de dos salidas de 3A cada una, una de 5V

y 12V respectivamente.

Para el diseño se ha optado por montar un chip regulador integrado. Este chip

contiene ya el interruptor de potencia, así como la electrónica de control.

El diseño que se ha utilizado es un montaje base del fabricante, este montaje se

ha extraído del “datasheet”.

La figura 21 muestra el circuito básico que se ha utilizado para el montaje de la

fuente de alimentación.

Figura 21.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 62 -

Para poder llevar a cabo el cálculo de la bobina y el condensador de salida, lo

que se ha utilizado son las tablas proporcionadas por el fabricante en su “datasheet”.

La figura 22 muestra la tabla necesaria para llevar a cabo el cálculo de la bobina de

la fuente.

Figura 21.

Mediante esta tabla se obtiene la bobina a utilizar en la fuente de alimentación.

Para poder calcularla se debe colocar en el eje de las “X” la corriente máxima a la salida

y en el eje de las “Y” la tensión a la entrada.

En nuestro sistema, la tensión de entrada es de 24V y la corriente máxima 3A.

Se ha considerado 3A pensando en la colocación de 2 discos duros, uno en maestro y

otro en esclavo.

Haciendo uso de la tabla anterior para calcular la bobina de la fuente de 5V se

tiene que, si se cruzan los ejes en 24V de tensión de entrada y 3A de corriente de salida

se obtiene una bobina de 100 µH.

Análogamente usando la tabla de la figura 22, se obtiene que el valor de la bobina

de la fuente de 12V es de 150 µH.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 63 -

Figura 22.

Para el condensador de salida, el fabricante únicamente aconseja utilizar uno de

tipo electrolítico de entre 680 y 2000µF, se ha optado por uno de 1470µF, resultado de

la combinación de dos condensadores.

El diodo que se ha utilizado es un diodo de barrera “schocky” modelo 1N5822,

recomendado por el fabricante en los diagramas de su “datasheet”.

Lo que hace referencia al cálculo del disipador de calor de la fuente, se ha

optado por montar ambos chips en un único disipador de calor.

Para el cálculo que la potencia disipa en cada regulador integrado se utiliza la

formula (6) que se muestra a continuación.

VsatIloadVinVo

Pd *

= (6)

Para poder completar el cálculo debemos definir los parámetros de cada fuente.

Fuente de 5V: Corriente a la salida = 3A

Tensión de entrada = 24V nominal

Temperatura ambiente = 25ºC

Temperatura máxima en la unión = 80ºC

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 64 -

Fuente de 12v: Corriente a la salida = 3A

Tensión de entrada = 24V nominal

Temperatura ambiente = 25ºC

Temperatura máxima en la unión = 80ºC

Resolviendo la formula (6) con los valores anteriormente mencionados, se

obtiene una potencia resultante de:

wwPotencia 6695,52*32412

2*3245

≈=

+

= (7)

Mediante la formula (8) se calcula la resistencia térmica del radiador a utilizar:

CdadaCdajdPdttj º9)1)(6(º60))(( =→+=→+=∆ φφφφ

El disipador de calor a colocar deberá ser de 9ºC para poder disipar todo el calor

generado por el chip regulador sin peligro de que se queme.

NOTA: Para la fuente del prototipo se a colocado un disipador de 8.1ºC ya que

no se pudo encontrar el calculado con rapidez.

La figura 23 y 24 muestran a nivel informativo el aspecto del circuito integrado

regulador y el diagrama interno del chip.

Figura 23

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 65 -

Figura 24

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 66 -

4. Planos. 4.1. Placa de Control. 4.1.1. Esquema Eléctrico.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 67 -

4.1.2. Layout.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 68 -

4.2. Fuente de Alimentación. 4.2.1. Esquema Eléctrico.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 69 -

5. Presupuesto. 5.1. Placa de control.

En la siguiente partida presupostaria se pasa a detallar todos los componentes de

la placa de control, así como la elaboración de la placa de prototipo, programación y

puesta en marcha.

Codigo Unid. Descripción Precio

Unitario Precio Total

001100877 1 Unidad Microcontrolador PIC 16F877 20Mhz en encapsulado DIP 40 pines.

10.92 10.92

001100256 1 Unidad de memoria RAM estática de 32Kbytes en encapsulado DIP de 32 pines

modelo UM62256

13 13

001101256 1 Unidad de memoria EEPROM de 32KB en encapsulado DIP de 32 pines modelo

AT28256

15 15

001100573 3 Latch paralelo de 8 bits con bit de enable, bit de inhabilitación de la salida y bit tri-estado con tecnología CMOS, modelo 74HCT573

con encapsulado DIP de 20 pines.

1.5 4.5

001100138 1 Decodificador de 3 bits binarios a 8 líneas decimales con tecnología CMOS y

encapsulado DIP de 16 pines.

1 1

001100232 1 Circuito Adaptador de señales RS232 a TTL modelo MAX232 de Maxim en encapsulado

DIP de 18 pines.

2 2

001100010 4 Condensador Electrolítico de 10µF y 16 voltios radial para PCB estándar

0.52 2.08

001100100 1 Condensador Electrolítico de 100µF y 16 voltios radial para PCB estándar

0.62 0.62

001100100 8 Condensador de Película de 100pF radial para PCB estándar

0.12 0.96

101100001 3 Resistencia de ¼ de vatio axial 0.02 0.06 001100022 2 Condensador de Película de 22pF radial para

PCB estándar 0.11 0.22

110010 1 Cristal de Cuarzo a 20 Mhz montaje en PCB estándar

0.68 0.68

001100420 1 LCD para montaje en PCB estándar con interfase paralela no retro iluminada de 4 líneas y 20 caracteres por línea. Chip de

control HITACHI.

24 24

101040 1 Conector IDE para montaje en PCB estándar

y 40 pines. 0.25 0.25

101010 1 Conector ICD para montaje en PCB estándar y 10 pines.

0.20 0.20

1045 1 Conector RJ11 para montaje en PCB estándar

0.85 0.85

1009 1 Conector DB9 acodado hembra para montaje en PCB estándar.

0.69 0.69

2003 2 Led para montaje en PCB estándar de 3 m/m 0.10 0.20 2004 1 Pulsador para montaje superficial 0.50 0.50 SEP 11 Separador de PCB de 10 m/m métrica 3 0.10 1.1

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 70 -

PCB 1 PCB “routeado” y elaborado mediante fotolito en un sistema de luz ultravioleta

150 150

9999 48 Hora de Ingeniero en el montaje del PCB 50 2400 9998 248 Hora de Ingeniero en elaboración del

Firmware y puesta en servicio 50 12400

Total Partida Placa Control é Adquisición 15028.83€

La partida de Placa de Control y Adquisición asciende a: // 15.028,83 € // // Quince mil vente y ocho euros con ochenta y tres centimos //

5.2. Fuente de Alimentación. Codigo Unid. Descripción Precio

Unitario Precio Total

201100 1 Regulador conmutado de 260 Khz en encapsulado pentavat y tensión fija a 5 v y

3A

3.68 3.68

201101 1 Regulador conmutado de 260 Khz en encapsulado pentavat y tensión fija a 12 v y

3A

3.68 3.68

201102 1 Bobina de filtrado con devanado al aire y 33µH

1.05 1.05

201103 1 Bobina de filtrado con devanado al aire y 22µH

1.05 1.05

201104 1 Radiador para encapsulado TO220 de 2.8ºC/W

2.75 2.75

201105 3 Portafusiles para PCB 0.60 1.80 201106 1 Fusible de 2A 0.21 0.21 201107 1 Fusible 1A 0.21 0.21 201108 2 Diodo Rectificador con barrera Scotky de 2A 0.10 0.20 201109 1 Interruptor de rabilla 1 contacto conmutado 0.45 0.45 20PCB 1 PCB para circuito de alimentación se simple

cara elaborado con sistema de luz ultravioleta en placa de fibra de vidrio

80 80

9999 24 Hora de Ingeniero en el montaje del PCB 50 1200 Total Partida Fuente de Alimentación 1295.08€

La partida de la Fuente de Alimentación asciende a: // 1.295,08 € //

// Mil doscientos noventa y cinco euros con ocho centimos //

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 71 -

6. Pliego de Condiciones.

6.1. Condiciones Técnicas.

6.1.1. Generalidades.

Para una correcta realización del montaje, deben tenerse en cuenta una serie de

puntos, destacando el orden en que estos se desarrollan.

1- Encargo y compra de materiales y componentes necesarios

2- Construcción de los inductores

3- Fabricación de las placas de circuito impreso

4- Montaje de los componentes en las placas fabricadas anteriormente

5- Ajuste y comprobación de los parámetros par un correcto

funcionamiento

6- Puesta en marcha del equipo

7- Controles de calidad y de fiabilidad

Todas estas partes, que en su conjunto forman la obra, deberán ser ejecutada por

montadores que se someterán a las normas y reglas que la comunidad autónoma, país o

comunidades internacionales tenga previstas para este tipo de montajes, no haciéndose

así cargo el proyectista de los desperfectos ocasionados por su incumpliendo.

6.1.2. Resistencias.

Las resistencias serán de los valores óhmicos especificados. Todas las

resistencias serán de ¼ W y con una tolerancia del 5% excepto las fijadas en los planos

que lo indiquen de otra forma. Las pruebas a realizar en todas ellas son:

- Medidas de valores de tolerancia.

- Medidas de disipación y voltaje.

Estas pruebas se clasificaran:

- Potencia nominal

- Resistencias ajustables.

- Potenciómetros.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 72 -

La medida de los valores de resistencia y tolerancia se extenderán a todas las

resistencias y todas tendrán que mantener su tolerancia dentro de unos limites

comprendidos entre el 0’5 y el 5% según el tipo a que correspondan.

Las medidas de potencia se realizaran sometiendo a las resistencias a tensiones

adecuadas para que su disipación sea la que indica el fabricante.

Se someterán a estas tensiones durante un tiempo de 6 horas para que permita

verse con diferencia su variación de resistencia a lo largo del tiempo.

6.1.3. Condensadores.

Todos los condensadores serán de los valores capacitativos especificados en los

planos. Su tensión máxima también se especifica en los planos.

Los condensadores electrolíticos serán de montaje vertical o horizontal según las

especificaciones de los planos. Es necesario pone especial atención en no invertir la

polaridad en el momento de montarlos.

La capacidad no nominal es la especificada por el fabricante y marca sobre el

cuerpo del componente, mediante un código de colores (similar al empleado para el

marcaje de resistores). También puede estar marcada una cifra y la letra de unidades (p

para picofaradios, n para nanofaradios, m para microfaradios y m para milifaradios).

Cada valor nominal ha de llevar asociada una tolerancia, que se marca mediante

un color o mediante una segunda letra. Además suele marcar también la tensión

nominal, y en el caso de condensadores cerámicos con coeficiente de temperatura

establecido, el coeficiente de temperatura, ya sea con una franja de color o con una letra.

La elección del tipo de condensador a utilizar es también un punto a tener muy en

cuenta en el montaje de un equipo de potencia. El mercado de este tipo de componente

electrónico es muy amplio, existen así un amplio abanico de donde elegir.

Lo tipos de condensador más utilizados son los cerámicos y electrolíticos.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 73 -

Condensadores cerámicos: Los materiales cerámicos son buenos aislantes

térmicos y eléctricos. El proceso de fabricación consiste básicamente en la metalización

de las dos caras del material cerámico. Se fabrican de 1pF a 1nF (grupo I) y de 1pF a

470nF (grupo II) con tensiones comprendidas entre 3 y 10000V. Su identificación se

realiza mediante código alfanumérico. Se utilizan en circuitos que necesitan alta

estabilidad y bajas pérdidas en altas frecuencias.

Condensadores electrolíticos: Pueden ser de aluminio, de tántalo, y su principal

diferencia con los anteriores, es la apariencia física, las dimensiones de éstos no son

demasiado elevadas incluso para grandes capacidades. Uno de los inconvenientes que

presenta es que la resistencia serie que presentan es bastante elevada, con lo que las

pérdidas e disparan, reduciéndose así considerablemente la vida media de este tipo de

condensadores.

6.1.4. Inductores.

Todos los Inductores serán de los valores especificados en los planos o en su

defecto, modelos equivalentes. Su Intensidad máxima también se especifica en los

planos, en caso contrario no será superior a 3000mA.

6.1.5. Transistores y Diodos.

Los transistores y diodos utilizados serán los especificados en los planos, o en su

defecto, modelos equivalentes.

Se verificaran estas condiciones conforme a las medidas siguientes:

- Medidas de los valores límites.

- Medidas de los parámetros de trabajo.

Las medidas de las tensiones, corrientes y potencias, se harán mediante un

montaje de prueba que facilite y permita suministrar en cada caso y a cada uno de los

transistores, las tensiones deseadas y disponiendo así de aparatos de medida de

tensiones y corrientes que nos permitan controlar en cada momento las tensiones y

corrientes que circulan por los transistores.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 74 -

Si durante alguna de las pruebas realizadas resultara dañado algún componente,

sin haber sobrepasado los límites específicos y los daños de fuesen de carácter

permanente, no implica ningún tipo de compromiso por la firma en cuestión, siendo

responsabilidad enteramente de la empresa o casa adjudicada.

6.1.6. Placas de Circuito Impreso.

Las placas de circuito impreso tendrán que tener aislamiento superficial igual o

superior a 10MO y serán de fibra de vidrio presensibilizadas positivamente, una a una

cara y dos a doble cara.

Las dimensiones serán las necesarias para que puedan contenerse los esquemas.

La hoja de cobre tiene que tener un grosor normalizado de 0’075 mm para pistas de

señal y de 0’76 mm para las de potencia.

La separación mínima de pistas será de 1’14 mm, siempre que sea posible,

mientras que los agujeros se harán con una broca de 1mm o inferior.

La realización de los circuitos impresos se realizará a partir de los planos,

respectando estrictamente el diseño de las pistas.

Los conectores encargados de realizar las conexiones entre el exterior y las

placas, así como las conexiones entre ellas, se revisaran para garantizar el correcto

contacto con las placas y se imprimirán una serie de indicadores para su correcta

colocación.

Una vez soldados los componentes y comprobados, se le aplicará una capa de

barniz especial para evitar la posible oxidación del cobre con el paso del tiempo.

6.1.7. Especificaciones Mecánicas

Los requerimientos mecánicos en el montaje del prototipo son un punto muy a

tener en cuenta para una correcta ejecución, siendo necesarias unas ciertas calidades den

los materiales con el fin de que la solidez mecánica sea aceptable.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 75 -

La mayoría de los componentes presentan una sujeción estable por soldadura

directamente con la placa. Sin embargo, los circuitos impresos se insertan en la placa

mediante zócalos (en algunos casos de doble cara) con el claro objetivo de realizar

sustituciones de los integrados con una cierta facilidad, ya sea porque se ha dañado o

porque se quieren realizar otras pruebas.

6.1.8. Interface.

El puerto serie del PC debe contar con un conector Sub-D9 macho, o en su

defecto un conector Sub-D25 macho. Para el último caso será responsabilidad del

usuario el proveerse con un adaptador Sub-D25/Sub-D9.

El puerto serie debe cumplir con el estándar RS-232, proporcionando tensiones a

partir de -12V para el valor lógico “0” y tensiones a partir de +12V para el valor lógico

“1”.

La tina de corriente a la que se conecta el dispositivo maestro debe estar

contenida en la red general donde se conecten el resto de dispositivos de red.

6.1.9. Suministro.

Se debe comprobar la regulación de línea del sistema de alimentación mediante

red eléctrica convencional, para que se asegure una aportación de 5V y 12V. Los

elementos pasivos de seguridad deben estar homologados y probados (los que puedan

usarse repetidamente).

6.1.10. El Microcontrolador.

El microcontrolador debe ser configurado para comunicar a 2400 bps. Los pines

deben ser configurados según su función, si son de entrada o de salida.

6.1.11. Montaje y Cableado Interior.

Todas las palcas realizadas para este montaje irán en el interior de cajas con unas

características apropiadas de aislamiento delante de posibles interferencias, acciones

ambientales externas y otros factores negativos para el funcionamiento del sistema.

El conexionado entre placas y otros elementos se realizará sin alterar el orden indicado

en los planos.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 76 -

7. Anexo 7.1. Código Fuente Comentado. 7.1.1. PFC.asm Este archivo es el programa principal del proyecto, es desde aquí donde se configura todo los dispositivos. ;======================================================================; ; PROJECTE FI DE CARRERA ORIOL MONCLUS SANCHEZ ; ; UNITAT DE MOSTREIX I ALMAGATZEMATGE MASIU ; ;======================================================================; ;======================================================================; ; DIRECCIONS DE LA PANTALLA LCD ; ; ; ; 0X80 --> LINEA1 ; ; 0XC0 --> LINEA2 ; ; 0X94 --> LINEA3 ; ; 0XD4 --> LINEA4 ; ;======================================================================; #include <p16f877.inc> ;======================================================================; ; DEFINES ; ;======================================================================; Se definen unas etiquetas que hacen referencia directa a unos pins de lo puertos de salida o entrada, asi como bits especificos de algunos registros. #DEFINE HD_LED PORTB,2 #DEFINE DRDY HD_STATUS,6 #DEFINE BSY HD_STATUS,7 #DEFINE ERR HD_STATUS,0 #DEFINE DF HD_STATUS,5 #DEFINE DRQ HD_STATUS,3 #DEFINE UNIDAD DEVICE_HEAD,4 #DEFINE LBA DEVICE_HEAD,6 #DEFINE SRST DEVICE_CONTROL,2 #DEFINE nIEN DEVICE_CONTROL,1 #DEFINE HD_OK R_CONTROL,0 #DEFINE RAM_OK R_CONTROL,1 #DEFINE EEP_OK R_CONTROL,2 #DEFINE COM_ERR R_CONTROL,3 #DEFINE B_USO_GENERAL R_CONTROL,4 #DEFINE CERO R_CONTROL,7 #DEFINE MUX_ANAL PORTA,4 ;SALIDA DIGITAL ;DEL PUERTO A #DEFINE IO_SERIE PORTB,3 ;SALIDA SERIE ;DEL PUERTO B

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 77 -

;====================VARIABLES=========================================== Esta area es la reservada para las variables del proyecto, se reservan a partir de la direccion 0x20 de la RAM del micro. ORG 0X20 AUX EQU 0X21 AUX1 EQU 0X22 AUX2 EQU 0X4E IO_L EQU 0X23 IO_H EQU 0X24 COUNT EQU 0X2B COUNTAUX EQU 0X4D ;=========================REGISTROS PARA LAS RUTINAS DE PAUSA ========== V_PAUSA EQU 0X25 V_PAUSA1 EQU 0X26 V_PAUSA2 EQU 0X27 ;===========================ACCESO A LA MEMORIA EXTERNA Y INTERNA ====== DIREC_H EQU 0X28 DIREC_L EQU 0X29 DAT EQU 0X2A ;========VARIABLES DE RETORNO DE LA RUTINA HEX --> DEC=================== DIG0 EQU 0X2C DIG1 EQU 0X2D DIG2 EQU 0X2E DIG3 EQU 0X2F DIG4 EQU 0X30 ;==============REGISTROS DEL DISCO DURO================================== FEATURES EQU 0X31 SECTOR_COUNT EQU 0X32 SECTOR_NUMBER EQU 0X33 CYLINDER_LOW EQU 0X34 CYLINDER_HIGH EQU 0X35 DEVICE_HEAD EQU 0X36 COMMAND EQU 0X37 HD_ERROR EQU 0X38 HD_STATUS EQU 0X39 DEVICE_CONTROL EQU 0X3A COMANDOS_ERR EQU 0X4F CONSTANT N_INTENTOS=.4 ;==========REGISTROS Y CONSTANTES PARA LA PILA SOFTWARE================= STACK EQU 0XD1 CONSTANT BOTOM=0XFF CONSTANT TOP=0XD2 OLD_W EQU 0X58 ;REGISTROS PARA SALVAR ;LOS REGISTROS W,STATUS OLD_STATUS EQU 0X59 OLD_PCLATH EQU 0X5A

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 78 -

;=================INFORMACION DEL DISCO DURO============================ CYL_L EQU 0X3B CYL_H EQU 0X3C HEADS_L EQU 0X3D HEADS_H EQU 0X3E SECTORS_L EQU 0X3F SECTORS_H EQU 0X40 ;=================REGISTRO DE BITS DE CONFIGURACION===================== R_CONTROL EQU 0X48 ;===============DIRECCIONES DE LOS FICHEROS EN LA RAM================== CONSTANT FILE1=0X0000 ;DIRECCION DE LOS REGISTROS EN RAM CONSTANT FILE2=0X0400 CONSTANT FILE3=0X0800 CONSTANT FILE4=0X0C00 CONSTANT FILE5=0X1000 OFFSET_L EQU 0X49 ;POSICION RELATIVA OFFSET_H EQU 0X56 ;DEL FICHERO EN RAM CANAL EQU 0X57 ;CANAL QUE SE MUESTREA #DEFINE CANAL0 CANAL,0 #DEFINE CANAL1 CANAL,1 #DEFINE CANAL2 CANAL,2 #DEFINE CANAL3 CANAL,3 #DEFINE CANAL4 CANAL,4 #DEFINE CANAL5 CANAL,5 ;=====================DIRECCION LBA==================================== LBA70 EQU 0X4A ;MENOS PESO LBA158 EQU 0X4B LBA2316 EQU 0X4C ;MAS PESO ;============DIRECCION MAXIMA LBA DIRECCIONABLE EN DISCO 2.1Gb========= CONSTANT MAXLBA70=0X00 CONSTANT MAXLBA158=0X00 CONSTANT MAXLBA2316=0X40 ;============VARIABLES PARA LA TRANSMISION SERIE PROGRAMADA============ CLKIN equ .2000000 ;FRECUENCIA DE OSCILACION ;EN HERZIOS BAUDIOS equ .2400 ;VELOCIDAD DE COMUNICACION T_MODO equ 1 ;TRANSMITE PRIMERO EL BIT LSB R_MODO equ 1 ;RECIBIR PRIMER BIT LSB T_Nbit equ 8 ;TRANSMITE CARACTERES DE 8 bits R_Nbit equ 8 ;RECIBE CARACTERES DE 8 bits Sbit equ 2 ;TRANSMITE 2 BITS DE STOP ;ESTAS CONSTANTES SE CALCULAN AUTOMATICAMENTE A PARTIR DE LOS ;VALORES DE LAS CONSTANTES ANTERIORES CLKOUT equ CLKIN >> 2 ;Calcula duración ;del ciclo máquina DELAY equ ((CLKOUT/BAUDIOS)/3)-.5 ;Calcula la ;duración del bit DELAY_L equ low DELAY ;Calcula la parte ;baja de DELAY DELAY_H equ high DELAY+1 ;Calcula la parte ;alta de DELAY DELAY_START equ (DELAY/2)+DELAY ;Calcula duración ;del bit de inicio DELAY_START_L equ low DELAY_START ;Calcula parte baja ;de DELAY_START DELAY_START_H equ high DELAY_START+1 ;Calcula parte alta ;de DELAY_START

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 79 -

Rs232_var equ 0x50 ;INICIO DE MEMORIA PARA LAS ;RUTINAS RS232 CBLOCK Rs232_var ;Inicio de las variables Rxdreg ;Registro de recepción Txdreg ;Registro de transmisión Cont ;Contador de bits transmitidos Dlycnt_l ;Contador de delay parte baja Dlycnt_h ;Contador de delay parte alta ENDC #define Txd_pin PORTB,5 ;LINEA DE TRANSMISION #define Rxd_pin PORTB,4 ;LINEA DE RECEPCION ;===================TAMAÑO ACTUAL DE FICHERO=========================== CF0 EQU 0X44 CF1 EQU 0X45 CF2 EQU 0X46 CF3 EQU 0X47 ;=========REGISTROS PARA EL CONTROL DE LA ESTRUCTURA FAT16============== R_CONTROL2 EQU 0X5B #DEFINE BUFFER1_FULL R_CONTROL2,0 #DEFINE BUFFER2_FULL R_CONTROL2,1 #DEFINE AUT_STBY R_CONTROL2,2 ;PERMITO AUTOAPAGADO #DEFINE AD_RUN R_CONTROL2,3 ;ME INDICA QUE DEBE DE ;ARRANCAR LA CONVERSION #DEFINE PACK_MUESTREADO R_CONTROL2,4 #DEFINE AUT_FORMAT R_CONTROL2,5 #DEFINE INFO_PANT R_CONTROL2,6 ;0 BUFFERS ;1 DISCO #DEFINE BUFFER_ACTIVO R_CONTROL2,7 ;0 BUFFER 1 ;1 BUFFER 2 R_CONTROL3 EQU 0X67 #DEFINE DESBORDAMIENTO R_CONTROL3,0 ;INDICA EL ;DESBORDAMIENTO DEL ;TIEMPO DE RECEPCION ;RS232 N_SEC_CLUS EQU 0X5C ;NUMERO DE SECTOR DEL CLUSTER ACTIVO N_CLUS_L EQU 0X5D ;NUMERO DE CLUSTERS UTILIZADOS A PARTIR N_CLUS_H EQU 0X5E ;DEL SECTOR 608 ( DATOS ) N_SEC_FAT EQU 0X5F ;NUMERO DEL SECTOR DE LA FAT1 Y 2 CONSTANT MBR_DISCO=0X0000 ;SECTOR INICIO DISCO CONSTANT MBR_FAT=0X003F ;SECTOR INICIO FAT16 CONSTANT INI_SEC_FAT1=0X0040 ;SECTOR DE INICIO DE FAT CONSTANT INI_SEC_FAT2=0X0140 CONSTANT INI_SEC_DIR=0X0240 ;SECTOR DE INICIO DEL DIR. CONSTANT INI_SEC_DATO=0X0260 ;SECTOR DE INICIO DE DATOS CONSTANT P_BAR_BUF_1=0X00C4 ;INICIO DE LA PROGRESBAR1 CONSTANT P_BAR_BUF_2=0X00D8 ;INICIO DE LA PROGRESBAR2 CONSTANT PACK_POR_REPRESENTACION=0X19 ;NUMERO DE PACKS ;DE CANALES MUESTREADOS ;POR PORCION DE ;PROGRESS BAR PACK_EVENT EQU 0X60 ;VARIABLE QUE ME INDICA CADA CUANTAS MUESTRAS SE ;DEVE DE ACTUALIZAR LA PROGRESS BAR

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 80 -

DESP_BAR EQU 0X61 ;OFFSET DE DESPLAZAMIENTO DE LAS BARRAS DE ESTADO FICHERO EQU 0X66 ;VARIABLE QUE ME INDICA EL FICHERO EN EL ;MOMENTO DE CALCULAR EL SECTOR RELATIVO CONSTANT SEC_US_GENERAL_RAM=0X7C00 ;SECTOR PARA USO ;GENERAL EN RAM CONSTANT SEC_DIR_EN_RAM=0X1400 ;SECTOR DE DIR. ;EN LA RAM CONSTANT SEC_FAT_EN_RAM=0X1600 ;SECTOR DE FAT ;EN RAM ;====================================================================== ;=======================CONTROL DEL RELOJ PRINCIPAL==================== ;====================================================================== CONSTANT TIEMPO_BASE_TMR0=0XD9 TICS_L EQU 0X62 ;NUMERO DE TICS DE TMR0 PARA ARRANCAR TICS_H EQU 0X63 ;LA CONVERSION T_TICS_L EQU 0X64 T_TICS_H EQU 0X65 ;======================================================================= ;======================================================================= ;=====================PROGRAMA PRINCIPAL================================ ;======================================================================= ;======================================================================= A partir de aquí es donde empieza la ejecución del programa, el micro cada vez que detecta un reset o se alimenta por primera vez salta a esta direccion de la FLASH. ORG 0X00 NOP ;SE UTILIZA PARA EL DEPURADOR GOTO INICIO ;======================================================================= Inicio del vector de interrupción. Una vez el micro detecta una interrupción salta a esta direccion y lo primero que hace es guardar los registros en la pila. ORG 0X04 NOP ;SE UTILIZA PARA EL DEPURADOR BCF AD_RUN ;BAJO LA BANDERA DE ARRANQUE MOVWF OLD_W ;GUARDO LOS REGISTROS W , SWAPF STATUS,W ;STATUS Y PCLATCH CLRF STATUS MOVWF OLD_STATUS MOVF PCLATH,W MOVWF OLD_PCLATH CLRF PCLATH PAGESEL V_INT ;SALTO A LA RUTINA DE INTERR. GOTO V_INT ;======================================================================= ;=====================CONFIGURACIONES=================================== ;======================================================================= Inicio normal. INICIO NOP BANKSEL TRISB

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 81 -

Se configuran los puertos ya sean para entrada como para salida. Tambien se configura el primer canal del conversor A/D. MOVLW B'00010001' ;CONFIGURACION DE LOS PUERTOS E/S MOVWF TRISB CLRF TRISD CLRF TRISC MOVLW B'00101111' MOVWF TRISA MOVLW B'10000010' ;CONFIGURACION DE LOS CANALES MOVWF ADCON1 MOVLW B'00000000' MOVWF TRISE BANKSEL PORTA Se configura el conversor A/D, ya sea frecuencia de reloj asi como velocidad de conversión. MOVLW B'01000001' ;CONFIGURACION DEL CONVERSOR CANAL MOVWF ADCON0 ;Y VELOCIDAD DE CONVERSION Se carga en el registro Cabezas del Dispositivo la estructura fija para poder enviar comandos. MOVLW B'10100000' ;VALORES INICIALES DE LOS REGISTROS MOVWF DEVICE_HEAD Se eliminan los contenidos de los registros una vez inicioalizados. CLRF DEVICE_CONTROL CLRF R_CONTROL CLRF HD_STATUS CLRF DIREC_L CLRF DIREC_H CLRF R_CONTROL2 CLRF OFFSET_L CLRF OFFSET_H CLRF TICS_L CLRF TICS_H CLRF T_TICS_L CLRF T_TICS_H CLRF DESP_BAR BSF Txd_pin BSF Rxd_pin Se carga la variable numero de interrupciones por representación con el valor de la constante. MOVLW low PACK_POR_REPRESENTACION ;CARGO LA VARIABLE MOVWF PACK_EVENT ;CON EL NUMERO DE ;TICS POR PORCION ;DE PROGRESS BAR Se carga en la variable canal el primer canal que se va a muestrear. MOVLW B'00000001' ;BORRA EL REGISTRO DONDE ME INDICA MOVWF CANAL ;EL CANAL QUE SE A MUESTREADO Se fuerza al micro para que el direccionamiento quede fijado en el 1 y 2 banco, y se deshabilita el decoder externo. BCF STATUS,IRP ;FUERZO A QUE EL DIRECCIONAMIENTO BCF PORTB,1 ;INDIRECTO SOLO SEA ENTRE EL BANCO 1 2 ;DISABILITO EL 74LS138 Se limpian los puertos de salida. CLRF PORTE ;LIMPIO PUERTOS CLRF PORTD

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 82 -

CLRF PORTC CLRF PORTB Se borran los latch externos. PAGESEL B_LATCHS ;CARGO LOS LATCH A 0 CALL B_LATCHS PAGESEL INICIO Se inicializa la pila software. PAGESEL INI_PILA ;INICIALITZO LA PILA SOFTWARE CALL INI_PILA PAGESEL INICIO Se restauran los valores de los registros los cuales me guardan las configuraciones de la placa asi como la información de disco. PAGESEL RESTORE ;RESTAURO LOS VALORES DE LOS CALL RESTORE ;REGISTROS PARA EL CONTROL DE LA FAT PAGESEL INICIO ;DE LA EEPROM DEL PIC Se hace una copia del valor cargado en el temporizador TMR0.Este valor se utiliza para poder-lo recargar una vez desbordado. MOVF TICS_L,W ;CARGO EL CONTADOR DE EVENTOS TMR0 MOVWF T_TICS_L ;CON EL VALOR PROGRAMADO MOVF TICS_H,W MOVWF T_TICS_H Se inicializa la LCD. PAGESEL INI_LCD ;INICIALITZO LA LCD CALL INI_LCD PAGESEL INICIO Se representa la pantalla Principal de presentacion del proyecto. PAGESEL P_PRINCI ;PRESENTO LA PANTALLA PRINCIPAL CALL P_PRINCI PAGESEL INICIO Se espera que el disco duro este listo. PAGESEL HD_LISTO ;ESPERO QUE EL HD ESTE LISTO , CALL HD_LISTO ;Y QUANDO LO ESTE LE EJECUTA UN RESET PAGESEL INICIO ;SI A PRESENTADO UN ERROR ;EN ESTA RUTINA SE MODIFICA ;LA BANDERA HD_OK Se comprueba que dispositivos estan instalados en el sistema. PAGESEL SISTEMA ;COMPRUEBO TODO EL SISTEMA Y LOS CALL SISTEMA ;RECURSOS MINIMOS SE MODIFICAN PAGESEL INICIO ;LAS BANDERAS DE EEP_OK Y RAM_OK Se evalua el sistema para que sea el correcto para poder funcionar. PAGESEL EVAL_SIS ;RUTINA QUE LO NOS HACE ES QUE A CALL EVAL_SIS ;TRAVES DE LAS BANDERAS DE LOS PAGESEL INICIO ;DISPOSITIVOS DETECTADOS NOS EVALUA ;SI EL SISTEMA ESTA LISTO PARA CONTINUAR Se configura el disco duro. PAGESEL CONFIG_HD ;CONFIGURO EL DISCO DURO , PIO MODE 0 CALL CONFIG_HD PAGESEL INICIO

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 83 -

Se lee el registro interno de estado del disco duro. PAGESEL R_HD_STATUS ;SE UTILIZA PARA COMPROBAR LA CONFIG.PIO CALL R_HD_STATUS PAGESEL INICIO Se extrae el sector de identificación del disco duro y se almacena en la memoria RAM. PAGESEL HD_IDENTI ;LEO EL SECTOR DE IDENTIFICACION CALL HD_IDENTI ;DEL HD Y LO COLOCO A PARTIR DE PAGESEL INICIO ;LA @ 0x7E00 DE LA RAM EXTERNA Se muestra por la pantalla LCD la información del disco duro. PAGESEL MUESTRA_INFO ;MUESTRO LA INFORMACION DE CIL,HEAD,SEC DEL CALL MUESTRA_INFO ;DISCO DURO Y TIPO DE DISPOSITIVO PAGESEL INICIO Se comprueba que el disco sea lo suficientemente grande para ser utilizado en el proyecto. PAGESEL CHECK_SPACE ;COMPRUEBO QUE EL TAMAÑO DE DISCO SEA CALL CHECK_SPACE ;LO SUFICIENTEMENTE GRANDE PAGESEL INICIO Se extraen el sector del directorio del disco y se almacena en la memoria RAM , tambien se extrae el sector de la FAT que se este utilizando en este momento. PAGESEL V_DIR_FAT ;VUELCO LOS SECTORES DE FAT Y DIR CALL V_DIR_FAT ;A LA RAM PAGESEL MAIN Se llama a la rutina que comprueba si el PC esta conectado a la placa. PAGESEL BUSCA_MONITOR ;RUTINA QUE BUSCA EL PROGRAMA MONITOR CALL BUSCA_MONITOR ;SI ESTA ARRANCA LA MONITORIZACION PAGESEL INICIO ;SI DESBORDA SIGUE EL AVANCE NORMAL Se compara el directorio exteido del disco con el que esta en la EEPROM para comprobar si a habia modificacion. PAGESEL COMPARA_DIR ;SI SE PERMITIO EL AUT.FORMAT PRIMERO CALL COMPARA_DIR ;SE COMPARA EL DIRECTORIO POR SI ES PAGESEL INICIO ;EL MISMO QUE LA EEPROM Se comprueba si ha retornado iguales , sino es asi se salta a la parte de formateo. MOVWF AUX ;SI SON IGUALES ME RETORNA 0 INCF AUX,F BTFSS STATUS,Z ;SI ME RETORNA 255 TENGO QUE FORMATEAR FIJO GOTO NO_FORMAT Se comprueba si el usuario a configurado el proyecto para que se pueda autoformatear. BTFSC AUT_FORMAT ;MIRO SI PERMITE QUE AUTOFORMATEE GOTO FORMATEA Si el usuario no a permitido el autoformateo lo indico por pantalla y se detiene el programa. PAGESEL BORRA_LCD ;ESCRIBO QUE NO SE PERMITE EL CALL BORRA_LCD ;FORMATEO DE PARTE DEL USUARIO MOVLW MIS34 PAGESEL FRASE3 CALL FRASE3 MOVLW 0X94 PAGESEL COMANDO

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 84 -

CALL COMANDO MOVLW MIS42 PAGESEL FRASE3 CALL FRASE3 MOVLW 0XD4 PAGESEL COMANDO CALL COMANDO MOVLW MIS43 PAGESEL FRASE3 CALL FRASE PAGESEL INICIO ;SISTEMA PARADO GOTO $-1 ;SE DEBE DE RESETEAR Si el usuario a permitido el autoformateo primero se comprueba que realmente este disponible la memoria eeprom externa , ya que es ella la que contiene la estructura FAT fija. FORMATEA NOP PAGESEL ERROR_EEPROM BTFSS EEP_OK GOTO ERROR_EEPROM ;PRESENTO POR PANTALLA EL ERROR ;Y PARO EL SISTEMA Se llama a la funcion que me formatea el disco duro. PAGESEL HD_FORMAT ;SE EJECUTARA POR AQUI SI NO ERAN CALL HD_FORMAT ;IGUALES , POS PRIMERO SE BORRA Se ejecuta una pausa de 1 segundo. PAGESEL PAUSA1SEG CALL PAUSA1SEG Se llama a la funcion que me recostruye la estructura FAT. PAGESEL RECOSTRUCT_FAT ;LUEGO SE RECONSTRUYE LA FAT CALL RECOSTRUCT_FAT Se ejecuta una pausa de 1 segundo. PAGESEL PAUSA1SEG CALL PAUSA1SEG PAGESEL INICIO Se vuelven a extraer los sectores de directorio y fat . PAGESEL V_DIR_FAT ;VUELCO LOS SECTORES DE FAT Y DIR CALL V_DIR_FAT ;A LA RAM PAGESEL MAIN Si se a comprobado que los directorios son iguales , o sea no a habido modificacion se salta a esta etiqueta. NO_FORMAT NOP Se comprueba si el usuario permite el autostanby después de 30 segundos de inactividad. BTFSS AUT_STBY ;MIRO SI SE PERMITE EL AUTO_STANBY GOTO MAIN Si es asi , se configura el disco para que haya stanby después de 30 segundos de inactividad. PAGESEL HD_STBY ;PROGRAMO EL DISCO PARA QUE PASE A STBY CALL HD_STBY ;TRAS 30 Seg. DE INACTIVIDAD PAGESEL INICIO

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 85 -

;======================================================================= ;=====================BUCLE PRINCIPAL=================================== ;======================================================================= A partir de aquí se arranca el bucle principal de programa. MAIN NOP Se configurant los registros de control , asi como del conversor A/D y las interrupciones. MOVLW B'01100000' MOVWF INTCON MOVLW B'00000110' BANKSEL OPTION_REG MOVWF OPTION_REG BANKSEL PORTB BANKSEL PIE1 BSF PIE1,ADIE ;HABILITO LA INTERRUPCION DEL A/D BCF PIE1,TMR1IE ;HABILITO LA INTERRUPCION DEL TRM1 BANKSEL PORTB CLRF PIR1 CLRF PIE2 CLRF PIR2 Se carga el temporizador TMR0 con la base de tiempo ajustada por defecto. Este temporizador proboca una interrupcion por desbordamiento asi que el valor a cargar debe de ser en complemento a 2. MOVLW low TIEMPO_BASE_TMR0 ;CARGO EL TIMER CON 217 MOVWF TMR0 ;DESBORDARA A 255 Se configura el TRM1 para que provoque interrupcion cada segundo . MOVLW 0XFF ;CONFIGURO EL TMR1 PARA MOVWF TMR1H ;UN TIEMPO DE UN SEGUNDO MOVWF TMR1L Se llama a la rutina que me muestra por la pantalla LCD el estado de los Bufferes. PAGESEL ESTADO_BUFFER CALL ESTADO_BUFFER PAGESEL MAIN Se activan las interrupciones. BSF INTCON,GIE ;HABILITO LAS INTERRUPCIONES ;===============================CONDICIONES=============================== Se comprueban las condiciones del programa. El programa puede saltar por llenado de alguno de los bufferes software o por que se a llegado al numero de packs muestreados. FIN_MAIN NOP BTFSC BUFFER1_FULL ;MIRO LAS VARIABLES DE GOTO MAIN1 ;ENTORNO PARA SABER QUE BTFSC PACK_MUESTREADO ;A PASADO GOTO MAIN2 BTFSC BUFFER2_FULL GOTO MAIN3 GOTO FIN_MAIN ;================================BARRAS==================================== Si se salta aquí es porque se a llegado al numero de muestras por representación en la progress bar, cada vez que se llama a esta rutina lo que se hace es representar por la LCD la progress bar con un evolucion de 1 cuadradito. Se paran las interrupciones. Y se mira que barra esta evolucionando. MAIN2 BCF INTCON,GIE MOVLW low P_BAR_BUF_1 ;MIRO LA BARRA QUE ESTA BTFSC BUFFER_ACTIVO ;EVOLUCIONANDO MOVLW low P_BAR_BUF_2

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 86 -

Se posiciona el cursor en el ultimo cuadrito representado. ADDWF DESP_BAR,W ;POSICIONO EL CURSOR PAGESEL COMANDO CALL COMANDO PAGESEL FIN_MAIN Se escribe un cuadrito en esta posición. MOVLW 0XFF ;ESCRIBO UN CUADRADITO PAGESEL DATO CALL DATO PAGESEL FIN_MAIN Se incrementa la variable de desplazamiento de la progress bar. INCF DESP_BAR,F ;INCREMENTO EL OFFSET DE BCF PACK_MUESTREADO ;LA BARRA Y BAJO LA BANDERA Se reactivan las interrupciones. BSF INTCON,GIE GOTO FIN_MAIN ;=============================BUFFERES==================================== ;========================== BUFFER 1 FULL ================================ Si el programa salta en esta posición de codigo quiere decir que el buffer 1 ya esta lleno y se debe de volcar al disco duro. La operación de volcado se lleva a cabo por los 5 ficheros. Se desactivan las interrupciones. MAIN1 BCF INTCON,GIE CLRF FICHERO ;INDICO QUE PRIMERO GRABO ;EL SECTOR DEL PRIMER ;FICHERO Se carga la variable relacionada con los canales a 5 , ya que es el numero de canales disponibles. MOVLW .5 ;BUCLE DE 5 CANALES MOVWF AUX2 Se apunta al principio del buffer 1. CLRF DIREC_L ;APUNTO AL BUFFER 1 DEL CLRF DIREC_H ;CANAL 1 Se calcula el sector de destino para la información del primer buffer. MAIN11 NOP PAGESEL CALC_SECTOR CALL CALC_SECTOR PAGESEl MAIN1 Se llama a la funcion que nos graba la información al disco. PAGESEL W_HD_SECTOR CALL W_HD_SECTOR PAGESEL MAIN1 Se comprueba que la accion de grabar sector no me a probocado error. Si se proboca error se salta a borrar la LCD y s representar un mensaje de error. BTFSS COM_ERR ;SI LA ACCION DE ESCRIBIR GOTO MAIN12 ;EN DISCO ME PROBOCA ERROR

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 87 -

Se borra la LCD. PAGESEL BORRA_LCD ;LO INDICO Y PARO EL SISTEMA CALL BORRA_LCD Se representa por pantalla el mensaje 24 del array de mensajes , ( mensaje de error ). MOVLW MIS24 PAGESEL FRASE2 CALL FRASE2 Se desactiva las interrupciones. BCF INTCON,GIE SLEEP Se incrementa la varible que me indica a que fichero le estoy cargando el sector. INCF FICHERO,F ;SEGUNDO FICHERO Se apunta al principio del siguiente sector. MOVF DIREC_H,W ;APUNTO AL BUFFER 1 DEL ADDLW 0X02 ;CANAL 2 Y CONSECUTIVOS MOVWF DIREC_H Se decrementa la variable que me indica el numero de ficheros. Si no llega a cero se repite el bucle. DECFSZ AUX2,F GOTO MAIN11 Se incrementa la variable que me indica el numero de sectores ocupados por cluster reservado. MAIN12 INCF N_SEC_CLUS,F ;INCREMENTO LA VARIABLE ;QUE ME INDICA EL NUMERO ;DE SECTORES LLENOS DEL ;CLUSTER ACTUAL Se incrementa la capacidad del fichero en el sector del directorio del disco. PAGESEL INC_CAPACIDAD ;INCREMENTO LA CAPACIDAD CALL INC_CAPACIDAD ;ACTUAL DEL FICHERO EN PAGESEL MAIN1 ;512 BYTES Se comprueba si el numero de sectortes ocupados ya son 64 ya que si lo son se debe de reservar otro cluster. MOVF N_SEC_CLUS,W ;CAPACIDAD DEL CLUSTER XORLW .64 ;SI A LLEGADO A 64 DEVO BTFSS STATUS,Z ;DE RESERVAR UN NUEVO GOTO MAIN13 ;CLUSTER Si se debe de reservar un nuevo cluster en la estructura FAT se llama a esta rutina. PAGESEL NUEVO_CLUSTER CALL NUEVO_CLUSTER PAGESEL MAIN1 Se almacenas los valores de nuevo en la EEPROM interna del micro para poderlos restablecer en caso de corte de alimentación o reset del sistema. MAIN13 MOVLW 0X03 ;GUARDO EL NUEVO VALOR MOVWF DIREC_L ;EN AL EEPROM INTERNA MOVF N_SEC_CLUS,W MOVWF DAT PAGESEL W_MEM_IN CALL W_MEM_IN PAGESEL MAIN1

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 88 -

Se baja la bandera de que el buffer 1 estaba lleno, y se borra el contenido de la variable de desplazamiento de la progress bar. BCF BUFFER1_FULL ;BAJO LA BANDERA DE FULL CLRF DESP_BAR ;VACIO LA PROGRESS BAR ;DEL BUFFER Se apunta al principio de la 4 linea de la LCD. MOVLW 0XC0 PAGESEL COMANDO CALL COMANDO PAGESEL MAIN1 Se representa el mensaje 23 del array que es la progress bar. MOVLW MIS23 PAGESEL FRASE2 CALL FRASE2 PAGESEL MAIN1 Se elimina el contenido de la variable fichero. CLRF FICHERO ;RESETEO LA VARIABLE QUE ;ME INDICA EL FICHERO Se reactivan las interrupciones. BSF INTCON,GIE GOTO FIN_MAIN ;========================== BUFFER 2 FULL ================================ Se salta a esta liena de codigo si se a detectado que el segundo buffer esta lleno. Esta rutina actua de la misma manera que la del buffer 1 pero sumando un offset complementario al principio de 0x200 ya que es el desplazamiento de 512 bytes correspondientes al primer buffer. MAIN3 BCF INTCON,GIE ;AL LLENARSE EL 2 BUFFER CLRF OFFSET_L ;PRIMERO RESETEO EL CLRF OFFSET_H ;OFFSET DE LA RAM CLRF DIREC_L ;APUNTO AL BUFFER 2 DEL MOVLW 0X02 ;CANAL 1 MOVWF DIREC_H MOVLW .5 ;BUCLE DE 5 CANALES MOVWF AUX2 MAIN31 NOP PAGESEL CALC_SECTOR CALL CALC_SECTOR PAGESEl MAIN3 PAGESEL W_HD_SECTOR CALL W_HD_SECTOR PAGESEL MAIN3 BTFSS COM_ERR ;SI LA ACCION DE ESCRIBIR GOTO MAIN32 ;EN DISCO ME PROBOCA ERROR PAGESEL BORRA_LCD ;LO INDICO Y PARO EL SISTEMA CALL BORRA_LCD MOVLW MIS24 PAGESEL FRASE2 CALL FRASE2 BCF INTCON,GIE SLEEP MAIN32 INCF FICHERO,F ;SEGUNDO FICHERO

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 89 -

MOVF DIREC_H,W ;APUNTO AL BUFFER 2 DEL ADDLW 0X02 ;CANAL 2 Y CONSECUTIVOS MOVWF DIREC_H DECFSZ AUX2,F GOTO MAIN31 INCF N_SEC_CLUS,F ;INCREMENTO LA VARIABLE ;QUE ME INDICA EL NUMERO ;DE SECTORES LLENOS DEL ;CLUSTER ACTUAL PAGESEL INC_CAPACIDAD ;INCREMENTO LA CAPACIDAD CALL INC_CAPACIDAD ;ACTUAL DEL FICHERO EN PAGESEL MAIN3 ;512 BYTES MOVF N_SEC_CLUS,W ;CAPACIDAD DEL CLUSTER XORLW .64 ;SI A LLEGADO A 64 DEVO BTFSS STATUS,Z ;DE RESERVAR UN NUEVO GOTO MAIN33 ;CLUSTER PAGESEL NUEVO_CLUSTER CALL NUEVO_CLUSTER PAGESEL MAIN3 MAIN33 MOVLW 0X03 ;GUARDO EL NUEVO VALOR MOVWF DIREC_L ;EN AL EEPROM INTERNA MOVF N_SEC_CLUS,W MOVWF DAT PAGESEL W_MEM_IN CALL W_MEM_IN PAGESEL MAIN3 BCF BUFFER2_FULL ;BAJO LA BANDERA DE FULL BCF BUFFER_ACTIVO ;BUFFER ACTIVO 1 CLRF DESP_BAR ;RESET PROGRESSBAR MOVLW 0XD4 ;BORRO LO PROGRESS BAR PAGESEL COMANDO CALL COMANDO PAGESEL MAIN3 MOVLW MIS23 PAGESEL FRASE2 CALL FRASE2 PAGESEL MAIN3 CLRF FICHERO ;RESETEO LA VARIABLE ;QUE ME INDICA EL FILE BSF INTCON,GIE GOTO FIN_MAIN ;======================================================================= ;=====================FIN PROGRAMA PRINCIPAL============================ ;======================================================================= ;======================================================================= ;=====================VECTOR DE INTERRUPCION============================ ;======================================================================= Se salta a esta lineas de codigo cada vez que se proboca una interrupcion , el primer paso es salvar los registros en pila y a continuación comprobar que dispositivo interno a probocado dicha interrupcion. V_INT NOP PAGESEL SALVA_INT CALL SALVA_INT PAGESEL V_INT BTFSC PIR1,ADIF ;MIRO SI LA A PROVOCADO EL A/D GOTO CONVERSOR BTFSC INTCON,T0IF ;MIRO SI LA A PROVOCADO EL TIMER GOTO TIMER

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 90 -

BTFSC PIR1,TMR1IF ;MIRO SI LO A PROBOCADO EL TIMER1 GOTO TIMER1 GOTO FIN_INT ; == INTERRUPCION DE SERVICIO AL CONVERSOR A/D == Interrupcion probocada por el conversor A/D. Se associa una rutina para cada canal. CONVERSOR NOP Se baja la bandera de interrupcion probocada por el A/D. BCF PIR1,ADIF ;BAJO LA BANDERA Se comprueba si el canal convertido es el 0. Sino se salta al siguiente canal. BTFSS CANAL0 ;MIRO SI SE A ESCANEADO EL CANAL 0 GOTO CONVERSOR1 Se apunta a la direccion de memoria reservada para el primer canal. Y se le suma el offset para posicionar bien el puntero en la RAM. ;INSTRUCCIONS ASOCIADES AL CANAL0 MOVLW high FILE1 ;CALCULO LA POSICION RELATIVA EN RAM MOVWF DIREC_H CLRF DIREC_L MOVF OFFSET_H,W ADDWF DIREC_H,F MOVF OFFSET_L,W ADDWF DIREC_L,F Se desplaza el bit que me indica el canal que ya e muetreado. Y se configura el A/D para el proximo canal a muestrear. RLF CANAL,F ;INCREMENTO EL CANAL MUESTREADO MOVLW B'11001001' ;CONFIGURO EL A/D PARA EL CANAL 1 MOVWF ADCON0 GOTO GUARDA_FIN Todas las rutinas actuan de la misma forma. CONVERSOR1 BTFSS CANAL1 GOTO CONVERSOR2 ;INSTRUCCIONS ASOCIADES AL CANAL1 MOVLW high FILE2 ;CALCULO LA POSICION RELATIVA EN RAM MOVWF DIREC_H CLRF DIREC_L MOVF OFFSET_H,W ADDWF DIREC_H,F MOVF OFFSET_L,W ADDWF DIREC_L,F RLF CANAL,F ;INCREMENTO EL CANAL MUESTREADO MOVLW B'11010001' ;CONFIGURO EL A/D PARA EL CANAL 2 MOVWF ADCON0 GOTO GUARDA_FIN CONVERSOR2 BTFSS CANAL2 GOTO CONVERSOR3 ;INSTRUCCIONS ASOCIADES AL CANAL2 MOVLW high FILE3 ;CALCULO LA POSICION RELATIVA EN RAM MOVWF DIREC_H CLRF DIREC_L MOVF OFFSET_H,W ADDWF DIREC_H,F MOVF OFFSET_L,W ADDWF DIREC_L,F RLF CANAL,F ;INCREMENTO EL CANAL MUESTREADO MOVLW B'11011001' ;CONFIGURO EL A/D PARA EL CANAL 3 MOVWF ADCON0

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 91 -

GOTO GUARDA_FIN CONVERSOR3 BTFSS CANAL3 GOTO CONVERSOR4 ;INSTRUCCIONS ASOCIADES AL CANAL4 MOVLW high FILE4 ;CALCULO LA POSICION RELATIVA EN RAM MOVWF DIREC_H CLRF DIREC_L MOVF OFFSET_H,W ADDWF DIREC_H,F MOVF OFFSET_L,W ADDWF DIREC_L,F RLF CANAL,F ;INCREMENTO EL CANAL MUESTREADO MOVLW B'11100001' ;CONFIGURO EL A/D PARA EL CANAL 4 MOVWF ADCON0 GOTO GUARDA_FIN CONVERSOR4 MOVLW 0X01 ;INSTRUCCIONS ASOCIADES AL CANAL4 MOVWF CANAL ;COLOCO COMO QUE EL PROXIMO CANAL ;QUE SE ESCANEARA SERA EL 1 MOVLW high FILE5 ;CALCULO LA POSICION RELATIVA EN RAM MOVWF DIREC_H CLRF DIREC_L MOVF OFFSET_H,W ADDWF DIREC_H,F MOVF OFFSET_L,W ADDWF DIREC_L,F MOVLW B'11000001' ;CONFIGURO EL A/D PARA EL CANAL 0 MOVWF ADCON0 MOVLW 0X02 ;INCREMENTO EL OFFSET EN 2 POSICIONES ADDWF OFFSET_L,F ;SOLO CUANDO SE HAN MUESTREADO LOS BTFSC STATUS,C ;5 CANALES INCF OFFSET_H,F Se descuenta el numero de muestreos de canal.

DECF PACK_EVENT,F ;DESCUENTO EL NUMERO DE PAQUETES DE BTFSS STATUS,Z ;CANALES MUESTREADOS GOTO NO_PACK_EVENT Se recarga el contador de packs por representacion y se levanta la bandera que indica que se debe de representar yn cuadradito en la progress bar. MOVLW low PACK_POR_REPRESENTACION MOVWF PACK_EVENT BSF PACK_MUESTREADO Se comprueba si se a llenado algunos de los bufferes , ya sea el buffer 1 o el buffer 2. Si se a llenado alguno de los bufferes se levantala bandera del buffer que se a llenado y se activa la bandera del buffer activo. NO_PACK_EVENT MOVF OFFSET_L,W ;COMPRUEBO SI A LLEGADO A LLENARSE BTFSS STATUS,Z ;EL BUFFER 1 GOTO NO_BUFFER_1 ;DIRECCION 0X0200 MOVLW 0X02 XORWF OFFSET_H,W BTFSS STATUS,Z GOTO NO_BUFFER_1 BSF BUFFER1_FULL BSF BUFFER_ACTIVO ;CAMBIO DE BUFFER NO_BUFFER_1 MOVF OFFSET_L,W ;COMPRUEBO SI A LLEGADO A LLENARSE BTFSS STATUS,Z ;EL BUFFER 2 GOTO GUARDA_FIN ;DIRECCION 0X03FF MOVLW 0X04 XORWF OFFSET_H,W

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 92 -

BTFSC STATUS,Z BSF BUFFER2_FULL ;========================================================================== Una vez calculados los valores de los apuntadores a la RAM , se almacena el contenido del conversor A/D en su correcta posicion. GUARDA_FIN NOP BANKSEL ADRESL MOVF ADRESL,W ;GUARDO LA PARTE BAJA EN RAM BANKSEL DAT MOVWF DAT PAGESEL W_MEM_EX CALL W_MEM_EX INCF DIREC_L,F ;INCREMENTO LA DIRECCION DE LA RAM BTFSC STATUS,Z INCF DIREC_H,F MOVF ADRESH,W ;GUARDO LA PARTE ALTA EN RAM MOVWF DAT PAGESEL W_MEM_EX CALL W_MEM_EX PAGESEL V_INT GOTO FIN_INT ; == INTERRUPCION DE SERVICIO AL TIMER0 == Se interrupcion procada por el Timer 0 , base de tiempo para el muestreo de los canales. Se baja la bandera que indica que dispositivo a probocado la interrupcion. TIMER BCF INTCON,T0IF Se recarga el temporizador con la base de tiempos por defecto. MOVLW low TIEMPO_BASE_TMR0 ;RECARGO EL TIMER MOVWF TMR0 Se decrementa la variable de 16 bits que me indica el numero de tics a realizar por interrupcion. DECFSZ T_TICS_L,F ;DECREMENTO EL CONTADOR GOTO FIN_INT ;DE TICS DE RELOJ PRINCIPAL MOVF T_TICS_H,W BTFSC STATUS,Z GOTO ARRANCA DECF T_TICS_H,F GOTO FIN_INT Si se a llegado al numero de tics realizados por conversión primero se recarga el contador de tics y a continuación se arranca el conversor A/D. ARRANCA MOVF TICS_H,W ;RECARGO EL CONTADOR DE TICS MOVWF T_TICS_H MOVF TICS_L,W MOVWF T_TICS_L BSF AD_RUN ;SI ES CERO LEVANTO LA BANDERA ;DE INICIO DE CONVERSION GOTO FIN_INT ; == INTERRUPCION DE SERVICIO AL TIMER1 == Interrupcion probocada por el Timer 1 , este timer esta dedicado al Timer Out de la UART programada para la comunicación con el PC. TIMER1 BCF T1CON,TMR1ON BCF PIR1,TMR1IF BSF DESBORDAMIENTO ; == FIN DE LA INTERRUPCION ===

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 93 -

Al finalizar la interrupcion se restauran los valores en los registros anteriormente almacenados en pila. FIN_INT NOP PAGESEL RESTAURA_INT CALL RESTAURA_INT MOVF OLD_PCLATH,W ;RESTAURO LOS REGISTROS MOVWF PCLATH ;STATUS , W , PCLATCH SWAPF OLD_STATUS,W MOVWF STATUS SWAPF OLD_W,F SWAPF OLD_W,W BTFSC AD_RUN ;SI LA BANDERA ESTA LEVANTADA BSF ADCON0,GO ;ARRANCO EL CONVERSOR AD BCF AD_RUN ;BAJO LA BANDERA RETFIE ;======================================================================= ;===================FIN VECTOR DE INTERRUPCION========================== ;======================================================================= Al final del vector de interrupcion del micro se carga las rutinas de la RS232 y de la FAT 16. #INCLUDE <RS232.INC> #INCLUDE <FAT16.INC> ;======================================================================= ; MENSAJES PARA LA LCD Y RS232 SE COLOCAN EN LA 1 PAGINA DEL CODIGO ;=======================================================================

A partir de esta posición de memoria se carga las frases que el micro debera representar por la LCD.

Estas rutinas representan las frases por la LCD en modo de apuntador , de tal forma que para representar

un frase lo primero que se debe de hacer es , cargar en el registro la etiqueta que representa la frase ( Ex.

MIS23 ) , a continuación llamar la rutina que se encarga de escribir por la LCD el rago de mensajes

relacionados ( Ex. FRASE 2 ) , estas rutinas lo que hacen es ir escribiendo el contenidos de las siguientes

posiciones de memoria hasta encontrar un 0x00.

ORG 0X0800 FRASE MOVWF AUX1 MOVLW 0X08 MOVWF PCLATH CONTINUA MOVF AUX1,W CALL REPRE XORLW 0X00 ;ES PER DETECTAR EL FI DE CADENA BTFSC STATUS,Z RETURN PAGESEL DATO CALL DATO PAGESEL FRASE INCF AUX1,F GOTO CONTINUA EXIT NOP PAGESEL INICIO RETURN REPRE MOVWF PCL MIS1 EQU $ DT 0X22,"PFC",0x22," Oriol Monclus",0x00 MIS2 EQU $ DT "Unidad de Muestreo",0x00 MIS3 EQU $ DT "y Almacenamiento",0X00 MIS4 EQU $ DT "Masivo 2004",0X00

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 94 -

MIS5 EQU $ DT "Inicializando RAM :",0X00 MIS6 EQU $ DT "CPU: PIC16F877 20Mhz",0X00 MIS7 EQU $ DT "RAM: 32Kb SRAM... ",0X00 MIS8 EQU $ DT "EEPROM: 32Kb .... ",0X00 MIS9 EQU $ DT "OK",0X00 MIS10 EQU $ DT "KO",0X00 MIS11 EQU $ DT "NONE",0X00 MIS12 EQU $ DT "HD: ",0X00 MIS13 EQU $ DT "Estabilizando Discos",0X00 MIS14 EQU $ DT "Ejecutando Reset...",0X00 MIS15 EQU $ DT "DETECTADO",0X00 MIS16 EQU $ DT "ERROR !!",0X00 FRASE2 MOVWF AUX1 MOVLW 0X09 ;POSO EL PCLATH A 255 BITS MES ;ENDEVANT MOVWF PCLATH CONTINUA2 MOVF AUX1,W CALL REPRE2 XORLW 0X00 ;ES PER DETECTAR EL FI DE CADENA BTFSC STATUS,Z RETURN PAGESEL DATO CALL DATO PAGESEL FRASE2 INCF AUX1,F GOTO CONTINUA2 REPRE2 MOVWF PCL MIS17 EQU $ DT "PILA FUERA DE RANGO",0X00 MIS18 EQU $ DT "TIPO:",0X00 MIS19 EQU $ DT "CILINDROS:",0X00 MIS20 EQU $ DT "CABEZAS :",0X00 MIS21 EQU $ DT "SECTORES :",0X00 MIS22 EQU $ DT "Formateando Disco:",0X00 MIS23 EQU $ DT " 0% ---------- 100% ",0X00 MIS24 EQU $ DT "Fallo R/W Sector",0X00 MIS25 EQU $ DT "FORMATO",0X00 MIS26 EQU $ DT "COMPLETADO !!!!",0X00 MIS27 EQU $ DT "HD NO DETECTADO",0X00 MIS28 EQU $ DT "RAM NO DETECTADA",0X00 MIS29 EQU $ DT "Datos en BUFFER ",0X00 MIS30 EQU $ DT "Ocupado en DISCO",0X00 MIS31 EQU $ DT "Muestreo: ",0X00 MIS32 EQU $ DT "Particionando Disco:",0x00

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 95 -

FRASE3 MOVWF AUX1 MOVLW 0X0A ;POSO EL PCLATH A 255 BITS MES ;ENDEVANT MOVWF PCLATH CONTINUA3 MOVF AUX1,W CALL REPRE3 XORLW 0X00 ;ES PER DETECTAR EL FI DE CADENA BTFSC STATUS,Z RETURN PAGESEL DATO CALL DATO PAGESEL FRASE3 INCF AUX1,F GOTO CONTINUA3 REPRE3 MOVWF PCL MIS33 EQU $ DT "SISTEMA ARCHI. FAT16",0X00 MIS34 EQU $ DT "IMPOSSIBLE FORMATEAR",0X00 MIS35 EQU $ DT "NO SE DETECTO MEM.",0X00 MIS36 EQU $ DT "EEPROM, RESET EN ",0X00 MIS37 EQU $ DT "MODO MONITOR",0X00 MIS38 EQU $ DT "INSUFICIENTE ESPACIO",0X00 MIS39 EQU $ DT "EN DISCO",0X00 MIS40 EQU $ DT "ESPACIO REQUERIDO",0X00 MIS41 EQU $ DT "INSUFICIENTE",0X00 MIS42 EQU $ DT "NO PERMITIDO POR EL",0X00 MIS43 EQU $ DT "USUARIO",0X00 MIS44 EQU $ DT "MONITOR ?????",0X00 MIS45 EQU $ DT "DESCONECTADO !!",0X00 MIS46 EQU $ DT "RUN :",0X00 #INCLUDE <PANTALLA.INC> ;=========================================================================== ;=========================================================================== ; INCLUDES ESPECIFICOS--> SE COLOCAN EN LA 2 Y 3 PAGINA DEL CODIGO <-- ;=========================================================================== ;=========================================================================== A partir de esta posición de memoria del micro se colocan los includes creados para el manejo de la placa. ORG 0X1000 #INCLUDE <LCD.INC> #INCLUDE <DELAY.INC> #INCLUDE <ENABLES.INC> #INCLUDE <MEMORIAS.INC> #INCLUDE <SISTEM.INC> #INCLUDE <DISCO.INC> #INCLUDE <PILA.INC> #INCLUDE <LATCHES.INC> #INCLUDE <MATES.INC> #INCLUDE <MONITOR.INC>

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 96 -

;======================================================================= ; RUTINA PARA COMPROBAR SI EL PC ESTA CONECTADO A LA PLACA ; PARA PODER FUNCIONAR SE REQUIERE EL FUNCIONAMIENTO EN EL PC ; DEL PROGRAMA MONITOR ;=======================================================================

Esta rutina nos sirve para comprobar si el PC esta conectado a la placa y el programa monitor esta

corriendo en el. Si es asi salta a la rutina en modo monitor.

BUSCA_MONITOR NOP Se borra el contenido de la LCD. PAGESEL BORRA_LCD CALL BORRA_LCD Se representa el mensaje 44 del array de mensajes. MOVLW MIS44 PAGESEL FRASE3 CALL FRASE3 Se transmite por el puerto serie un 0xAA. MOVLW 0XAA MOVWF Txdreg PAGESEL TxD ;ENVIO EL CARACTER DE BUSQUEDA CALL TxD PAGESEL BUSCA_MONITOR Se ejecuta una pausa de 1 Segundo. PAGESEL PAUSA1SEG CALL PAUSA1SEG PAGESEL BUSCA_MONITOR Se transmite de nuevo un 0xAA. MOVLW 0XAA MOVWF Txdreg PAGESEL TxD ;ENVIO EL CARACTER DE BUSQUEDA CALL TxD PAGESEL BUSCA_MONITOR Se carga el TMR1 para que generer overflow en aproximadamente 1 Segundo. CLRF TMR1H MOVLW 0X01 MOVWF TMR1L BSF T1CON,TMR1ON BCF PIR1,TMR1IF Se espera la recepcion del carácter de confirmacion de programa monitor conectado. PAGESEL RxD ;ESPERO LA RECEPCION DE LA CALL RxD ;CONFIRMACION PAGESEL BUSCA_MONITOR Se comprueba si a salido de la rutina de espera a la recepcion por desbordamiento del TMR1. Si es asi

que entiende que el PC no estaba conectado y se debe de arrancar de manera automatica.

BTFSC PIR1,TMR1IF ;MIRO SI A DESBORDADO GOTO NO_ENCONTRADO

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 97 -

Si no a desbordado se mira si el carácter recibido es el 0xBB , carácter de confirmacion. Si es asi se salta a la etiqueta RUN_MONITOR. MOVF Rxdreg,W ;SI NO A DESBORDADO MIRO SI XORLW 0XBB ;EL CARACTER RECIBIDO VALIDO BTFSS STATUS,Z GOTO NO_ENCONTRADO GOTO RUN_MONITOR Si no se a conectado en modo monitor se representa por pantalla el mensaje 45 queme indica que el PC no estaba conectado. NO_ENCONTRADO MOVLW 0XC0 PAGESEL COMANDO CALL COMANDO MOVLW MIS45 PAGESEL FRASE3 CALL FRASE3 PAGESEL BUSCA_MONITOR RETURN Siu el PC estaba conectado se salta a esta linea de codigo que a su vez salta a la rutina de modo monitor. RUN_MONITOR NOP PAGESEL MODO_MONITOR GOTO MODO_MONITOR ;======================================================================= ; RUTINA PARA EL FUNCIONAMIENTO EN MODO MONITOR ;======================================================================= Rutina para el funcionamiento en modo monitor. MODO_MONITOR NOP Se borra el contenido de la LCD. PAGESEL BORRA_LCD CALL BORRA_LCD Se representa el mensaje 46 del array de mensajes. MOVLW MIS46 PAGESEL FRASE3 CALL FRASE3 Se salta a una linea intermedia de la LCD. MOVLW 0XC0 PAGESEL COMANDO CALL COMANDO Se representa el mensaje 37 del array de mensajes. MOVLW MIS37 PAGESEL FRASE3 CALL FRASE3 PAGESEL MODO_MONITOR Se deshabilita el temporizador de timerout para la recepcion serie. BCF T1CON,TMR1ON ;ESPERO UN COMANDO DEL BCF PIR1,TMR1IF ;USUARIO ( RECIVIR ) Se espera a recibir un comando de 8 bits. PAGESEL RxD CALL RxD PAGESEL MODO_MONITOR

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 98 -

Se escanea el comando para comprobar cual es y se salta a su respectiva etiqueta. MOVF Rxdreg,W XORLW 0X01 BTFSC STATUS,Z GOTO PETICION_ESTADO MOVF Rxdreg,W XORLW 0X02 BTFSC STATUS,Z GOTO PETICION_FORMATEO MOVF Rxdreg,W XORLW 0X03 BTFSC STATUS,Z GOTO VALORES_TENSION MOVF Rxdreg,W XORLW 0X04 BTFSC STATUS,Z GOTO CPU_RESET MOVF Rxdreg,W XORLW 0X05 BTFSC STATUS,Z GOTO VUELCA_SECTOR MOVF Rxdreg,W XORLW 0X06 BTFSC STATUS,Z GOTO VUELCA_RAM MOVF Rxdreg,W XORLW 0X07 BTFSC STATUS,Z GOTO CARGA_FAT MOVF Rxdreg,W XORLW 0X08 BTFSC STATUS,Z GOTO HD_OFF MOVF Rxdreg,W XORLW 0X09 BTFSC STATUS,Z GOTO RECONFIGURA GOTO MODO_MONITOR Rutina para la petición de estado del sistema. PETICION_ESTADO Se envia el registro de control 1. MOVF R_CONTROL,W ;ENVIO EL REGISTRO DE CONTROL 1 MOVWF Txdreg PAGESEL TxD CALL TxD NOP Se envia el registro de control 2. MOVF R_CONTROL2,W ;ENVIO EL REGISTRO DE CONTROL 2 MOVWF Txdreg PAGESEL TxD CALL TxD NOP Se envia el tamaño de fichero , en total son 4 bytes consecutivos. MOVF CF0,W ;ENVIO EL 1 BYTE DEL TAMAÑO DE FICHERO MOVWF Txdreg PAGESEL TxD CALL TxD NOP MOVF CF1,W ;ENVIO EL 2 BYTE DEL TAMAÑO DE FICHERO MOVWF Txdreg

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 99 -

PAGESEL TxD CALL TxD NOP MOVF CF2,W ;ENVIO EL 3 BYTE DEL TAMAÑO DE FICHERO MOVWF Txdreg PAGESEL TxD CALL TxD NOP MOVF CF3,W ;ENVIO EL 4 BYTE DEL TAMAÑO DE FICHERO MOVWF Txdreg PAGESEL TxD CALL TxD NOP Se envia el numero de clusteres ocupados en total 2 bytes. MOVF N_CLUS_H,W ;ENVIO LOS CLUSTERS ALTOS USADOS MOVWF Txdreg PAGESEL TxD CALL TxD NOP MOVF N_CLUS_L,W ;ENVIO LOS CLUSTERS BAJOS USADOS MOVWF Txdreg PAGESEL TxD CALL TxD NOP Se envia el numero de sectores ocupados por cluster. MOVF N_SEC_CLUS,W ;ENVIO LOS SECTORES USADOS MOVWF Txdreg PAGESEL TxD CALL TxD Se envia el numero de tics por conversión del A/D , en total 2 bytes. MOVF TICS_H,W ;ENVIO LA PARTE ALTA DE LOS TICS POR MOVWF Txdreg ;MUESTREO PAGESEL TxD CALL TxD MOVF TICS_L,W ;ENVIO LA PARTE BAJA DE LOS TICS POR MOVWF Txdreg ;POR MUESTREO PAGESEL TxD CALL TxD PAGESEL MODO_MONITOR GOTO MODO_MONITOR Se salta aquí para el comando de petición de formateo. PETICION_FORMATEO Se envia la confirmacion de el comando recibido. MOVLW 0X20 ;ENVIO LA CONFIRMACION DE COMANDO MOVWF Txdreg ;RECIVIDO PAGESEL TxD CALL TxD Se llama a la rutina de formateo de disco. PAGESEL HD_FORMAT CALL HD_FORMAT NOP

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 100 -

Se genera una pausa de 1 Segundo. PAGESEL PAUSA1SEG CALL PAUSA1SEG Se envia el carácter de fin de borrado del disco. MOVLW 0X21 ;ENVIO LA CONFIRMACION DE COMANDO MOVWF Txdreg ;ACABADO Y INICIO DE LA PARTICION PAGESEL TxD CALL TxD Se llama a la rutina que me recostruye la estructura FAT 16. PAGESEL RECOSTRUCT_FAT ;LUEGO SE RECONSTRUYE LA FAT CALL RECOSTRUCT_FAT Se envia el carater de fin de recostruccion. MOVLW 0X22 ;ENVIO FIN DE RUTINA MOVWF Txdreg PAGESEL TxD CALL TxD Se genera una pausa de 1 Segundo. PAGESEL PAUSA1SEG CALL PAUSA1SEG PAGESEL MODO_MONITOR GOTO MODO_MONITOR Se salta esta linea de codigo para el comando de valores de tension de las entradas. VALORES_TENSION Se configura el A/D para el primer canal y se arranca ( con la interrupciones paradas ).

NOP

BCF INTCON,GIE BSF ADCON0,GO BTFSC ADCON0,GO GOTO $-1 Se configura para el siguiente canal. MOVLW B'01001001' Se envia el byte alto de la conversión. MOVWF ADCON0 MOVF ADRESH,W MOVWF Txdreg PAGESEL TxD CALL TxD PAGESEL VALORES_TENSION BANKSEL ADRESL Se envia el byte bajo de la conversión. MOVF ADRESL,W BANKSEL PORTB MOVWF Txdreg PAGESEL TxD CALL TxD PAGESEL VALORES_TENSION

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 101 -

Se repite análogamente los mismos pasos para los diferentes canales. BSF ADCON0,GO BTFSC ADCON0,GO GOTO $-1 MOVLW B'01010001' MOVWF ADCON0 MOVF ADRESH,W MOVWF Txdreg PAGESEL TxD CALL TxD PAGESEL VALORES_TENSION BANKSEL ADRESL MOVF ADRESL,W BANKSEL PORTB MOVWF Txdreg PAGESEL TxD CALL TxD PAGESEL VALORES_TENSION BSF ADCON0,GO BTFSC ADCON0,GO GOTO $-1 MOVLW B'01011001' MOVWF ADCON0 MOVF ADRESH,W MOVWF Txdreg PAGESEL TxD CALL TxD PAGESEL VALORES_TENSION BANKSEL ADRESL MOVF ADRESL,W BANKSEL PORTB MOVWF Txdreg PAGESEL TxD CALL TxD PAGESEL VALORES_TENSION BSF ADCON0,GO BTFSC ADCON0,GO GOTO $-1 MOVLW B'01100001' MOVWF ADCON0 MOVF ADRESH,W MOVWF Txdreg PAGESEL TxD CALL TxD PAGESEL VALORES_TENSION BANKSEL ADRESL MOVF ADRESL,W BANKSEL PORTB MOVWF Txdreg PAGESEL TxD CALL TxD PAGESEL VALORES_TENSION BSF ADCON0,GO BTFSC ADCON0,GO GOTO $-1 MOVLW B'01000001' MOVWF ADCON0 MOVF ADRESH,W MOVWF Txdreg PAGESEL TxD CALL TxD PAGESEL VALORES_TENSION BANKSEL ADRESL MOVF ADRESL,W BANKSEL PORTB MOVWF Txdreg PAGESEL TxD CALL TxD PAGESEL MODO_MONITOR GOTO MODO_MONITOR

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 102 -

Se salta a esta linea de codigo cuando se quiere hacer un reset por software. CPU_RESET NOP PAGESEL INICIO GOTO INICIO Se salta a esta linea de codigo cuando se quiere volcar un sector por el puerto serie. VUELCA_SECTOR NOP PAGESEL V_SECTOR CALL V_SECTOR PAGESEL MODO_MONITOR GOTO MODO_MONITOR Se salta a esta linea cuando se quiere volcar un sector de la RAM por el puerto serie. VUELCA_RAM NOP PAGESEL V_RAM CALL V_RAM PAGESEL MODO_MONITOR GOTO MODO_MONITOR Se salta a esta linea de codigo cuando se quiere cargar el sector generico de FAT en la EEPROM. CARGA_FAT NOP PAGESEL C_FAT_EEPROM CALL C_FAT_EEPROM PAGESEL MODO_MONITOR GOTO MODO_MONITOR Se salta a esta linea de codigo cuando se quiere forzar a detener el Disco Duro. HD_OFF NOP PAGESEL HD_STBY CALL HD_STBY PAGESEL MODO_MONITOR GOTO MODO_MONITOR Se salta a esta linea de codigo cuando se quiere reconfigurar la placa. Se deshabilita el temporizador de timerout para el timer 1 RECONFIGURA BCF T1CON,TMR1ON ;ESPERO UN DATO DEL BCF PIR1,TMR1IF ;USUARIO ( RECIVIR ) Se espera a recibir el byte que subtituye el registro de control 2. PAGESEL RxD CALL RxD MOVF Rxdreg,W ANDLW B'00100100' MOVWF Rxdreg MOVLW B'11011011' ANDWF R_CONTROL2,F MOVF Rxdreg,W IORWF R_CONTROL2,F Se espera a recibir el nuevo valor de tics por conversión de A/D. PAGESEL RxD ;ESPERO A RECIVIR LA CALL RxD ;PARTE ALTA DE TICS MOVF Rxdreg,W MOVWF TICS_H PAGESEL RxD ;ESPERO A RECIBIR LA CALL RxD ;PARTE BAJA DE TICS MOVF Txdreg,W MOVWF TICS_L

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 103 -

Se salva los registros en la EEPROM interna del micro. PAGESEL BACKUP ;GUARDO EL CONTENIDO DE CALL BACKUP ;CONTROL A LA EEPROM PAGESEL MODO_MONITOR GOTO MODO_MONITOR ;======================================================================= ;=============================FIN====================================== ;======================================================================= ;======================================================================= ;======================MEMORIA EEPROM DEL PIC=========================== ;======================================================================= En esta posición de memoria esta el contenido por defecto de la EEPROM interna del micro , este contenido solo se grabara la primera vez y cada vez que se regrabe el micro. ORG 0X2100 DATA 0X24 ;REGISTRO DE CONTROL 2 DATA 0X00 ;N_CLUS_H DATA 0X00 ;N_CLUS_L DATA 0X00 ;N_SEC_CLUS DATA 0X00 ;N_SEC_FAT DATA 0X00 ;TICS_H DATA 0X14 ;TICS_L DATA 0X00 DATA 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00 DATA 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00 DATA 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00 DATA 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00 END

7.1.2. DELAY.inc ;======================================================================; ; RUTINAS PARA LA EJECUCION DE PAUSAS ; ;======================================================================; ; Oriol Monclus Sanchez 29 / 5 / 2004 ;======================================================================; ; PAUSA [[255+1]=255]+1 CICLOS DE INSTRUCCION = 13mS ; ; PAUSA1SEG = 1 SEGONS APROXIMADAMENT ; ;======================================================================; Esta rutina genera un bucle de pausa de 1 segundo si llamamos als bucle a través de la etiqueta PAUSA1SEG y de 250 mS si la llamamos a través de la etiqueta PAUSA. PAUSA1SEG MOVLW .4 ;SA DE POSAR A 40 MOVWF V_PAUSA2 ;AMB EL RELLOTGE DE 20 Mhz GOTO $+3 PAUSA MOVLW .1 MOVWF V_PAUSA2 MOVLW 0XFF MOVWF V_PAUSA MOVWF V_PAUSA1 DECFSZ V_PAUSA,F GOTO $-1 DECFSZ V_PAUSA1,F GOTO $-3 DECFSZ V_PAUSA2,F GOTO $-5 RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 104 -

7.1.3. DISCO.inc Esta función lo que nos hace es leer el registro de estado del disco duro , como el disco posee 2 registros de estado , se puede llamar a la rutina R_HD_STATUS_ALT para leer el registro alternativo o R_HD_STATUS para leer el principal. R_HD_STATUS_ALT

BSF HD_LED CLRF HD_STATUS Se llama a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro. PAGESEL SALVA CALL SALVA PAGESEL R_HD_STATUS Se modifican los puertos , los pongo en salida ya que en primer momento debo de modificar los registros específicos del disco duro para poder acceder a leer el registro de estado. BANKSEL TRISD CLRF TRISD CLRF TRISC BANKSEL PORTD Se carga en el decodificador el valor necesario para que me apunte al lach del disco duro. MOVLW 0X07 MOVWF PORTE Se pone en la entrada del lach el valor necesario para que me apunte al registro interno de estado del disco duro. En este caso al registro de estado alternativo. MOVLW B'01110000' MOVWF PORTD Se llama a la rutina que me generara un pulso al lach externo del disco duro con el fin de congelar el valor introducido anteriormente PAGESEL HD_LE CALL HD_LE PAGESEL R_HD_STATUS Se pone en el decodificador que apunte a la línea de IO_R del disco duro. MOVLW 0X01 MOVWF PORTE CLRF PORTD Se modifican los puertos para que sean de entrada ya que deberé de leer el registro de estado. BANKSEL TRISD MOVLW 0XFF MOVWF TRISD BANKSEL PORTD Se genera un flanco de subida en la línea del decodificador la cual se propagara a la línea de IO_R del diso duro , una vez la señal este a 1 , se debe de mover el contenido del bus de datos a su correspondiente registro , en este caso HD_STATUS. BSF PORTB,1 NOP NOP NOP MOVF PORTD,W MOVWF HD_STATUS BCF PORTB,1

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 105 -

Una vez movido el contenido del bus a su correspondiente registro , bajo la línea de IO_R del disco y salto a la etiqueta R_HD_STATUS_FIN la cual me llevara a restaurar los registros correspondientes al estado de los puertos del micro. GOTO R_HD_STATUS_FIN La etiqueta R_HD_STATUS es llamada cuando se quiere leer el registro de estado principal , el funcionamiento es exactamente idéntico al anterior con excepción que en el momento de apuntar al registro interno del disco se debe de apuntar al principal a cambio del alternativo. R_HD_STATUS BSF HD_LED CLRF HD_STATUS PAGESEL SALVA CALL SALVA PAGESEL R_HD_STATUS BANKSEL TRISD CLRF TRISD CLRF TRISC BANKSEL PORTD MOVLW 0X07 MOVWF PORTE Registro de estado principal . MOVLW B'11101000' MOVWF PORTD PAGESEL HD_LE CALL HD_LE PAGESEL R_HD_STATUS MOVLW 0X01 MOVWF PORTE CLRF PORTD BANKSEL TRISD MOVLW 0XFF MOVWF TRISD BANKSEL PORTD BSF PORTB,1 NOP NOP NOP MOVF PORTD,W MOVWF HD_STATUS BCF PORTB,1 Se restaura el estado de los puertos del bus con el fin de dejarlo del mismo modo que estaban al entrar. R_HD_STATUS_FIN NOP PAGESEL RESTAURA CALL RESTAURA PAGESEL R_HD_STATUS Se para el led que indica que se esta accediendo al disco. BCF HD_LED RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 106 -

;====================================================================; ; RUTINA PARA GRABAR EN EL REGISTRO COMMAND DEL DISCO DURO , ; EL DATO SE ALMACENA EN ; HD_COMMAND. HD_COMAND --> COMMAND(Device) ;====================================================================; Rutina para grabar el contenido del registro en ram ( HD_COMAND ) , al registro interno del disco duro. W_HD_COMMAND BSF HD_LED Se llama a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro PAGESEL SALVA CALL SALVA PAGESEL W_HD_COMMAND Se modifican los puertos , los pongo en salida ya que en primer momento debo de modificar los registros específicos del disco duro para poder acceder a leer el registro de estado. BANKSEL TRISD CLRF TRISD CLRF TRISC BANKSEL PORTD Se pone en la entrada del lach el valor necesario para que me apunte al registro interno de estado del disco duro. En este caso al registro command. MOVLW B'11101000' MOVWF PORTD Llamo a la rutina que me generara un pulso al lach externo del disco duro con el fin de congelar el valor introducido anteriormente PAGESEL HD_LE CALL HD_LE PAGESEL W_HD_COMMAND Se mueve el contenido del registro COMMAND de la Ram al bus del disco duro. MOVF COMMAND,W MOVWF PORTD Se genera un pulso en la línea de IO_W del disco duro con el fin de que lea el contenido del bus y lo almacene en el correspondiente registro. PAGESEL DIOW CALL DIOW PAGESEL W_HD_COMMAND Se restaura el estado de los puertos del bus con el fin de dejarlo del mismo modo que estaban al entrar. PAGESEL RESTAURA CALL RESTAURA PAGESEL W_HD_COMMAND Se para el led que me indica que estoy accediendo al disco duro y salgo de la rutina. BCF HD_LED RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 107 -

;=====================================================================; ; RUTINA PARA GRABAR EN EL REGISTRO DEVICE/HEAT ; DEL DISCO DURO , EL DATO SE ALMACENA EN ; DEVICE. DEVICE --> DEVICE(Device) ;=====================================================================; Rutina para grabar el contenido del registro en Ram ( DEVICE ) , al registro interno del disco duro W_HD_DEVICE BSF HD_LED PAGESEL SALVA CALL SALVA PAGESEL W_HD_DEVICE Se modifican los puertos , los pongo en salida ya que en primer momento debo de modificar los registros específicos del disco duro para poder acceder a leer el registro de estado. BANKSEL TRISD CLRF TRISD CLRF TRISC BANKSEL PORTD Se carga en la entrada del lach el valor necesario para que me apunte al registro interno de estado del disco duro. En este caso al registro device MOVLW B'01101000' MOVWF PORTD Se llama a la rutina que me generara un pulso al lach externo del disco duro con el fin de congelar el valor introducido anteriormente PAGESEL HD_LE CALL HD_LE PAGESEL W_HD_DEVICE Se mueve el contenido del registro DEVICE_HEAD de la Ram al bus del disco duro MOVF DEVICE_HEAD,W MOVWF PORTD Se genera un pulso en la línea de IO_W del disco duro con el fin de que lea el contenido del bus y lo almacene en el correspondiente registro PAGESEL DIOW CALL DIOW PAGESEL W_HD_DEVICE Se restaura el estado de los puertos del bus con el fin de dejarlo del mismo modo que estaban al entrar. PAGESEL RESTAURA CALL RESTAURA PAGESEL W_HD_DEVICE Se para el led que me indica que estoy accediendo al disco duro y salgo de la rutina BCF HD_LED RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 108 -

;====================================================================; ; RUTINA PARA LEER EN EL REGISTRO DEVICE/HEAD DEL DISCO DURO ; EL DATO SE ALMACENA EN ; DEVICE. DEVICE_HEAD <-- DEVICE(Device) ;====================================================================; Rutina para leer el contenido del registro en Ram ( DEVICE ) , al registro interno del disco duro R_HD_DEVICE BSF HD_LED Se llama a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro PAGESEL SALVA CALL SALVA PAGESEL R_HD_DEVICE Se modifican los puertos , los pongo en salida ya que en primer momento debo de modificar los registros específicos del disco duro para poder acceder a leer el registro de estado. BANKSEL TRISD CLRF TRISD CLRF TRISC BANKSEL PORTD Se carga en la entrada del lach el valor necesario para que me apunte al registro interno de estado del disco duro. En este caso al registro device MOVLW B'01101000' MOVWF PORTD Se llama a la rutina que me generara un pulso al lach externo del disco duro con el fin de congelar el valor introducido anteriormente PAGESEL HD_LE CALL HD_LE PAGESEL R_HD_DEVICE CLRF DEVICE_HEAD Se ponen los puertos en modo entrada. BANKSEL TRISD MOVLW 0XFF MOVWF TRISD MOVWF TRISC BANKSEL PORTD Se coloca en el decodificador el valor necesario para que apunte a la línea IO_R del disco. MOVLW 0X01 MOVWF PORTE Se genera un flanco de subida en la línea del decodificador la cual se propagara a la línea de IO_R del diso duro , una vez la señal este a 1 , se debe de mover el contenido del bus de datos a su correspondiente registro , en este caso DEVICE_HEAD. BSF PORTB,1 MOVF PORTD,W MOVWF DEVICE_HEAD BCF PORTB,1 Se restaura el estado de los puertos del bus con el fin de dejarlo del mismo modo que estaban al entrar PAGESEL RESTAURA CALL RESTAURA PAGESEL DEVICE_HEAD

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 109 -

Se para el led que me indica que estoy accediendo al disco duro y salgo de la rutina BCF HD_LED RETURN ;=====================================================================; ; RUTINA PARA GRABAR EN EL REGISTRO NUMERO DE SECTORES ; DEL DISCO DURO , ; EL DATO SE ALMACENA EN SECTOR_NUM. ; SECTOR_NUMBER --> SECTOR_NUMBER(Device) ;=====================================================================; Rutina para grabar el contenido del registro en Ram ( SECTOR_NUMBER ) , al registro interno del disco duro W_HD_SEC_NUM BSF HD_LED Se llama a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro PAGESEL SALVA CALL SALVA PAGESEL W_HD_SEC_NUM Se carga en la entrada del lach el valor necesario para que me apunte al registro interno de estado del disco duro. En este caso al registro sector_number. MOVLW B'11001000' MOVWF PORTD Se modifican los puertos , los pongo en salida ya que en primer momento debo de modificar los registros específicos del disco duro para poder acceder a leer el registro. BANKSEL TRISD CLRF TRISD CLRF TRISC BANKSEL PORTD Se llama a la rutina que me generara un pulso al lach externo del disco duro con el fin de congelar el valor introducido anteriormente PAGESEL HD_LE CALL HD_LE PAGESEL W_HD_SEC_NUM Se mueve el contenido del registro DEVICE_HEAD de la Ram al bus del disco duro MOVF SECTOR_NUMBER,W MOVWF PORTD Se genera un pulso en la línea de IO_W del disco duro con el fin de que lea el contenido del bus y lo almacene en el correspondiente registro PAGESEL DIOW CALL DIOW PAGESEL W_HD_SEC_NUM Se restaura el estado de los puertos del bus con el fin de dejarlo del mismo modo que estaban al entrar PAGESEL RESTAURA CALL RESTAURA PAGESEL W_HD_SEC_NUM Se para el led que me indica que estoy accediendo al disco duro y salgo de la rutina BCF HD_LED RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 110 -

;=====================================================================; ; RUTINA PARA LEER EN EL REGISTRO NUMERO ; DE SECTORES DEL DISCO DURO , ; EL DATO SE ALMACENA EN SECTOR_NUM. ; SECTOR_NUMBER <-- SECTOR_NUMBER(Device) ;=====================================================================; Rutina para leer el contenido del registro en Ram ( SECTOR_NUMBER ) , al registro interno del disco duro R_HD_SEC_NUM BSF HD_LED Se llama a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro PAGESEL SALVA CALL SALVA PAGESEL R_HD_SEC_NUM Se modifican los puertos , los pongo en salida ya que en primer momento debo de modificar los registros específicos del disco duro para poder acceder a leer el registro. BANKSEL TRISD CLRF TRISD CLRF TRISC BANKSEL PORTD Se carga en la entrada del lach el valor necesario para que me apunte al registro interno de estado del disco duro. En este caso al registro sector_number. MOVLW B'11001000' MOVWF PORTD Se llama a la rutina que me generara un pulso al lach externo del disco duro con el fin de congelar el valor introducido anteriormente PAGESEL HD_LE CALL HD_LE PAGESEL R_HD_SEC_NUM Se coloca en el decodificador el valor necesario para que apunte a la línea IO_R del disco. MOVLW 0X01 MOVWF PORTE CLRF PORTD Se configuran los puertos en modo entrada. BANKSEL TRISD MOVLW 0XFF MOVWF TRISD MOVWF TRISC BANKSEL PORTD Se genera un flanco de subida en la línea del decodificador la cual se propagara a la línea de IO_R del diso duro , una vez la señal este a 1 , se debe de mover el contenido del bus de datos a su correspondiente registro , en este caso SECTOR_NUMBER. BSF PORTB,1 MOVF PORTD,W MOVWF SECTOR_NUMBER BCF PORTB,1 Se restaura el estado de los puertos del bus con el fin de dejarlo del mismo modo que estaban al entrar PAGESEL RESTAURA CALL RESTAURA PAGESEL R_HD_SEC_NUM Se para el led que me indica que estoy accediendo al disco duro y salgo de la rutina BCF HD_LED RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 111 -

;=====================================================================; ; RUTINA PARA LEER EN EL REGISTRO CONTADOR ; DE SECTORES DEL DISCO DURO , ; EL DATO SE ALMACENA EN SECTOR_COUNT. ; SECTOR_COUNT <-- SECTOR_COUNT(Device) ;=====================================================================; R_HD_SEC_COUNT BSF HD_LED Se llama a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro PAGESEL SALVA CALL SALVA PAGESEL R_HD_SEC_COUNT Se modifican los puertos , los pongo en salida ya que en primer momento debo de modificar los registros específicos del disco duro para poder acceder a leer el registro. BANKSEL TRISD CLRF TRISD CLRF TRISC BANKSEL PORTD Se apunta al registro contador de sectores del disco duro a través del latch conectado al Puerto D del procesador que enlaza con las líneas de chip selec del HD. MOVLW B'01001000' MOVWF PORTD Se genera un pulso en la entrada de LE del lach que configura las lineas de chip selec del disco duro. A continuación se borra el contenido del puerto D. PAGESEL HD_LE CALL HD_LE PAGESEL R_HD_SEC_COUNT CLRF PORTD Puertos del micro en modo entrada. BANKSEL TRISD MOVLW 0XFF MOVWF TRISD MOVWF TRISC BANKSEL PORTD Se coloca en la entrada del decodificador la direccion de la línea de DIOR del disco duro. MOVLW 0X01 MOVWF PORTE Se sube la línea de habilitacion del decoder . Esta acción generara una subida de la línea de DIOR del disco , una vez subida la línea de lectura del disco , movemos el obtenido del bus de datos a su correspondiente registro. BSF PORTB,1 MOVF PORTD,W MOVWF SECTOR_COUNT BCF PORTB,1 Se restaura el estado de los puertos del bus con el fin de dejarlo del mismo modo que estaban al entrar. PAGESEL RESTAURA CALL RESTAURA PAGESEL R_HD_SEC_COUNT RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 112 -

;=====================================================================; ; RUTINA PARA GRABAR EN EL REGISTRO CONTADOR ; DE SECTORES DEL DISCO DURO , ; EL DATO SE ALMACENA EN SECTOR_COUNT. ; SECTOR_COUNT --> SECTOR_COUNT(Device) ;=====================================================================; W_HD_SEC_COUNT BSF HD_LED Llamo a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro PAGESEL SALVA CALL SALVA PAGESEL W_HD_SEC_COUNT Modifico los puertos , los pongo en salida ya que en primer momento debo de modificar los registros específicos del disco duro para poder acceder a leer el registro. BANKSEL TRISD CLRF TRISD CLRF TRISC BANKSEL PORTD Se apunta al registro contador de sectores del disco duro a través del latch conectado al Puerto D del procesador que enlaza con las líneas de chip selec del HD. MOVLW B'01001000' MOVWF PORTD Se genera un pulso en la entrada de LE del lach que configura las lineas de chip selec del disco duro. A continuación se borra el contenido del puerto D. PAGESEL HD_LE CALL HD_LE PAGESEL R_HD_SEC_COUNT Se mueve el contenido del registro de la RAM al registro acumulador y seguidamente se coloca al puerto de datos , a continuación se genera un pulso en la línea DIOW del disco para que almacene su contenido. MOVF SECTOR_COUNT,W MOVWF PORTD PAGESEL DIOW CALL DIOW PAGESEL W_HD_SEC_COUNT Se restaura el estado de los puertos del bus con el fin de dejarlo del mismo modo que estaban al entrar. PAGESEL RESTAURA CALL RESTAURA PAGESEL W_HD_SEC_COUNT Se desactiva el led de acceso a disco y se sale de la rutina BCF HD_LED RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 113 -

;=====================================================================; ; RUTINA PARA GRABAR EN EL REGISTRO CILINDROS ; BAJOS DEL DISCO DURO , ; EL DATO SE ALMACENA EN CYLINDER_LOW. ; CYLINDER_LOW --> CYLINDER_LOW(Device) ;=====================================================================; W_HD_CYL_LOW BSF HD_LED Llamo a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro PAGESEL SALVA CALL SALVA PAGESEL W_HD_CYL_LOW Modifico los puertos , los pongo en salida ya que en primer momento debo de modificar los registros específicos del disco duro para poder acceder a leer el registro. BANKSEL TRISD CLRF TRISD CLRF TRISC BANKSEL PORTD Se apunta al registro cilindros bajos del disco duro a través del latch conectado al Puerto D del procesador que enlaza con las líneas de chip selec del HD. MOVLW B'00101000' MOVWF PORTD Se genera un pulso a la patilla LE del lach del disco. PAGESEL HD_LE CALL HD_LE PAGESEL W_HD_CYL_LOW Se mueve el contenido del registro de la RAM al registro acumulador y seguidamente se coloca al puerto de datos , a continuación se genera un pulso en la línea DIOW del disco para que almacene su contenido. MOVF CYLINDER_LOW,W MOVWF PORTD PAGESEL DIOW CALL DIOW PAGESEL W_HD_CYL_LOW Se restaura el estado de los puertos del bus con el fin de dejarlo del mismo modo que estaban al entrar. PAGESEL RESTAURA CALL RESTAURA PAGESEL W_HD_CYL_LOW Se desactiva el led de acceso a disco y se sale de la rutina BCF HD_LED RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 114 -

;======================================================================; ; RUTINA PARA LEER EN EL REGISTRO CILINDROS BAJOS DEL DISCO DURO , ; EL DATO SE ALMACENA EN CYLINDER_LOW. ; CYLINDER_LOW <-- CYLINDER_LOW(Device) ;======================================================================; R_HD_CYL_LOW BSF HD_LED Llamo a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro PAGESEL SALVA CALL SALVA PAGESEL R_HD_CYL_LOW Modifico los puertos , los pongo en salida ya que en primer momento debo de modificar los registros específicos del disco duro para poder acceder a leer el registro. BANKSEL TRISD CLRF TRISD CLRF TRISC BANKSEL PORTD Se apunta al registro cilindros bajos del disco duro a través del latch conectado al Puerto D del procesador que enlaza con las líneas de chip selec del HD. MOVLW B'00101000' MOVWF PORTD Se genera un pulso a la patilla LE del lach del disco. PAGESEL HD_LE CALL HD_LE PAGESEL R_HD_CYL_LOW Se coloca en la entrada del decodificador la dirección de la línea de DIOR del disco duro. MOVLW 0X01 MOVWF PORTE CLRF PORTD Puertos del micro en modo entrada. BANKSEL TRISC MOVLW 0XFF MOVWF TRISC MOVWF TRISD BANKSEL PORTD Se sube la línea de habilitacion del decoder . Esta acción generara una subida de la línea de DIOR del disco , una vez subida la línea de lectura del disco , movemos el obtenido del bus de datos a su correspondiente registro. BSF PORTB,1 MOVF PORTD,W MOVWF CYLINDER_LOW BCF PORTB,1 Se restaura el estado de los puertos del bus con el fin de dejarlo del mismo modo que estaban al entrar. PAGESEL RESTAURA CALL RESTAURA PAGESEL R_HD_CYL_LOW Se desactiva el led de acceso a disco y se sale de la rutina BCF HD_LED RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 115 -

;=====================================================================; ; RUTINA PARA GRABAR EN EL REGISTRO CILINDROS ALTOS ; DEL DISCO DURO , ; EL DATO SE ALMACENA EN CYLINDER_LOW. ; CYLINDER_HIGH --> CYLINDER_HIGH(Device) ;=====================================================================; W_HD_CYL_HIGH BSF HD_LED Llamo a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro PAGESEL SALVA CALL SALVA PAGESEL W_HD_CYL_HIGH Modifico los puertos , los pongo en salida ya que en primer momento debo de modificar los registros específicos del disco duro para poder acceder a leer el registro. BANKSEL TRISD CLRF TRISD CLRF TRISC BANKSEL PORTD Se apunta al registro cilindros altos del disco duro a través del latch conectado al Puerto D del procesador que enlaza con las líneas de chip selec del HD. MOVLW B'10101000' MOVWF PORTD Se genera un pulso a la patilla LE del lach del disco. PAGESEL HD_LE CALL HD_LE PAGESEL W_HD_CYL_HIGH Se mueve el contenido del registro de la RAM al registro acumulador y seguidamente se coloca al puerto de datos , a continuación se genera un pulso en la línea DIOW del disco para que almacene su contenido. MOVF CYLINDER_HIGH,W MOVWF PORTD PAGESEL DIOW CALL DIOW PAGESEL W_HD_CYL_HIGH Se restaura el estado de los puertos del bus con el fin de dejarlo del mismo modo que estaban al entrar. PAGESEL RESTAURA CALL RESTAURA PAGESEL W_HD_CYL_HIGH Se desactiva el led de acceso a disco y se sale de la rutina BCF HD_LED RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 116 -

;======================================================================; ; RUTINA PARA LEER EN EL REGISTRO CILINDROS ALTOS DEL DISCO DURO , ; EL DATO SE ALMACENA EN CYLINDER_LOW. ; CYLINDER_HIGH --> CYLINDER_HIGH(Device) ;======================================================================; R_HD_CYL_HIGH BSF HD_LED Llamo a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro PAGESEL SALVA CALL SALVA PAGESEL R_HD_CYL_HIGH Modifico los puertos , los pongo en salida ya que en primer momento debo de modificar los registros específicos del disco duro para poder acceder a leer el registro. BANKSEL TRISD CLRF TRISD CLRF TRISC BANKSEL PORTD Se apunta al registro cilindros altos del disco duro a través del latch conectado al Puerto D del procesador que enlaza con las líneas de chip selec del HD. MOVLW B'10101000' MOVWF PORTD Se genera un pulso a la patilla LE del lach del disco. PAGESEL HD_LE CALL HD_LE PAGESEL R_HD_CYL_HIGH CLRF PORTD Se coloca en la entrada del decodificador la dirección de la línea de DIOR del disco duro. MOVLW 0X01 MOVWF PORTE Puertos del micro en modo entrada. BANKSEL TRISC MOVLW 0XFF MOVWF TRISC MOVWF TRISD BANKSEL PORTD Se sube la línea de habilitacion del decoder . Esta acción generara una subida de la línea de DIOR del disco , una vez subida la línea de lectura del disco , movemos el obtenido del bus de datos a su correspondiente registro. BSF PORTB,1 MOVF PORTD,W MOVWF CYLINDER_HIGH BCF PORTB,1 Se restaura el estado de los puertos del bus con el fin de dejarlo del mismo modo que estaban al entrar. PAGESEL RESTAURA CALL RESTAURA PAGESEL R_HD_CYL_HIGH Se desactiva el led de acceso a disco y se sale de la rutina BCF HD_LED RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 117 -

;==================================================================; ; RUTINA PARA LANZAR EL DISCO DURO AL MODO STANDBY ; ;==================================================================; Esta rutina se utiliza para enviar el disco duro a modo standby y a su vez programarlo para que pasa a este modo 30 segundos después de que no se detecte ninguna actividad en el bus. El procedimiento de autostandby lo ejecuta automáticamente el disco una ves configurado. HD_STBY NOP BSF HD_LED Se lee el registro de estado principal del disco duro. PAGESEL R_HD_STATUS CALL R_HD_STATUS PAGESEL HD_STBY Se comprueba la disponibilidad del disco a través de las banderas de DEVICE READY y BUSY. BTFSS DRDY GOTO HD_STBY BTFSC BSY GOTO HD_STBY Se coloca en el registro de SECTOR_COUNT el valor necesario referente al protocolo ATA para seleccionar 30 segundos. MOVLW 0X06 MOVWF SECTOR_COUNT PAGESEL W_HD_SEC_COUNT CALL W_HD_SEC_COUNT PAGESEL HD_STBY Se selecciona la unidad 0 , en este modo la MASTER. BCF UNIDAD ;SELECCIONO LA UNIDAD 0 PAGESEL W_HD_DEVICE CALL W_HD_DEVICE PAGESEL HD_STBY NOP Se coloca en el registro de COMMAND el valor del comando. En este caso el comando 0xE2 MOVLW 0XE2 MOVWF COMMAND PAGESEL W_HD_COMMAND CALL W_HD_COMMAND PAGESEL HD_STBY Se desactiva el led de actividad en el disco , y se sale. BCF HD_LED RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 118 -

;======================================================================; ; RUTINA PARA COMPROBAR LA DISPONIBILIDAD DEL DISCO O DISCOS DUROS ; ESTA RUTINA LO QUE NOS HACE ES COMPROBAR EL ESTADO DE LA ; BANDERA DE /BOR , EL QUAL ME INDICA SI EL RESET DEL MICRO SE A ; PRODUCIDO POR UNA RECONEXION DE LA ALIMENTACION, ; SI ES ASI , SE DEBE DE ESPERAR UNOS 15 SEG. ; PARA QUE EL DISCO DURO ESTE LISTO ; DATOS OBTENIDOS DEL DATASHET DEL FABRICANTE. UNA VEZ ESPERADO ; ESE TIEMPO SI EL DISPOSITIBO MARCA UN ERROR SE LE EJECUTA ; UN RESET ;======================================================================; Esta rutina se llama una vez en todo el programa y al iniciar. Esta rutina lo que comprueba es la disponibilidad del disco conectado al sistema. Como cualquier dispositivo de almacenamiento su arranque es lento de tal forma que se debe de esperar a que este listo para su acceso. Según el fabricante del disco , este no debe de tardar mas de 15 segundos , de tal forma que si este tarda mas de este tiempo en responder se entenderá como disco no conectado. Al iniciar la rutina se baja la bandera de disco conectado ( HD_OK). HD_LISTO BCF HD_OK ;BAJO LA BANDERA DE DISCO DETECTADO BSF HD_LED Se borra el contenido de la pantalla LCD. PAGESEL BORRA_LCD CALL BORRA_LCD PAGESEL HD_LISTO Se presenta por pantalla que se estan estabilizando los discos. MOVLW MIS13 PAGESEL FRASE CALL FRASE PAGESEL HD_LISTO Se intentara leer el disco correctamente 20 veces. MOVLW .20 ;SE INTENTA LEER EL DISCO 10 VECES MOVWF COUNT Se coloca el cursor de la pantalla en la segunda línea. MOVLW 0XC0 PAGESEL COMANDO CALL COMANDO PAGESEL HD_LISTO Se borra el contenido actual del registro de estado de la RAM. CLRF HD_STATUS Se comprueba la disponibilidad del disco a través del flag de DEVICE_READY. En caso de leer el registro correctamente se salta a la etiqueta BUCLE4. BUCLE3 BTFSC DRDY ;GENERO EL BUCLE HASTA QUE SE GOTO BUCLE4 ;LEVANTE LA BANDERA DE READY Se escribe un punto en la segunda línea de la LCD representando el paso que se esta leyendo. MOVLW "." PAGESEL DATO CALL DATO PAGESEL HD_LISTO Se ejecuta una pausa de 1 segundo aproximado. PAGESEL PAUSA1SEG CALL PAUSA1SEG PAGESEL HD_LISTO

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 119 -

Se lee el registro de estado del disco. PAGESEL R_HD_STATUS CALL R_HD_STATUS PAGESEL HD_LISTO Se decrementa el contador de intentos de lectura del disco. Y salto a volver a comprobar. En caso de llegar a 0 este retornara pero sin modificar la bandera de HD_OK con la consecuencia que el sistema no detectara el disco o no podrá evolucionar. DECFSZ COUNT,F ;DESCUENTO EL NUMERO GOTO BUCLE3 ;DE INTENTOS DE LECTURA RETURN ;RETORNO PERO SIN MODIFICAR ;BANDERA HD_OK YA QUE ;NO SE DETECTO Se salta aquí si se a detectado el disco en el tiempo establecido. Se levanta la bandera como disco OK BUCLE4 BSF HD_OK ;SE DETECTO EL DISCO BCF HD_LED Se comprueba si el disco a respondido con error. BTFSS ERR RETURN De ser así , se salta a esta línea. Se coloca el cursor en la tercera línea de la LCD - MOVLW 0X94 PAGESEL COMANDO CALL COMANDO PAGESEL HD_RESET Se representa el mensaje de ejecutando reset por la lcd. MOVLW MIS14 PAGESEL FRASE CALL FRASE PAGESEL HD_RESET Se ejecuta un reset por software al disco duro. PAGESEL HD_RESET ;SE EJECUTA EL RESET POR SOFTWARE CALL HD_RESET PAGESEL HD_LISTO Se ejecuta una pausa y se sale de la rutina. PAGESEL PAUSA CALL PAUSA CALL PAUSA PAGESEL HD_LISTO RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 120 -

;====================================================================; ; RUTINA PARA GENERAR UN RESET POR SOFTWARE AL DISCO DURO ; ;====================================================================; Esta función ejecuta un reset por software al disco duro. El reset no utiliza en ningun momento la línea de RESET disponible en bus del disco duro. HD_RESET NOP Se activa el bit correspondiente al reset en el registro del disco duro. BSF SRST Se almacena dicho registro en el disco duro PAGESEL W_HD_DEVICE_CNT CALL W_HD_DEVICE_CNT PAGESEL HD_RESET NOP NOP Se desctiva el bit de reset del registro del disco duro. BCF SRST Se almacena el registro de nuevo al disco duro. PAGESEL W_HD_DEVICE_CNT CALL W_HD_DEVICE_CNT PAGESEL HD_RESET Se ejecuta una pausa de 1 Seg, aproximadamente. PAGESEL PAUSA CALL PAUSA PAGESEL HD_RESET CHECK NOP Se lee el registro de estado del disco duro para saber el estado después del reset. PAGESEL R_HD_STATUS CALL R_HD_STATUS PAGESEL HD_RESET Se comprueba el estado de las lineas de Device Ready y Busy para saber si el disco esta listo para continuar operando. De no ser asi se continua leiendo el registro de estado hasta que el disco este listo para salir. BTFSS DRDY GOTO CHECK BTFSC BSY GOTO CHECK RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 121 -

;====================================================================; ; RUTINA PARA GRABAR EN EL REGISTRO FEATURES DEL DISCO DURO , ; ; EL DATO SE ALMACENA EN FEATURES. ; ; FEATURES --> FEATURES(Device) ; ;====================================================================; W_HD_FEATURE BSF HD_LED Llamo a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro PAGESEL SALVA CALL SALVA PAGESEL W_HD_FEATURE Modifico los puertos , los pongo en salida ya que en primer momento debo de modificar los registros específicos del disco duro para poder acceder a leer el registro. BANKSEL TRISD CLRF TRISD CLRF TRISC BANKSEL PORTD Se apunta al registro mediante las lineas de chip selec del disco duro , las cuales son atacadas mediante el match conectado al bus. MOVLW B'10001000' MOVWF PORTD Se genera un pulso al latch que ataca a las lineas de Chip Select del disco duro. PAGESEL HD_LE CALL HD_LE PAGESEL W_HD_FEATURE Se mueve el contenido del registro Features al acumulador y a continuación al Bus. MOVF FEATURES,W MOVWF PORTD Se pasa a generar un pulso a la línea de Input Output Write del disco duro con el fin de que recoja el contenido del bus y lo almacene en el registro apuntado por las lineas de Chip Select. PAGESEL DIOW CALL DIOW PAGESEL W_HD_FEATURE Se restauran los registros , se para el led de actividad en el disco y se sale de la rutina. PAGESEL RESTAURA CALL RESTAURA PAGESEL W_HD_FEATURE BCF HD_LED RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 122 -

;=====================================================================; ; RUTINA PARA GRABAR EN EL REGISTRO DEVICE CONTROL DEL DISCO DURO ; EL DATO SE ALMACENA EN ; DEVICE CONTROL. DEVICE CONTROL --> DEVICE CONTROL(Device) ;=====================================================================; W_HD_DEVICE_CNT BSF HD_LED Llamo a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro PAGESEL SALVA CALL SALVA PAGESEL W_HD_DEVICE Modifico los puertos , los pongo en salida ya que en primer momento debo de modificar los registros específicos del disco duro para poder acceder a leer el registro. BANKSEL TRISD CLRF TRISD CLRF TRISC BANKSEL PORTD Se apunta al registro mediante las lineas de chip selec del disco duro , las cuales son atacadas mediante el match conectado al bus. MOVLW B'01110000' MOVWF PORTD Se genera un pulso al latch que ataca a las lineas de Chip Select del disco duro. PAGESEL HD_LE CALL HD_LE PAGESEL W_HD_DEVICE_CNT Se mueve el contenido del registro Features al acumulador y a continuación al Bus. MOVF DEVICE_CONTROL,W MOVWF PORTD Se pasa a generar un pulso a la línea de Input Output Write del disco duro con el fin de que recoja el contenido del bus y lo almacene en el registro apuntado por las lineas de Chip Select. PAGESEL DIOW CALL DIOW PAGESEL W_HD_DEVICE_CNT Se restauran los registros , se para el led de actividad en el disco y se sale de la rutina. PAGESEL RESTAURA CALL RESTAURA PAGESEL W_HD_DEVICE_CNT BCF HD_LED RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 123 -

;=====================================================================; ; RUTINA PARA LEER DEL REGISTRO DE DATOS DEL DISCO DURO ; EL DATO SE ALMACENA EN IO_L , IO_H ;=====================================================================; R_HD_DATA BSF HD_LED Llamo a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro PAGESEL SALVA CALL SALVA PAGESEL R_HD_DATA Modifico los puertos , los pongo en salida ya que en primer momento debo de modificar los registros específicos del disco duro para poder acceder a leer el registro. BANKSEL TRISC CLRF TRISC CLRF TRISD BANKSEL PORTD Se apunta al registro mediante las lineas de chip select del disco duro , las cuales son atacadas mediante el match conectado al bus. MOVLW B'00001000' MOVWF PORTD Se genera un pulso al latch que ataca a las lineas de Chip Select del disco duro. PAGESEL HD_LE CALL HD_LE PAGESEL R_HD_DATA Puertos del micro en modo entrada. BANKSEL TRISC MOVLW 0XFF MOVWF TRISC MOVWF TRISD BANKSEL PORTD Se coloca en el descodificador de direcciones la direccion la cual apunta a la línea de DIOR del disco duro. MOVLW 0X01 MOVWF PORTE Se sube la línea de habilitacion del decodificador , con la consecuencia de que tambien sube la línea a la cual apunta. BSF PORTB,1 NOP Una vez subida la línea DIOR se recoge el contenido del bus y se coloca en sus correspondientes registros en ram. MOVF PORTD,W MOVWF IO_L MOVF PORTC,W MOVWF IO_H Se baja la línea de habilitacion del codificador , en consecuencia la línea de DIOR. BCF PORTB,1 Se para el led de actividad en el disco , se restaura los registros y se sale de la rutina. BCF HD_LED PAGESEL RESTAURA CALL RESTAURA PAGESEL R_HD_DATA RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 124 -

;====================================================================; ; RUTINA PARA ESCRIBIR DEL REGISTRO DE DATOS DEL DISCO DURO ; EL DATO SE ALMACENA EN IO_L , IO_H ;====================================================================; W_HD_DATA BSF HD_LED Llamo a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro PAGESEL SALVA CALL SALVA PAGESEL W_HD_DATA Modifico los puertos , los pongo en salida ya que en primer momento debo de modificar los registros específicos del disco duro para poder acceder a leer el registro. BANKSEL TRISC CLRF TRISC CLRF TRISD BANKSEL PORTD Se apunta al registro mediante las lineas de chip select del disco duro , las cuales son atacadas mediante el match conectado al bus. MOVLW B'00001000' NOP MOVWF PORTD Se genera un pulso al latch que ataca a las lineas de Chip Select del disco duro. PAGESEL HD_LE CALL HD_LE PAGESEL R_HD_DATA Se mueve el contenido de los registros en RAM al bus. ( 16 bits ). MOVF IO_L,W MOVWF PORTD MOVF IO_H,W MOVWF PORTC Se genera un pulso en la línea de DIOW del disco duro. PAGESEL DIOW CALL DIOW PAGESEL W_HD_DATA Se para el led de actividad en el disco , se restaura los registros y se sale de la rutina. BCF HD_LED PAGESEL RESTAURA CALL RESTAURA PAGESEL R_HD_DATA RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 125 -

;====================================================================; ; RUTINA PARA LEER LOS 512BYTES DE IDENTIFICACION DE DISCO, ; EL CONTENIDO SE COLOCA EN EL ULTIMO ; SECTOR DE LA RAM 0x7E00 --> 0x7FFF ; ;====================================================================; Esta rutina lo que nos hace es leer el contenido del sector de identificación de disco , este sector no se trata de un sector físico en el plato magnetico sino que se encuentra almacenado en la RAM del propio dispositivo y es único para cada modelo de disco. Este sector se vuelca a la RAM de la placa de control para si fuera necerasio poder acceder a algún parámetro si fuera necesario. HD_IDENTI NOP Llamo a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro PAGESEL SALVA CALL SALVA PAGESEL HD_IDENTI Se apunta al inicio de la direccion de la memoria RAM a partir de la cual se quiere almacenar el contenido del sector de identificación. MOVLW 0X00 MOVWF DIREC_L MOVLW 0X7E MOVWF DIREC_H HD_IDENTI_4 NOP Se lee el registro de estado del disco duro para poder comprobar la disponibilidad del disco antes de continuar. PAGESEL R_HD_STATUS CALL R_HD_STATUS PAGESEL HD_IDENTI Se comprueba que el disco este preparado , no este ocupado y que no este en fase de transferencia de información. BTFSS DRDY GOTO HD_IDENTI_4 BTFSC BSY GOTO HD_IDENTI_4 BTFSC DRQ GOTO HD_IDENTI_4 Se selecciona la unidad maestro. BCF UNIDAD PAGESEL W_HD_DEVICE CALL W_HD_DEVICE PAGESEL HD_IDENTI HD_IDENTI_1 NOP Se comprueba de nuevo la disponibilidad del disco después de seleccionar la unidad a la cual operar. PAGESEL R_HD_STATUS CALL R_HD_STATUS PAGESEL HD_IDENTI BTFSS DRDY GOTO HD_IDENTI_1 BTFSC BSY GOTO HD_IDENTI_1 Se carga en el registro del comando , el comando relacionado con el comando de lectura del registro de identificación de disco. MOVLW 0XEC MOVWF COMMAND PAGESEL W_HD_COMMAND CALL W_HD_COMMAND

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 126 -

PAGESEL HD_IDENTI Se lee el registro de estado alternativo para comprobar que el disco a aceptado el comando y que esta listo para la transferencia de información. HD_IDENTI_3 PAGESEL R_HD_STATUS_ALT CALL R_HD_STATUS_ALT PAGESEL HD_IDENTI BTFSS DRDY GOTO HD_IDENTI_3 BTFSC BSY GOTO HD_IDENTI_3 BTFSS DRQ GOTO HD_IDENTI_3 Se carga el contador de words transferidos a 256 words , correspondiente a 0x00 MOVLW 0X00 ;256 WORDS , 512 BYTES MOVWF COUNT Se inicia el bucle de lectura de la información procediente del disco duro , a cada vuelta se lee el registro de estado del disco duro para comprobar la disponibilidad del disco antes de leer el registro de datos. HD_IDENTI_2 NOP PAGESEL R_HD_STATUS CALL R_HD_STATUS PAGESEL HD_IDENTI BTFSS DRQ GOTO HD_IDENTI_2 BTFSC BSY GOTO HD_IDENTI_2 Se llama a la rutina de lectura del registro de datos del disco duro. Esta rutina lee el bus y lo coloca a sus registros correspondientes de la RAM. PAGESEL R_HD_DATA CALL R_HD_DATA PAGESEL HD_IDENTI Se mueve el contenido del registro de RAM al acumulador y a la direccion a la que apunta el registro de direccionamiento de la memoria. MOVF IO_L,W MOVWF DAT Se llama a la rutina la cual graba el contenido del registro DAT a la posición de la memoria a la que apunta los registros de la RAM PAGESEL W_MEM_EX CALL W_MEM_EX PAGESEL HD_IDENTI Se incrementa la direccion de la memoria externa. INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F Se graba la parte alta de la información a la memoria externa. MOVF IO_H,W MOVWF DAT PAGESEL W_MEM_EX CALL W_MEM_EX PAGESEL HD_IDENTI

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 127 -

Se incrementa de nuevo la direccion de la RAM. ( Memoria externa ) INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F BCF HD_LED Se decrementa el contador de words transferidos , si el contador no es cero se ejecuta de nuevo el bucle sino sale. DECFSZ COUNT,F ;DESCUENTO ELS 256 WORDS GOTO HD_IDENTI_2 ;QUE SON 512 BYTES ;RELLENO LOS REGISTRO INVOLUCRADOS Se lee de la posición de la RAM la cual indica el numero de cilindros del disco el cual se a leido la información. MOVLW 0X02 MOVWF DIREC_L MOVLW 0X7E MOVWF DIREC_H PAGESEL R_MEM_EX CALL R_MEM_EX PAGESEL HD_IDENTI Se coloca la información en los registros involucrados de la RAM. MOVF DAT,W MOVWF CYL_L INCF DIREC_L,F PAGESEL R_MEM_EX CALL R_MEM_EX PAGESEL HD_IDENTI MOVF DAT,W MOVWF CYL_H Se apunta a la direccion de RAM 0x7E06 , el cual indica el numero de cabezas del disco. MOVLW 0X06 MOVWF DIREC_L PAGESEL R_MEM_EX CALL R_MEM_EX PAGESEL HD_IDENTI Se lee de la posición de memoria el valor del registro HEADS del disco duro. MOVF DAT,W MOVWF HEADS_L INCF DIREC_L,F PAGESEL R_MEM_EX CALL R_MEM_EX PAGESEL HD_IDENTI MOVF DAT,W MOVWF HEADS_H Se apunta de la direccion de RAM 0x7E0C , el cual indica el inicio del registro de numero de sectores. MOVLW 0X0C MOVWF DIREC_L PAGESEL R_MEM_EX CALL R_MEM_EX PAGESEL HD_IDENTI MOVF DAT,W MOVWF SECTORS_L INCF DIREC_L,F

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 128 -

PAGESEL R_MEM_EX CALL R_MEM_EX PAGESEL HD_IDENTI MOVF DAT,W MOVWF SECTORS_H Se restaura los registros involucrados y se sale de la rutina. PAGESEL RESTAURA CALL RESTAURA PAGESEL HD_IDENTI RETURN ;===================================================================; ; RUTINA PARA CONFIGURAR EL DISCO DURO PARA PODER OPERAR ; EN ESTE PROYECTO ;===================================================================; Esta rutina lo que nos hace es configurar el disco duro para poder operar en este proyecto , la configuración que nos carga en el disco es para programar transferencias PIO , en el modo mas lento PIO 0 , ya que la placa de control funciona como maximo a una velocidad de reloj principal de 20 Mhz. No optante la velocidad de transferencia del disco duro es mucho inferior a 20 Mbytes/sg. CONFIG_HD BSF HD_LED CONFIG_HD_1 NOP Se lee el registro de estado del disco duro para poder ver si esta listo para poder continuar con la configuración. PAGESEL R_HD_STATUS CALL R_HD_STATUS PAGESEL CONFIG_HD Se comprueba que el disco no este ocupado y este preparado. BTFSS DRDY GOTO CONFIG_HD_1 BTFSC BSY GOTO CONFIG_HD_1 Se carga en el registro FEATURES de la RAM y a continuación al del disco duro el subcomando de velocidad de transferencia. Este comando me indica el modo de transferencia asi como de la velocidad.. MOVLW 0X03 ;SUBCOMANDO DE MODO DE MOVWF FEATURES ;TRANSFERENCIA , PIO PAGESEL W_HD_FEATURE CALL W_HD_FEATURE PAGESEL CONFIG_HD Se le indica que la velocidad de transferencia será la 0 , de tal forma que quedara Modo PIO 0. El valor para la velocidad se debe de cargar en el registro SECTOR_COUNT del disco duro , de tal forma que primero se carga en el registro de la RAM y a continuación en el disco duro. MOVLW B'00001000' ;PIO MODE 0 MOVWF SECTOR_COUNT PAGESEL W_HD_SEC_COUNT CALL W_HD_SEC_COUNT PAGESEL CONFIG_HD Se selecciona la unidad maestra del disco. BCF UNIDAD ;SELECCIONO LA UNIDAD 0 PAGESEL W_HD_DEVICE CALL W_HD_DEVICE PAGESEL CONFIG_HD Se comprueba que el disco este listo después de seleccionar la unidad. CONFIG_HD_2 NOP PAGESEL R_HD_STATUS

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 129 -

CALL R_HD_STATUS PAGESEL CONFIG_HD BTFSS DRDY GOTO CONFIG_HD_2 BTFSC BSY GOTO CONFIG_HD_2 Se carga en la RAM el comando de configuración de disco y a continuación al disco duro , una vez el disco detecte que se a grabado en el registro de comando un comando valido , coge y ejecuta el comando con los datos almacenados en cada uno de los registros involucrados. MOVLW 0XEF MOVWF COMMAND PAGESEL W_HD_COMMAND CALL W_HD_COMMAND PAGESEL CONFIG_HD RETURN ;====================================================================; ; RUTINA PARA LEER UN SECTOR DEL HD , EN MODO LBA ; LA INFORMACION SE COLOCA A PARTIR DE LA DIRECCION ; INDICADA EN DIREC_L/H ;====================================================================; R_HD_SECTOR NOP Llamo a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro PAGESEL SALVA CALL SALVA PAGESEL R_HD_SECTOR R_HD_SECTOR6 NOP Se lee el registro de estado del disco duro para comprobar la disponibilidad del disco duro. Una vez el registro es leido , se comprueba que no este ocupado , este preparado y no este en fase de transferencia. PAGESEL R_HD_STATUS CALL R_HD_STATUS PAGESEL R_HD_SECTOR BTFSS DRDY GOTO R_HD_SECTOR6 BTFSC DRQ GOTO R_HD_SECTOR6 BTFSC BSY GOTO R_HD_SECTOR6 Se desactiva el Bit nIEN del registro DEVICE_CONTROL , para que el disco duro no me genere interrupción al acabar una transferencia.Una vez el bit es modificado en la Ram del Micro este se transfiere al disco duro. BSF nIEN ;PER QUE NO GENERE INTER. PAGESEL W_HD_DEVICE_CNT CALL W_HD_DEVICE_CNT PAGESEL R_HD_SECTOR Se carga el registro SECTOR_COUNT con el numero de sectores a leer o escribir por programación PIO. MOVLW 0X01 ;SOLO LEO UN SECTOR MOVWF SECTOR_COUNT PAGESEL W_HD_SEC_COUNT CALL W_HD_SEC_COUNT PAGESEL R_HD_SECTOR

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 130 -

Se carga la parte baja de la direccion LBA a escribir en el registro SECTOR_NUMBER en primer momento en el registro en Ram del Micro y a continuación al registro del disco duro. El numero de bits necesarios para mapear 2.1 Gb en un disco duro IDE se requieren 24 bits , con lo cual se requiere cargar 3 registros de 8 bits para indicar la direccion exacta. MOVF LBA70,W MOVWF SECTOR_NUMBER ;CARGO LA PARTE BAIJA DEL LBA PAGESEL W_HD_SEC_NUM CALL W_HD_SEC_NUM PAGESEL R_HD_SECTOR Se carga los bits 8 al 15 de la direccion LBA en el registro CYLINDER_LOW , primero en el registro de la Ram y a continuación al registro del disco duro. MOVF LBA158,W MOVWF CYLINDER_LOW PAGESEL W_HD_CYL_LOW CALL W_HD_CYL_LOW PAGESEL R_HD_SECTOR Se carga la parte alta de la direccion LBA en el registro CYLINDER_HIGH , primero en el registro de la Ram y a continuación al registro del disco duro. MOVF LBA2316,W ;CARGO LA PART ALTA DEL LBA MOVWF CYLINDER_HIGH PAGESEL W_HD_CYL_HIGH CALL W_HD_CYL_HIGH PAGESEL R_HD_SECTOR Se selecciona la unidad maestro del Bus IDE . BCF UNIDAD BSF LBA PAGESEL W_HD_DEVICE CALL W_HD_DEVICE PAGESEL R_HD_SECTOR Se lee el registro de estado del disco duro para comprobar la disponibilidad del disco una vez se ha seleccionado la unidad. R_HD_SECTOR4 NOP PAGESEL R_HD_STATUS CALL R_HD_STATUS PAGESEL CONFIG_HD Se comprueba que este listo y no este ocupado. BTFSS DRDY GOTO R_HD_SECTOR4 BTFSC BSY GOTO R_HD_SECTOR4 Se envia el comando de lectura de sector al disco duro , primero se graba en el registro de la Ram y a continuación al del disco duro. Una vez el disco detecta que se a escrito un comando en su registro el disco duro ejecuta el comando relacionado con la información almacenada en los registros involucrados. MOVLW 0X20 MOVWF COMMAND PAGESEL W_HD_COMMAND CALL W_HD_COMMAND PAGESEL R_HD_SECTOR R_HD_SECTOR2 NOP Se lee el registro de estado del disco para comprobar que el disco a detectado el comando y esta listo para aceptar la transferencia. La condicion de transferencia será , que este preparado , que no este ocupado , que no detecte error y que este listo para la transferencia.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 131 -

PAGESEL R_HD_STATUS_ALT CALL R_HD_STATUS_ALT PAGESEL R_HD_SECTOR BTFSS DRDY GOTO R_HD_SECTOR2 BTFSS DRQ GOTO R_HD_SECTOR2 BTFSC ERR GOTO R_HD_SECTORFIN BTFSC BSY GOTO R_HD_SECTOR2 Se carga el registro de words transferidos con el valor 00 que representa 256 words o que es lo mismo 512 bytes. MOVLW 0X00 ;256 WORDS , 512 BYTES MOVWF COUNT R_HD_SECTOR3 NOP Se lee el registro de datos del disco duro y se transfiere los 16 bits del bus al registo IO alto y bajo. PAGESEL R_HD_DATA CALL R_HD_DATA PAGESEL R_HD_SECTOR Se mueve el contenido del registo IO bajo al registro DAT de la memoria Ram del Micro y a continuación a la direccion donde apunta el registro DIREC de la memoria Ram externa. MOVF IO_L,W MOVWF DAT PAGESEL W_MEM_EX CALL W_MEM_EX PAGESEL R_HD_SECTOR Se incrementa la direccion la cual apunta a la memoria Ram externa. INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F Se incrementa de nuevo la direccion la cual apunta a la memoria Ram externa para poder guardar la parte alta del dato leido del Bus. MOVF IO_H,W MOVWF DAT PAGESEL W_MEM_EX CALL W_MEM_EX PAGESEL R_HD_SECTOR Se incrementa otra vez para el proximo acceso a memoria externa. INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F R_HD_SECTOR5 NOP Se lee el registro de estdo del disco duro para comprobar que esta listo para la proxima lectura del registro de datos del disco duro. Si la transferencia no a concluido se debe de cumplir que el disco este listo y a la vez que este preparado para una nueva transferencia , bit DRQ activo. PAGESEL R_HD_STATUS CALL R_HD_STATUS PAGESEL R_HD_SECTOR BTFSC BSY

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 132 -

GOTO R_HD_SECTOR5 BTFSS DRQ GOTO R_HD_SECTORFIN2 Se decrementa el contador de words transferidos. Si el contador vale 0 se cumple que la transferencia que a completado. DECFSZ COUNT,F ;BUCLE DE LECTURA GOTO R_HD_SECTOR3 GOTO R_HD_SECTORFIN2 Si el el comando a probocado error se salta a esta línea de codigo , la cual nos activa el bit COM_ERR y sale de la rutina. Mediante este bit se puede comprobar que la rutina se a completado con éxito. R_HD_SECTORFIN NOP ;SALTO AQUI SI A PRODUCIDO BSF COM_ERR ;ERROR Y DEVUELVO POR W UN FF GOTO R_HD_SECTORFIN3 Se salta a esta línea de codigo si el comando se a completado exitosamente. R_HD_SECTORFIN2 BCF COM_ERR ;AQUI SI LA RUTINA A ACABADO ;NORMALMENTE Y DEVUELVO ;POR W UN 0 Se restaura los registros para dejar el estado de la placa de control tal y como estaba en el momento de entrar. R_HD_SECTORFIN3 NOP PAGESEL RESTAURA CALL RESTAURA PAGESEL R_HD_SECTOR RETURN ;=====================================================================; ; RUTINA PARA ESCRIBIR UN SECTOR DEL HD , EN MODO LBA ; EL SECTOR SE RECOJE A PARTIR DE LA DIRECCION CONTENIDA ; EN DIREC_L / DIREC_H ;=====================================================================; W_HD_SECTOR NOP Llamo a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro PAGESEL SALVA CALL SALVA PAGESEL W_HD_SECTOR Se lee el registro de estado del disco duro para saber la disponibilidad del disco duro para saber si esta listo para evolucionar. W_HD_SECTOR1 NOP PAGESEL R_HD_STATUS CALL R_HD_STATUS PAGESEL W_HD_SECTOR Se comprueba que el disco no este ocupado ni esperando para completar una transferencia y este preparado. BTFSS DRDY GOTO W_HD_SECTOR1

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 133 -

BTFSC DRQ GOTO W_HD_SECTOR1 BTFSC BSY GOTO W_HD_SECTOR1 Se desactiva el bit nIEN para forzar al disco que no me ejecute una interrupción una vez a acabado la transferencia. BSF nIEN ;NO GENERE INTER. PAGESEL W_HD_DEVICE_CNT CALL W_HD_DEVICE_CNT PAGESEL W_HD_SECTOR MOVLW 0X01 ;SOLO ESCRIBO 1 SECTOR MOVWF SECTOR_COUNT PAGESEL W_HD_SEC_COUNT CALL W_HD_SEC_COUNT PAGESEL W_HD_SECTOR MOVF LBA70,W MOVWF SECTOR_NUMBER PAGESEL W_HD_SEC_NUM CALL W_HD_SEC_NUM PAGESEL W_HD_SECTOR MOVF LBA158,W MOVWF CYLINDER_LOW PAGESEL W_HD_CYL_LOW CALL W_HD_CYL_LOW PAGESEL W_HD_SECTOR MOVF LBA2316,W MOVWF CYLINDER_HIGH PAGESEL W_HD_CYL_HIGH CALL W_HD_CYL_HIGH PAGESEL W_HD_SECTOR BCF UNIDAD BSF LBA PAGESEL W_HD_DEVICE CALL W_HD_DEVICE PAGESEL W_HD_SECTOR W_HD_SECTOR2 NOP PAGESEL R_HD_STATUS CALL R_HD_STATUS PAGESEL W_HD_SECTOR BTFSS DRDY GOTO W_HD_SECTOR2 BTFSC DRQ GOTO W_HD_SECTOR2 BTFSC BSY GOTO W_HD_SECTOR2 MOVLW 0X30 MOVWF COMMAND PAGESEL W_HD_COMMAND CALL W_HD_COMMAND PAGESEL W_HD_SECTOR W_HD_SECTOR3 NOP ;BUCLE DE ENCRITURA PAGESEL R_HD_STATUS_ALT CALL R_HD_STATUS_ALT PAGESEL W_HD_SECTOR BTFSS DRDY GOTO W_HD_SECTOR3 ;ESTE LISTO BTFSC BSY GOTO W_HD_SECTOR3 ;NO ESTE OCUPADO BTFSC ERR GOTO W_HD_SECTORFIN ;MIRO QUE EL COMANDO NO BTFSS DRQ ;HAYA PRODUCIDO ERROR GOTO W_HD_SECTOR3 ;ESTE PREPARADO PARA LA

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 134 -

;TRANSFERENCIA MOVLW 0X00 ;256 WORDS (512 BYTES) MOVWF COUNT W_HD_SECTOR4 NOP PAGESEL R_MEM_EX CALL R_MEM_EX PAGESEL W_HD_SECTOR MOVF DAT,W MOVWF IO_L INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F PAGESEL R_MEM_EX CALL R_MEM_EX PAGESEL W_HD_SECTOR INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F MOVF DAT,W MOVWF IO_H PAGESEL W_HD_DATA CALL W_HD_DATA PAGESEL W_HD_SECTOR W_HD_SECTOR5 NOP PAGESEL R_HD_STATUS_ALT CALL R_HD_STATUS_ALT PAGESEL W_HD_SECTOR BTFSC BSY GOTO W_HD_SECTOR5 ;NO ESTE OCUPADO BTFSS DRQ ;HAYA PRODUCIDO ERROR GOTO W_HD_SECTORFIN3 DECFSZ COUNT,F GOTO W_HD_SECTOR4 GOTO W_HD_SECTORFIN3 W_HD_SECTORFIN BSF COM_ERR ;ERROR DE COMANDO GOTO W_HD_SECTORFIN3 W_HD_SECTORFIN2 BCF COM_ERR W_HD_SECTORFIN3 NOP PAGESEL RESTAURA CALL RESTAURA PAGESEL W_HD_SECTOR RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 135 -

;=====================================================================; ; RUTINA PARA FORMATEAR 2.1Gb DE DISCO DURO ; ESTA RUTINA DE FORMATEO LO QUE NOS HACE ES ; BORRARNOS LOS SECTORES NECESARIOS ;=====================================================================; HD_FORMAT NOP Llamo a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro PAGESEL SALVA CALL SALVA PAGESEL HD_FORMAT Se borra el contenido de la pantalla LCD. PAGESEL BORRA_LCD CALL BORRA_LCD PAGESEL HD_FORMAT Se se llama a la rutina de impresión por pantall con el mensale 22. Esta rutina lo que nos hace es imprimir por la pantalla LCD el mensaje con indice almacenado en el Acumulador. MOVLW MIS22 ;IMPRIMO LA PANTALLA QUE SE PAGESEL FRASE2 ;VA A FORMATAR EL DISCO CALL FRASE2 Se coloca el cursor a la tercera línea de la pantalla LCD. Para poder ejecutar esta operación se coloca en el acumulador la posición de la memoria ram de la LCD la cual hace referencia el primer carácter de la línea. MOVLW 0X94 ;CURSOR 3 LINEA PAGESEL COMANDO CALL COMANDO Se imprime por pantalla el mensaje que hace referencia a la barra de progreso de formateado. El indice del mensaje Progress Bar es el 23. MOVLW MIS23 ;PROGRESS BAR PAGESEL FRASE2 CALL FRASE2 PAGESEL HD_FORMAT Se coloca los registros que apuntan a la memoria externa en la dirección del sector de proposito general ubicado en la ram. MOVLW 0X7C ;PREPARO EL SECTOR PARA GRABAR MOVWF DIREC_H ;EN DISCO A 0X00 CLRF DIREC_L ;SECTOR DE USO GENERAL Se borra el contenido del registro de la Ram el cual contiene el dato que se va a escribir en la memoria externa. HD_FORMAT1 CLRF DAT Se escribe el contenido del registro DAT en el interior de la memoria externa la cual apunta los registros DIREC. PAGESEL W_MEM_EX CALL W_MEM_EX PAGESEL HD_FORMAT Se incrementa los registros que apuntan a la memoria externa. INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 136 -

Se comprueba que se a llegado al final del sector de uso general , si no se a llegado al final del sector de uso general se vuelve a ejecutar el bucle hasta que se a llegado al final ( 0x7DFF ). MOVLW 0X7E XORWF DIREC_H,W ;SE HACE HASTA LA DIRECCION BTFSS STATUS,Z ;0x7DFF DE LA RAM GOTO HD_FORMAT1 Se coloca la direccion LBA al primer sector del disco duro. CLRF LBA70 ;COLOCO AL PRIMER SECTOR EN LBA CLRF LBA158 CLRF LBA2316 Se coloca en un registro de uso general la direccion de la memoria Ram de la LCD en la cual empieza la barra de progreso. MOVLW 0X98 ;INDICO DONDE EMPIEZA LA MOVWF AUX2 ;PROGRESS BAR Se coloca en el registro el cual apunta a la memoria externa la direccion del sector de uso general el cual esta cargado a 0 por el bucle anterior. MOVLW 0X7C ;EMPIEZA EL FORMATEO MOVWF DIREC_H CLRF DIREC_L Se escribe vuelca el contenido el cual apunta la direccion de la memoria externa al sector el cual apunta el registro LBA. PAGESEL W_HD_SECTOR ;GRABO EL SECTOR EN LA POSICION CALL W_HD_SECTOR ;QUE INDIQUE EL LBA PAGESEL HD_FORMAT Se comprueba que la rutina anterior de escribir sector no me a provocado error. Si se a producido error este salta a la etiqueta HD_FORMAT_ERR. BTFSC COM_ERR ;COMPRUEBO QUE NO ME RET. ERROR GOTO HD_FORMAT_ERR Se coloca el cursor en la posición de la barra de progreso el cual indica el registro de uso general anteriormente cargado. MOVF AUX2,W ;COLOCO EL CURSOR EN LA PAGESEL COMANDO ;POSICION DE LA CALL COMANDO ;PROGRES BAR PAGESEL HD_FORMAT Se escribe en la LCD un cuadradito , el cual indica la evolución del formateado. MOVLW 0XFF PAGESEL DATO CALL DATO PAGESEL HD_FORMAT Se incrementa el contenido del registro de propósito general el cual me indica la posición de la barra de progreso. INCF AUX2,F Se carga en los registros que apuntan a la memoria externa la direccion del sector de proposito general. MOVLW 0X7C MOVWF DIREC_H CLRF DIREC_L Se carga en los registros LBA los cuales apuntan a los sectores del disco la direccion del sector 63. MOVLW 0X3F MOVWF LBA70 CLRF LBA158

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 137 -

CLRF LBA2316 Se escribe el sector a la direccion LBA el contenido del sector de uso general , tambien 0. PAGESEL W_HD_SECTOR CALL W_HD_SECTOR PAGESEL HD_FORMAT Se comprueba que la rutina anterior de escribir sector no me a provocado error. Si se a producido error este salta a la etiqueta HD_FORMAT_ERR. BTFSC COM_ERR ;COMPRUEBO QUE NO ME RET. ERROR GOTO HD_FORMAT_ERR Se coloca el cursor en la posición de la pantalla la cual indica el registro de proposito general. MOVF AUX2,W ;COLOCO EL CURSOR EN LA PAGESEL COMANDO ;POSICION DE LA CALL COMANDO ;PROGRES BAR PAGESEL HD_FORMAT Se escribe en la LCD un cuadradito , el cual indica la evolución del formateado. MOVLW 0XFF PAGESEL DATO CALL DATO PAGESEL HD_FORMAT Se incrementa el contenido del registro de propósito general el cual me indica la posición de la barra de progreso. INCF AUX2,F Se carga en los registros LBA los cuales apuntan a los sectores del disco la direccion del sector 64. MOVLW 0X40 MOVWF LBA70 Se carga en los registros que apuntan a la memoria externa la direccion del sector de proposito general. HD_FORMAT3 MOVLW 0X7C MOVWF DIREC_H CLRF DIREC_L Se escribe el sector a la direccion LBA el contenido del sector de uso general , tambien 0. PAGESEL W_HD_SECTOR CALL W_HD_SECTOR PAGESEL HD_FORMAT Se comprueba que la rutina anterior de escribir sector no me a provocado error. Si se a producido error este salta a la etiqueta HD_FORMAT_ERR. BTFSC COM_ERR ;COMPRUEBO QUE NO ME RET. ERROR GOTO HD_FORMAT_ERR Se incrementa la parte baja del registro LBA , el cual apuntara al sector 65. INCF LBA70,F ;INCREMENTO LA DIRECCION LBA Se comprueba si la parte baja del registro LBA vale 0x50 , si es asi sale del bucle , sino continuara incrementando y grabando el sector de uso general previamente cargado a ceros . MOVLW 0X50 ;BORRO 16 SECTORS DE LA FAT1 XORWF LBA70,W BTFSS STATUS,Z GOTO HD_FORMAT3 Se coloca el cursor en la posición de la pantalla LCD que indica el registro de proposito general .

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 138 -

MOVF AUX2,W ;COLOCO EL CURSOR EN LA PAGESEL COMANDO ;POSICION DE LA CALL COMANDO ;PROGRES BAR PAGESEL HD_FORMAT Se escribe en la pantalla LCD 3 cuadraditos , representando que se esta evolucionando el formateo. MOVLW 0XFF PAGESEL DATO CALL DATO PAGESEL HD_FORMAT INCF AUX2,F MOVLW 0XFF PAGESEL DATO CALL DATO PAGESEL HD_FORMAT INCF AUX2,F MOVLW 0XFF PAGESEL DATO CALL DATO PAGESEL HD_FORMAT INCF AUX2,F Se carga el registro LBA el cual apunta al sector del disco 0x140. Sector 320 inicio de la FAT 2. MOVLW 0X40 MOVWF LBA70 MOVLW 0X01 MOVWF LBA158 Se carga en los registros que apuntan a la memoria externa la direccion con la direccion del sector de proposito general. HD_FORMAT4 MOVLW 0X7C MOVWF DIREC_H CLRF DIREC_L Se escribe el sector a la direccion LBA el contenido del sector de uso general , tambien 0. PAGESEL W_HD_SECTOR CALL W_HD_SECTOR PAGESEL HD_FORMAT4 Se comprueba que la rutina anterior de escribir sector no me a provocado error. Si se a producido error este salta a la etiqueta HD_FORMAT_ERR. BTFSC COM_ERR ;COMPRUEBO QUE NO ME RET. ERROR GOTO HD_FORMAT_ERR Se incrementa la parte baja del registro LBA , el cual apuntara al sector 321. INCF LBA70,F ;INCREMENTO LA DIRECCION LBA Se comprueba si la parte baja del registro LBA vale 0x50 , si es asi sale del bucle , sino continuara incrementando y grabando el sector de uso general previamente cargado a ceros . MOVLW 0X50 ;BORRO 16 SECTORS DE LA FAT2 XORWF LBA70,W BTFSS STATUS,Z GOTO HD_FORMAT4 Se coloca el cursor en la posición de la pantalla LCD que indica el registro de proposito general . MOVF AUX2,W ;COLOCO EL CURSOR EN LA PAGESEL COMANDO ;POSICION DE LA CALL COMANDO ;PROGRES BAR PAGESEL HD_FORMAT

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 139 -

Se escribe en la pantalla LCD 3 cuadraditos , representando que se esta evolucionando el formateo. MOVLW 0XFF PAGESEL DATO CALL DATO PAGESEL HD_FORMAT INCF AUX2,F MOVLW 0XFF PAGESEL DATO CALL DATO PAGESEL HD_FORMAT INCF AUX2,F MOVLW 0XFF PAGESEL DATO CALL DATO PAGESEL HD_FORMAT INCF AUX2,F Se carga en los registros que apuntan al sector del disco duro con al dirección del sector 576 , sector de inicio del directorio. MOVLW 0X40 MOVWF LBA70 MOVLW 0X02 MOVWF LBA158 Se carga en los registros que apuntan a la memoria externa la direccion con la direccion del sector de proposito general. MOVLW 0X7C MOVWF DIREC_H CLRF DIREC_L Se escribe el sector a la direccion LBA el contenido del sector de uso general , tambien 0. PAGESEL W_HD_SECTOR CALL W_HD_SECTOR PAGESEL HD_FORMAT Se comprueba que la rutina anterior de escribir sector no me a provocado error. Si se a producido error este salta a la etiqueta HD_FORMAT_ERR. BTFSC COM_ERR ;COMPRUEBO QUE NO ME RET. ERROR GOTO HD_FORMAT_ERR Se coloca el cursor en la posición de la pantalla que indica el registro de proposito general. MOVF AUX2,W ;COLOCO EL CURSOR EN LA PAGESEL COMANDO ;POSICION DE LA CALL COMANDO ;PROGRES BAR PAGESEL HD_FORMAT Se escriben 2 cuadraditos en la posición actual del cursor. MOVLW 0XFF PAGESEL DATO CALL DATO PAGESEL HD_FORMAT INCF AUX2,F MOVLW 0XFF PAGESEL DATO CALL DATO PAGESEL HD_FORMAT_FIN GOTO HD_FORMAT_FIN HD_FORMAT_ERR NOP

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 140 -

Si alguna accion de escribir sector en el disco duro a provocado error el programa salta a esta línea de codigo. Lo primero que se hace es borrar el contenido actual de la pantalla. PAGESEL BORRA_LCD ;SI ME PROBOCA ERROR SE CALL BORRA_LCD ;EMPIEZA A EJECUTAR ESTA LINEA PAGESEL HD_FORMAT Se imprime por pantalla un mensaje que indica que se a producido un error de entrada salida al disco duro. MOVLW MIS16 PAGESEL FRASE CALL FRASE PAGESEL HD_FORMAT MOVLW 0XC0 PAGESEL COMANDO CALL COMANDO PAGESEL HD_FORMAT MOVLW MIS24 PAGESEL FRASE2 CALL FRASE2 PAGESEL HD_FORMAT El pograma entra en un bucle infinito de tal manera que no evoluciona hasta que no se le ejecute un reset por hardware a la placa. GOTO $-1 ;PROGRAMA PARADO Si el formateo se concluye sin problema alguno el codigo salta a esta línea. En primer paso lo que se hace es borrar la LCD , y si coloca el cursor en una posición intermedia de la pantalla LCD. HD_FORMAT_FIN NOP PAGESEL BORRA_LCD ;PRESENTO LA PANTALLA DE CALL BORRA_LCD ;FIN DE FORMATEO PAGESEL HD_FORMAT MOVLW 0XC5 PAGESEL COMANDO CALL COMANDO PAGESEL HD_FORMAT Se presenta por pantalla el mensaje numero 25 del array de mensajes. MOVLW MIS25 PAGESEL FRASE2 CALL FRASE2 PAGESEL HD_FORMAT Se coloca el cursor en una posición intermedia de la pantalla LCD pero de la segunda línea. MOVLW 0X97 PAGESEL COMANDO CALL COMANDO PAGESEL HD_FORMAT Se representa por pantalla el mensaje numero 26. MOVLW MIS26 PAGESEL FRASE2 CALL FRASE2 PAGESEL HD_FORMAT Se restauran los registros previamente salvados al iniciar la rutina , con el fin de dejar los puertos y registros necesarios tal y como estaban. PAGESEL RESTAURA CALL RESTAURA PAGESEL HD_FORMAT RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 141 -

;==================================================================; ; RUTINA PARA LEER EL REGISTRO DE ERROR ;==================================================================; R_HD_ERROR BSF HD_LED Llamo a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro PAGESEL SALVA CALL SALVA PAGESEL R_HD_ERROR Modifico los puertos , los pongo en salida ya que en primer momento debo de modificar los registros específicos del disco duro para poder acceder a leer el registro. BANKSEL TRISD CLRF TRISD CLRF TRISC BANKSEL PORTD MOVLW B'10001000' MOVWF PORTE PAGESEL HD_LE CALL HD_LE PAGESEL R_HD_ERROR Puertos del micro en modo entrada. BANKSEL TRISC MOVLW 0XFF MOVWF TRISC MOVWF TRISD BANKSEL PORTD MOVLW 0X01 MOVWF PORTE BSF PORTB,1 MOVF PORTD,W MOVWF HD_ERROR BCF PORTB,1 BCF HD_LED PAGESEL RESTAURA CALL RESTAURA PAGESEL R_HD_ERROR RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 142 -

;=====================================================================; ; RUTINA PARA LEER EL REGISTRO DE ERROR EXTENDIDO ;=====================================================================; R_HD_EX_ERROR BSF HD_LED Llamo a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro PAGESEL SALVA CALL SALVA PAGESEL R_HD_EX_ERROR BCF UNIDAD PAGESEL W_HD_DEVICE CALL W_HD_DEVICE PAGESEL R_HD_EX_ERROR MOVLW 0X03 MOVWF COMMAND PAGESEL W_HD_COMMAND CALL W_HD_COMMAND PAGESEL R_HD_EX_ERROR PAGESEL R_HD_ERROR CALL R_HD_ERROR PAGESEL R_HD_EX_ERROR BSF HD_LED PAGESEL RESTAURA CALL RESTAURA PAGESEL R_HD_EX_ERROR RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 143 -

;======================================================================= ; RUTINA PARA RECONSTRUIR LA ESTRUCTURA FAT16 , PARTICION DE 2.1Gb ;======================================================================= RECOSTRUCT_FAT

NOP Llamo a la función que me guarda el valor de los registros que me indican el estado de los puertos de entrada salida, de esta forma al salir de la función se puede restaurar el estado de los puertos , de tal forma que se quedan de la misma forma que cuando se entro. PAGESEL SALVA CALL SALVA Se llama a la función que borra la LCD. PAGESEL BORRA_LCD CALL BORRA_LCD Se representa por pantalla el mensaje numero 32 del array de mensajes. MOVLW MIS32 ;ETIQUETA PARTICION PAGESEL FRASE2 CALL FRASE2 Se coloca el cursor en la tercera línea de la LCD. MOVLW 0X94 ;TERCERA LINEA PAGESEL COMANDO CALL COMANDO Se representa el mensaje numero 23 , del array , se trata de una progress bar. MOVLW MIS23 ;PROGRESS BAR PAGESEL FRASE2 CALL FRASE2 Coloco el cursor en el inicio de la Progress Bar. MOVLW 0X98 ;INDICO DONDE EMPIEZA LA PAGESEL COMANDO ;PROGRESS BAR CALL COMANDO Se carga en los registros LBA de la Ram del procesador la direccion del primer sector de la FAT 16 , en nuestro caso el primer sector se coloca en el sector 0. CLRF LBA70 CLRF LBA158 CLRF LBA2316 Se carga en los registros internos de la Ram del procesador el sector que se debe de grabar en la direccion contenida en el LBA. En este caso la información de la partición FAT esta contenida en la EEPROM externa al micro , en la direccion 0x80. MOVLW 0X80 ;INICIO DEL SECTOR EN EEPROM SEC. 0 MOVWF DIREC_H CLRF DIREC_L Se llama a la función que graba el sector en el disco , esta función solo graba un sector a la vez por transferencia PIO. PAGESEL W_HD_SECTOR ;ESCRITURA DEL SECTOR 0 CALL W_HD_SECTOR PAGESEL RECOSTRUCT_FAT Se comprueba si la ejecución de la función anterior me a probocado error. Si se a probocado se salta a la etiqueta RECOSTRUCT_FAT1. BTFSC COM_ERR ;MIRO SI ME PROBOCA ERROR

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 144 -

GOTO RECOSTRUCT_FAT1 Se rellenan 2 cuadritos de la progress bar. MOVLW 0XFF ;IMPRIMO DOS CUADRADITOS PAGESEL DATO CALL DATO MOVLW 0XFF PAGESEL DATO CALL DATO Se carga en los registros de la LBA la direccion correspondiente al proximo sector a grabar en el disco. En este caso la dirección 0x00003F. MOVLW 0X3F MOVWF LBA70 Se llama de nuevo a la función de grabar sector. PAGESEL W_HD_SECTOR ;ESCRITURA DEL SECTOR 63 CALL W_HD_SECTOR PAGESEL RECOSTRUCT_FAT Se comprueba si la ejecución de la función anterior me a probocado error. Si se a probocado se salta a la etiqueta RECOSTRUCT_FAT1. BTFSC COM_ERR ;MIRO SI ME PROBOCA ERROR GOTO RECOSTRUCT_FAT1 Se rellenan 2 cuadritos de la progress bar. MOVLW 0XFF ;IMPRIMO DOS CUADRADITOS PAGESEL DATO CALL DATO MOVLW 0XFF PAGESEL DATO CALL DATO Se incrementa el contenido del registro LBA70 , en nuestro caso quedara de la forma 0x000040. INCF LBA70,F Se llama de nuevo a la función de grabar sector. PAGESEL W_HD_SECTOR ;ESCRITURA DEL SECTOR 64 CALL W_HD_SECTOR PAGESEL RECOSTRUCT_FAT Se comprueba si la ejecución de la función anterior me a probocado error. Si se a probocado se salta a la etiqueta RECOSTRUCT_FAT1. BTFSC COM_ERR ;MIRO SI ME PROBOCA ERROR GOTO RECOSTRUCT_FAT1 Se rellenan 2 cuadritos de la progress bar. MOVLW 0XFF ;IMPRIMO DOS CUADRADITOS PAGESEL DATO CALL DATO MOVLW 0XFF PAGESEL DATO CALL DATO Se carga en el registro de la LBA de los bits 8 – 15 el valor 0x01 , sin tocar el contenido de los restantes registros , en nuestro caso quedara 0x000140. MOVLW 0X01 MOVWF LBA158 Se carga en los registros que apuntan a la memoria externa con la direccion del sector correspondiente a la direccion contenida en los registros de la LBA.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 145 -

MOVLW 0X84 MOVWF DIREC_H CLRF DIREC_L Se llama de nuevo a la función de grabar sector. PAGESEL W_HD_SECTOR ;ESCRITURA DEL SECTOR 320 CALL W_HD_SECTOR PAGESEL RECOSTRUCT_FAT Se comprueba si la ejecución de la función anterior me a probocado error. Si se a probocado se salta a la etiqueta RECOSTRUCT_FAT1. BTFSC COM_ERR ;MIRO SI ME PROBOCA ERROR GOTO RECOSTRUCT_FAT1 Se rellenan 2 cuadritos de la progress bar. MOVLW 0XFF ;IMPRIMO DOS CUADRADITOS PAGESEL DATO CALL DATO MOVLW 0XFF PAGESEL DATO CALL DATO Se carga en el registro de la LBA de los bits 8 – 15 el valor 0x02 , sin tocar el contenido de los restantes registros , en nuestro caso quedara 0x000240. MOVLW 0X02 MOVWF LBA158 Se llama de nuevo a la función de grabar sector. PAGESEL W_HD_SECTOR CALL W_HD_SECTOR ;ESCRITURA DEL SECTOR 576 PAGESEL RECOSTRUCT_FAT Se comprueba si la ejecución de la función anterior me a probocado error. Si se a probocado se salta a la etiqueta RECOSTRUCT_FAT1. BTFSC COM_ERR ;MIRO SI ME PROBOCA ERROR GOTO RECOSTRUCT_FAT1 Se rellenan 2 cuadritos de la progress bar. MOVLW 0XFF ;IMPRIMO DOS CUADRADITOS PAGESEL DATO CALL DATO MOVLW 0XFF PAGESEL DATO CALL DATO Se llama a la función que borra la LCD. PAGESEL BORRA_LCD ;PRESENTO LA PANTALLA DE CALL BORRA_LCD ;FIN DE PARTICION Se coloca el cursor en la posición intermedia de la pantalla LCD. MOVLW 0XC0 PAGESEL COMANDO CALL COMANDO Se representa por pantalla el mensaje numero 33. MOVLW MIS33 PAGESEL FRASE3 CALL FRASE3

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 146 -

Se coloca el cursor en la posición intermedia de la pantalla y en la segunda fila de la LCD. MOVLW 0X97 PAGESEL COMANDO CALL COMANDO Se representa por pantalla el mensaje numero 26. MOVLW MIS26 PAGESEL FRASE2 CALL FRASE2 PAGESEL RECOSTRUCT_FAT Se salta a la etiqueta RECOSTRUCT_FAT2 , señal de que el particionamiento a sido correcto. GOTO RECOSTRUCT_FAT2 RECOSTRUCT_FAT1

NOP En caso de haberse probocado un error en el momento de particionar el disco , primero se lee el registro de error del disco para saber el origen del fallo. PAGESEL R_HD_ERROR ;LEO EL REGISTRO DE ERROR CALL R_HD_ERROR Se borra la LCD. PAGESEL BORRA_LCD ;SI ME PROBOCA ERROR SE CALL BORRA_LCD ;EMPIEZA A EJECUTAR ESTA LINEA Se representa en la LCD el mensaje numero 16. Del array de mensajes. MOVLW MIS16 PAGESEL FRASE CALL FRASE Se coloca el cursor en una posición intermedia de la LCD y en la segunda fila. MOVLW 0XC0 PAGESEL COMANDO CALL COMANDO Se representa el mensaje numero 24 del array de mensajes. MOVLW MIS24 PAGESEL FRASE2 CALL FRASE2 PAGESEL RECOSTRUCT_FAT Se genera un bucle infinito hasta que no se ejecuta un reset por software. Este bucle se a implementado ya que al tratarse de una demostración practica del proyecto no se a implementado una rutina para poder resoler el problema de forma automatica. GOTO $-1 Como se a formateado el disco se borran los registros que contenian la información del disco. Al igual que los registros que contenian el tamaño de disco ocupado. RECOSTRUCT_FAT2

CLRF N_SEC_CLUS ;BORRO LAS VARIABLES CLRF N_CLUS_L ;DE CONTROL DE LA CLRF N_CLUS_H ;FAT CLRF N_SEC_FAT CLRF CF0 CLRF CF1 CLRF CF2 CLRF CF3

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 147 -

Se guarda el contenido de los registros que contiene la información del disco en la memoria eeprom interna del micro. PAGESEL BACKUP ;GUARDO EN EEPROM CALL BACKUP Se restauran los valores de los registros , para poderlos dejar tal y como estaban en el momento de entrar en la rutina. PAGESEL RESTAURA CALL RESTAURA PAGESEL RECOSTRUCT_FAT RETURN

7.1.4. ENABLES.inc. Este incluye contiene las rutinas encargadas de ejecutar los impulsos de habilitacion de los diferentes dispositivos externos . Al ser un sistema con un bus comun y limitado en pines de salida del Micro , se obto por la colocacion de un decodificador de direcciones y una unica línea de enable. ;==================================================================; ; RUTINAS PARA LA EJECUCION DE PULSOS DE ENABLE ;==================================================================; ; Oriol Monclus Sanchez 29 / 5 / 2004 ;===================================================================; ; RUTINA QUE EJECUTA UN PULSO AL LATCH DE LA LCD ; ;===================================================================; Se coloca en el puerto E del micro la direccion que ocupa el dispositiva habilitar en el decodificador de direcciones. A través de la línea 0 del puerto B se ejecuta la habilitacion del chip. LCD_LE MOVLW 0X03 MOVWF PORTE BSF PORTB,1 NOP NOP BCF PORTB,1 RETURN ;===================================================================; ; RUTINA QUE EJECUTA UN PULSO AL LATCH DE DIRECCIONES ; ;===================================================================; Se coloca en el puerto E del micro la direccion que ocupa el dispositiva habilitar en el decodificador de direcciones. A través de la línea 0 del puerto B se ejecuta la habilitacion del chip. ALE MOVLW 0X06 MOVWF PORTE BSF PORTB,1 NOP NOP BCF PORTB,1 RETURN ;===================================================================; ; RUTNIA QUE EJECUTA UN PULSO EN EL LATCH DEL DISCO_DURO ;===================================================================; Se coloca en el puerto E del micro la direccion que ocupa el dispositiva habilitar en el decodificador de direcciones. A través de la línea 0 del puerto B se ejecuta la habilitacion del chip. HD_LE MOVLW 0X07 MOVWF PORTE BSF PORTB,1 NOP NOP BCF PORTB,1

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 148 -

RETURN ;===================================================================; ; RUTINA QUE EJECUTA UN ENABLE A LA LCD ;===================================================================; Se coloca en el puerto E del micro la direccion que ocupa el dispositiva habilitar en el decodificador de direcciones. A través de la línea 0 del puerto B se ejecuta la habilitacion del chip. LCD_E MOVLW 0X02 MOVWF PORTE BSF PORTB,1 NOP BCF PORTB,1 RETURN ;===================================================================; ; RUTINA QUE EJECUTA UN ENABLE A LA LINEA DE ESCRITURA ; DE LA MEM EXTERNA ;===================================================================; Se coloca en el puerto E del micro la direccion que ocupa el dispositiva habilitar en el decodificador de direcciones. A través de la línea 0 del puerto B se ejecuta la habilitacion del chip. WE MOVLW 0X04 MOVWF PORTE BSF PORTB,1 NOP NOP BCF PORTB,1 RETURN ;===================================================================; ; RUTINA QUE EJECUTA UN ENABLE A LA LINEA ; DE ESCRITURA DEL DISCO DURO ;===================================================================; Se coloca en el puerto E del micro la direccion que ocupa el dispositiva habilitar en el decodificador de direcciones. A través de la línea 0 del puerto B se ejecuta la habilitacion del chip. DIOW MOVLW 0X00 MOVWF PORTE BSF PORTB,1 NOP NOP BCF PORTB,1 RETURN

7.1.5. FAT16.inc. ;======================================================================= ; RUTINA PARA INCREMENTAR LA CAPACIDAD ACTUAL DEL FICHERO EN ; 512 BYTES , ESTO SE HACE CADA VEZ QUE SE GRABA UN SECTOR ;======================================================================= Esta rutina lo que nos hace es incrementar el contenido de la posición correpondiente a cada fichero de la FAT el cual indica el tamaño en disco en 512 bytes. Esta rutina se llamara cada vez que enviemos un sector a disco. INC_CAPACIDAD NOP Se suma al contenido a las variables que me indican el contenido actual de fichero 512 bytes que representan un sector.

MOVF CF0,W ADDLW 0X00 MOVWF CF0 MOVF CF1,W ADDLW 0X02 MOVWF CF1 BTFSS STATUS,C

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 149 -

GOTO INC_2 INCF CF2,F BTFSC STATUS,Z INCF CF3,F Se carga la variable AUX2 a valor 5 , bucle que nos actualiza los 5 ficheros por igual. INC_2 MOVLW .5 MOVWF AUX2 Se apunta a la primera posición de la memoria RAM donde esta el contenido del tamaño de fichero del primer fichero de la FAT. Se accede al sector de directorio temporal en RAM. MOVLW 0X14 MOVWF DIREC_H MOVLW 0X3C MOVWF DIREC_L Se graba alli el nuevo valor de tamaño de fichero. INC_3 MOVF CF0,W MOVWF DAT PAGESEL W_MEM_EX CALL W_MEM_EX PAGESEL INC_CAPACIDAD INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F MOVF CF1,W MOVWF DAT PAGESEL W_MEM_EX CALL W_MEM_EX PAGESEL INC_CAPACIDAD INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F MOVF CF2,W MOVWF DAT PAGESEL W_MEM_EX CALL W_MEM_EX PAGESEL INC_CAPACIDAD INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F MOVF CF3,W MOVWF DAT PAGESEL W_MEM_EX CALL W_MEM_EX PAGESEL INC_CAPACIDAD Se le suma el offset correpondiente para pasar a apuntar a la segunda posición de memoria donde indica el contenido del espacio ocupado en disco del segundo fichero de la FAT. MOVF DIREC_L,W ADDLW 0X1D MOVWF DIREC_L BTFSC STATUS,C INCF DIREC_H,F Se decrementa el valor de la variable AUX2 y si no es cero se salta al proximo fichero de la estructura FAT. DECFSZ AUX2,F ;BUCLE DE LOS 5 CANALES GOTO INC_3

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 150 -

Se apunta al principio del sector del directorio en la RAM. MOVLW 0X14 ;APUNTO AL SECTOR DE ROOT MOVWF DIREC_H ;EN RAM CLRF DIREC_L Se apunta al principio del sector del directorio en el disco. MOVLW low INI_SEC_DIR ;APUNTO AL SECTOR DE ROOT MOVWF LBA70 ;EN DISCO MOVLW high INI_SEC_DIR MOVWF LBA158 CLRF LBA2316 Se llama a la rutina que nos transfiere un sector de la RAM al disco. PAGESEL W_HD_SECTOR ;GRABO DE NUEVO EL ROOT EN CALL W_HD_SECTOR ;DISCO PAGESEL INC_CAPACIDAD Se comprueba si la operación a generado error. Si nos a generado error borra la LCD y nos muetra el mensaje 24 ( mensaje de error ). BTFSS COM_ERR ;SI LA ACCION DE ESCRIBIR GOTO INCREMENTA_FIN ;EN DISCO ME PROBOCA ERROR PAGESEL BORRA_LCD ;LO INDICO Y PARO EL SISTEMA CALL BORRA_LCD MOVLW MIS24 PAGESEL FRASE2 CALL FRASE2 Se deshabilitan todas la interrupciones y s detiene el sistema. BCF INTCON,GIE SLEEP Fin de la rutina. INCREMENTA_FIN NOP PAGESEL INC_CAPACIDAD RETURN ;======================================================================= ; RUTINA PARA CARGAR EN LA RAM EL SECTOR DE FAT QUE SE ESTABA O ; ESTE UTILIZANDO Y EL DIRECTORIO DE DISCO ; SE ALMACENARA EN LOS RESPECTIVOS LUGARES DE LA RAM ;======================================================================= Esta rutina lo que nos hace es volcar el sector de la FAT que se esta utilizando en este momento al sector temporal de la RAM. Se selecciona de los 255 sectores que forman la FAT el ultimo que se utilizo o sea el que se estaba utilizando en el momento de la desconexion y se carga en el sector temporal de la RAM. V_DIR_FAT NOP Se salvan los registros de los puertos de entrada salida. PAGESEL SALVA CALL SALVA PAGESEL V_DIR_FAT Se carga en los registros de la LBA la direccion de inicio de la FAT1. MOVLW low INI_SEC_FAT1 ;VUELCO EL SECTOR DE FAT MOVWF LBA70 ;QUE SE ESTABA UTILIZANDO MOVLW high INI_SEC_FAT1 MOVWF LBA158 CLRF LBA2316 Se le suma el offset , o sea el numero de sectores de FAT ocupados.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 151 -

MOVF N_SEC_FAT,W ;SUMO EL OFFSET DEL SECTOR ADDWF LBA70,F ;DE FAT BTFSC STATUS,C INCF LBA158,F BTFSC STATUS,C INCF LBA2316,F Se apunta al inicio del sector de FAT temporal en RAM. MOVLW low SEC_FAT_EN_RAM MOVWF DIREC_L MOVLW high SEC_FAT_EN_RAM MOVWF DIREC_H Se llama a la rutina leer sector para que nos tranfiera el sector. Esta rutina nos transfiere un sector desde la direccion LBA a la direccion de la RAM. PAGESEL R_HD_SECTOR CALL R_HD_SECTOR PAGESEL V_DIR_FAT Se carga en los registros LBA la direccion del sector de directorio del disco. MOVLW low INI_SEC_DIR ;VUELCO EL SECTOR DE DIR MOVWF LBA70 ;EN LA RAM MOVLW high INI_SEC_DIR MOVWF LBA158 CLRF 2316 Se apunta al sector de directorio temporal de la RAM. MOVLW low SEC_DIR_EN_RAM MOVWF DIREC_L MOVLW high SEC_DIR_EN_RAM MOVWF DIREC_H Se llama a la rutina leer sector para que nos tranfiera el sector. Esta rutina nos transfiere un sector desde la direccion LBA a la direccion de la RAM. PAGESEL R_HD_SECTOR CALL R_HD_SECTOR PAGESEL V_DIR_FAT Se apunta a la posición de memoria del sector del directorio de la RAM donde indica el tamaño de fichero en disco. MOVLW low SEC_DIR_EN_RAM ;COJO EL TAMAÑO DEL FILE MOVWF DIREC_L ;Y LO COLOCO EN EL REGISTRO MOVLW high SEC_DIR_EN_RAM MOVWF DIREC_H Se le suma el offset. MOVF DIREC_L,W ;SUMO EL OFFSET EN LA RAM ADDLW 0X3C BTFSC STATUS,C INCF DIREC_H,F MOVWF DIREC_L Se lee el primer byte. PAGESEL R_MEM_EX CALL R_MEM_EX PAGESEL V_DIR_FAT MOVF DAT,W MOVWF CF0 Se incrementa los registros que apuntan al registro de tamaño. INCF DIREC_L,F BTFSC STATUS,Z

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 152 -

INCF DIREC_H,F Se lee el segundo byte. PAGESEL R_MEM_EX CALL R_MEM_EX PAGESEL V_DIR_FAT MOVF DAT,W MOVWF CF1 INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F Se lee el tercer byte. PAGESEL R_MEM_EX CALL R_MEM_EX PAGESEL V_DIR_FAT MOVF DAT,W MOVWF CF2 INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F Se lee el cuarto byte. PAGESEL R_MEM_EX CALL R_MEM_EX PAGESEL V_DIR_FAT MOVF DAT,W MOVWF CF3 Se restauran los registros de los puertos de entrada salida. PAGESEL RESTAURA CALL RESTAURA PAGESEL V_DIR_FAT RETURN ;======================================================================= ; RUTINA PARA CALCULAR EL SECTOR AL QUE SE DEBE DE ESCRIBIR ; ESTE ALGORITMO , CALCULA LA POSICION RELATIVA A PARTIR DE ; EL SECTOR DEL FICHERO QUE SE QUIERA ESCRIBIR , EL CLUSTER ; Y EL NUMERO DE SECTOR DE CLUSTER ; [[((Nc*5)+Nf)*64]+608]+Ns = Sector ;======================================================================= Esta rutina nos calcula la direccion del sector el cual debemos acceder a partir del fichero el cual queramos trabajar , el numero de clusters ocupados y los sectores en uso. El sector de destino se calcula mediante la formula : [[((Nc*5)+Nf)*64]+608]+Ns = Sector CALC_SECTOR NOP Se borran los registros de la LBA.

CLRF LBA70 CLRF LBA158 CLRF LBA2316 Se calcula el primer terminio de la expresión , clusters x 5. MOVLW .4 ;MULTIPLICO EL CLUSTER PER 5 MOVWF AUX MOVF N_CLUS_L,W MOVWF LBA70 MOVF N_CLUS_H,W

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 153 -

MOVWF LBA158 CALC_SEC_1 MOVF N_CLUS_L,W ADDWF LBA70,F BTFSS STATUS,C GOTO CALC_SEC_3 INCF LBA158,F BTFSC STATUS,Z INCF LBA2316,F CALC_SEC_3 MOVF N_CLUS_H,W ADDWF LBA158,F BTFSC STATUS,C INCF LBA2316,F DECFSZ AUX,F GOTO CALC_SEC_1 Se le suma el numero de fichero para el cual quiero calcular el sector , de [ 0 a 4 ]. MOVF FICHERO,W ;SUMO EL INDICE DEL FICHERO ADDWF LBA70,F BTFSC STATUS,C INCF LBA158,F BTFSC STATUS,C INCF LBA2316,F Se multiplica el resultado anterior por 64. MOVLW .63 MOVWF AUX MOVF LBA70,W ;MULTIPLICO POR 64 MOVWF DIG0 MOVF LBA158,W MOVWF DIG1 MOVF LBA2316,W MOVWF DIG2 CALC_SEC_2 MOVF DIG0,W ADDWF LBA70,F BTFSS STATUS,C GOTO CALC_SEC_4 INCF LBA158,F BTFSC STATUS,Z INCF LBA2316,F CALC_SEC_4 MOVF DIG1,W ADDWF LBA158,F BTFSC STATUS,C INCF LBA2316,F MOVF DIG2,W ADDWF LBA2316,F DECFSZ AUX,F ;BUCLE DE 64 ITER. GOTO CALC_SEC_2 Se le suma 608 que es el offset al principio del sector de datos. MOVLW 0X60 ;SUMO 608 ADDWF LBA70,F BTFSC STATUS,C INCF LBA158,F BTFSC STATUS,Z INCF LBA2316,F MOVLW 0X02 ADDWF LBA158,F

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 154 -

BTFSC STATUS,C INCF LBA2316,F Se le suma el numero de sectores en uso. MOVF N_SEC_CLUS,W ;SUMO EL NUMERO DE SECTOR ADDWF LBA70,F ;DEL CLUSTER ACTIVO BTFSC STATUS,C INCF LBA158,F BTFSC STATUS,Z INCF LBA2316,F RETURN ;======================================================================= ; RUTINA PARA RESERVAR UN NUEVO CLUSTER , ESTO SE HACE CADA VEZ ; QUE SE HAN GRABADO 64 SECTORES , YA QUE ES EL NUMERO DE ; SECTORES QUE TIENE UN CLUSTER ;======================================================================= Esta rutina lo que hace es reservar un cluster para cada fichero en la FAT1. Tambien nos comprueba que el numero de clusters ocupados por fichero no exceda de el numero maximo ya que sino se deberá entender que el disco esta lleno. NUEVO_CLUSTER NOP Se actualizan los registros relacionados con el manejo de la FAT. Se borra el registro de numero de sectores ocupados por cluster y se incremeta en 1 el numero de clusters ocupados por fichero.

CLRF N_SEC_CLUS ;LIMPIO EL OFFSET DEL CLUS

INCF N_CLUS_L,F ;INCREMENTO EL NUMERO DE BTFSC STATUS,Z ;CLUS QUE SE UTILIZA INCF N_CLUS_H,F ;COMPROBACION DE DISCO LLENO , SE CALCULA MEDIANTE CLUSTERES ;LLENOS , MAX VALOR DE LA VARIABLE N_CLUS = 13103 ;LO QUE QUIERE DECIR QUE CADA FICHERO SE RESERVA 13103 ;CLUSTERS PARA EL SOLO 13103 = 0X332F Se comprueba que el numero de clusters ocupados en el disco no sea mayor de 13103 por fichero , ya que en un sistema con FAT16 el numero maximo de clusteres direccionables es 65536. MOVLW 0X33 XORWF N_CLUS_H,W BTFSS STATUS,Z GOTO FREE_SPACE MOVLW 0X30 XORWF N_CLUS_L,W BTFSS STATUS,Z GOTO FREE_SPACE ;MUESTRO QUE NO HAY MAS ESPACIO EN DISCO PARA PODER ;ALMACENAR MAS INFORMACION Si se a detectado que el numero de clusteres ocupados es superior a 13103 se deberá de imprimir el mensaje de información conforme se a llegado al valor maximo de capacidad. Se borra la LCD. PAGESEL BORRA_LCD CALL BORRA_LCD Se representa por pantalla el mensaje 38 del array de mensajes. MOVLW MIS38 PAGESEL FRASE3 CALL FRASE3 Se coloca el cursor en una posición intermedia de la LCD.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 155 -

MOVLW 0XC0 PAGESEL COMANDO CALL COMANDO Se imprime el mensaje 39 del array de mensajes. MOVLW MIS39 PAGESEL FRASE3 CALL FRASE3 PAGESEL NUEVO_CLUSTER Se pasa al modo sleep ya que el sistema no puede evolucionar. SLEEP Si queda espacio disponible en disco se salta a este punto del codigo. FREE_SPACE MOVLW low SEC_FAT_EN_RAM MOVWF DIREC_L MOVLW high SEC_FAT_EN_RAM MOVWF DIREC_H Se mira si estamos reservando cluster en el primer sector de la FAT , si es asi sumamos 4 para saltar la estructura fija. ( FF F8 ). MOVF N_SEC_FAT,W ;SI ESTOY EN EL PRIMER BTFSS STATUS,Z ;SECTOR DE FAT , SUMO 4 GOTO NUEVO_CLUSTER4 ;PARA SALTAR LA ESTRUCTURA MOVLW .4 ;FIJA ADDWF DIREC_L,F Se busca el word que nos indica final de la estructura FAT, ( FF FF ). NUEVO_CLUSTER4 NOP PAGESEL R_MEM_EX CALL R_MEM_EX PAGESEL NUEVO_CLUSTER MOVF DAT,W MOVWF DIG0 INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F PAGESEL R_MEM_EX CALL R_MEM_EX PAGESEL NUEVO_CLUSTER MOVF DAT,W Se compara los dos bytes leidos del sector de FAT temporal en RAM con la cadena 0xFFFF. Si se encuentra la estructura 0xFFFF se salta a la rutina RELLENAR . XORLW 0XFF ;BUSCO LA CADENA 0XFFFF BTFSS STATUS,Z GOTO NUEVO_CLUSTER1 MOVF DIG0,W XORLW 0XFF BTFSS STATUS,Z GOTO NUEVO_CLUSTER1 PAGESEL RELLENA_INFO_CLUS ;LLAMO A LA RUTINA GOTO RELLENA_INFO_CLUS ;LA CUAL ME RELLENA PAGESEL NUEVO_CLUSTER ;EL SECTOR DE FAT RETURN ;CORRECTAMENTE Si no se encuentra la cadena sde final de cluster , se incrementa el apuntador a memoria y se lee el siguiente valor. NUEVO_CLUSTER1 INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 156 -

GOTO NUEVO_CLUSTER4 RETURN ;======================================================================= ; RUTINA PARA GUARDAR EN EL SECTOR DE RAM RESERVADO EL SIGUIENTE ; SECTOR DE LA FAT , LO QUE NOS HACE ES GUARDAR EL SECTOR ; ACTUAL EN SU DEVIDA POSICION Y NOS VUELCA EL SIGUIENTE A LA ; RAM , TAMBIEN NOS INCREMENTA LA VARIABLE N_SEC_FAT ;======================================================================= Esta rutina lo que hace es volcar el siguiente sector de FAT del disco a la RAM . El primer paso que ejecuta es guardar el sector de la RAM en su lugar correspondiente , a continuación incrementar el valor de la variable que nos indica el sector de FAT que se esta utilizando y bajarlo al espacio temporal en la memoria RAM. NUEVO_SEC_FAT CLRF DIREC_L CLRF DIREC_H Se apunta al primer sector de la FAT1 en el disco. MOVLW low INI_SEC_FAT1 MOVWF LBA70 MOVLW high INI_SEC_FAT1 MOVWF LBA158 CLRF LBA2316 Se suma el offset del numero de sectores utilizados. MOVF N_SEC_FAT,W ;SUMO EL OFFSET DEL SECTOR DE FAT ADDWF LBA70,F ;NO SE CONTEMPLA EL INCREMENTO DE BTFSC STATUS,C ;LBA2316 YA QUE NUNCA LLEGA INCF LBA158,F Se apunta a la direccion de memoria temporal RAM donde esta el sector de FAT1 que se estaba utilizando en este momento. MOVLW low SEC_FAT_EN_RAM MOVWF DIREC_L MOVLW high SEC_FAT_EN_RAM MOVWF DIREC_H Se llama a la rutina que nos graba el sector de la RAM a al disco duro. PAGESEL W_HD_SECTOR ;GUARDO EL SECTOR QUE ESTABA CALL W_HD_SECTOR ;EN RAM AL DISCO DURO PAGESEL NUEVO_SEC_FAT Se comprueba si la ultima accion a producido error . Si no se a producido se salta a reserbar nuevo sectror. BTFSS COM_ERR ;SI LA ACCION DE ESCRIBIR GOTO NUEVO_SEC_FAT1 ;EN DISCO ME PROBOCA ERROR Si a producido error primero se borra la LCD , y a continuación se representa por pantalla el mensaje 24 del array de mensajes. El sistema pasa a modo sleep. PAGESEL BORRA_LCD ;LO INDICO Y PARO EL SISTEMA CALL BORRA_LCD MOVLW MIS24 PAGESEL FRASE2 CALL FRASE2 BCF INTCON,GIE SLEEP Se salta aquí si no se a producido error. Se incrementa el registro que nos indica el numero de sectores ocupados en la FAT.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 157 -

NUEVO_SEC_FAT1 INCF N_SEC_FAT,F ;INCREMENTO LA VARIABLE OFFSET ;EN FAT Se apunta a la posición de memoria donde se almacena el sector temporal de la FAT en RAM. MOVLW low SEC_FAT_EN_RAM MOVWF DIREC_L MOVLW high SEC_FAT_EN_RAM MOVWF DIREC_H Se incrementa el apuntador LBA para pasar a leer el siguiente sector de disco. INCF LBA70,F ;PASO AL SEGUENT SECTOR DE HD BTFSC STATUS,Z INCF LBA158,F Se llama a la función que nos lee el sector de disco y lo pasa a la RAM. PAGESEL R_HD_SECTOR ;VUELCO A LA RAM EL SIGUIENTE CALL R_HD_SECTOR ;SECTOR DE LA FAT PAGESEL NUEVO_SEC_FAT Se comprueba si el ultimo comando a producido error , si lo a producido se borra la LCD y se muestra un mensaje de error. Se detiene el sistema. BTFSS COM_ERR ;SI LA ACCION DE ESCRIBIR GOTO NUEVO_SEC_FAT2 ;EN DISCO ME PROBOCA ERROR PAGESEL BORRA_LCD ;LO INDICO Y PARO EL SISTEMA CALL BORRA_LCD MOVLW MIS24 PAGESEL FRASE2 CALL FRASE2 BCF INTCON,GIE SLEEP Se deberia de implementar el mismo procedimiento para la FAT2. NUEVO_SEC_FAT2 MOVLW low SEC_FAT_EN_RAM MOVWF DIREC_L MOVLW high SEC_FAT_EN_RAM MOVWF DIREC_H RETURN ;======================================================================= ; RUTINA PARA QUE UNA VEZ ENCONTRADO LA CADENA 0XFFFF NOS ; RELLENE DEVIDAMENTE EL SECTOR DE LA FAT , CON SUS ; CORRESPONDIENTES CLUSTERES ; UNA VEZ RELLENADOS NOS VUELCA DE NUEVO EL SECTOR AL HD ; EL NUMERO DE SECTOR SE CALCULA DE LA SIGUIENTE FORMA: ; VALOR_CLUSTER = ( N_CLUS(L/H) * 5 ) + 2 + FICHERO[0...4] ;======================================================================= Esta rutina rellena la información necesaria a partir de la cadena 0xFFFF encontrada a través de la rutina anterior. El numero de sector a reservar se calcula a partir de la formula : VALOR_CLUSTER = ( N_CLUS(L/H) * 5 ) + 2 + FICHERO[0...4] RELLENA_INFO_CLUS NOP Se hace una copia de la variable que me indica el numero de clusteres ocupados y se multiplican por 5. MOVLW .4 ;MULTIPLICO EL CLUSTER PER 5 MOVWF AUX ;EL VALOR MAXIMO SOLO PUEDE DAR ;0XFFFF YA QUE EL VALOR DE LA MOVF N_CLUS_L,W ;VARIABLE N_CLUS ESTA ACOTADO A MOVWF DIG0 ;13103 MOVF N_CLUS_H,W MOVWF DIG1 RELLENA_1 MOVF N_CLUS_L,W

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 158 -

ADDWF DIG0,F BTFSS STATUS,C GOTO RELLENA_2 INCF DIG1,F RELLENA_2 MOVF N_CLUS_H,W ADDWF DIG1,F DECFSZ AUX,F GOTO RELLENA_1 ;BUCLE DE MULTIPLICACION 5 Se suma 2 al resultado. MOVLW .2 ;SUMO EL OFFSET 2 DE LA FAT ADDWF DIG0,F BTFSC STATUS,C INCF DIG1,F Se retrocede una posición par asituarse justo encima de la cadena 0xFFFF DECF DIREC_L,F ;RESTO UNO A LA DIRECCION DE LA MOVLW 0XFF ;PARA PODER POSICIONARME AL XORWF DIREC_L,W ;PRINCIPIO DE LA CADENA 0XFFFF BTFSC STATUS,Z DECF DIREC_H,F Se genera un bucle de 5 ficheros para poder reservar 5 clusters. MOVLW .5 ;BUCLE DE 5 FICHEROS MOVWF AUX Se guarda en la posición actual de la RAM el valor ya calculado. RELLENA_4 MOVF DIG0,W MOVWF DAT Se escribe la parte baja. PAGESEL W_MEM_EX CALL W_MEM_EX PAGESEL RELLENA_INFO_CLUS Se incrementa el apuntador de la RAM y se comprueba que no salga del limite del sector. INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F El sector acaba en 0x1800 , el próximo cluster se tuviera que reservar fuera del este rango , se deberia de guardar el sector de la RAM al disco y volcar el siguiente. MOVF DIREC_H,W XORLW 0X18 BTFSC STATUS,Z CALL RELLENA_3 Se graba la parte alta. MOVF DIG1,W MOVWF DAT PAGESEL W_MEM_EX CALL W_MEM_EX PAGESEL RELLENA_INFO_CLUS INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F MOVF DIREC_H,W XORLW 0X18 BTFSC STATUS,Z

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 159 -

CALL RELLENA_3 INCF DIG0,F BTFSC STATUS,Z INCF DIG1,F DECFSZ AUX,F GOTO RELLENA_4 NOP ;A PARTIR DE AQUI , ;ES COLOCAN LA CADENA 0XFFFF A partir de aquí se vuelve a colocar las 5 cadenas de 0xFFFF para indicar que el cluster es ultimo.

MOVLW 0XFF ;ESTRUCTURA DE CLUSTER FINAL MOVWF DAT Se genera el bucle de los 5 ficheros. MOVLW .5 ;BUCLE DE 5 CANALES MOVWF AUX Se empieza a grabar las 5 cadenas de 0xFFFF. RELLENA_6 NOP PAGESEL W_MEM_EX CALL W_MEM_EX PAGESEL RELLENA_6 Se incrementa el apuntador a la direccion de memoria de la RAM. INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F Se comprueba que no haga llegado al final del sector reservado en la RAM. MOVF DIREC_H,W ;MIRO DE NO HABER LLEGADO XORLW 0X18 ;AL FINAL DEL SECTOR DE BTFSC STATUS,Z ;RAM GOTO RELLENA_5 Si no es asi se graba la parte alta de la cadena. PAGESEL W_MEM_EX CALL W_MEM_EX PAGESEL RELLENA_6 Se incrementa el apuntador a la RAM. INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F Se comprueba que no haga llegado al final de sector reservado en la RAM. MOVF DIREC_H,W XORLW 0X18 BTFSC STATUS,Z GOTO RELLENA_5 Se decrementa 1al registro de numero de fichero y si no llega a cero se ejecuta de nuevo el bucle. DECFSZ AUX,F GOTO RELLENA_6 GOTO GUARDA_SALE

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 160 -

;============================================= ; ESTA RUTINA SE EJECUTA SI SE DEBE DE RELLENAR ; FFFF EN EL SECTOR SIGUIENTE AL QUE SE ESTA ; UTILIZANDO ;============================================= Si durante la fase de grabacion de las cadenas de 0xFFFF se detecta de que se debe de continuar en el siguiente sector de la FAT se salta a esta línea de codigo. Se apunta al sector de proposito general de la RAM. RELLENA_5 MOVLW 0X7C ;APUNTO AL SECTOR DE MOVWF DIREC_H ;INTERCAMBIO DE LA RAM CLRF DIREC_L Se apunta al primer sector de la FAT del disco duro. MOVLW low INI_SEC_FAT1 ;APUNTO AL SECTOR MOVWF LBA70 ;DE FAT DEL HD MOVLW high INI_SEC_FAT1 MOVWF LBA158 CLRF LBA2316 Se le suma el offset que es el que indica el numero de sectores que se estan utilizando en este momento. MOVF N_SEC_FAT,W ;SUMO EL OFFSET DEL SECTOR ADDWF LBA70,F ;DE USO BTFSS STATUS,C GOTO RELLENA_12 INCF LBA158,F BTFSC STATUS,Z INCF LBA2316,F Se le suma 1 para pasar al siguiente sector. RELLENA_12 INCF LBA70,F ;+1 , PARA EL PROXIMO SECTOR BTFSS STATUS,Z GOTO RELLENA_7 INCF LBA158,F BTFSC STATUS,Z INCF LBA2316,F Se lee el sector y se pasa a la RAM. RELLENA_7 NOP PAGESEL R_HD_SECTOR CALL R_HD_SECTOR PAGESEL RELLENA_7 Se pasa a apuntar al sector de intercambio de la RAM . MOVLW 0X7C ;APUNTO AL SECTOR DE MOVWF DIREC_H ;INTERCAMBIO DE LA RAM CLRF DIREC_L Se continua escribiendo la cadena 0xFFFF en el sector de intercambio de la RAM. RELLENA_8 NOP PAGESEL W_MEM_EX CALL W_MEM_EX PAGESEL RELLENA_7 Se incrementa el apuntador a RAM. INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F Se escribe la parte alta de la cadena 0xFFFF. PAGESEL W_MEM_EX CALL W_MEM_EX

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 161 -

PAGESEL RELLENA_7 Se incrementa el apuntador. INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F Se decrementa el contador de numero de cadenas 0xFFFF que nos faltaban. DECFSZ AUX,F GOTO RELLENA_8 Se salta a esta etiqueta una vez se acabe la rutina. GOTO GUARDA_SALE_1 ;============================================= Si durante la reserva de clusteres se a detectado que se debia de continuar en el siguiente sector se salta a esta línea y se retorna. RELLENA_3 NOP PAGESEL NUEVO_SEC_FAT CALL NUEVO_SEC_FAT PAGESEL RELLENA_INFO_CLUS RETURN ;============================================= ; GUARDA_SALE_1 : ES PARA GUARDAR LOS 2 SECTORES ; DE FAT UNO A PARTIR DEL OTRO ; GUARDA_SALE : ES PARA GUARDAR UNICAMENTE EL ; SECTOR DE FAT ;============================================= Se salta a esta línea de codigo si se a tenia que coger el siguiente sector de la FAT para continuar escribiendo la cadena de 0xFFFF. Esta rutina nos guarda el el sector de FAT de la RAM en su correspondiente lugar en el HD y el sector de proposito general que contiene el siguiente sector de RAM a continuación del sector de FAT que se esta utilizando en el HD. Primero se apunta al sector de intercambio de la RAM. GUARDA_SALE_1 MOVLW 0X7C ;APUNTO AL SECTOR DE MOVWF DIREC_H ;INTERCAMBIO DE LA RAM CLRF DIREC_L Se apunta al primer sector de la FAT. MOVLW low INI_SEC_FAT1 ;APUNTO AL SECTOR MOVWF LBA70 ;DE FAT DEL HD MOVLW high INI_SEC_FAT1 MOVWF LBA158 CLRF LBA2316 Se le suma el offset correspondiete al numero de sectores que se estaban utilizando. MOVF N_SEC_FAT,W ;SUMO EL OFFSET DEL SECTOR ADDWF LBA70,F ;DE USO BTFSS STATUS,C GOTO RELLENA_9 INCF LBA158,F BTFSC STATUS,Z INCF LBA2316,F Se le suma 1 al apuntador a disco ya que es el sector que se debe de escribir a continuación al sector en uso. RELLENA_9 INCF LBA70,F ;+1 , PARA EL PROXIMO SECTOR

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 162 -

BTFSS STATUS,Z GOTO RELLENA_10 INCF LBA158,F BTFSC STATUS,Z INCF LBA2316,F Se llama a la rutina que me escribe el sector en el disco. RELLENA_10 NOP PAGESEL W_HD_SECTOR CALL W_HD_SECTOR PAGESEL GUARDA_SALE_1 Se comprueba que no me a producido error , si es asi se muestra un mensaje de error por pantalla y se detiene el sistema. BTFSS COM_ERR ;SI LA ACCION DE ESCRIBIR GOTO GUARDA_SALE ;EN DISCO ME PROBOCA ERROR PAGESEL BORRA_LCD ;LO INDICO Y PARO EL SISTEMA CALL BORRA_LCD MOVLW MIS24 PAGESEL FRASE2 CALL FRASE2 BCF INTCON,GIE SLEEP Se salta a esta rutina cuando solo se quiere actualizar el sector de la FAT con el sector de la FAT de la RAM. Se apunta primero al primer sector de la FAT del disco. GUARDA_SALE MOVLW low INI_SEC_FAT1 ;APUNTO AL SECTOR MOVWF LBA70 ;DE FAT DEL HD MOVLW high INI_SEC_FAT1 MOVWF LBA158 CLRF LBA2316 Se le suma el offset de sectores utilizados . MOVF N_SEC_FAT,W ;SUMO EL OFFSET DEL SECTOR ADDWF LBA70,F ;DE USO BTFSS STATUS,C GOTO RELLENA_11 INCF LBA158,F BTFSC STATUS,Z INCF LBA2316,F Se apunta al sector de la FAT de la RAM. RELLENA_11 MOVLW low SEC_FAT_EN_RAM MOVWF DIREC_L MOVLW high SEC_FAT_EN_RAM MOVWF DIREC_H Se llama a la rutina la cual me graba el sector en el disco. PAGESEL W_HD_SECTOR CALL W_HD_SECTOR PAGESEL RELLENA_11 Se comprueba de que no haya probacodo error , de ser asi se indica por pantalla y se para el sistema. BTFSS COM_ERR ;SI LA ACCION DE ESCRIBIR GOTO RELLENA_13 ;EN DISCO ME PROBOCA ERROR PAGESEL BORRA_LCD ;LO INDICO Y PARO EL SISTEMA CALL BORRA_LCD MOVLW MIS24 PAGESEL FRASE2 CALL FRASE2 BCF INTCON,GIE SLEEP

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 163 -

Se restauran los valores de los registros de los puertos y se sale. RELLENA_13 NOP PAGESEL BACKUP CALL BACKUP PAGESEL RELLENA_11 RETURN ;======================================================================= ; RUTINA PARA COMPARAR QUE EL DISCO ES LO SUFICIENTEMENTE GRANDE ; COMO PARA PODER CREAR UNA PARTICION DE FAT16 MAXIMA ; SE COMPARA CON EL NUMERO DE CILINDROS DISPONIBLES EN DISCO ; SE REQUIEREN UN MINIMO DE 4577 CILINDROS = 0X11E1 ;======================================================================= Esta rutina comprueba que el disco sea lo suficioentemente grande como para poder generar un partición FAT 16 máxima , o sea una partición de 2,1 Gb. Para ello lo que se hace es comprobar el numero de cilindros que contiene el disco , si es superior a 4577 cilindros se puede particionar a 2.1 Gb. Se mira si la parte alta ya es superior a 0x11 , si es asi quiere decir que el disco ya es superior a 4577 cilindros. CHECK_SPACE MOVLW 0X11 ;0X11 <= CYL_H SUBWF CYL_H,W BTFSC STATUS,C GOTO CHECK_SPACE1 RETURN ;RETORNO SI LOS CILINDROS YA SON ;MAYORES QUE EL MINIMO Si no es superior a 0x11 , se comprueba si es igual a 0x11 , si es asi luego se mira si es superior o igual a 0xE1. Si es superior a 0xE1 tambien se puede particionar. CHECK_SPACE1 MOVF CYL_H,W ;COMPRUEBO SI CYL_H , SON 0X11 XORLW 0X11 ;EXACTAMENTE BTFSS STATUS,Z RETURN Se mira si al ser igual a 0x11 la parte alta , se mira si la parte baja es superior a 0xE1, eso quiere decir que se puede particionar. MOVLW 0XE1 ;0XE1 < CYL_L MOVWF AUX MOVF CYL_L,W SUBWF AUX,W BTFSS STATUS,C GOTO CHECK_ERROR RETURN Si se deduce de que el disco es de un tamaño demasiado pequeño para generar una partición FAT 16 máxima ( 2.1 Gb ) , se representa un mensaje de error y se entra en bucle infinito. CHECK_ERROR NOP PAGESEL BORRA_LCD CALL BORRA_LCD MOVLW MIS40 PAGESEL FRASE3 CALL FRASE3 MOVLW 0XC0 PAGESEL COMANDO CALL COMANDO MOVLW MIS39 PAGESEL FRASE3 CALL FRASE3 MOVLW 0X94 PAGESEL COMANDO CALL COMANDO

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 164 -

MOVLW MIS41 PAGESEL FRASE3 CALL FRASE3 PAGESEL CHECK_SPACE GOTO $-1 RETURN ;======================================================================= ; RUTINA PARA COMPARAR EL DIRECTORIO DE DISCO CON EL DE LA ; EEPROM , RETORNA 0 SI ERAN IGUALES , 255 SI SON DIFERENTES ; SOLO COMPARA LOS PRIMEROS 256 BYTES DEL ROOT ; 0X00 --> DIRECTORIO NO MODIFICADO ; 0XFF --> DIRECTORIO MODIFICADO ; --> POSICIONES EN EEPROM EXTERNA <-- ; 0X864E --> LOCALIZACION DE LA FECHA DE CREACION DEL FICHERO 1 ; 0X8686 --> LOCALIZACION DE LA FECHA DE CREACION DEL FICHERO 2 ; 0X8718 --> LOCALIZACION DE LA FECHA DE CREACION DEL FICHERO 3 ; 0X874A --> LOCALIZACION DE LA FECHA DE CREACION DEL FICHERO 4 ; 0X877C --> LOCALIZACION DE LA FECHA DE CREACION DEL FICHERO 5 ;======================================================================= Esta rutina nos sirve para comparar el directorio del Disco duro con el directorio real de la memoria EEPROM , lo que nos haces esta rutina es comparar la direccion de memoria donde indica la ultima modificacion del archivo , como el microcontrolador l’unico que hace es modificar el tamaño de archivo la fecha de creación y ultima modificacion deveran de ser la misma que contenia la memoria EEPROM. Solo se modificara esta posición de memoria si introducimos el disco duro en un pc y se modifica el contenido del fichero , de tal forma que si se vuelve a colocar el mismo disco en la placa de proyecto nos dira que los directorios no coinciden y se deberá de formatear. Se carga la parte alta y la parte baja de la primera direccion en DIG0..1 y se carga la parte alta y baja de la segunda posición a comparar en DIG2..3. COMPARA_DIR MOVLW 0X86 MOVWF DIG0 MOVLW 0X36 MOVWF DIG1 MOVLW 0X14 MOVWF DIG2 MOVLW 0X36 MOVWF DIG3 Se llama a la función que nos compara las dos direcciones de memoria , esta función nos retorna un 0x00 si el directorio no a sido modificado y un 0xFF si a sido modificado. PAGESEL COMPARA_POS CALL COMPARA_POS PAGESEL COMPARA_DIR Se comprueba lo que retorna la función comparar , si retorna 0x00 quiere decir que las posiciones de memoria son iguales. MOVWF DIG0 INCF DIG0,W BTFSC STATUS,Z RETLW 0XFF Se carga la parte alta y la parte baja de la primera direccion en DIG0..1 y se carga la parte alta y baja de la segunda posición a comparar en DIG2..3. MOVLW 0X86 MOVWF DIG0 MOVLW 0X56 MOVWF DIG1 MOVLW 0X14 MOVWF DIG2

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 165 -

MOVLW 0X56 MOVWF DIG3 Se llama a la función que nos compara las dos direcciones de memoria , esta función nos retorna un 0x00 si el directorio no a sido modificado y un 0xFF si a sido modificado. PAGESEL COMPARA_POS CALL COMPARA_POS PAGESEL COMPARA_DIR Se comprueba lo que retorna la función comparar , si retorna 0x00 quiere decir que las posiciones de memoria son iguales. MOVWF DIG0 INCF DIG0,W BTFSC STATUS,Z RETLW 0XFF Se carga la parte alta y la parte baja de la primera direccion en DIG0..1 y se carga la parte alta y baja de la segunda posición a comparar en DIG2..3. MOVLW 0X86 MOVWF DIG0 MOVLW 0X76 MOVWF DIG1 MOVLW 0X14 MOVWF DIG2 MOVLW 0X76 MOVWF DIG3 Se llama a la función que nos compara las dos direcciones de memoria , esta función nos retorna un 0x00 si el directorio no a sido modificado y un 0xFF si a sido modificado. PAGESEL COMPARA_POS CALL COMPARA_POS PAGESEL COMPARA_DIR Se comprueba lo que retorna la función comparar , si retorna 0x00 quiere decir que las posiciones de memoria son iguales. MOVWF DIG0 INCF DIG0,W BTFSC STATUS,Z RETLW 0XFF Se carga la parte alta y la parte baja de la primera direccion en DIG0..1 y se carga la parte alta y baja de la segunda posición a comparar en DIG2..3. MOVLW 0X86 MOVWF DIG0 MOVLW 0X96 MOVWF DIG1 MOVLW 0X14 MOVWF DIG2 MOVLW 0X96 MOVWF DIG3 Se llama a la función que nos compara las dos direcciones de memoria , esta función nos retorna un 0x00 si el directorio no a sido modificado y un 0xFF si a sido modificado. PAGESEL COMPARA_POS CALL COMPARA_POS PAGESEL COMPARA_DIR Se comprueba lo que retorna la función comparar , si retorna 0x00 quiere decir que las posiciones de memoria son iguales. MOVWF DIG0 INCF DIG0,W BTFSC STATUS,Z RETLW 0XFF

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 166 -

Se carga la parte alta y la parte baja de la primera direccion en DIG0..1 y se carga la parte alta y baja de la segunda posición a comparar en DIG2..3. MOVLW 0X86 MOVWF DIG0 MOVLW 0XB6 MOVWF DIG1 MOVLW 0X14 MOVWF DIG2 MOVLW 0XB6 MOVWF DIG3 Se llama a la función que nos compara las dos direcciones de memoria , esta función nos retorna un 0x00 si el directorio no a sido modificado y un 0xFF si a sido modificado. PAGESEL COMPARA_POS CALL COMPARA_POS PAGESEL COMPARA_DIR Se comprueba lo que retorna la función comparar , si retorna 0x00 quiere decir que las posiciones de memoria son iguales. MOVWF DIG0 INCF DIG0,W BTFSC STATUS,Z RETLW 0XFF Si depues de comprobar todas las posiciones de memoria no se encuentra ninguna de diferente se retorna 0x00 que quiere decir que el directorio no a sido modificado por el sistema operativo. RETLW 0X00 ;======================================================================= ; RUTINA PARA COMPARAR DOS POSICIONES DE LA MEMORIA ; DIG0,DIG1 --> PARTE ALTA Y BAJA DE LA PRIMERA POSSICION ; DIG2,DIG3 --> PARTE ALTA Y BAJA DE LA SEGUNDA POSSICION ; --> RETORNA <-- ; 0XFF --> SI SON DIFERENTES ; 0X00 --> SI SON IGUALES ;======================================================================= Esta rutina lo que nos hace es comparar el contenido de dos posiciones de memoria de 16 bits , la posición 1 se encuentra en DIG0..1 y la segunda posición en DIG2..3. Retorna 0x00 si son iguales y 0xFF si son diferentes. Se hace una copia de la direccion de la primera posición de memoria. COMPARA_POS MOVF DIG0,W MOVWF DIREC_H MOVF DIG1,W MOVWF DIREC_L Se lee el primer byte la primera posición de memoria y se guarda en una variable temporal. PAGESEL R_MEM_EX CALL R_MEM_EX MOVF DAT,W MOVWF DIG0 Se incrementa el apuntador a memoria para poder leer el segundo byte de la primera posición de memoria. INCF DIREC_L,F Se lee el segundo byte. PAGESEL R_MEM_EX CALL R_MEM_EX

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 167 -

Se guarda en una variable temporal. MOVF DAT,W MOVWF DIG1 Se hace una copia de la segunda posición de memoria a comparar. MOVF DIG2,W MOVWF DIREC_H MOVF DIG3,W MOVWF DIREC_L Se lee el primer byte de la primera posición de memoria. PAGESEL R_MEM_EX CALL R_MEM_EX Se guarda en una variable temporal. MOVF DAT,W MOVWF DIG2 Se incrementa el apuntador para poder leer el segundo byte. INCF DIREC_L,F Se lee el segundo byte de la segunda direccion de memoria. PAGESEL R_MEM_EX CALL R_MEM_EX Se guarda en una variable temporal. MOVF DAT,W MOVWF DIG3 Se pasa a comparar los 4 contenidos por orden , parte alta con alta y parte baja con baja. Si son iguales retorna 0x00 y si son diferentes retorna 0xFF. MOVF DIG0,W XORWF DIG2,W BTFSS STATUS,Z RETLW 0XFF MOVF DIG1,W XORWF DIG3,W BTFSS STATUS,Z RETLW 0XFF RETLW 0X00

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 168 -

7.1.6. LATCHES.inc. Esta rutina sirve para borrar el contenido de los latches en el momento del arranque. ;============================================================; ; RUTINA PARA BORRAR EL CONTENIDO DE LOS LATCHES ;============================================================; Se borra el contenido del BUS y se ejecuta un pulso de habilitacion a cada dispositivo que contenga latch. B_LATCHS CLRF PORTD PAGESEL LCD_LE CALL LCD_LE CALL ALE CALL HD_LE RETURN

7.1.7. PANTALLA.inc. ;=========================================================================; ; RUTINA PARA REPRESENTAR LA PANTALLA INICIAL Y LA MUESTRA 3 SEGUNDOS ; ;=========================================================================; Esta rutina lo que hace es presentar el titulo del proyecto por la LCD durante 3 segundos y luego sale. Represento por pantalla el mensaje 1 del array de mensajes. P_PRINCI MOVLW MIS1 PAGESEL FRASE CALL FRASE PAGESEL P_PRINCI Se coloca el cursor en la segunda línea de la LCD. MOVLW 0XC0 PAGESEL COMANDO CALL COMANDO PAGESEL P_PRINCI Se representa el mensaje 2 del array de mensajes. MOVLW MIS2 PAGESEL FRASE CALL FRASE PAGESEL P_PRINCI Se coloca el cursor en la tercera línea de la LCD. MOVLW 0X94 PAGESEL COMANDO CALL COMANDO PAGESEL P_PRINCI Se representa por la LCD el mensaje 3 del array de mensajes. MOVLW MIS3 PAGESEL FRASE CALL FRASE PAGESEL P_PRINCI Se coloca el cursor en la cuarta línea de la LCD. MOVLW 0XD4 PAGESEL COMANDO CALL COMANDO PAGESEL P_PRINCI Se representa el mensaje 4 del array de mensajes.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 169 -

MOVLW MIS4 PAGESEL FRASE CALL FRASE PAGESEL P_PRINCI Se genera un bucle de pausa de 3 segundos mediante la rutina de pausa por software. Lo que hace es llamar repetidamente la rutina de pausa hasta que la variable AUX1 se hace 0. Al finalizar cada llamada a la rutina de pausa se decrementa AUX1. MOVLW .4 MOVWF AUX1 BUCLE1 NOP PAGESEL PAUSA1SEG CALL PAUSA1SEG PAGESEL P_PRINCI DECFSZ AUX1,F GOTO BUCLE1 RETURN ;=================================================================== ; RUTINA QUE NOS MUESTRA POR PANTALLA LA INFORMACION DEL DISCO ;=================================================================== Esta rutina nos representa por la pantalla LCD la información del disco actual. Tanto modelo , heads , cilindres y sectors. MUESTRA_INFO NOP Se salva la configuración de los puertos del bus. PAGESEL SALVA CALL SALVA PAGESEL MUESTRA_INFO Se borra la LCD. PAGESEL BORRA_LCD CALL BORRA_LCD PAGESEL MUESTRA_INFO Se representa por pantalla el mensaje 18 del array de mensajes. MOVLW MIS18 PAGESEL FRASE2 CALL FRASE2 PAGESEL MUESTRA_INFO Se carga en los registros de direccionamiento de la memoria externa la direccion de inicio donde se a almacenado el modelo de disco , esta información se encuentra en el sector de identificación que se volco al arrancar el hardware. MOVLW 0X36 ;APUNTO A LA POSICIO ;ON ESTA EL MODEL DEL HD MOVWF DIREC_L MOVLW 0X7E MOVWF DIREC_H Se genera un bucle de lectura del array en memoria , solo se leeran los primeros 8 bytes del tipo de disco. Normalmente el tipo no acupa mas de 8 , pero podria llegar a ocupar hasta 40 caracteres. MOVLW .8 MOVWF COUNT MUESTRA_INFO2 NOP Se lee el primer carácter del string y se guarda en una variable que no se este utilizando en este momento. PAGESEL R_MEM_EX

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 170 -

CALL R_MEM_EX PAGESEL MUESTRA_INFO Se incrementa el apuntador a memoria , proximo carácter del string. INCF DIREC_L,F MOVF DAT,W MOVWF IO_L Se lee el proximo carácter del string. PAGESEL R_MEM_EX CALL R_MEM_EX PAGESEL MUESTRA_INFO INCF DIREC_L,F MOVF DAT,W Se imprimer el carácter por pantalla , al tener el string los caracteres entrelazados se debe de imprimir primero el segundo carácter del string y a continuación el primero , luego imprimir el cuarto y a continuación el tercero y asi subcesivammente. PAGESEL DATO CALL DATO PAGESEL MUESTRA_INFO MOVF IO_L,W PAGESEL DATO CALL DATO PAGESEL MUESTRA_INFO Se va decrementando la variable que me indica cuantos caracteres se deben de imprimir. DECFSZ COUNT,F GOTO MUESTRA_INFO2 Se coloca el cursor en la segunda línea de la LCD. MOVLW 0XC0 PAGESEL COMANDO CALL COMANDO PAGESEL MUESTRA_INFO Se representa por pantalla el mensaje 19 del array de mensajes. MOVLW MIS19 PAGESEL FRASE2 CALL FRASE2 PAGESEL MUESTRA_INFO Se carga en un par de registros que no se estén utilizando en este momento el contenido de las variables CYL_L y CYL_H. MOVF CYL_L,W MOVWF IO_L MOVF CYL_H,W MOVWF IO_H Se llama a la rutina que nos convierte los numeros en decimal a ASCII y los imprime por pantalla a partir de donde este colocado el cursor. PAGESEL CONVER_IMPRIME CALL CONVER_IMPRIME PAGESEL MUESTRA_INFO Se coloca el cursor a una posicion intermedia de la pantalla LCD. MOVLW 0X94 PAGESEL COMANDO CALL COMANDO PAGESEL MUESTRA_INFO Se representa por pantalla el mensaje numero 20 del array de mensajes.

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 171 -

MOVLW MIS20 PAGESEL FRASE2 CALL FRASE2 PAGESEL MUESTRA_INFO Se envia a convertir de HEX a ASCII el contenido de las variables HEADS , las cuales indica el numero de cabezas que tiene el disco duro. MOVF HEADS_L,W MOVWF IO_L MOVF HEADS_H,W MOVWF IO_H PAGESEL CONVER_IMPRIME CALL CONVER_IMPRIME PAGESEL MUESTRA_INFO Se coloca el cursor a una posición intermedia de la pantalla LCD. MOVLW 0XD4 PAGESEL COMANDO CALL COMANDO PAGESEL MUESTRA_INFO Se representa el mensaje numero 21 del array de mensajes. MOVLW MIS21 PAGESEL FRASE2 CALL FRASE2 PAGESEL MUESTRA_INFO Se envia a convertir de HEX a ASCII el contenido de las variables SECTORS las cuales me indican el numero de sectores del disco duro. MOVF SECTORS_L,W MOVWF IO_L MOVF SECTORS_H,W MOVWF IO_H PAGESEL CONVER_IMPRIME CALL CONVER_IMPRIME PAGESEL MUESTRA_INFO Se ejecuta un bucle de retardo de 3 segundos. MOVLW 0X03 ;ESPERO 3 SEGUNDOS PARA MOVWF COUNT ;QUE SE PUEDA VER LA INFO MUESTRA_INFO3 NOP PAGESEL PAUSA1SEG CALL PAUSA1SEG PAGESEL MUESTRA_INFO DECFSZ COUNT,F GOTO MUESTRA_INFO3 Se restauran los valores de los registros almacenados en memoria para que el sistema quede igual que cuando se entro. PAGESEL RESTAURA CALL RESTAURA PAGESEL MUESTRA_INFO RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 172 -

;=============================================================== ; RUTINA QUE NOS CONVIERTE EL CONTENIDO DE IO_L , IO_H ; A DECIMAL ; I NOS LO IMPRIMER POR LA LCD EN LA POSICION ACTUAL ; ESTA RUTINA IMPRIME BLANCOS PARA LOS PRIMEROS CEROS ;=============================================================== Esta rutina lo que nos hace es convertir un numero de 16 bits a sus correspondientes 5 valores decimales ASCII para poder-los imprimir por pantalla. CONVER_IMPRIME

NOP Se llama a la rutina que convierte el valos de 16 bits en sus correpondientes 5 valores decimales.

PAGESEL HEXADEC CALL HEXADEC PAGESEL MUESTRA_INFO Se baja el flag de cero , el cual me indica si existen ceros a la izquierda. BSF CERO Se convierten los 5 digitos decimales a sus correpondientes valores ASCII , esto se hace sumando 48 a cada valor. MOVF DIG0,W ADDLW .48 MOVWF DIG0 MOVF DIG1,W ADDLW .48 MOVWF DIG1 MOVF DIG2,W ADDLW .48 MOVWF DIG2 MOVF DIG3,W ADDLW .48 MOVWF DIG3 MOVF DIG4,W ADDLW .48 MOVWF DIG4 A continuación se procede a imprimir el numero ya convertido a ASCII por la pantalla LCD , se imprimira un espacio en blanco en caso de existir ceros a la izquierda. MOVF DIG4,W BTFSS CERO GOTO $+8 Se comprueba si el primer numero del array de caracteres ASCII es cero , si es asi se imprime un espacio en blanco. MOVF DIG4,W XORLW .48 BTFSS STATUS,Z BCF CERO Si es cero , envia un 0x20 a la pantalla LCD , que correponde a un espacio en blanco. MOVF DIG4,W BTFSC CERO MOVLW 0X20 PAGESEL DATO CALL DATO PAGESEL MUESTRA_INFO MOVF DIG3,W BTFSS CERO

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 173 -

GOTO $+8 MOVF DIG3,W XORLW .48 BTFSS STATUS,Z BCF CERO MOVF DIG3,W BTFSC CERO MOVLW 0X20 PAGESEL DATO CALL DATO PAGESEL MUESTRA_INFO MOVF DIG2,W BTFSS CERO GOTO $+8 MOVF DIG2,W XORLW .48 BTFSS STATUS,Z BCF CERO MOVF DIG2,W BTFSC CERO MOVLW 0X20 PAGESEL DATO CALL DATO PAGESEL MUESTRA_INFO MOVF DIG1,W BTFSS CERO GOTO $+8 MOVF DIG1,W XORLW .48 BTFSS STATUS,Z BCF CERO MOVF DIG1,W BTFSC CERO MOVLW 0X20 PAGESEL DATO CALL DATO PAGESEL MUESTRA_INFO MOVF DIG0,W BTFSS CERO GOTO $+8 MOVF DIG0,W XORLW .48 BTFSS STATUS,Z BCF CERO MOVF DIG0,W BTFSC CERO MOVLW 0X20 PAGESEL DATO CALL DATO PAGESEL MUESTRA_INFO RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 174 -

;=============================================================== ; RUTINA QUE NOS MUESTRA POR PANTALLA QUE EL SISTEMA ; REQUIERE FORMATEAR EL DISCO Y RECOSTRUIR LA FAT PERO ; NO SE A DETECTADO LA MEMORIA EEPROM. ; SE DEBE DE REINICIAR CON LA MEMORIA PUESTA O MONITOR ;=============================================================== Esta rutina nos muestra por pantalla que el sistema a detectado que debe de ser formateado y no existe EEPROM externa la cual contenga la estructura FAT16 para poder ser restaurada en el disco duro. ERROR_EEPROM NOP Se borra el contenido por completo de la pantalla LCD. PAGESEL BORRA_LCD CALL BORRA_LCD PAGESEL ERROR_EEPROM Se coloca el cursor a una posición intermedia de la pantalla LCD. MOVLW 0X80 PAGESEL COMANDO CALL COMANDO Se representa por pantalla el mensaje 23 del array de mensajes. MOVLW MIS34 PAGESEL FRASE3 CALL FRASE3 Se coloca el cursor a una posición intermedia y a la segunda fila de la pantalla LCD. MOVLW 0XC0 PAGESEL COMANDO CALL COMANDO Se representa el mensaje numero 35 del array de mensajes. MOVLW MIS35 PAGESEL FRASE3 CALL FRASE3 Se coloca el cursor a una posición intermedia de la pantalla LCD y en la tercera fila de la LCD. MOVLW 0X94 PAGESEL COMANDO CALL COMANDO Se representa el mensaje 36 del arrray de mensajes. MOVLW MIS36 PAGESEL FRASE3 CALL FRASE3 Se coloca el cursor a una posición intermedia y en la cuarta fila de la pantalla LCD. MOVLW 0XD4 PAGESEL COMANDO CALL COMANDO Se representa por pantalla el mensaje 37 del array de menasajes. MOVLW MIS37 PAGESEL FRASE3 CALL FRASE3 PAGESEL ERROR_EEPROM Se genera un bucle infinito ya que el sistema a llegado a un punto el cual no puede autoresoler-se. GOTO $-1 RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 175 -

;======================================================================= ; RUTINA QUE NOS PRESENTA LA PANTALLA DE ESTADO DE BUFFERES ; INTERMEDIOS DE DATOS ;======================================================================= Esta rutina nos representa por la pantalla LCD las process bars que nos representaran de forma semigrafica el estado de los búferes intermedios , estos búferes son de 1 Kb cada uno y almacenan de forma periodica los valores recogidos de los canales analogicos. ESTADO_BUFFER NOP Se borra el contenido de la pantalla LCD. PAGESEL BORRA_LCD CALL BORRA_LCD PAGESEL ESTADO_BUFFER Se representa el mensaje 29 del array de mensajes. MOVLW MIS29 PAGESEL FRASE2 CALL FRASE2 PAGESEL ESTADO_BUFFER Se imprime el valor ASCII correspondiente al 1. MOVLW '1' PAGESEL DATO CALL DATO Se coloca el cursor a una posición intermedia en la LCD. MOVLW 0XC0 PAGESEL COMANDO CALL COMANDO Se representa el mensaje 23 del array de mensajes. MOVLW MIS23 PAGESEL FRASE2 CALL FRASE2 Se coloca el cursor en la segunda línea de la LCD. MOVLW 0X94 PAGESEL COMANDO CALL COMANDO Se imprime el mensaje 29 del array de mensajes. MOVLW MIS29 PAGESEL FRASE2 CALL FRASE2 Se imprime el valor ASCII correpondiente al 2. MOVLW '2' PAGESEL DATO CALL DATO Se coloca el cursor en una posición intermedia de la LCD. MOVLW 0XD4 PAGESEL COMANDO CALL COMANDO Se imperime el mensaje 23 del array de mensajes. MOVLW MIS23 PAGESEL FRASE2 CALL FRASE2 PAGESEL ESTADO_BUFFER RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 176 -

7.1.8. MATES.inc. Esta rutina lo que nos hace es convertir un numero hexagesimal de 16 bits a su correspondiente numero en decimal. El resultado lo expresa en 5 digitos de 0 a 9 , como el maximo valor en hex de 16 bits es 0xFFFF el resultado será expresado en 5 digitos o sea 65536. ;=========================================================== ; RUTINA PARA CONVERTIR DE HEXAGESIMAL A DECIMAL DE ; 16BITS A 5 DECIMALES ; ENTRA POR : IO_L , IO_H ; SALE POR : DIG0 , DIG1 , DIG2 , DIG3 , DIG4 ;=========================================================== Se borran los registros de salida de la función. HEXADEC CLRF DIG0 CLRF DIG1 CLRF DIG2 CLRF DIG3 CLRF DIG4 Se comprueba si la parte alta del numero en HEX de 16 bits es 0. MOVF IO_H,W BTFSC STATUS,Z GOTO NO_ALTA Si el numero de 16 bits posee parte alta se salta a esta línea de codigo y se empieza a incrementar los registros de salida a la vez que se va decrementando la parte baja del valor en HEX. SI_ALTA NOP PAGESEL INCREMENTA CALL INCREMENTA PAGESEL HEXADEC Se decrementa y se va generando el bucle hasta que valga 0. DECFSZ IO_L,F GOTO SI_ALTA Una vez llegado a 0 la parte baja del valor en HEX se decrementa la parte alta , y se vuelve a generar el bucle con la parte baja , en este caso de 255 ciclos. DECFSZ IO_L,F GOTO SI_ALTA Se carga la parte baja con 255 por que la instrucción DECFSZ lo que hace es decrementar y luego comprobar si es cero para ejecutar un salta , a causa de esta accion se deja por incrementar los registros de salida en 255. MOVLW 0XFF MOVWF IO_H SI_ALTA2 NOP PAGESEL INCREMENTA CALL INCREMENTA PAGESEL HEXADEC DECFSZ IO_L,F GOTO SI_ALTA2 PAGESEL INCREMENTA CALL INCREMENTA PAGESEL HEXADEC RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 177 -

Si el registro de entrada no tiene parte alta se salta a esta línea de codigo , de tal forma que unicamente se debe de convertir la parte baja. NO_ALTA NOP PAGESEL INCREMENTA CALL INCREMENTA PAGESEL HEXADEC Se va decrementando la parte baja a la vez que se van incrementando los registros de salida. DECFSZ IO_L,F GOTO NO_ALTA RETURN Esta parte del codigo se va llamando cada vez que se debe de incrementar los registros de salida. Lo que se hace es que cada vez que se llama a la rutina se incrementa en primer paso el digito de las unidades , una vez incrementado se comprueba si vale 10 en decimal , si es asi se borra y se incrementa el digito de las decenas de unidad , una vez mas se comprueba si las decenas valen 10 en decimal , de ser asi se borra y se incrementan las centenas , asi hasta el 5 digito. INCREMENTA INCF DIG0,F MOVF DIG0,W XORLW 0X0A BTFSS STATUS,Z RETURN CLRF DIG0 INCF DIG1,F MOVF DIG1,W XORLW 0X0A BTFSS STATUS,Z RETURN CLRF DIG1 INCF DIG2,F MOVF DIG2,W XORLW 0X0A BTFSS STATUS,Z RETURN CLRF DIG2 INCF DIG3,F MOVF DIG3,W XORLW 0X0A BTFSS STATUS,Z RETURN CLRF DIG3 INCF DIG4,F RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 178 -

7.1.9. MEMORIAS.inc. ;======================================================================; ; RUTINAS GENERADAS PARA EL MANEJO DE LA MEMORIA EXTERNA , ; YA SEA RAM COMO EEPROM ;======================================================================; ;======================================================================; ; RUTINA PARA ESCRIBIR EN LA MEMORIA EXTERNA , ; LA DIRECCION ESTARA EN EL ; REGISTRO DIREC_H , DIREC_L , Y EL DATO EL DAT ;======================================================================; Esta rutina sirve para almacenar un dato en las memorias externas. La dirección a la que se debe almacenar el dato va contenida en los registros DIREC_H y DIREC_L , y el dato en DAT. W_MEM_EX NOP Se salvan los estados de los puertos . PAGESEL SALVA CALL SALVA PAGESEL W_MEM_EX Se configuran los puertos del bus para salida. BANKSEL TRISD CLRF TRISD CLRF TRISC BANKSEL PORTD Se mueve la direccion del dato en el bus , la parte baja se almacena previamente en el match ya que el bus es de 8 bits y las memorias de 16 bits. MOVF DIREC_L,W MOVWF PORTD CALL ALE MOVF DIREC_H,W MOVWF PORTC MOVF DAT,W MOVWF PORTD Se genera un pulso en la línea de escritura de la memoria para que almacene el dato. CALL WE Se restauran los valores de los puertos para dejarlos de la misma manera que estaban en el momento de entrar. PAGESEL RESTAURA CALL RESTAURA PAGESEL W_MEM_EX RETURN ;=====================================================================; ; RUTINA PARA LEER EN LA MEMORIA EXTERNA , ; LA DIRECCION ESTARA EN EL ; REGISTRO DIREC_H , DIREC_L , Y EL DATO SALDRA POR DAT ;=====================================================================; Rutina para leer de las memorias externas. La direccion a leer esta contenida en DIREC_L y DIREC_H y el dato sale por DAT. Se salva el contenido de los puertos. R_MEM_EX NOP PAGESEL SALVA CALL SALVA PAGESEL R_MEM_EX

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 179 -

Se configuran los puertos para salida. BANKSEL TRISD CLRF TRISD CLRF TRISC BANKSEL PORTD Se coloca la direccion en el puerto de direcciones de la memoria . MOVF DIREC_L,W MOVWF PORTD CALL ALE MOVF DIREC_H,W MOVWF PORTC MOVLW 0X05 MOVWF TRISE CLRF PORTD Se configura el bus de datos para entrada. BANKSEL TRISD MOVLW 0XFF MOVWF TRISD BANKSEL PORTD Se sube la línea de RD de la memoria externa. Una vez la línea este en high se lee el contenido del bus de datos y se vuelve a low. BSF PORTB,1 MOVF PORTD,W MOVWF DAT BCF PORTB,1 Se restauran los valores de los puertos para dejarlos tal y como estaban. PAGESEL RESTAURA CALL RESTAURA PAGESEL R_MEM_EX RETURN ;======================================================================; ; RUTINA PARA LEER DE LA MEMORIA EEPROM INTERNA , ; LA DIRECCION ESTARA EN EL ; REGISTRO DIREC_L , Y EL DATO EL DAT , LA MEMORIA ES DE 256 BYTES ; PUES SOLO SE UTILIZA EL REGISTRO BAJO DE DIRECCIONES ;======================================================================; Rutina para leer de la memoria interna del PIC , esta rutina es la proporcionado por el fabricante en su datasheet como metodo recomendado. La dirección de lectura es la contenida en el registro DIREC_L y el dato de salida por DAT. R_MEM_IN NOP PAGESEL SALVA CALL SALVA PAGESEL PAUSA CALL PAUSA PAGESEL R_MEM_IN BANKSEL DIREC_L MOVF DIREC_L,W BANKSEL EEADR MOVWF EEADR BANKSEL EECON1 BCF EECON1,EEPGD BSF EECON1,RD BTFSC EECON1,RD ;ESPERO A QUE BAJE EL FLAG GOTO $-1 ;DE LECTURA

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 180 -

BANKSEL EEDATA MOVF EEDATA,W BANKSEL DAT MOVWF DAT BANKSEL PORTD PAGESEL RESTAURA CALL RESTAURA PAGESEL R_MEM_IN RETURN ;======================================================================; ; RUTINA PARA ESCRIBIR EN LA MEMORIA INTERNA , ; LA DIRECCION ESTARA EN EL ; REGISTRO DIREC_L , Y EL DATO EL DAT LA MEMORIA ES DE 256 BYTES ; PUES SOLO SE UTILIZA EL REGISTRO BAJO DE DIRECCIONES ;======================================================================; Esta rutina nos graba un dato en la memoria interna del micro , la rutina esta programada como indica el fabricante en su datasheet. La direccion esta indicada en DIREC_L y el dato a grabar en DAT. W_MEM_IN NOP PAGESEL SALVA CALL SALVA PAGESEL W_MEM_IN BANKSEL EECON1 W_MEM_IN1 BTFSC EECON1,WR GOTO W_MEM_IN1 BANKSEL DIREC_L MOVF DIREC_L,W BANKSEL EEADR MOVWF EEADR BANKSEL DAT MOVF DAT,W BANKSEL EEDATA MOVWF EEDATA BANKSEL EECON1 BCF EECON1,EEPGD BSF EECON1,WREN La unica modificacion que se a implementado en la rutina es esta línea. Esta línea lo que hace es comprobar el estado del bit de habilitacion de interrupciones generales , lo que hace es guardar el contenido de dicho bit en un registro de proposito general en momento de la grabacion. En el momento de la grabacion del dato se deshabilitan para evitar problemas de paginamiento. BANKSEL R_CONTROL BCF B_USO_GENERAL BTFSC INTCON,GIE BSF B_USO_GENERAL BCF INTCON,GIE BANKSEL EECON2 MOVLW 0X55 MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF EECON1,WR Restauro el estado de las interrupciones generales. BANKSEL R_CONTROL

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 181 -

BTFSC B_USO_GENERAL BSF INTCON,GIE BANKSEL EECON1 BCF EECON1,WREN BANKSEL PORTD PAGESEL RESTAURA CALL RESTAURA PAGESEL W_MEM_IN RETURN ;======================================================================= ; RUTINA PARA RECUPERAR EL VALOR DE LOS REGISTROS ALMACENADOS ; EN LA EEPROM INTERNA DEL PIC ;======================================================================= Esta rutina lo que hace es recuperar los registros que nos indican el estado de configuración de la placa y de los registros de información del disco por si en algún caso que corta la alimentación poder reanudar la grabacion de los datos a partir de la ultima posición. Los datos se leen a partir de la direccion 0x00 de la eeprom interna. RESTORE NOP PAGESEL SALVA CALL SALVA PAGESEL RESTORE BANKSEL DIREC_L CLRF DIREC_L PAGESEL R_MEM_IN CALL R_MEM_IN MOVF DAT,W ANDLW B'00100100' ;ELIMINO LOS DEMAS BITS NO ME INTERESAN MOVWF R_CONTROL2 INCF DIREC_L,F PAGESEL R_MEM_IN CALL R_MEM_IN MOVF DAT,W MOVWF N_CLUS_H INCF DIREC_L,F PAGESEL R_MEM_IN CALL R_MEM_IN MOVF DAT,W MOVWF N_CLUS_L INCF DIREC_L,F PAGESEL R_MEM_IN CALL R_MEM_IN MOVF DAT,W MOVWF N_SEC_CLUS INCF DIREC_L,F PAGESEL R_MEM_IN CALL R_MEM_IN MOVF DAT,W MOVWF N_SEC_FAT INCF DIREC_L,F PAGESEL R_MEM_IN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 182 -

CALL R_MEM_IN MOVF DAT,W MOVWF TICS_H INCF DIREC_L,F PAGESEL R_MEM_IN CALL R_MEM_IN MOVF DAT,W MOVWF TICS_L PAGESEL RESTAURA CALL RESTAURA PAGESEL RESTORE RETURN ;======================================================================= ; RUTINA PARA ALMACENAR EL VALOR DE LOS REGISTROS ; EN LA EEPROM INTERNA DEL PIC ;======================================================================= Esta rutina lo que hace es guardar los registros que nos indican el estado de configuración de la placa y de los registros de información del disco por si en algún caso que corta la alimentación poder reanudar la grabacion de los datos a partir de la ultima posición. Los datos se graban a partir de la direccion 0x00 de la eeprom interna. BACKUP NOP PAGESEL SALVA CALL SALVA PAGESEL BACKUP CLRF DIREC_L MOVF R_CONTROL2,W BANKSEL DAT MOVWF DAT PAGESEL W_MEM_IN CALL W_MEM_IN INCF DIREC_L,F MOVF N_CLUS_H,W BANKSEL DAT MOVWF DAT PAGESEL W_MEM_IN CALL W_MEM_IN INCF DIREC_L,F MOVF N_CLUS_L,W BANKSEL DAT MOVWF DAT PAGESEL W_MEM_IN CALL W_MEM_IN INCF DIREC_L,F MOVF N_SEC_CLUS,W BANKSEL DAT MOVWF DAT PAGESEL W_MEM_IN CALL W_MEM_IN INCF DIREC_L,F

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 183 -

MOVF N_SEC_FAT BANKSEL DAT MOVWF DAT PAGESEL W_MEM_IN CALL W_MEM_IN PAGESEL RESTAURA CALL RESTAURA PAGESEL BACKUP RETURN

7.1.10. MONITOR.inc ;RUTINAS PARA EL FUNCIONAMIENTO DEL MICRO EN MODO MONITOR , ;LA MAYORIA DE RUTINAS REQUIEREN ;DATOS COMPLEMENTARIOS VIA SERIE ;============================================================== ; RUTINA PARA VOLCAR UN SECTOR DE DISCO DURO A TRAVES ; DEL RS 232 LA DIRECCION DEL SECTOR DEBERA DE ESTAR ; CONTENIDA EN LBA70,158,2316 SE UTILIZARA COMO BUFER ; INTERMEDIO EL SECTOR DE USO GENERAL DE LA RAM ;============================================================== Esta rutina sirve para enviar un secto a través del puerto serie , para poder ejecutar-se se debe de enviar primero la direccion LBA del sector a leer. V_SECTOR NOP Se salva los registros en la pila software. PAGESEL SALVA CALL SALVA PAGESEL V_SECTOR V_SECTOR2 NOP Se lee el estado del disco duro para poder comprobar si esta disponible , y sino lo esta se espera a que lo este. PAGESEL R_HD_STATUS CALL R_HD_STATUS PAGESEL V_SECTOR BTFSS DRDY GOTO V_SECTOR2 BTFSC BSY GOTO V_SECTOR2 BTFSC DRQ GOTO V_SECTOR2 Se deshabilita el temporizador de over time para la recepcion de un carácter por el puerto serie. CLRF TMR1H CLRF TMR1L BCF T1CON,TMR1ON BCF PIR1,TMR1IF Se espera a recibir el byte bajo de la direccion LBA. PAGESEL RxD ;ESPERO LOS TRES BYTES CALL RxD ;PARA LA TRANSFERENCIA PAGESEL V_SECTOR Se coloca en el registro bajo de la direccion LBA. MOVF Rxdreg,W MOVWF LBA70

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 184 -

Se espera a recibir el segundo byte de la direccion LBA. PAGESEL RxD CALL RxD PAGESEL V_SECTOR Se coloca en el segundo byte de la direccion LBA del registro LBA de la CPU. MOVF Rxdreg,W MOVWF LBA158 Se espera a recibir el tercer byte de la direccion LBA . PAGESEL RxD CALL RxD PAGESEL V_SECTOR Se carga en el tercer byte de la direccion LBA de la CPU. MOVF Rxdreg,W MOVWF LBA2316 Se apunta al sector de intercambio de la RAM. MOVLW 0X7C MOVWF DIREC_H CLRF DIREC_L Se llama a la rutina para leer un sector. PAGESEL R_HD_SECTOR ;MANDO LA LECTURA DEL CALL R_HD_SECTOR ;SECTOR Y LO ALMACENO EN PAGESEL V_SECTOR ;LA POSICION DONDE MARQUE ;DIREC_L/H Se vuelve a apuntar al principio del sector de intercambio de la RAM. MOVLW 0X7C MOVWF DIREC_H CLRF DIREC_L A partir de aquí se empieza a transferir los datos via serie. V_SECTOR3 NOP ;COMIENZA LA TRANSFERENCIA ;VIA SERIE Se lee el primer carácter de la memoria RAM. PAGESEL R_MEM_EX CALL R_MEM_EX PAGESEL V_SECTOR Se envia al registro de salida del puerto serie. MOVF DAT,W MOVWF Txdreg Se llama a la rutina que nos envia el dato via serie. PAGESEL TxD CALL TxD PAGESEL V_SECTOR Se incrementa el apuntador de la memoria RAM. INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F Se comprueba de que no haya llegado al final del sector de intercambio de la RAM. Si no a llegado se vuelve a generar el bucle. MOVLW 0X7E ;SE EJECUTA HASTA LLEGAR A XORWF DIREC_H,W ;UN SECTOR

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 185 -

BTFSS STATUS,Z GOTO V_SECTOR3 Si a acabado la transferencia se restauran los valores de los registros y se sale. PAGESEL RESTAURA CALL RESTAURA PAGESEL V_SECTOR RETURN ;================================================================ ; RUTINA PARA VOLCAR UN SECTOR DE RAM A TRAVES DEL RS 232 ; LA DIRECCION DEL SECTOR DEBERA DE ESTAR CONTENIDA ; EN DIREC_L / DIREC_H ; ESTA RUTINA SIEMPRE ENVIA POR EL SERIE 512 BYTES ;================================================================ Esta rutina lo que nos hace es transferir un sector de datos almacenados en RAM , tambien se le puede decir que transfiera cualquier direcccion de la RAM , siempre y cuando sea 512 bytes. V_RAM NOP Se salvan los registros en la pila software. PAGESEL SALVA CALL SALVA PAGESEL V_RAM Se carga un 0x200 en un contador de 16 bits ( 0x200 = 512 bytes ). MOVLW 0X02 MOVWF COUNTAUX CLRF COUNT Se deshabilita el temporizador de timerover para la recepcion de un carácter serie. CLRF TMR1H CLRF TMR1L BSF T1CON,TMR1ON BCF PIR1,TMR1IF Se espera a recibir el primer byte de la direccion de memoria. PAGESEL RxD ;ESPERO LA LLEGADA DE LOS 2 BYTES QUE CALL RxD ;INDIQUEN EL INICIO DE LECTURA EN RAM PAGESEL V_RAM Se coloca el contenido de la recepcion en su registro. MOVF Rxdreg,W MOVWF DIREC_L Se espera a recibir el segundo byte de la direccion de memoria. PAGESEL RxD CALL RxD PAGESEL V_RAM Se coloca el contenido de la recepcion en su registro. MOVF Rxdreg,W MOVWF DIREC_H A partir de aquí empieza la transferencia a traves del puerto serie. V_RAM2 NOP ;EMPIEZA LA TRANSFERENCIA ;DEL SECTOR DE RAM

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 186 -

Se lee el primer byte de la memoria. PAGESEL R_MEM_EX CALL R_MEM_EX PAGESEL V_RAM Se transfiere el dato al registro de envio del puerto serie. MOVF DAT,W MOVWF Txdreg Se llama a la funcion que me envia el dato por el puerto serie. PAGESEL TxD CALL TxD PAGESEL V_RAM Se incrementa el apuntador a la memoria. INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F Se decrementa el contador de bytes enviados. Si aun no es cero se ejecuta de nuevo el bucle. DECFSZ COUNT,F GOTO V_RAM2 DECFSZ COUNTAUX,F GOTO V_RAM2 Se restaura los registros almacenados en la pila software y se sale. PAGESEL RESTAURA CALL RESTAURA PAGESEL V_RAM RETURN ;======================================================================= ; RUTINA PARA CARGAR LOS SECTORES DE FAT EN LA EEPROM EXTERNA ; LOS DATOS LLEGARAN VIA SERIE RS232 ;======================================================================= Esta funcion se utiliza para almacenar en el espacio reservado para la estructura FAT 16 de la EEPROM externa de la placa la información necesaria para poder recostruir la estructura en el momento en que la placa quiera formatear el disco duro. C_FAT_EEPROM NOP Se envia desde el pc un data para poder estabilizar el puerto y eliminar rebotes, el dato se elimina. PAGESEL RxD CALL RxD MOVF Rxdreg,W MOVWF DAT Se apunta al principio de la memoria EEPROM. NOP MOVLW 0X80 ;APUNTO A LA EEPROM MOVWF DIREC_H CLRF DIREC_L Se envia un 0xFF al pc para confirmar el comando. MOVLW 0XFF C_FAT_EEPROM1 MOVWF Txdreg PAGESEL TxD CALL TxD PAGESEL C_FAT_EEPROM

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 187 -

Se recibe el primer dato a memorizas en la memoria externa. NOP PAGESEL RxD CALL RxD PAGESEL C_FAT_EEPROM Se almacena en la direccion en la que estabamos apuntando , ( espacio para la FAT 16 ). MOVF Rxdreg,W MOVWF DAT MOVWF AUX PAGESEL W_MEM_EX CALL W_MEM_EX PAGESEL C_FAT_EEPROM Se elimina el dato recibido. CLRF DAT Se genera una pausa corta. PAGESEL PAUSA CALL PAUSA PAGESEL C_FAT_EEPROM Se lee el contenido del dato recibido. PAGESEL R_MEM_EX CALL R_MEM_EX PAGESEL C_FAT_EEPROM Se comprueba el dato leido con el que se habia recibido para comprobar que este bien almacenado. MOVF DAT,W XORWF AUX,F BTFSS STATUS,Z GOTO C_FAT_FIN_KO Se incrementa el apuntador a la memoria EEPROM. INCF DIREC_L,F BTFSC STATUS,Z INCF DIREC_H,F Se comprueba de que no haya llegado al final del espacio reservado. Si a llegado se salta a la etiqueta de fin. MOVLW 0X88 XORWF DIREC_H,W BTFSC STATUS,Z GOTO C_FAT_FIN_OK Si no a llegado al final de espacio reservado y el dato a sido grabado correctamente se salta aquí. Y se envia un “O” de confirmación correcta. MOVLW 'O' GOTO C_FAT_EEPROM1 Si el dato recibido contrastado con el leido en la EEPROM a sido erroneo se retorna una “K” de error y se para la transferencia. C_FAT_FIN_KO MOVLW 'K' MOVWF Txdreg PAGESEL TxD CALL TxD PAGESEL C_FAT_EEPROM RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 188 -

Si se a llegado al final de espacio reservado se envia una “F” notificando de que la placa no acepta mas datos. C_FAT_FIN_OK MOVLW 'F' MOVWF Txdreg PAGESEL TxD CALL TxD PAGESEL C_FAT_EEPROM RETURN

7.1.11. PILA.inc. ;======================================================; ; RUTINA PARA ALMACENAR EN LA PILA SOFTWARE, ; EL VALOR SE ENTRA POR STACK ;======================================================; G_PILA NOP MOVLW TOP XORWF FSR,W BTFSC STATUS,Z RETLW 0XFF BANKSEL STACK MOVF STACK,W BANKSEL PORTD MOVWF INDF DECF FSR,F RETLW 0X00 ;===================================================; ; RUTINA PARA RECUPERAR DE LA PILA SOFTWARE , ; EL VALOR SALE POR STACK ;===================================================; R_PILA NOP MOVLW BOTOM XORWF FSR,W BTFSC STATUS,Z RETLW 0XFF INCF FSR,F MOVF INDF,W BANKSEL STACK MOVWF STACK BANKSEL PORTD RETLW 0X00 ;====================================================; ; RUTINA PARA INICIALIZAR LA PILA SOFTWARE ;====================================================; INI_PILA NOP MOVLW BOTOM MOVWF FSR BANKSEL STACK CLRF STACK BANKSEL PORTD RETURN ;=====================================================; ; RUTINA PARA SALVAR LOS REGISTROS , ; TRISC , TRISD , PORTE EN PILA ;=====================================================; SALVA NOP

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 189 -

BANKSEL TRISC MOVF TRISC,W MOVWF STACK PAGESEL G_PILA CALL G_PILA PAGESEL SALVA ADDLW 0X01 BTFSC STATUS,Z GOTO ERROR_PILA BANKSEL TRISD MOVF TRISD,W MOVWF STACK PAGESEL G_PILA CALL G_PILA PAGESEL SALVA ADDLW 0X01 BTFSC STATUS,Z GOTO ERROR_PILA BANKSEL PORTE MOVF PORTE,W MOVWF STACK PAGESEL G_PILA CALL G_PILA PAGESEL SALVA ADDLW 0X01 BTFSC STATUS,Z GOTO ERROR_PILA BANKSEL PORTD RETURN ;=========================================================; ; RUTINA PARA RECUPERAR LOS REGISTROS TRISC , TRISD ; PORTE DE LA PILA ;=========================================================; RESTAURA NOP PAGESEL R_PILA CALL R_PILA PAGESEL RESTAURA ADDLW 0X01 BTFSC STATUS,Z GOTO ERROR_PILA BANKSEL STACK MOVF STACK,W BANKSEL PORTE MOVWF PORTE PAGESEL R_PILA CALL R_PILA PAGESEL RESTAURA ADDLW 0X01 BTFSC STATUS,Z GOTO ERROR_PILA BANKSEL STACK MOVF STACK,W MOVWF TRISD PAGESEL R_PILA CALL R_PILA PAGESEL RESTAURA ADDLW 0X01 BTFSC STATUS,Z GOTO ERROR_PILA

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 190 -

BANKSEL STACK MOVF STACK,W MOVWF TRISC BANKSEL PORTD RETURN ;============================================================; ; RUTINA QUE NOS MUESTRA POR LCD QUE HA HABIDO ; UN ERROR DE DESBORDAMIENTO DE PILA ; COMO SE CONSIDERA QUE EL ERROR DE PILA ES GRABE EL ; SISTEMA SE DETIENE ;============================================================; ERROR_PILA NOP MOVLW 0X01 PAGESEL COMANDO CALL COMANDO PAGESEL ERROR_PILA PAGESEL PAUSA CALL PAUSA PAGESEL ERROR_PILA MOVLW MIS16 PAGESEL FRASE CALL FRASE PAGESEL ERROR_PILA MOVLW 0XC0 PAGESEL COMANDO CALL COMANDO PAGESEL ERROR_PILA MOVLW MIS17 PAGESEL FRASE2 CALL FRASE2 PAGESEL ERROR_PILA BCF INTCON,GIE ;PARO LAS INTER. GOTO $-1 ;AQUI EL SISTEMA SE DETIENE RETURN ;================================================================; ; RUTINA PARA SALVAR LOS REGISTROS , TRISC , TRISD , ; PORTE EN PILA Y LOS REGISTROS DE W , STATUS , PCLATH , ; ESTA RUTINA ESTA ESPECIALMENTE INDICADA ; ; PARA GUARDAR LOS REGISTROS AL ENTRAT EN LA INTERRUPCION ;================================================================; SALVA_INT NOP PAGESEL SALVA CALL SALVA PAGESEL SALVA_INT MOVF DIREC_L,W BANKSEL STACK MOVWF STACK PAGESEL G_PILA CALL G_PILA PAGESEL SALVA_INT ADDLW 0X01 BTFSC STATUS,Z GOTO ERROR_PILA MOVF DIREC_H,W BANKSEL STACK MOVWF STACK PAGESEL G_PILA CALL G_PILA PAGESEL SALVA_INT

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 191 -

ADDLW 0X01 BTFSC STATUS,Z GOTO ERROR_PILA RETURN ;=================================================================; ; RUTINA PARA RECUPERAR LOS REGISTROS , TRISC , TRISD , ; PORTE EN PILA Y LOS REGISTROS DE W , STATUS , PCLATH , ; ESTA RUTINA ESTA ESPECIALMENTE INDICADA ; PARA RECUPERAR LOS REGISTROS AL SALIR DE LA INTERRUPCION ;=================================================================; RESTAURA_INT NOP PAGESEL R_PILA CALL R_PILA PAGESEL RESTAURA_INT ADDLW 0X01 BTFSC STATUS,Z GOTO ERROR_PILA BANKSEL STACK MOVF STACK,W BANKSEL DIREC_H MOVWF DIREC_H PAGESEL R_PILA CALL R_PILA PAGESEL RESTAURA_INT ADDLW 0X01 BTFSC STATUS,Z GOTO ERROR_PILA BANKSEL STACK MOVF STACK,W BANKSEL DIREC_L MOVWF DIREC_L PAGESEL RESTAURA CALL RESTAURA PAGESEL RESTAURA_INT RETURN

7.1.12. RS232.inc. Esta rutina es para poder programar una rutina para la transmisión via serie a traves de dos pins libres de la CPU , esta rutina esta extraida directamente de un APLICATION NOTES del fabricante y esta programada en seudo Basic. ;CLKIN: Frecuencia del oscilador expresada en ciclos/segundo ;BAUDIOS: Frecuencia a la que se desea comunicar ;T_MODO: Modo de transmisión, a "1" se transmite primero el ; bit LSB, a "0" el MSB ;R_MODO: Modo de recepción, a "1" se recibe primero el bit ; LSB, a "0" el MSB ;T_Nbit: Número de bits a transmitir, 7 u 8 ;R_Nbit: Número de bits a recibir, 7 u 8 ;Sbit: Número de bits de stop, 1 o 2 ; ; ;******************************************************************* ;RxD: Rutina de recepción. Trás detectar el bit de inicio, ;espera recibirse unaN palabra de 7 u 8 bits según la variable R_Nbit ;Se recibe primero el bit de más peso ;o el de menos peso según la variable R_MODO RxD clrf Rxdreg ;Borrar registro receptor BSF Rxd_pin

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 192 -

BSF Txd_pin RxD_1 BTFSC PIR1,TMR1IF RETURN btfsc Rxd_pin goto RxD_1 ;Espera el bit de inicio ("0") call Delay_ini ;Tiempo de retraso del bit de ;inicio (1.5 del restode los bits) IF R_Nbit == 8 movlw 8 ;8 bits de datos ELSE movlw 7 ;7 bits de datos ENDIF movwf Cont RxD_next bcf STATUS,C IF R_MODO == 1 rrf Rxdreg,F ;Recibir primero el bit de menos peso ELSE rlf Rxdreg,F ;Recibir primero el bit de más peso ENDIF btfsc Rxd_pin ;Chequea bit de entrada y mira si es"1" IF R_MODO == 1 IF R_Nbit == 8 bsf Rxdreg,7 ;Activa bit 7 de Rxdreg si nºbits=8 y ELSE ;1º bit LSB bsf Rxdreg,6 ;Activa bit 6 de Rxdreg si nºbits=7 y ENDIF ;1º bit LSB ELSE bsf Rxdreg,0 ;Activa bit 0 de Rxdreg si 1º el bit MSB ENDIF call Delay_bit ;Espera entre bits decfsz Cont,F ;Decrementa contador de nº de bits goto RxD_next PAGESEL Delay_bit call Delay_bit IF Sbit == 2 call Delay_bit ENDIF ;Espera 1 o 2 bits de stop RETURN ;**************************************************************** ;TxD: Rutina de transmisión. Trás el bit de inicio se ;transmite la palabra contenida en el registro transmisor Txdreg ;seguido de uno o dos bits de stop según la variable ;Sbit TxD IF T_Nbit == 8 movlw 8 ;Trans. de palabras de 8 bits ELSE movlw 7 ;Trans.n de palabras de 7 bits ENDIF movwf Cont IF T_MODO == 1 ;Si se transmite 1º el LSB y ELSE ;la palabra es de 7 bits, el IF T_Nbit == 8 ;registro transmisor se desplaza ELSE ;una posición a la izquierda para rlf Txdreg,F ;descartar el 8º bit ENDIF ENDIF bcf Txd_pin ;Transmite el bit de inicio

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 193 -

call Delay_bit TxD_next bcf STATUS,C IF T_MODO == 1 rrf Txdreg,F ;Desplazamiento a dcha si 1º ELSE ;es el bit LSB rlf Txdreg,F ;Desplazamiento a izda. si 1º ENDIF ;es el bit MSB btfsc STATUS,C bsf Txd_pin ;Si el carry es uno, se transmite un "1" btfss STATUS,C bcf Txd_pin ;Si el carry es cero se transmite un "0" call Delay_bit decfsz Cont,F ;Decrementa contador de bits goto TxD_next bsf Txd_pin ;Transmite un bit de stop call Delay_bit IF Sbit == 2 bsf Txd_pin ;Transmite segundo bit de stop si Sbit=2 call Delay_bit ENDIF return ;************************************************************************** ;Delay_bit: Rutina de temporización para los intervalos entre bit y bit Delay_bit movlw DELAY_H movwf Dlycnt_h Delay_bit_1 movlw DELAY_L movwf Dlycnt_l Delay_bit_2 decfsz Dlycnt_l,F goto Delay_bit_2 decfsz Dlycnt_h,F goto Delay_bit_1 return ;************************************************************************** ;Delay_ini: Rutina de temprización para el bit de inicio en el modo ;de recepción. Esta temporización es de 1.5 con respecto a la del resto ;de bits. Así se consigue que el muestreo sea aproximadamente en el centro ;de cada bit recibido. Delay_ini movlw DELAY_START_H movwf Dlycnt_h Delay_ini_1 movlw DELAY_START_L movwf Dlycnt_l Delay_ini_2 decfsz Dlycnt_l,F goto Delay_ini_2 decfsz Dlycnt_h,F goto Delay_ini_1 return

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 194 -

7.1.13. SISTEM.inc. ;================================================================= ; RUTINA PARA LA DETECCION DEL SISTEMA Y ; DISPOSITIVOS Y CONFIGURACION DEL SISTEMA ;================================================================= Esta rutina lo que nos hace es evaluar el sistema para saber que dispositivos estan instalados y poder deducir si el sistema es capaz de funcionar. Se borra el contenido de la pantalla LCD. SISTEMA NOP PAGESEL BORRA_LCD CALL BORRA_LCD PAGESEL SISTEMA Se bajan los flags de las memorias. BCF RAM_OK ;BAJO LA BANDERA DE EX. DE RAM BCF EEP_OK ;BAJO LA BANDERA DE EX. DE EEPR Se imprime por la LCD el mensaje 6 del array de mensajes. MOVLW MIS6 PAGESEL FRASE CALL FRASE Se coloca el cursor de la LCD en una posición de intermedia de la pantalla LCD. MOVLW 0XC0 PAGESEL COMANDO CALL COMANDO Se imprime por la LCD el mensaje 7 del arrray de mensajes. MOVLW MIS7 PAGESEL FRASE CALL FRASE Se comprueba que la RAM este colocada correctamente , el procedimiento es , escribir un dato conocido en la ultima posición de memoria y comprobar que el datio a estado escrito correctamente. MOVLW 0X7F ;COMPRUEBO LA RAM MOVWF DIREC_H MOVLW 0XFF MOVWF DIREC_L MOVLW 0XAA MOVWF DAT Se escribe la parte alta del dato. PAGESEL W_MEM_EX CALL W_MEM_EX Se ejecuta una pausa para estabilizar el puerto. PAGESEL PAUSA CALL PAUSA CLRF DAT Se lee el contenido de la ultima posición de memoria. PAGESEL R_MEM_EX CALL R_MEM_EX Se compara el dato leido con el que nosotros sabiamos que deberia leer. MOVF DAT,W XORLW 0XAA

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 195 -

Si los datos son iguales subimos la bandera de meoria RAM_OK. BTFSC STATUS,Z BSF RAM_OK Se imprime el mensaje 9 del array de mensajes. MOVLW MIS9 ;EL MOVIMIENTO DE LITERALES ;NO AFECTA A STATUS Si no se a detectado la existencia de la memoria RAM se imprime el mensaje 10 del array de mensajes. BTFSS STATUS,Z MOVLW MIS10 Se llama a la rutina de imprimir mensajes. PAGESEL FRASE CALL FRASE Se coloca el cursor en una posición intermedia de la pantalla LCD. MOVLW 0X94 PAGESEL COMANDO CALL COMANDO Se imprime el mensaje 8 del array de mensajes. MOVLW MIS8 Se llama a la rutina de imprimir mensajes. PAGESEL FRASE CALL FRASE Se pasa a comprobar la memoria EEPROM. MOVLW 0XFF ;COMPRUEBO LA EEPROM MOVWF DIREC_H MOVLW 0XAA MOVWF DAT Se escribe el dato al final de la memoria eeprom. PAGESEL W_MEM_EX CALL W_MEM_EX Se ejecuta una pausa para estabilizar el puerto. PAGESEL PAUSA CALL PAUSA Se borra la variable DAT. CLRF DAT Se lee el contenido de la ultima posición de memoria. PAGESEL R_MEM_EX CALL R_MEM_EX Se comprara con el dato que deveria de tener. MOVF DAT,W XORLW 0XAA Si son iguales se sube la bandera de EEPROM_OK. BTFSC STATUS,Z BSF EEP_OK

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 196 -

Se selecciona el mensaje 9 del arry de mensajes. MOVLW MIS9 Si los datos leidos no son iguales se imprime por pantalla el mensaje 10 del array de mensajes. BTFSS STATUS,Z MOVLW MIS10 Se llama a la rutina de imprimir mensajes. PAGESEL FRASE CALL FRASE Se coloca el cursor en una posición intermedia de la pantalla LCD. MOVLW 0XD4 PAGESEL COMANDO CALL COMANDO Se llama a la rutina de imprimir mensajes. MOVLW MIS12 PAGESEL FRASE CALL FRASE Se activa el led de actividad en el disco. BSF HD_LED Se ejecuta una pausa de 1 segundo aproximadamente. PAGESEL PAUSA1SEG CALL PAUSA1SEG PAGESEL SISTEMA Se coloca el mensaje 11 del array de mensajes . Si el flag de disco no esta activo quiere decir que no hay ningun disco conectado al puerto IDE y se deberá de imprimir el mensaje 15 del array de mensajes. MOVLW MIS11 BTFSC HD_OK MOVLW MIS15 Se llama a la rutina de imprimir mensajes. PAGESEL FRASE CALL FRASE PAGESEL SISTEMA Se apaga el led de actividad en el disco. BCF HD_LED Se ejecuta una rutina de 3 segundos aproximadamente para poder ver los datos en pantalla antes de pasar a la siguiente. MOVLW 0X02 ;ESPERO APROXIMADAMENTE 3 SEGUNDOS MOVWF COUNT ;PARA PODER BIEN LA PANTALLA SISTEMA2 NOP ;LA PANTALLA PAGESEL PAUSA1SEG CALL PAUSA1SEG PAGESEL SISTEMA DECFSZ COUNT,F GOTO SISTEMA2 RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 197 -

;================================================================== ; RUTINA PARA DETECTAR LOS REQUISITOS MINIMOS DE SISTEMA , ; LOS REQUISITOS MINIMOS PARA UN SISTEMA CON HD , ; ES LA MEMORIA RAM DE INTERCAMBIO Y EL DISCO DURO ; PROPIAMENTE DITXO LA EEPROM SOLO SERA NECESARIA SI EL ; DISCO SE INSTALA SIN FORMATO Y LOS FICHEROS PROPIAMENTE ; CREADOS ;================================================================== Se comprueba los dispositivos instalados en el sistema para poder ver si el sistema es capaz de evolucionar. EVAL_SIS NOP Se borra el contenido de la pantalla LCD . PAGESEL BORRA_LCD CALL BORRA_LCD PAGESEL EVAL_SIS Se mira el flag del disco , si es “0” se imprime por pantalla el mensaje 27 de array de mensajes. BTFSC HD_OK GOTO EVAL_SIS1 MOVLW MIS27 PAGESEL FRASE2 CALL FRASE2 PAGESEL EVAL_SIS Si no se detecta disco el sistema se detiene , ya que es unos de los requisistos minimos. GOTO $-1 ;NO SE DETECTO EL DISCO SIS. PARADO Se comprueba la existencia de la RAM , si no esta se imprime el mensaje 28 del array de mensajes. EVAL_SIS1 BTFSC RAM_OK RETURN MOVLW MIS28 PAGESEL FRASE2 CALL FRASE2 PAGESEL EVAL_SIS Se vuelve a detener el sistema ya que es un elemento basico para funcionar. GOTO $-1 ;NO SE DETECTOR LA RAM SIS. PARADO RETURN

Sistema Remoto para la Captación masiva de Información Autor: Oriol Monclús Sánchez

ETIEI (Enginyeria Tècnica Ind. esp. Electrònica Industrial) - 198 -

8. Referencias. [1] www.microchip.com [2] www.seagate.com [3] www.maxtor.com [4] www.national.com [5] www.fairchildsemic.om [6] www.atmel.com [7] www.amidata.es [8] www.t13.org