PROBADOR DE CABLES DE INSTALACIONES DE RED - 2

En ediciones anteriores comenzamos a explicar el circuito de un probador de cables e instalaciones de red. En esta nota explicaremos cómo es el programa del PIC en su versión básica. Haremos la explicación paso a paso para que el lector entienda cómo se "diseña" un programa para PIC.

INTRODUCCION
Para una dada tarea a realizar por un PIC hay tantos programas posibles como programadores hay en el mundo. La tarea de programar es casi como la tarea de pensar en cómo resolver un problema o cómo diseñar una casa. Los programas pueden ser totalmente distintos y, sin embargo, cumplir con la misma función. Con el tiempo Ud. va a tener sus propios criterios de programación y sus programas tendrán su sello personal.

Nos queda a nosotros aconsejarle sobre los detalles generales a tener en cuenta cuando programa. En principio recuerde que la memoria del ser humano se rige por criterios muy especiales.

La memoria humana borra algunas cosas que considera poco importantes porque sería imposible guardar imagen y sonido de todos y cada uno de los instantes de nuestra vida. Esto significa que es muy posible que mientras esté trabajando con un programa Ud. se acuerde de todo, pero unos meses después no recordará para qué estaba colocada una determinada sentencia.

El separador ";" fue creado para que Ud. coloque explicaciones en sus programas. Mi consejo general es que lo utilice con profusión. No tenga miedo al explicar lo que está haciendo en el programa. Los comentarios no se graban en el PIC y por lo tanto no se consume memoria. No escriba tipo telegrama, no tiene sentido, escriba con todas las reglas ortográficas para que el texto resulte claro y preciso.

Tampoco se pase de vueltas porque un exceso de explicaciones confunde en lugar de aclarar.

Otro consejo muy general es resolver los programas haciendo un uso extensivo de subrutinas que realizan tareas claramente específicas. En nuestro dispositivo se utilizan demoras del orden del segundo en varias partes del programa (recuerde que se deben aplicar estados altos a los diferentes pares de modo tal que se pueda observar visualmente el encendido de leds). Esas demoras no son fáciles de realizar si consideramos que el paso de programa suele durar alrededor de 1µS para la frecuencia de cristal mas común que es de 4MHz, se deben efectuar un millón de pasos de programa para lograr una demora de 1 segundo. Es evidente que no vamos a escribir 1 millón de sentencias en el programa, sino que vamos a hacer uso de un bucle que repita la misma sentencia 1 millón de veces.

Esa demora es utilizada en casi todos los programas para PIC, por esa razón es conveniente crear una subrutina con el nombre "demora" para poder utilizarla en otros programas. Los índices que modifican esta demora se crearan en el programa principal para que la subrutina genere la demora deseada en ese programa particular.

Por último, le aclaramos que en esta disciplina gana el más ordenado. Ud. tiene muchas opciones de trabajo.

Lo elemental es que haga un archivo de subrutinas con un comentario sobre la función que cumple cada subrutina creada. Mi consejo es que utilice el Excel para crear una base de datos que pueda ordenar a su antojo; recuerde que las subrutinas son en el fondo archivos de texto y el Excel tiene la opción de guardar archivos de texto dentro de una celda como si fuera un número o un carácter alfanumérico.

La idea es que con el correr de los años Ud. tenga suficientes subrutinas para resolver cualquier problema que se le presente y sólo tenga que elegir las subrutinas y unirlas adecuadamente en un programa especial.

¿Y si yo no tengo predisposición para el orden, qué puedo hacer?
Este es un caso por demás común y no se trata simplemente de una característica negativa de personalidad.

Es que ordenar lleva mucho tiempo y no todos disponen del mismo.

Que hace Ud. para mantener su casa limpia y ordenada; contrata a alguien que le ordena el rancho. Ahora, los programadores que no tienen tiempo de ordenar y realizar un archivo de subrutinas, pueden recurrir a programas especiales que ya tienen todas las subrutinas comunes y no tan comunes debidamente archivadas en su espacio de memoria y presentadas en forma gráfica para identificarlos con toda facilidad. Estos programas también llamados de programación gráfica (quizás debamos ponerlo en singular porque hasta ahora solo encontramos uno) aprovechan el contexto para realizar controles internos y evitar que se produzcan errores de programación o repetición de nombres de variables o posiciones de memoria.

En una palabra que el usuario tiene que conocer algo de la programación del dispositivo para utilizar el programa, pero es sólo un mínimo que no le ocupa demasiado tiempo.

Con esto uno se dedica a la verdadera tarea creativa que involucra el diseño de un programa y deja de lado la tarea de memorización y repetitiva que tanto tiempo lleva. Próximamente presentaremos este programa y le brindaremos un "Demo" gratuito para que pueda analizarlo a fondo.

De cualquier modo para aprender a usar estos programa Ud. debe conocer las características del PIC utilizado y su set de sentencias característico.

Pensamos que recién el próximo mes, tendremos oportunidad de comenzar a trabajar con estos programas que nos simplifican enormemente la tarea de programar.

 
LA TEMPORIZACION
¿Qué precisión tiene una temporización realizada con un PIC?
Tiene una precisión tan grande como su clock. Si el oscilador es a cristal tiene precisión de cristal, si es RC todo depende de cómo se complementen las curvas de variación con la temperatura del capacitor y el resistor utilizados en el oscilador. En la figura 1 podemos observar el circuito correspondiente a un oscilador RC.

Los valores de C1 y R1 controlan la frecuencia de oscilación. No existe una fórmula precisa y simple de cálculo; pero para nuestro trabajo nos podemos arreglar perfectamente con una tabla levantada por el autor y que se puede observar en la figura 2.

Para nuestro caso particular del probador de instalaciones de red, necesitamos que el oscilador funcione a 4MHz, si no queremos usar un cristal.

De la tabla observamos que en ese caso necesitamos un capacitor de 20pF y un resistor del orden de los 4,7kohm. En cuanto al tipo de componentes utilizados, podemos decir que en este caso es conveniente utilizar un capacitor cerámico con coeficiente de temperatura nulo (NP0) y un resistor de carbón depositado. En lo que respecta a los valores límites, se aconseja no utilizar resistores superiores a 4,7kohm y capacitores menores a 20pF.

El PIC debe estar programado según el oscilador elegido. Si se utiliza oscilador a RC cuando se carga el programa, durante la predisposición se debe elegir la opción RC. Existen otras tres opciones más de oscilador que son el cristal de alta frecuencia (HS) y el cristal o resonador cerámico de baja frecuencia (XS). El límite de frecuencia entre estas opciones es 4MHz y como frecuencia máxima se puede llegar hasta 20MHz; es decir que en nuestro caso se podría optar indistintamente entre HS y XS. Por último existe una opción para cristales cuarzo (LP) de bajo consumo, alta estabilidad y baja frecuencia con un límite mínimo de 200kHz.

En la práctica, las opciones más usadas son la RC y la HS. De la RC ya dimos un circuito explicativo. El circuito de la opción HS se puede observar en la figura 3.

Los capacitores C1 y C2 no dependen del PIC sino del cristal utilizado. El fabricante del cristal recomienda el valor del capacitor a utilizar para que sea igual al que él utiliza en la prueba. De cualquier modo se puede asegurar que entre 10 y 50pF el cristal oscilará adecuadamente, aunque puede existir algún mínimo error en la frecuencia de oscilación, del orden de las centenas de Hz para un cristal típico de 4MHz. Este circuito de oscilador es el que utilizaremos en nuestro dispositivo probador de redes de PC.

Sólo en aquellos casos, en que se requiere un ajuste muy preciso de la frecuencia se utiliza un trimer de 50pF en reemplazo del capacitor C1. Un caso típico es en la construcción de codificadores y decodificadores de señales de TV.

El PIC nunca trabaja a una frecuencia de clock igual a la del oscilador. En efecto, entre el oscilador y el clock interno siempre hay un divisor por cuatro; de modo que las sentencias se ejecutan a un ritmo de 1 uS (una señal de 4MHz tiene un periodo de 0,25µS de modo que cuatro ciclos completan 1 uS). NOTA: existen algunas sentencias que requieren más de un ciclo de reloj. Por ejemplo, las de direccionamiento o salto que requieren dos ciclos de reloj.

 
LA SENTENCIA NOP
¿Qué significa realizar una demora?
Significa que el microprocesador no debe realizar ninguna operación matemática o lógica mientras dura el retardo. La sentencia NOP (no operation = ninguna operación) es justamente una sentencia inocua sobre todos los operadores internos, solo se incrementa en una unidad el contador de programa PC que indica el paso de programa que se esta ejecutando.

La sentencia NOP entonces aumenta el contador de programa en una unidad dejando todos los registros internos de la memoria y el registro de trabajo W de la unidad aritmética y lógica sin modificar.

Para recordar las sentencias el autor recurre a fichas en donde se anotan todos los detalles de las mismas.

La ficha correspondiente a la sentencia NOP se puede observar en la figura 4.

Cuando se requiera un retardo superior a 1µS, se deberá repetir la sentencia NOP tanta veces como sea necesario para llegar al retardo requerido.

Por ejemplo con un programa como el de la figura 5 se consigue un retardo de 4µS.

Este sector elemental de un programa, nos permitirá entender cómo funciona internamente un microprocesador al realizar una demora.

Un microprocesador es un sistema muy ordenado de cálculo numérico. El solo, realiza operaciones matemáticas binarias entre la información binaria introducida desde el puerto paralelo de entrada y guardada en una posición de memoria determinada (por ejemplo la 0009) y la contenida circunstancialmente en un registro interno llamado registro de trabajo W.

A su vez la información binaria de ese registro fue introducida en un paso previo de programa en otra determinada posición de memoria como veremos más adelante. Lo importante ahora es que tenemos dos números binarios de 8 bits o lo que es lo mismo dos Bytes uno en la posición de memoria 0009 y otro guardado el registro W.

Las sentencias marcadas en la columna central del programa le indican a la unidad aritmética y lógica que tipo de operación debe realizar entre ambos números binarios. En la sentencia NOP no hay ningún resultado, ni es necesario indicarle al micro en qué posición de memoria se guardan los operandos de la operación.

Pero cuando se usan otras sentencias aparecen datos en la tercer columna que proveen esta información (posición de memoria de una de los operando, ya que el otro es el registro W y además donde se debe guardar el resultado).

La operaciones que se realizan utilizando una sola de las 32 sentencias que forman el total que utiliza el PIC son operaciones de suma, resta, comparación, borrado, control de un dado bit, reubicación de bits, etc, etc.

Cada línea de programa tiene un número interno correlativo que se guarda en un registro de la memoria llamado PC (program counter o contador de programa) de modo que cuando se termina de realizar la operación se incrementa el número en una unidad para realizar el siguiente paso de programa. Cuando llegamos a la primer línea NOP, estamos quizás con el contador PC en 43. En el programa guardado en el micro no tenemos la sentencia NOP, sino un código de unos y ceros guardados en la posición de memoria correspondiente al PC 43. Este código numérico varía de acuerdo a la sentencia (para el NOP es 00 0000 0XX0 0000) y le indica a la ALU (unidad aritmética y lógica) todo lo que la misma debe hacer. Para la demora, el trabajo de la ALU es muy simple "no hacer nada"; sólo que "no hacer nada" se completa en 1uS lo mismo que por ejemplo sumar dos números.

Una vez realizada la operación de la línea 43, el PC pasa a 44 y se realiza la siguiente demora de 1 uS, luego se pasa a la 45 y a la 46 completando el retardo de 4 uS.

¿Y si necesitamos un retardo de 1 segundo o más, cómo se debe hacer?
En realidad hay otro medio de realizar retardos grandes que es un temporizador interno preseteable. Pero se trata de un temporizador con baja exactitud. Este modo de trabajo será visto más adelante. Lo típico es realizar retardos grandes por repetición automática de una única sentencia NOP. Esto implica realizar un LOOP cerrado en el programa y esto se realiza con una sentencia llamada de salto condicional que es lo que comentaremos en el próximo punto.

 
EL SALTO INCONDICIONAL
El programa de un micro se cumple habitualmente en orden ascendente del contador PC. Pero existe la posibilidad de realizar algo que se llama salto incondicional que interrumpe la secuencia natural del programa. Es decir que cuando PC llega cierta posición se produce un salto a una posición anterior. En la figura 6 se puede observar un programa que contiene ambos tipos de saltos para usar como ejemplo.

En el cuarto y sexto renglón se pueden observar sentencias de salto incondicional GOTO. Cada vez que el contador de programa PC llega al número correspondiente al cuarto renglón (supongamos el número 34) se produce un cambio en su contenido pasando en nuestro caso a un número una unidad menor (33), es decir que se vuelve a ejecutar la sentencia marcada con el nombre BUCLE.

En lenguajes de computación más antiguos, el programador colocaba realmente un número para cada renglón (por ejemplo el Basic). En ese caso la sentencia GOTO se completaba como GOTO 15 que significaba que el control del programa volvía a la sentencia del renglón 15 (también se puede decir al paso de programa 15).

En los lenguajes modernos la numeración de renglones queda a cargo de la misma máquina que la realiza como un trabajo de fondo que no es visible para el programador, salvo que él se lo pida específicamente al MPLAB o al editor que esté utilizando.

Pero para programar no se necesita conocer los números de los pasos de programa.

Basta con colocar un nombre o etiqueta a los renglones importantes, sobre la primer columna. Por ejemplo, el nombre BUCLE y marcar como destino el mismo nombre en la tercer columna de la sentencia GOTO. Así se forma un bucle cerrado y si adentro del bucle se coloca una sentencia NOP o cualquier otra sentencia, cada vez que se recorre el bucle se produce una demora, que se puede calcular de acuerdo a cuánto se tarda en ejecutar cada una de las sentencias del LOOP. Construyamos la ficha de la sentencia GOTO tal como lo hicimos con la sentencia NOP. Ver la figura 7.

La ficha nos indica que la operación se puede interpretar como "ir a" y que su sintaxis exige que en la segunda columna se ubique el nombre GOTO y en la tercera la etiqueta donde se debe volver (que en la ficha está marcada genéricamente como XXX). Por supuesto que la operación marcada XXX ‡ PC significa que la posición de memoria PC, se carga con el número de renglón correspondiente a la etiqueta de regreso una vez efectuada la operación GOTO.

Por último se da un ejemplo y se indica cómo quedan los registros especiales antes y después de efectuar la operación GOTO. En cuanto a la cantidad de ciclos de instrucción necesarios para efectuar un GOTO, la ficha nos dice que se necesitan dos ciclos, es decir, 2µS en nuestro caso.

Aún no sabemos cuantos ciclos requiere la sentencia "decfsz" pero si suponemos que también es doble se puede decir que para completar un LOOP se requieren 4µS, dos de GOTO y dos de DECFSZ.

¿Cómo se sale de un LOOP de GOTO?
La sentencia GOTO no incluye un camino de salida porque se trata de una sentencia incondicional. Es decir siempre dirige el control al mismo lugar del programa. Para salir del loop adentro del mismo se debe incluir un salto condicional. Es decir que es como un GOTO que aparece sólo si se cumple una determinada condición.

Por lo general la condición está dada por un contador ascendente o descendente que se coloca adentro del LOOP y que al llegar a cero genera un GOTO al exterior del LOOP.

 
CONCLUSIONES
El tema de las temporizaciones efectuadas en un programa, es suficientemente largo como para que debamos utilizar dos artículos para completar el estudio de una rutina de demora.

En este artículo presentamos dos importantes sentencias del PIC, la sentencia NOP y el salto incondicional GOTO, ambas muy utilizadas cuando se generan demoras. La NOP es la demora básica y la GOTO es imprescindible para generar LOOP cerrados que repitan una NOP para obtener demoras largas. En el próximo artículo vamos a explicarles qué es la sentencia DECFSZ y INCFSZ que son los saltos condicionales y los vamos a utilizar dentro de una subrutina de demora que es por mucho la más utilizada en programación con PICs.

 
Autor: Ing. Alberto H. Picerno
FIGURA 1
 
FIGURA 2
 
FIGURA 3
 
FIGURA 4
 
FIGURA 5
 
FIGURA 6
 
FIGURA 7
 
 
 
 
PROMOCIONES
 
 
PROMOCIONES
 
 
PROMOCIONES
 
 
PROMOCIONES
 
 
 
 
 
PROMOCIONES
 
 
PROMOCIONES
 
 
PROMOCIONES
 
 
PROMOCIONES
 
 
PROMOCIONES