Que son los PIC

40
¿ Que son los PIC? Los PIC son los circuitos integrados de Microchip Technology Inc . , que pertenece a la categoría de los microcontroladores es decir, aquellos componentes que integran en un único dispositivo todos los circuitos necesarios para realizar un completo sistema digital programable. Como se puede ver en la figura, los PIC (en este caso un PIC16F84) se presentan extern amente como los normales circuitos integrados TTL o CMOS, pero internamente disponen de todos los dispositivos típicos de un sistema a microprocesador es decir: Una CPU (Central Processor U nit es decir, unidad central de procesamiento) cuyo objeto es el de interpretar las instrucciones de programana. Una memoria PROM ( Programable Read Only Memory es decir, memoria programa ble de solo lectura ) en la cual son memorizadas en manera permanente las instrucciones del programa a seguir. Una memoria RAM (Random Access Memory es decir, memoria de asceso casual) utilizada para memorizar las variables utilizadas en el programa. Una serie de LINEAS DE I/O para manejar dispositivos externos o recibir impulsos de sensores, pulsantes, etc. Una serie de dispositivos auxiliares para el funcionamiento tales como generadore s de reloj, bus, contadores, etc. La presencia de todos estos dispositivos en un espacio extremadamente reducido, le da al proyectista enormes ventajas derivadas del uso de un sistema a micropro- cesador, debido a que estos hace poco tiempo se construían con circuitos tradicio- nales. Los PIC son disponibles en una amplia gama de modelos para adaptarse mejor a las exigencias de los proyectos, diferenciándose por él numero de líneas I/O y por la dotación de dispositivos. Se parte de los modelos más pequeños identificados con la sigla PIC12Cxx dotados de solo 8 pines, hasta llegar a modelos más grandes con una sigla PIC17Cxx dotados de 40 pines. Una descripción detallada de la tipología del PIC está disponible en el site web de Microchip ( http://www.microchip.com ) obtenible via internet, que aconsejamos mucho de explorar por la gran cantidad de información tecnica, software de soporte, ejemplos de aplicaciones y actualizaciones disponibles Para nuestro curso hemos escogido un modelo intermedio de PIC el PIC16F84 . Este esta dotado de 18

Transcript of Que son los PIC

Page 1: Que son los PIC

¿ Que son los PIC?

Los PIC son los circuitos integrados de Microchip Technology Inc. , que pertenece a la categoría de los microcontroladores es decir, aquellos componentes que integran en un único dispositivo todos los circuitos necesarios para realizar un completo sistema digital programable.

Como se puede ver en la figura,

los PIC (en este caso un PIC16F84) se presentan extern amente como los normales circuitos integrados TTL o CMOS, pero internamente disponen de todos los dispositivos típicos de un sistema a microprocesador es decir:

• Una CPU (Central Processor Unit es decir, unidad central de procesamiento) cuyo objeto es el de interpretar las instrucciones de programana.

• Una memoria PROM ( Programable Read Only Memory es decir, memoria programa ble de solo lectura ) en la cual son memorizadas en manera permanente las instrucciones del programa a seguir.

• Una memoria RAM (Random Access Memory es decir, memoria de asceso casual) utilizada para memorizar las variables utilizadas en el programa.

• Una serie de LINEAS DE I/O para manejar dispositivos externos o recibir impulsos de sensores, pulsantes, etc.

• Una serie de dispositivos auxiliares para el funcionamiento tales como generadore s de reloj, bus, contadores, etc.

La presencia de todos estos dispositivos en un espacio extremadamente reducido, le da al proyectista enormes ventajas derivadas del uso de un sistema a micropro- cesador, debido a que estos hace poco tiempo se construían con circuitos tradicio- nales.

Los PIC son disponibles en una amplia gama de modelos para adaptarse mejor a las exigencias de los proyectos, diferenciándose por él numero de líneas I/O y por la dotación de dispositivos. Se parte de los modelos más pequeños identificados con la sigla PIC12Cxx dotados de solo 8 pines, hasta llegar a modelos más grandes con una sigla PIC17Cxx dotados de 40 pines.

Una descripción detallada de la tipología del PIC está disponible en el site web de Microchip ( http://www.microchip.com ) obtenible via internet, que aconsejamos mucho de explorar por la gran cantidad de información tecnica, software de soporte, ejemplos de aplicaciones y actualizaciones disponibles

Para nuestro curso hemos escogido un modelo intermedio de PIC el PIC16F84. Este esta dotado de 18

Page 2: Que son los PIC

pines de los cuales 13 disponibles par I/O es decir, las conecciones con el resto de nuestro circuito y también por algunas características muy apropiadas a las exigencias de nuestro curso.

En particular el PIC16F84 dispone de una memoria para almacenar el programa de tipo EEPROM es decir, Electrical Erasable Programmable Read Only Memory, que puede ser reescrita cuantas veces queramos y por lo tanto ideal para nuestros experimentos y para la programación on-board es decir, actualización del programa interno de chip sin necesidad de retirarlo del circuito de prueba.

Tal característica viene plenamente aprovechada por nuestro programador YAPP! descripto en este curso y suministrado a cuantos han adquirido nuestro Kit completo PicTech. En alternativa es posible utilizar uno de los óptimos programadores producidos por otras firmas.

Quien no haya adquirido nuestro Kit pero desea de todas maneras construir el programador YAPP! podrá encontrar en este curso toda la documentación necesaria para realizarlo.

Y llego el momento de dar una ojeada al PIC16F84. Veamos la reproducción reportada en la siguiente figura:

Como es posible ver el PIC16F84 esta dotado de un total de 18 pines distribuidos en dos filas paralelas de 9 pines cada una. Los pines marcados con AZUL representan las Líneas de I/O diponibles para nuestras aplicaciones, los pines en ROJO y NEGRO son los pines de alimentación, los pines en VERDE son reservados al funcionamiento del PIC ( MCLR para el reset y OSC1-2 para el reloj ).

Observando los pines mostrados en la figura es posible visualizar una una breve descripción de su funcionamiento

En el paso sucesivo de esta lección conectaremos estos pines a nuestro primer circuito experimental para verificar inmediatamente su funcionamiento.

Introducción a los PIC

Al terminar esta leccion habras aprendido:

• Que son los PIC

Page 3: Que son los PIC

• Como realizar un simple circuito de prueba. • Como escribir y compilar un simple programa en assembler. • Como programar un PIC.

Contenidos de la lección 1

1. ¿Que son los PIC ? 2. Realizaremos un simple secuenciador a diodos led 3. Escritura y compilacion de un pr ograma en assembler 4. Analizaremos una fuente (source) assembler 5. Compilaremos una fuente assembler 6. Programaremos el PIC

Construiremos un simple secuenciador a LEDs

Después de haber visto brevemente como esta constituido un PIC, pasamos ahora a una simple aplicación practica.

Realizaremos un circuito muy simple cuyo fin es el de hacer encender en forma secuencial un diodo LED. Veremos como se escribe un programa en assembler, como se compila y como se transfiere al interno de la EEPROM del PIC para mandarlo a ejecutar.

El circuito a realizar es el siguiente example1.pdf (Acrobat reader 9Kb).

Como descrito en precedencia los pines Vdd (pin 14) y Vss (pin 5) sirven para entregar la alimentación al chip y son conectados respectivamente al positivo y al negativo (masa).

El pin MCLR (pin 4) sirve para efectuar el reset del chip cuando se pone en condicción lógica cero. En nuestro circuito esta conectado directamente al positivo y al programador YAPP!.

Los pines OSC 1/CLKIN (pin 16) y OSC 2/CLKOUT (pin 15) estan conectados internamente al circuito para la generación de la frecuencia de reloj utilizada para temporizar todos los ciclos de funcionamiento internos al chip. De esta frecuencia depende casi la totalidad de las operaciones internas y en particular la velocidad con la cual él PIC ejecuta las instrucciones del programa. En el caso del PIC16F84-04/P dicha frecuencia puede alcanzar un máximo de 4 Mhz de la cual se obtiene una velocidad de ejecución de las instrucciones igual a 1 millón de instrucciones por segundo. En nuestro caso para la generación de reloj utilizamos un cuarzo externo de 4 Mhz y dos condensadores de 22pf.

El pin RB0 (pin 6) es una de las lineas de I/O disponibles en el PIC para nuestros objetivos. En este caso esta línea esta conectada a un LED atraves de una resistencia de limitación. Una vez terminado el cableado del circuito vamos al paso sucesivo para aprender como se escribe el

Page 4: Que son los PIC

programa que el PIC deberá seguir.

Escritura y compilacion de un programa en assembler

Como cualquier sistema a microprocesador, también para los PIC es necesario preparar un programa que le permita desarrollar su trabajo.

Un programa esta constituido por una lista de instrucciones en secuencia, cadauna de las cuales identifican unívocamente las funciones de base que los PIC estan en grado de desarrollar. Cada instrucción esta representada por un código operativo ( en ingles operation code o más brevemente opcode ) a 14 bit y es memorizada en una posición de memoria EEPROM. Tal memoria en el PIC16F84 dispone de 1024 posiciones cada una de las cuales esta en grado de contener una sola instrucción. Un ejemplo de opcode en anotación binaria viene reportado enseguida.

00 0001 0000 0000B

Pero es muy probable que opcode venga representado en notación hexadecimal es decir:

0100H

Que representas exactamente el mismo valor pero en forma más breve. La letra H al final del valor 0100, indica el tipo de notación (hexadecimal). El mismo valor puede ser representado en assembler con la notación 0x100 derivada del lenguaje C o H´0100´.

Estos códigos, completamente privados de sentido para un ser humano, son los únicos que el PIC estan en grado de entender. Para facilitar la tarea al programador, se recurre a algunos instrumentos y convenciones para hacer las instrucciones más comprensibles.

La primera convención es aquella de asociar a cada opcode ( en total 35 para él PIC16F84 ) una sigla mnemónica es decir, una sigla que ayude a recordar el significado de la instrucción.

Regresando a nuestro ejemplo el opcode 0100H corresponde a la instrucción mnemónica CLRW que es la forma breve de la instrucción CLEAR W REGISTER es decir, acera el registro W (veremos mas adelante que significa).

Otras convenciones permiten de definir las variables, las constantes, las etiquetas (label) de referencia a las direcciones de memoria, etc. El conjunto de estas convenciones actas para facilitar la escritura de un programa para los PIC viene llamado lenguaje assembler. Un programa escrito en lenguaje assembler puede ser escrito en un PC utilizando cualquier procesador de palabra o editor en grado de generar archivos de tipo ASCII. Un archivo ASCII o, mejor dicho, un archivo de texto que contenga un programa en assembler viene llamado source o fuente assembler.

Una vez preparado nuestro source assembler (veremos mas adelante como), es necesario un programa en grado de traducir las instrucciones mnemónicas y todas las otras formas convencionales con las cuales fue escrito nuestro source en una serie de números ( los opcode ) reconocibles directamente por el PIC. Este programa se llama compilador assembler o assemblador.

Page 5: Que son los PIC

En la figura siguiente viene esquematizado el flujo de operaciones y el archivo (file) que se genera para pasar de un source assembler a un PIC programado.

Como se dijo la primera operación a efectuar es escribir el sourse assembler y su memorización en un archivo ( file ) de texto con extensión .ASM. Para hacer esto hemos dicho que es necesario utilizar un editor ASCII es decir, un programa de escritura como por ejemplo el NOTEPAD.EXE de Windows o el EDIT.EXE de MS/DOS©. Es posible generar este archivo también con programas de elaboración de texto mas sofisticados tales como Word© o Wordperfec teniendo el cuidado de memorizar siempre el archivo producido in formato texto y no en formato nativo. Esto para evitar que se memoricen los caracteres de control de formateo del texto que el compilador assembler no esta en grado de tratar.

En nuestro primer experimento practico utilizaremos el archivo LED.ASM

Page 6: Que son los PIC

El paso sucesivo es la compilación del source es decir, la transformación en opcode de los códigos mnemónicos o instrucciones assembler en los contenidos.

El compilador assembler que utilizaremos es el MPASMWIN.EXE producido por Microchip y disponible en CD-ROM incluido en nuestro Kit o también en site internet de Microchip (http://www.microchip.com).

Como es posible ver, además de nuestro source con extensión .ASM es necesario entregar al compilador un segundo archivo producido por Microchip con extensión .INC diferente según el tipo de PIC que estemos utilizando. En nuestro caso el archivo es el PIC16F84.INC.Esta source contiene algunas definiciones dependientes del chip utilizado que veremos mas adelante.

Durante la compilación del sourse, el compilador assembler genera una serie de archivos con nombre idéntico a la sourse pero con extensión distinta:

• .HEX es el archivo que contiene los códigos operativos para enviar al PIC a traves del programador.

• .LSTes un archivo de texto el cual contiene todo el source assembler y la correspondiente traducción en opcode. No es utilizable para la programación del PIC pero es extremadamente útil para verificar los procesos de compilación realizados por el compilador.

• .ERR contiene la lista de los errores de compilación encontrados y el numero de línea en el interno del source assembler en la cual se encontraron.

Los archivos .LST, .ERR vienen utilizados para el control de lo realizado en la compilacion. Solo el archivo .HEX viene utilizado realmente para programar el PIC. Veamos ahora como.

El archivo .HEX no es un archivo en formato binario y no corresponden directamente al contenido que deberá tener la EEPROM del PIC. Pero su formato si corresponde directamente a cuanto será transferido al PIC en forma legible y con unas instrucciones de más.

Sin entrar ahora en detalles es útil saber que formato es directamente reconocible por el programador de PIC que proveerá durante la programación a convertir en binario, el cual contiene además del opcode otras informaciones que se suman a las direcciones en las cuales serán transferidos los opcode. En el paso sucesivo analizaremos nuestro primer source assembler y veremos buena parte de las convenciones utilizadas en el lenguaje assembler.

Page 7: Que son los PIC

Analicemos un source assembler

Analicemos ahora línea por línea el contenido de nuestro source LED.ASM. Para quien dispone de una impresora es útil realizar una copia del source para seguir mejor nuestra descripción. De lo contrario seria preferible visualizar el source en una ventana separada de modo de poder seguir simultáneamente el source y la relativa explicación.

Partimos de la primera línea de código:

PROCESSOR 16F84

PROCESSOR es una directiva del compilador assembler que permite definir para cual microprocesador se escribió nuestro source. Las directivas no son instrucciones mnemónicas que el compilador traduce en el respectivo pocode, pero si, simples indicaciones que se entrega al compilador para determinar el funcionamiento durante la compilación. en este caso informamos al compilador que las instrucciones entregadas a nuestro source son las relativas a un PIC16F84.

RADIX DEC

La directiva RADIX sirve para informar al compilador que los números reportados sin notación, deben entenderse como números decimales. Es decir, si queremos especificar, por ejemplo el numero hexadecimal 10 (16 decimal) no podemos escribir solamente 10 porque seria interpretado como 10 decimal, pero sí 10h o también, 0x10 o también, H´10´.

INCLUDE "P16F84.INC"

Esta es otra directiva. Esta vez indicamos al compilador nuestra intención de incluir en el source un segundo archivo (file) denoninado P16F84.IN. El compilador se limitara a sustituir la línea que contiene la directiva INCLUDE con el contenido del archivo indicado y a efectuar por lo tanto la compilación como si fuera también parte de nuestro source.

LED EQU 0

Todavía directivas ! Pero cuando llegan las instrucciones ? Tengamos un poco de paciencia.

La directiva EQU es muy importante porque nos permite de definir las constantes simbólicas al interno de nuestro source. En particular la palabra LED de ahora en adelante en el source será equivalente al valor 0. La finalidad principal de la existencia de la directiva EQU es la poder hacer los source más legibles y de permitir cambiar los valores constantes en un único punto del source.

Es importante notar que la palabra LED no identifica una variable, es simplemente un nombre simbólico valido durante la compilación. No será por lo tanto, posible introducir instrucciones tipo LED = 3 al interno del source ya que la asignación dinámica de un valor a una variable es una operación que requiere la intervención de la CPU del PIC y por lo tanto debe ser expresada con instrucciones y no con directivas.

Las directivas tienen sentido solo durante la compilacion del source por lo tanto, un PIC no podra nunca seguir una directiva.

Veamos ahora la línea siguiente:

Page 8: Que son los PIC

ORG 0CH

También ORG es una directiva que nos permite definir la dirección para la cual queremos que el compilador empiece a localizar los datos o las instrucciones siguientes. En este caso, definiremos un arrea de datos al interno del PIC es decir, un área en la cual memorizar variables y contadores durante la ejecución de nuestro programa. Esta área coincide con el área RAM del PIC definida por Microchip como el área de los FILE REGISTER.

Los file register son localizaciones RAM disponibles por el usuario a partir de la dirección 0CH. Esta dirección de inicio es fija y no puede ser cambiada respecto a las localizaciones precedentes que son ocupadas por otros registros especializados para uso interno.

Count RES 2

En esta línea encontramos una label (etiqueta): Count y una directiva: RES.

La directiva RES indica al compilador que queremos reservar un cierto numero de byte o mejor de file register al interno del área de datos; in es caso 2 byte. La label Count, donde Count es un nombre escogido por nosotros, es una marca que en el resto del source asumirá el valor de la dirección en la cual fue colocado. Dado que en precedencia habíamos definido la dirección de partida como 0CH con la directiva ORG, Count valdrá 0CH. Si por ejemplo inserimos una label también en la línea sucesiva esta valdrá 0CH + 2 ( dos son los byte que hemos reservado) es decir, 0EH. Los nombres de las label (etiquetas) pueden ser cualquiera a excepción de las palabras reservadas al compilador (tales como las instrucciones mnemónicas y las directivas).

Una label se distingue de una constante simbólica porque su valor viene colocado en fase de compilación y no asignado por nosotros estáticamente.

ORG 00H

Esta segunda directiva ORG hace referencia a una dirección en el área de programa (en la EEPROM) y no en el área de datos. A partir de este punto, empezaremos a inserir las instrucciones mnemónicas que el compilador deberá convertir en las oportunas opcode para el PIC.

El primer opcode seguido por el PIC después del reset es el memorizado en la localización 0, correspondiente al valor 00H inserido en la ORG.

bsf STATUS,RP0

Esta es primera instrucción mnemónica completa con parámetros. Los PIC tienen una CPU interna del tipo RISC para la cual cada instrucción ocupa una sola localización de memoria, opcode y parámetros incluidos. En este caso la instrucción mnemónica BSF significa BIT SET FILE REGISTER es decir, pone un uno (condición lógica alta) uno de los bit contenidos en la localización de RAM especificada.

El parámetro STATUS viene definido en el file P16F84.INC atraves de una directiva EQU. El valor asignado a este file es 03H y corresponde a un file register (es decir, una localización RAM en el área de datos) reservado.

También el parámetro RPO viene definido en el file P17F84.INC con el valor 05H y corresponde al numero del bit que se quiere poner en uno. Cada file register tiene una longitud de 8 bit y la numeración de cada uno parte de 0 (bit menos significativo) hasta llegar a 7 (bit más significativo).

Page 9: Que son los PIC

Esta instrucción en practica coloca un 1 en el quinto bit del file register STATUS. Esta operación es necesaria, como veremos en las próximas lecciones, Para acceder a los file register TRISA y TRISB como veremos ahora.

movlw 00011111B

Esta instrucción significa: MOVE LITERAL TO W REGISTER es decir, mueva un valor constante en el acumulador. Como veremos mas adelante, el acumulador es un registro particular utilizado por la CPU en todas estas situaciones en la cual se hacen operaciones entre dos valores como operaciones de desplazamiento entre localizaciones de memoria. En practica es un registro de apoyo utizado por la CPU para memorizar temporalmente un byte cada vez que se presente la necesidad. El valor constante de memorizar en el acumulador es 00011111B es decir, un valor binario de 8 bit donde el bit mas a la derecha representa el bit 0 o el bit menos significativo. En la instrucción siguiente:

movwf TRISA

el valor 00011111 viene memorizado en el registro TRISA (como para el Registro STATUS también TRISA es definido atraves una directiva EQU ) cuya función es la de definir el funcionamiento de cada línea de I/O de la puerta A. En particular cada bit con uno del registro TRISA determina un un ingreso en la respectiva línea de la puerta A mientras cada 0 determina una salida.

En la siguiente tabla viene reportada la configuración que asumirán los pines del PIC después de la ejecución de esta instrucción:

N.bit registro TRISB Línea puerto A N.Pin Valor Estato

0 RA0 17 1 Input

1 RA1 18 1 Input

2 RA2 1 1 Input

3 RA3 2 1 Input

4 RA4 3 1 Input

5 - - 0 -

6 - - 0 -

7 - - 0 -

Como es posible ver los bit 5,6 y 7 no corresponden a ninguna línea de i/o por lo tanto su valor no tiene ninguna importancia.

Las dos instrucciones siguientes realizan las mismas funciones para el puer to B del PIC:

movlw B'11111110' movwf TRISB

Page 10: Que son los PIC

en este caso la definición de las líneas será la siguiente:

N.bit registro TRISB Línea puerto B N.Pin Valor Estato

0 RB0 6 0 Output

1 RB1 7 1 Input

2 RB2 8 1 Input

3 RB3 9 1 Input

4 RB4 10 1 Input

5 RB5 11 1 Input

6 RB6 12 1 Input

7 RB7 13 1 Input

Nótese como el valor 0 en el bit 0 del registro TRISB determina la configuración en la salida de la respectiva línea del PIC. En nuestra aplicación esta línea viene utilizada para activar el LED que va prender y apagar.

Hemos visto que la instrucción movwf TRISB transfiere el valor contenido en el acumulador (inicializado oportunamente con la instrucción movlw 11111110B) al registro TRISB. El significado de movwf es por lo tanto MOVE W TO FILE REGISTER.

bcf STATUS,RP0

Esta instrucción es parecida a bsf vista anteriormente, con la diferencia que acera el bit en vez de hacerlo uno. La sigla en este caso es BIT CLEAR FILE REGISTER.

Del punto de vista funcional instrucción se escogió para consentir el acceso A los registros internos del banco 0 en vez de los registros internos del banco 1 de los cuales hacen parte TRISA Y TRISB. Una descripción mas detallada se dará mas adelante.

bsf PORTB,LED

Con esta instrucción se efectúa la primera operación que tiene un reencuentro con el externo del PIC. En particular viene acezado el LED conectado a la línea RB0. PORTB es una constante definida en P16F84.INC y permite de referenciar el file register correspondiente a las líneas I/O del puerto B mientras LED es el numero de la línea que debe poner en 1. Si recordamos bien, al inicio del sourse la constante LED esta definida igual 0, por lo tanto, la línea interesada será RB0.

MainLoop

Esta línea contiene una label o mejor una referencia simbólica hacia una dirección de memoria. El valor de la label, como dicho anterior mente, se calcula en fase de compilación en base al numero de instrucciones, a las directivas ORG y a las otras instrucciones que de alguna manera ocupan espacio en la memoria del

Page 11: Que son los PIC

PIC.En este caso, se cuentan las instrucciones a partir de la ultima directiva ORG podemos calcular el valor que será asignado MainLoop o sea, 07H.

En realidad el valor que asumen las label no tienen mucha importancia puesto que su finalidad es de evitar de conocer la posición precisa de los opcode en la memoria del PIC permitiendo de todas maneras de diferenciar una determinada posición de memoria.

En este caso la label MainLoop viene utilizada como punto de inicio de un ciclo (de ingles loop) de encendido y de apagado del LED, es decir, una parte de código que vendrá repetida cíclicamente al infinito.Encontraremos mas adelante una referencia a esta label.

call Delay

Esta instrucción determina una llamada (del ingles call ) y una subrutina que empieza en correspondencia con la label Delay.

Las subrutinas son de las partes del programa especializadas para efectuar una funcion especifica. Cada vez que sea necesaria esta función es suficiente llamarla con una sola instrucción, en vez de repetir cada vez todas las instrucciones necesarias para efectuarla.En este caso la subrutina introduce un retardo igual al tiempo de encendido y apagado del LED.

Las instrucciones que componen la subrutina Delay son introducidas mas adelante en este curso.

btfsc PORTB,LED

El significado de esta instrucción es BIT TEST FLAG, SKIP IF CLEAR es decir, controla el estado de un bit interno de un registro y salta a la instrucción sucesiva si el valor de tal bit es cero. El bit a controlar corresponde a la línea de output (salida) a que esta conectado el LED, por medio de este “test” podremos determinar por lo tanto si el LED esta iluminado o apagado e intervenir es decir, si el LED esta iluminado lo apagaremos, si esta apagado lo prenderemos.

goto SetToZero

Esta instrucción es un salto incondicional ( del ingles GO TO , ir )a la etiqueta SetToZero donde encontraremos las instrucciones para apagar el LED. Esta instrucción vendrá saltada de la instrucción sucesiva si el LED esta ya apagado.

bsf PORTB,LED goto MainLoop

Estas dos instrucciones apagan el LED y reenvían el programa al inicio del ciclo de prendido y apagado.

SetToZero bcf PORTB,LED goto MainLoop

Estas dos instrucciones simplemente apagan el LED y reenvían el progama al inicio del ciclo de prendido y apagado.

La subrutina Delay

Page 12: Que son los PIC

Como descrito anteriormente esta subrutina introduce un retardo de alrede- dor de un segundo y puede ser llamada tadas las veces en la sourse a tra - ves de la instrucción call Delay.

Veamos como funciona:

Delay clrf Count clrf Count+1 DelayLoop decfsz Count,1 goto DelayLoop decfsz Count+1,1 goto DelayLoop retlw 0 END

Delay y DelayLoop son dos etiquetas. Delay identifica la dirección de inicio de la subrutina y viene utilizado para las llamadas del cuerpo principal del programa. DelayLoop viene llamado internamente de la subrutina y sirve como punto de ingreso para el ciclo ( del ingles loop ) de retardo.

¡En practica el retardo viene obtenido siguiendo miles de instrucciones que no hacen nada !

Este tipo de retardo se llama retardo software o retardo a programa. Es el tipo de retardo más simple de implementar y puede ser utilizado cuando no se necesita que el PIC haga otras tareas mientras adelanta el retardo.

Las instrucciones:

clrf Count clrf Count+1

CLEAR FILE REGISTER aceran las dos sitios de RAM reservados anteriormente con la instrucción :

Count RES 2

Estos dos lugares son adyacentes a partir de la dirección referenciada por la label Count.

decfsz Count,1

La instrucción significa DECREMENT FILE REGISTER, SKIP IF ZERO es decir, decrementar el contenido de un registro ( en este caso Co unt y saltar a la instrucción siguiente si el valor alcanzado es cero ). Si el valor alcanzado no es cero viene ejecutada la instrucción siguiente:

goto DelayLoop

Que ordena la ejecucion desde el principio del ciclo de retardo.Una vez alcanzado el cero con el contador Count vienen ejecutadas las intrucciones:

decfsz Count+1,1 goto DelayLoop

Page 13: Que son los PIC

Que decrecen el registro siguiente hasta que este también alcance el cero. El registro Count + 1 en particular sara decrementado de uno cada 256 decrementos de Count.

Cuando también Count + 1 alcance el cero la instrucción:

return

Cuyo significado es RETURN FROM SUBROUTINE que determinara la salida de la rutina de retardo y la continuación de la ejecución de la instruccion sucesiva la call Delay. Para terminar END es una directiva que indica al compilador el final del source assembler. En el paso siguiente compilaremos el source LED_1.ASM y programaremos el PIC con el código generado en la salida del compilador assembler.

Compilaremos un source assembler

Veamos ahora como es posible efectuar en la practica la compilación de un sourse assembler.

Primero creemos sobre nuestro disco duro un directorio de trabajo en el cual de ahora en adelante memorizaremos todos los sourse del curso. Escojamos un nombre por ejemplo:

C:\PICPRG

(Cualquier otro nombre de directorio o drive es obviamente valido. Bastara sustituir en el resto del curso todo lo referente a C:\PICPRG con el nombre del drive y del directorio escogido).

Copiamos ahora en nuestro directorio de trabajo C:\PICPRO los archivos LED.ASM y PIC16F84.INC. Para hacer esto basta hacer click en el pulsador derecho del mouse sobre el nombre y solicitar de salvar el file de nuestro directorio de trabajo, por lo tanto repetir la operación para los dos files.

Instalemos ahora el software necesario para compilar nuestros source.

Microchip hace disponible la dirección: http://www.microchip.com el propio assembler MPASM en doble versión para el sistema operativo Microsoft Windows™ 3.1/95 y para ambiente MS/DOS ™. Enseguida haremos referencia a la versión MS/DOS que puede de todas maneras trabajar también en una sección prompt MS/DOS de Microsoft Windows.

Seguimos las instrucciones entregadas en la pagina Microchip hasta obtener el file MPASM.EXE que contiene el ejecutable para MS/DOS del assembler. Copiamos por lo tanto este file en nuestro directorio de trabajo C:\PICPRG.

Advertencia..! el MPSAM es un producto de propiedad de Microchip Technology.inc.., por lo tanto no olvidar de leer atentamente las condiciones de uso indicadas durante la fase de instalación.

Compilaremos nuestro sourse LED.ASM después del prompt de DOS

Page 14: Que son los PIC

la instrucción:

MPASM LED.ASM

El resultado que debemos obtener en la pantalla es el siguiente:

Presionamos una tecla como lo solicita el MPASM y vamos a ver que files se generaron. Si todo salió bien, deberemos tener los siguientes archivos nuevos:

LED.HEX LED.LST LED.ERR LED.COD

Los contenidos de los files ya se ilustraron en el paso 3 por lo tanto,proseguimos con la programación del PIC utilizando solo el file LED.HEX que contiene el file compilado en formato Intel Hex 8.

Programemos el il PIC

Para programar los PIC en esta lección haremos referencia al programador YAPP contenido en el hardware PicTech entregado con la versión comercial de este curso. La documentación y el software para realizar sea el PicTech o el YAPP! están reportados en esto sito.

Para la programación de los chips con otros programadores se ruega de hacer referencia a la relativa documentación.

Copiamos en nuestro directorio de trabajo C:\PICPRG el file YAPP:EXE, por lo tanto dejamos en ejecución el YAPP con el siguiente comando del prompt del DOS:

YAPP LED.HEX /COM2 /XT

Con el cual enviamos a el YAPP ( conectando, por ejemplo,a la puerta serial COM2 ) el file LED.HEX el

Page 15: Que son los PIC

cual contiene nuestro programa compilado y programamos el PIC para que funcione con un cuarzo externo.

Para mayor información sobre la sintaxis del programa YAPP.EXE hacer referencia a la relativa documentación.

Si lo YAPP esta correctamente conectado veremos correr los opeode hexadecimales de las instrucciones de nuestro programa sin ningún mensaje de error.

Terminada la programación veremos prenderse y apagarse el LED 1 de la taijeta PicTech tal como la programamos.

Arquitectura interna de los PIC

Al terminar esta leccion habras aprendido:

• Donde se memoriza el programa. • Donde se memorizan los datos. • Que es una ALU, un Acumulador, el Program Counter, el Stac y el Register File..

Contenidos de la lección 2

1. El area programa y el Register File 2. El ALU y el registro W 3. El Program Counter y el Stack 4. Realizaremos el "secuenciador de

El Area de Programa y el Register File

Despues de haber hecho un poco de practica, pasamos ahora a la teoria. Iniciaremos viendo como esta hecho internamente el PIC, cuales son los dispositivos que contiene y como interactuan entre si.

En la figura siguiente se muestra el esquema a bloques simplificado de la arquitectura interna del PIC16F84 que nos ayudara a entender mejor lo que se ha explicado. Las mostradas en amarillo, son los componentes que uno por uno iremos analizando.

Empezaremos por la memoria EEPROM e dal REGISTER FILE.

Page 16: Que son los PIC

La EEPROM es una memoria especial, no borrable electricamente utilizada en el PIC para memorizar el programa a seguir.

La capacidad de memorizacion es de 1024 posiciones de memoria, cada una en grado de contener un opcode de 14 bit es decir, una instrucción base del PIC. Por lo tanto, el mas complejo que podemos realizar no podra ser mayor de 1024 instru- cciones.

Las diecciones reservadas a la EEPROM van de 0000H a 03FFH.El PIC puede solamente puede ejecutar las instrucciones memorizadas en estas posiciones. No se puede de manera interna leer, escribir o borrar lo que alli se encuentra contenido.

Para escribir, leer y borrar estas posiciones es necesario un dispositivo externo denominado PROGRAMADOR. Un ejemplo der programador es nuestro YAPP! o el PICSTAR-16+® producido por Microchip o muchos otros disponibles en el comercio.

La primera posicion de memoria, correspondiente a la direcion 0000H, debe contener la primera instrucción que el PIC ejecutara despues del reset y por esto se denomina Reset Vector.

Como recordaran, en el sourse LED.ASM presentado en la primera leccion fue introducida la directiva:

ORG 00H

Page 17: Que son los PIC

Para señalar el inicio del programa. Esta directiva tiene en cuenta el hecho que la ejecucion del programa al reset parte de la direccion 000H del area de programa.

La instrucción que sigue inmediatamente a la directiva ORG 00H:

bsf STATUS,RP0

será por lo tanto, la primera instrucción ejecutada.

El REGISTER FILE es un conjunto de posiciones de memoria RAM denominadas REGISTROS . Contrariamente a la memoria EEPROM destinada a contener el programa, el area de memoria RAM es directamente visible por el programa mismo.

Por lo tanto, podemos escribir, leer y modificar tranquilamente cada posicion del REGITER FILE en nuestro programa cada vez que sea necesario.

L'unica limitazione consiste nel fatto che alcuni di questi registri svolgono una funzione speciale per il PIC e non possono essere utilizzati per scopi diversi da quelli per cui sono stati riservati. Questi registri speciali si trovano nelle locazioni più basse dell'area di memoria RAM secondo quanto illustrato di seguito.

Las posiciones de memoria presentes en el REGITER FILE son direccionables directamente en una longitud de memoria que va de 00H a 2FH para un total de 48 byte, denominada pagina 0. Un segundo segmento de direccionamiento denominado pagina 1 va de 80H a AFH. Para acceder a este segundo espacio es necesario recurrir a los dos bit auxiliares RP0 y RP1 según la forma que explicaremos más adelante. Las primeras 12 posiciones de la pagina 0 (de 00H a 0BH) y de la pagina 1 ( de 80H a 8BH ) son aquellas reservadas a las funciones especiales de funcionamiento del PIC y como dijimos, no puden ser utilizadas para otros fines.

Las 36 posiciones de la pagina 0 direccionables de 0CH a 2FH pueden ser utilizadas libremente por nuestros programas para memorizar variables, contadores, ecc.

Page 18: Que son los PIC

En nuestro ejemplo LED.ASM la directiva :

ORG 0CH

Indica la dirección de inicio del area de datos utilizable por nuestro programa.

La directiva que sigue:

Count RES 2

reserva un espacio de dos posiciones, que el programa utilizara para memorizar los contadores de retardo de la subrutina Delay.

Los registros especializados del PIC vienen utilizados con mucha frecuencia en los programas.

Por ejemplo, se recurre a la pareja de registros especializados TRISA y TRISB, para definir que líneas de I/O son de entrada y cuales de salida. Del mismo estado lógico de las líneas de I/O depende del valor de los dos registros PORTA y PORTB.

Algunos registros suministran el estado de funcionamiento de los dispositivos internos del PIC o el resultado de las operaciones aritméticas y lógicas.

Es necesario por lo tanto, conocer exactamente que función desarrolla cada registro especializado y que efectos se obtienen al manipuel contenido.

Para facilitar las operaciones con los registros especializados, en el archivo (file) P16F84.INC ( que como recordaran fue incluido en el sourse LED.ASM con la directiva INCLUDE ) la Microchip ha proporcionado una lista de los nombres que identifican unívocamentete cada registro especializado o al cual se asocian las direcciones correspondientes en el area de los REGITER FILE.

Si, con un ejemplo, quisiéramos definir todas las líneas del puerto B del PIC en salida, actuando sobre el registro TRISB, podremos refe- renciar directamente el registro con su dirección :

movlw B'00000000' movwf 06H

también, referenciar el mismo registro con su nombre simbólico:

movlw B'00000000' movwf TRISB

pero teniendo el cuidado de introducir la directiva INCLUDE “PIC16F84.INC” en nuestro source.

En el paso siguiente veremos otro componente interno del PIC denominado ALU y el registro W conocido también con el nombre de acumulador.

Page 19: Que son los PIC

La ALU y el registro W

Vamos ahora a ilustrar otros dos componentes fundamentales en la arquitectura de los PIC, la ALU y el registro W o acumulador.

La ALU ( Arithmetic and Logic Unit es decir, unidad aritmética y lógica ) es la componente más compleja de los PIC por cuanto contiene toda la circuiteria delegada a desarrollar las funciones de calculo y manipulacion de los datos durante la ejecución de un programa.

La ALU es una componente presente en todos los microprocesadores Y de ella depende directamente la potencia de calculo del micro mismo.

La ALU del PIC16F84 esta en grado de operar valores sobre los 8 bit, es decir, valores numéricos no mayores de 255. Existen microprocesadores con ALU a 16, 32, 64 bit y otras. La familia Intel™ 80386™, 486™ y Pentium™ por ejemplo,dispone de una ALU a 32 bit. La potencia de calculo alcanzada por estos micros es notablemente superior al menoscabo de la compleja circuiteria interna, accesorios y en consecuencia del espacio ocupado.

Directamente conectado con la ALU esta el registro W denominado también acumulador. Este registro

Page 20: Que son los PIC

consiste de una simple posición de memoria en grado de contener un solo valor de 8 bit

La diferencia sustancial entre el registro W y las otras localizaciones de memoria consisten en el hecho que, referenciando el registro W, la ALU no debe entregar ninguna dirección de memoria, pero si puede acceder directamente.

El registro W es utilizado mucho en los programes para PIC.

Hagamos un ejemplo practico. Supongamos de volver a inserir en la direccion de memoria 0CH del REGISTER FILE el valor 01H. Buscando entre las instrucciones del PIC nos damos cuenta que no existe una única instrucción en grado de efectuar esta operación por lo tanto, debemos necesariamente recurrir al acumulador y usar dos instrucciones en secuencia.

Veamos porque:

Como dijimos en los pasos anteriores, el opcode de una instrucción no puede ser mayor de 14 bit mientras que a nosotros nos sirve:

8 bit para especificar el valor que entendemos introducir en la posición de memoria, 7 bit para especificar in cual posición de memoria queremos introducir nuestro valor, 6 bit para especificar cual instrucción entendemos utilizar.

para un total de 8 + 7 + 6 = 21 bit.

Debemos por lo tanto recurrir a dos instrucciones, es decir :

movlw 01H movwf 0CH

que primero introduzca en el registro W El valor 01H con la instrucción MOVe Literal to W y después lo “ mueva “ de la posición 0CH con la instrucción MOVe W to F. En el paso siguiente encontraremos El programa Counter y lo Stack que nos ayudaran a entender como funcionan las instrucciones de salto del PIC.

El Program Counter y el Stack

En este paso analizaremos El funcionamiento del Program Counter y del Stack dos componentes importantes para la comprensión de las instrucciones de salto y llamada a subrutinas.

Page 21: Que son los PIC

Como hemos visto en los pasos anteriores, el PIC16F84 inicia la ejecución del programa a partir del Reset Vector es decir, de la posición de memoria 0000H. Después de ejecutar esta instrucción pasa a la instrucción siguiente memorizada en la pocisión 0001H. y así sucesivamente. Si no hay instrucciones en grado de influenciar la ejecución progresiva del programa, el PIC llegara rápido a ejecutar la instrucción memorizada en la última posición y no sabrá mas como continuar.

Sabemos obviamente que no es así y que cualquier sistema microprocesado o lenguaje de programación dispone de instrucciones de salto, es decir instrucciones en grado de modificar el flujo de ejecución del programa.

Una de estas instrucciones es e l goto ( del ingles go to, ir a ). Cuando el PIC encuentra un goto no ejecuta mas instrucciones sucesivas sino que salta directamente a la posicion de memoria especificada en la instrucción.

Hagamos un ejemplo:

ORG 00H Point1

Page 22: Que son los PIC

movlw 10 goto Point1

Al reset el PIC ejecuta la instrucción movlw 10 memorizada en la pocisión 0000H que introducirá en el acumulador el valor decimal 10. Por lo tanto pasara a la instrucción siguiente goto Point1. Esta instrucción determinara un salto incondicional a la posición de memoria señalada por la label Point1 es decir, de nuevo a la posición 0000H.

El programa no hará otra cosa que ejecutar un ciclo infinito ejecutando continuamente la dos instrucciones predeterminadas.

Durante este ciclo, para determinar cual es la sucesiva instrucción a seguir, el PIC utiliza un registro especial denominado Program Counter es decir, contador de programa. este se actualiza con la dirección de la próxima instrucción a ejecutar. Al reset todo viene acerado, determinando el inicio de la ejecución de la dirección 0000H, cada instrucción viene incrementada de uno para consentir el paso a la instrucción sucesiva.

La instrucción goto consiente la introducción de un nuevo valor en el Program Counter y del consiguiente salto a una posición cualquiera del área de programa del PIC.

Otra instrucción muy interesante es la call es decir, la llamada a subrutina.

Esta instrucción funciona en manera muy simple similar a la goto con la única diferencia que antes de ejecutar el salto memoriza, en una posición de memoria particular denominada Stack , la dirección de aquella que deberia ser la próxima instrucción a seguir si no estuviera call.

Veamos mejor con un ejemplo:

ORG 00H Point1 movlw 10 call Point2 goto Point1 Point2 movlw 11 return

En este caso el PIC, después de haber ejecutado la movlw 10 pasa a ejecutar la call Point2. Antes de saltar memoriza en el Stack la dirección 0002H es decir, la dirección de la posición a la call. Pasa por lo tanto a ejecutar la instrucción movlw 11, memorizada en correspondencia de la label Point2 . A este punto encuentra una nueva instrucción la return que, como se puede deducir de su nombre, permite de “ volver “, es decir, vuelve a ejecutar la instrucción siguiente a la call.

La operación apenas efectuada viene denominada “llamada a subrutina “ es decir, instrucción momentánea de normal flujo del programa que “ llama “ en ejecución una serie de instrucciones y después

Page 23: Que son los PIC

regresa al normal flujo de ejecución.

Per poter riprendere da dove aveva interrotto, il PIC utilizza l'ultimo valore inserito nello Stack e lo inserisce di nuovo nel Program Counter.

La palabra Stack en ingles significa “ amontonar “ y en efecto es posible amontonar uno sobre otro las direcciones para recuperarlas cuando se necesiten. Este tipo de memorización viene también denonada LIFO del ingles Last In First Out, en el cual el ultimo elemento introducido ( last in ) debe necesariamente ser el primero en salir (last out).

Gracias al Stack es posible efectuar siempre mas call, una dentro de la otra y mantener siempre la seña del punto en el cual reinicia el flujo en el mo- mento en que se encuentra una instrucción return.

Veamos otro ejemplo:

ORG 00H Point1 movlw 10 call Point2 goto Point1 Point2 movlw 11 call Point3 return Point3 movlw 12 return

En este caso en la subrutina Point2 viene efectuada una ulterior call a la subrutina Point3. Al regreso de esta ultima el programa deberá reeentrar en la subrutina Point2 ejecutar return y luego regresar al flujo principal.

Las direcciones de memorizar en el stack son dos porque se encuentra una segunda call antes de encontrar la return correspondiente a la primera. Se dice por lo tanto que las call son “ nidificadas “ es decir, una dentro de la otra.

El PIC16F84 dispone de un stack a 8 niveles es decir, un stack que permite hasta 8 llamadas nidificadas. Es importante asegurarse, durante la escritura de un programa, que exista una instrucción return en correspondencia a una call para evitar peligrosos desalinamientos del stack que en ejecución pueden ocasionar errores difícilmente detectables. En el próximo paso modificaremos nuestro sourse LED.ASM para fijar mejor lo aprendido hasta el momento.

Page 24: Que son los PIC

Realizaremos el "secuenciador de luces"

Probemos ahora a fijar los conceptos hasta ahora aprendidos, recobremos el sourse LED.ASM presentado en la primera lección para realizar un se-cuenciador a cuatro led. El nuevo sourse modificado se llamara SEQ.ASM . En el file example2.pdf se muestra el esquema eléctrico del nuevo circuito, prácticamente igual al circuito presentado en la primera lección, con la única variante que ahora lo diodos led conectados son cuatro, en vez de uno.

Las líneas de I/O utilizadas son RB0 para el primer led, RB1 para el segundo, RB2 para el tercero y RB3 para el cuarto. Estos serán por lo tanto configurados como salidas al inicio del programa, cambiando las instrucciones :

movlw 11111110B movwf TRISB in movlw 11110000B movwf TRISB en el cual el cuarto bit menos significativo, correspondientes a las líneas RB0,1,2,3 son puestos en cero para definir las líneas de salida.

En el área de memoria del REGISTER FILE ( que en el sourse inicia con la directiva ORG 0CH ) además, a los dos byte referenciados por la etiqueta Cout, les reservamos un ulterior byte con label Shif que utilizaremos para determinar la secuencia de encendido del led. La directiva de introducir es :

Shift RES 1 Antes de ejecutar el ciclo principal ( label MainLoop ) inicializamos el nuevo registro Shift a 00000001B con las siguientes instrucciones : movlw 00000001B movwf Shift A este punto, en el ciclo principal de nuestro programa nos ocuparemos de transferir el valor memorizado en el registro Shift a el puerto B obteniendo por lo tanto, el encendido del primer led, con las siguientes instrucciones : movf Shift,W movwf PORTB luego de efectuar el Shift a la izquierda del valor contenido en Shift de un bit, con las siguientes instrucciones : bcf STATUS,S rlf Shift,F La primera instrucción sirve para poner en cero el bit CARRY del REGISTRO DE ESTADO que será analizado en las próximas lecciones. Las instrucciones RLF Rotate Left F through Carry ( gira a la izquierda a través del bit carry ) corre un bit a la izquierda el valor memorizado en el registro Shift introducien- do en la posición ocupada por el bit 0 el valor del bit de Carry ( que como he-mos dicho lo veremos en seguida ). Para lograr que el bit introducido sea siem-pre cero debe ejecutarse antes de la RLF la instrucción BCF STATUS,C para acerar este bit.

A este punto el registro Shift valdrá 00000010B, por lo tanto, en el ciclo sucesivo,una vez transferido tal valor al puerto B se obtendrá el “ off “ del LED1 y el “ on “ del LED2 y así sucesivamente para los ciclos siguientes.

Cuando el bit 4 de Shift valga 1, los cuatro se han iluminaron almenos una vez y es necesario empezar de nuevo del led1. Las siguientes intrusiones desarrollan este tipo de control :

Page 25: Que son los PIC

btfsc Shift,4 swapf Shift,F La instrucción BTFSC Shift, 4 controla si el bit 4 del registro Shift vale 1. Si es si, ejecuta la instrucción SWAPF Shift, F, de lo contrario la salta.

La instrucción SWAP (del ingles “ cambia “ ) en practica cambia los cuatro bit mas significativos contenidos en el registro Shift con los cuatro menos significativos. Del valor inicial del registro Shift igual a 00010000B obtenido después de varias repeticiones del ciclo MainLoop se obtiene el valor 00000001B que es en practica el reinicio del primer led.

Introduccion a los perisfericos

1. Las puertas A y B (translation in progress...) 2. Estadios de salida de las lineas I/O (translation in progress...) 3. Input para teclado (translation in progress...)

El contador TMR0 y el PRESCALER

Al terminar esta leccion habras aprendido:

• Como se utiliza el registro contador TMR0 • Para que sirve y como se programa el PRESCALER

Contenido de la lección 4

1. El registro contador TMR0 2. El Prescaler

Veamos ahora que és y como funciona el registro TMR0.

Page 26: Que son los PIC

El registro TMR0 és un contador, es decir un particular tipo de registro cuyo contenido és incrementado con una cadencia regular y programable directamente por el hardware del PIC. En la práctica, a diferencia de los otros registros, el TMR0 no mantiene inalterado el valor que tiene memorizado, sino que lo incrementa continuamente, si por ejemplo escribimos en él el valor 10 con las siguientes instrucciones:

movlw 10 movwf TMR0

después de un tiempo igual a cuatro ciclos de maquina, el contenido del registro comienza a ser incrementado a 11, 12, 13 y así sucesivamente con una cadencia constante y totalmente independiente de la ejecución del resto del programa.

Si, por ejemplo, después de haber insertado un valor en el registro TMR0, ejecutamos un bucle infinito

movlw 10 movwf TMR0 loop goto loop

el registro TMR0 es en consecuencia incrementado por el hardware interno del PIC al mismo tiempo que se

Page 27: Que son los PIC

ejecuta el bucle.

Una vez alcanzado el valor 255, el registro TMR0 és puesto a cero automaticamente reemprendiendo entonces el conteo nó desde el valor originariamente cargado sino desde cero.

La frecuencia de conteo és directamente proporcional a la frecuencia de reloj aplicada al chip y puede ser modificada programando adecuadamente algunos bits de configuración.

En la figúra siguiente está representada la cadena de bloques internos del PIC que determinan el funcionamiento del registro TMR0.

Los bloques Fosc/4 y T0CKI, mostrados en azul, representan las dos posibles fuentes de señal de reloj, para el contador TMR0 .

Fosc/4 és una señal generada internamente por el PIC tomada del circuito de reloj y que es igual a la frecuencia del oscilador dividida por cuatro.

T0CKI és una señal generada por un posible circuito externo y aplicada al pin T0CKI correspondiente al pin 3 en el PIC16F84.

Los bloques T0CS y PSA mostrados en verde son dos conmutadores de señal en cuya salida se presenta una de las dos señales de entrada en función del valor de los bits T0CS y PSA del registro OPTION.

El bloque PRESCALER és un divisor programable cuyo funcionamiento se explicará en la siguiente parte.

Veamos en la practica como es posible actuar sobre estos bloques para obtener diferentes modalidades de conteo para el registro TMR0.

Comenzamos programando el bit T0CS a 0 y PSA a 1. La configuración de funcionamiento que obtendremos está representada en la siguiente figura:

Page 28: Que son los PIC

Las partes en rojo evidencian el recorrido que efectua la señal antes de llegar al contador TMR0.

Como habíamos ya dicho anteriormente, la frecuencia Fosc/4 és una cuarta parte de la frecuencia de reloj. Utilizando un cristal de 4Mhz tendremos una Fosc/4 igual a 1 MHz. Tal frecuencia és enviada directamente al registro TMR0 sin sufrir ningun cambio. La cadencia de conteo que se obtiene es por lo tanto igual a 1 millón de incrementos por segundo del valor presente en TMR0.

Supongamos ahora que cambiamos el estado del bit T0CS de 0 a 1 la configuración que obtendríamos és la siguiente:

Esta vez será la señal aplicada al pin TOCKI del PIC la que será enviada directamente al contador TMR0 determinando esta la frecuencia de conteo. Aplicando por ejemplo a este pin una señal con una frecuencia de 100Hz obtendremos una frecuencia de conteo igual a cien incrementos al segundo.

La presencia de la puerta logica XOR (OR exclusiva) en la entrada TOCKI del PIC permite determinar por medio del bit T0SE del registro OPTION si el contador TMR0 debe ser incrementado en correspondencia con el flanco de bajada (T0SE=1) ó con el flanco de subida (T0SE=0) de la señal externa aplicada.

En la figura siguiente se representa la correspondencia entre el camino de la señal externa y el valor que toma el contador TMR0 en ambos casos:

Page 29: Que son los PIC

En la siguiente parte veremos como és posible dividir ulteriormente la frecuencia de conteo, interna ó externa, activando el PRESCALER.

El PRESCALER

El ultimo bloque que queda por analizar para poder utilizar completamente el registro TMR0 és el PRESCALER.

Si configuramos el bit PSA del registro OPTION a 0 enviamos al registro TMR0 la señal de salida del PRESCALER como se puede ver en la siguiente figura:

El PRESCALER consiste en la practica, en un divisor programable de 8 bits a utilizar en el caso de que la frecuencia de conteo enviada al contador TMR0 sea demasiado elevada para nuestros propositos.

En el ejemplo estudiado en la parte anterior habiamos visto que utilizando un cuarzo de 4Mhz obteníamos una frecuencia de conteo igual a 1Mhz que para muchas aplicaciones podría resultar demasiado elevada.

Con el uso del PRESCALER podemos dividir ulteriormente la frecuencia Fosc/4 configurando oportunamente los bits PS0, PS1 y PS2 del registro OPTION según la siguiente tabla.

PS2 PS1 PS0 Divisor Frecuencia de salida del prescaler (Hz)

0 0 0 2 500.000

El registro contador TMR0

Page 30: Que son los PIC

0 0 0 2 500.000

0 0 1 4 250.000

0 1 0 8 125.000

0 1 1 16 62.500

1 0 0 32 31.250

1 0 1 64 15.625

1 1 0 128 7.813

1 1 1 256 3.906

Probemos ahora a efectuar un experimento de campo para verificar cuanto hasta ahora hemos aprendido.

En la lección 2 habiamos realizado un intermitente con cuatro led cuya frecuencia de intermitencia era determinada por una subrutina que introducía un retardo software, es decir un retardo basado en el tiempo de ejecución de un ciclo continuo de instrucciones.

Intentemos ahora reescribir la misma subrutina para introducir un retardo igual a un segundo utilizando el registro TMR0.

Las modificaciones se encuentran explicadas en el fichero SEQTMR0.ASM.

Debemos ante todo programar el PRESCALER para obtener una frecuencia de conteo apropiada, insertando las siguientes instrucciones al inicio del programa:

movlw 00000100B movwf OPTION_REG

En la practica debemos programar el bit T0CS a 0 para seleccionar como fuente de conteo el reloj del PIC, el bit PSA a 0 para asignar el PRESCALER al registro TMR0 en lugar de al Watch Dog Timer (del que trataremos más adelante) y los bits de configuración del PRESCALER a 100 para obtener una frecuencia de división igual a 1:32.

La frecuencia de conteo que obtendremos en TMR0 será igual a:

Fosc = 1Mhz / 32 = 31.250 Hz

La subrutina Delay deberá utilizar oportunamente el registro TMR0 para obtener un retardo igual a un segundo. Veamos como. Las primeras instrucciones que escribimos en Delay son:

movlw 6 movwf TMR0

y

movlw 125 movwf Count

Page 31: Que son los PIC

Las primeras dos memorizan en TMR0 el valor 6 de modo que el registro TMR0 alcanza el cero después de 250 cuentas (256 - 6 = 250) obteniendo así una frecuencia de paso por cero del TMR0 igual a:

31.250 / 250 = 125 Hz

Las instrucciones siguientes memorizan en un registro de 8 bits (Count) el valor 125 de tal modo que, decrementando este registro en uno por cada paso por cero de TMR0, se obtenga una frecuencia de pasos por cero del registro Count igual a:

125/125 = 1Hz

Las instrucciones insertadas en el bucle DelayLoop se ocupan por lo tanto de controlar si TMR0 ha alcanzado el cero, luego de reinicializarlo a 6 y decrementar el valor contenido en Count. Cuando Count alcance tambien el valor cero, entonces habrá trascurrido un segundo y la subrutina podrá retornar control al programa que la llamó.

Las interrupciones (interrupt)

1. Interrupciones (translation in progress...) 2. Ejemplo practico de administracion de una interrupcion (traslation in progress...) 3. Ejemplo practico de administracion de mas interrupciones (traslation in progress...)

El modo Power Down y el Watch dog timer

Al terminar esta leccion habras aprendido:

• Colocar el PICmicro en el modo power down y sacarlo de él • Como funciona el Watch Dog Timer

Contenido de la lección 6

1. Funcionamiento del Power Down Mode 2. Funcionamiento del Watch dog timer

Funcionamiento del Power Down Mode

El Power Down Mode o Sleep Mode, es un estado particular de funcionamiento del PiCmicro utilizado para reducir el consumo de corriente en los momentos en que el PICmicro no realiza ninguna tarea ó está a la espera de un suceso externo.

Si tomamos como ejemplo un control remoto para TV, veremos que la mayor parte del tiempo el micro permanece a la espera de la presión de alguna tecla. Apenas oprimida, efectúa una breve transmisión y queda nuevamente a la espera de la presión de otra tecla.

Page 32: Que son los PIC

El tiempo de uso efectivo de la CPU del micro está, por lo tanto, limitado a unos pocos milisegundos necesarios para efectuar la transmisión mientras que por varias horas, no efectúa ninguna tarea particular.

Para no consumir inútilmente la energía de las baterías, es posible apagar varios de los circuitos del micro y reencenderlos sólo en correspondencia con algún suceso externo.

Veamos como.

La instrucción SLEEP

La instrucción SLEEP es utilizada para colocar el PICmicro en Power Down Mode y reducir, en consecuencia, la corriente absorbida, que pasará de unos 2 mA (a 5 volt y el clock en 4MHz) a unos 2uA, o sea, unas 1000 veces menos.

Para entrar en Power Down Mode basta insertar la siguiente instrucción en cualquier parte del programa: SLEEP

Cualquier instrucción siguiente a SLEEP no será efectuada or el PIC el cual finalizará en este punto la ejecución, apagará los circuitos internos, excepto aquellos necesarios para mantener el estado de los puertos de I/O y aquellos que lo sacarán de esa condición de los cuales hablaremos enseguida.

Los circuitos conectados a los puertos de salida, deben ser diseñados de modo de limitar el consumo en la condición de POWER DOWN. Otra recomendación de Microchip es conectar al positivo (Vdd) o al negativo (Vss) todas las líneas en alta impedancia no usadas incluso RA4/TOCKI (pin 3).

Cómo "despertar" al PIC

Para despertar al PIC son utilizadas diversas técnicas:

1. Reset del PIC llevando a cero el pin 4 (MCLR) 2. Timeout del watch dog timer (si está habilitado) 3. Verificación de una interrupción (interrupción desde el pin RB0/INT, cambio de estado en el

puerto B, finalización de la escritura sobre la EEPROM)

En los dos primeros casos, el PIC es reseteado y la ejecución es retomada en la locación 0 de memoria.

En el tercer caso, el PIC se comporta como en el caso de una interrupción normal, siguiendo primeramente, el Interrupt handler retomando la ejecución después de la instrucción SLEEP. Para que el PIC sea despertado por una interupt debe ser habilitado los flag del registro INTCON.

Ejemplo de Power Down Mode

Veamos, ahora, un ejemplo simple del uso del Power Down Mode y forma de "despertarlo". La modalidad usada es interrupción por flanco descendente aplicado al pin RB0/INT utilizando un pulsador. El programa utilizado es PDM.ASM .

El esquema está disponible en example4.pdf (formato Acrobat Reader 10 Kb).

Page 33: Que son los PIC

En la práctica, el LED D1 conectado a la línea RB2 parpadeará indicando la normal ejecución del programa. Oprimiendo SW2, el programa seguirá la instrucción:

SLEEP

Colocando al PIC en Power Down Mode. El LED D1 permanecerá encendido o apagado, según el instante en el que SW2 es oprimido.

Para sacar al PIC del Power Down Mode, bastará oprimir SW1 para generar una interrupción y retomar la ejecución del programa.

Mayor información podrá ser recabada en las hojas de datos del PIC16F84 (documento DS30430C pag. 51)

El Watch Dog Timer (WDT)

En esta lección, analizaremos el funcionamiento del Watch Dog Timer (que podría traducirse como temporizador perro guardián) cuya función es la de mejorarla confiabilidad de nuestros circuitos basados en el PIC.

El Watch Dog Timer es, en la práctica, un oscilador interno al PIC, pero completamente independiente del resto de la circuitería, cuya función es eliminar eventuales bloqueos de la CPU del PIC y resetearlo para que retome la ejecución normal del programa.

Para poder eliminar un eventual bloqueo de la CPU durante la ejecución del programa principal, se inserta en él una instrucción especial:

CLRWDT (CLeaR Watch Dog Timer)

La cual pone en cero a intervalos regulares el WDT no permitiéndole llegar al final de su temporización.Si la CPU no realiza esta instrucción antes del término de la temporización, entonces, se asume que el programa se ha bloqueado por algún motivo y se efectúa el reset de la CPU. El periodo mínimo alcanzado el cual la CPU es reseteada es de unos 18 ms (depende de le temperatura y de la tensión de alimentación). Es posible, sin embargo, asignar el prescaler al WDT a fin de obtener retardos mayores hasta unos 2,3 segundos .

Para habilitar el WDT debemos, en la fase de programación, habilitar el flag WDTE de la palabra de configuración. La modalidad de activación de este flag, depende del programador usado. En el caso del YAPP versión 2.5, es posible habilitar el WDT con el comando:

[2] - Watch Dog Timer

Page 34: Que son los PIC

Asignación del prescaler al WDT

Actuando sobre el bit PSA del registro OPTION_REG es posible asignar el prescaler al WDT para obtener tiempos de intervención mayores. El bit PSA va seteado a uno con la instrucción:

BSF OPTION_REG,PSA

En caso contrario, el prescaler será asignado al TIMER 0. Obviamente, asignando el prescaler al WDT, no será posible usarlo con el TIMER 0 y viceversa.

Según los valores de los bits PS0, PS1 y PS2 del OPTION_REG podremos obtener distintos intervalos de retardo. La elección correcta deberá ser hecha teniendo en cuenta el máximo retardo que logramos obtener en nuestro programa tras la ejecución de dos instrucciones CLRWDT sucesivas .

En la tabla siguiente vemos los retardos obtenibles, según los valores de PS0, PS1 y PS2:

PS2 PS1 PS0 Divisor Retardo 0 0 0 1 18ms 0 0 1 2 36ms 0 1 0 4 72ms 0 1 1 8 144ms 1 0 0 16 288ms 1 0 1 32 576ms 1 1 0 64 1.152s 1 1 1 128 2.304s

Ejemplo práctico del uso del WDT

Usaremos el mismo esquema del ejemplo precedente que podremos ver en el archivo example4.pdf (formato Acrobat Reader 10 Kb) y el programa podrá verse en WDT.ASM . En la práctica, no difiere mucho del ejemplo usado con el Power Down Mode. En cuanto ejecutemos el programa veremos destellar el LED 1, mientras tanto, se ejecuta continuamente la instrucción CLRWDT para evitar que la CPU sea reseteada (recordar de programar el PIC con la opción WDTE habilitada). Apenas presionemos SW2 la CPU entrará en un loop (StopLoop) sin ejecutar CLRWDT. Transcurridos unos 2,3 segundos, el WDT efectuará el reset de la CPU y el LED comenzará a destellar nuevamente. Probemos, ahora, a reprogramar el PIC con la opción WDTE no habilitada. Notaremos que presionando SW2 el LED se apaga y permanece en esa condición.

Page 35: Que son los PIC

Mayor información acerca del WDT puede encontrarse en las hojas de datos del PIC16F84 (documento DS30430C pag.50).

Interfase con el exterior

Al terminar esta leccion habras aprendido:

• Cómo conectar un display LCD 16x2 y cómo gestionarlo • Cómo conectar el PIC a una PC a través del RS 232 • Realizar un miniterminal LCD • Controlar desde una PC una serie de LED o leer el estado de una serie de pulsadores

Contenidos de la lección 7

1. Gestión de un display LCD 2. La interfase RS 232 3. Otro ejemplo con la interfase RS 232

Gestión de un Display LCD

Después de haber realizado, en las lecciones precedentes, ejemplos simples con diodos y pulsadores, iniciaremos ahora, la interface del PIC16F84 con algo más complejo. Comenzaremos con un display LCD (Liquid Crystal Display) compuesto por dos líneas de 16 caracteres cada una.

Los displays LCD más comunes, disponen de una interfaces ideada por Hitachi y adoptada como estándar por otros fabricantes.

Esta interfaces hace que el display pueda ser conectado al micro a través de un bus de 4 u 8 líneas más tres líneas de control y las de alimentación.

Demos una ojeada al circuito eléctrico que usaremos para comprender mejor las explicaciones siguientes. El esquema puede ser hallado en el archivo EXAMPLE5.PDF en formato Acrobat Reader, mientras que en la tabla siguiente están descriptas las funciones de cada línea disponible para interfasear el display. Las descripciones en negrita, indican las líneas efectivamente utilizadas en nuestra aplicación.

Page 36: Que son los PIC

Pin Nombre Función 1 GND Ground. Conectar al negativo de alimentación 2 VDD Power supply. Conectar al positivo de alimentación (+5 v) 3 LCD Liquid crystal driving voltage. En este pin debe ser aplicada una tensión variable

entre 0 y 5v para regular el contraste 4 RS Register select. Este pin es una línea de control con la que se le indica al display si se

está enviando en el bus de datos un comando (RS=0) o un dato (RS=1) 5 R/W Read, Write. Esta es otra línea de control con la que se indica al display si se está enviando

un dato (R/W=0) o leyendo un dato del display (R/W=1) 6 E Enable. Enable. Esta línea de control sirve para habilitar el display para que reciba

un dato o instrucciones a través del bus (E=1) 7 DB0 Data bus line 0 - Sobre estas líneas viajan los datos entre el micro y el display 8 DB1 Data bus line 1 9 DB2 Data bus line 2 10 DB3 Data bus line 3 11 DB4 Data bus line 4 12 DB5 Data bus line 5 13 DB6 Data bus line 6 14 DB7 Data bus line 7

Para reducir al máximo las conexiones entre el micro y el display, usaremos la modalidad de interconexión de datos a 4 bit, usando sólo las líneas DB4, DB5, DB6, DB7. Las líneas DB0, DB1, DB2 y DB3 no serán usadas y serán conectadas a masa. Tampoco la línea R/W será utilizada y será puesta a masa. De este modo, quedará seleccionado el modo escritura. En la práctica, sólo podremos enviar datos al LCD pero no recibirlos.

Hello World !

Despues de haber realizado el circuito del ejemplo, compilar el programa dado en LCD1.ASM , programar el PIC con el archivo .HEX obtenido, al encender el circuito, si todo anduvo bien, aparecerá en el display la siguente leyenda:

Page 37: Que son los PIC

Es decir, "Hola Mundo" que se ha convertido en la frase de iniciación de todos los aspirantes a programadores. No podiamos nosotros eludir esa tradición. El resultado no es muy exaltante, pero lo que hemos logrado es notable y vendrá estudiado a continuación profundamente. Si no lograron ver nada en el display, asegurarse que no haya algún error en el circuito y que el PIC esté bien programado ( recordar de programar la modalidad XT y deshabilitar el WDT), tal vez, sea necesario regular el contraste del display a través de R2 conectado al pin 3 del LCD.

La línea Enable (E) y Register Select (RS) del LCD

Para poder visualizar una frase en el display, el PIC debe enviar una serie de comandos a través del bus de datos (líneas DB4 a DB7). Para hacer esto, son utilizadas dos líneas de control con las que se comunica al LCD la operación de transferencia que realizará el bus. Las dos líneas de control son Enable (pin 6) y Register Select (pin 4) del LCD. Con la línea Register Select, el PIC indica al display que el dato presente en el bus es un comando (RS=0) o un dato a ser visualizado (RS=1). A través de los comandos, el PIC puede indicar al LCD el tipo de operación a realizar, como por ejemplo "limpiar pantallla". Con los datos, el PIC puede enviar directamente los caracteres ASCII a ser visualizados. La línea Enable habilita al LCD para leer el comando o el dato enviado 3n el bus por el PIC. El PIC debe ocuparse de haber enviado en el bus de datos el comando o el dato correcto antes de poner a 1 la señal Enable.

Multiplex sobre el bus de datos

Puesto que los comandos son números de 8 bits ¿cómo es posible enviarlos al LCD si el bus de datos dispone sólo de 4 líneas? En la práctica se usa la operación de multiplexado, es decir, cada bit es descompuesto en dos grupos de 4 bit y transmitidos por el bus de datos en secuencia. Son enviados primero los 4 bit menos significativos seguidos de los 4 bit más significativos. En nuestro ejemplo, todas las operaciones de transmisión de datos y comandos hacia el display son seguidas de una serie de subrutinas presentes en el archivo LCD1.ASM simpliflicando, de esa manera, la complejidad del programa. Antes de adentrarnos en el estudio de dichas subrutinas, veamos como funciona el programa principal.

Analicemos el programa fuente LCD1.ASM

En la primera parte, están definidas algunas constantes:

;LCD Control lines LCD_RS equ 2 ;Register Select

Page 38: Que son los PIC

LCD_E equ 3 ;Enable

;LCD data line bus LCD_DB4 equ 4 ;LCD data line DB4 LCD_DB5 equ 5 ;LCD data line DB5 LCD_DB6 equ 6 ;LCD data line DB6 LCD_DB7 equ 7 ;LCD data line DB7

Estas constantes definen la asociación entre las líneas del PIC (todas conectadas al PortB) y las líneas del display. Cada definición en particular, será usada en las subrutinas de grestión del LCD en lugar de cada número de identificación de las líneas de I/O.

tmpLcdRegister res 2 msDelayCounter res 2

Seguidamente, se reserva el espacio para dos registros: tmpLcdRegister, usado por la rutina de gestión del LCD y msDelayCounter usada por la subrutina msDelay que genera los retardos por sofware de 1 ms para el contenido del registro W. Es tas subrutina es usada siempre por las subrutinas de gestión para generar las temporizaciones requeridas durante la transmision de datos y comandos. Suigue la definición de las líneas de conección entre el PIC y el display y luego arrivamos a la primera subrutina que nos interesa:

call LcdInit

LcdInit es una subrutina que debe ser llamada solamente una vez en el inicio del programa y antes de cualquier otra subrutina de gestión. Ella se ocupa de efectuar todas las operaciones necesarias para inicializar correctamente el LCD y permite que las funciones sucesivas operen correctamente.- Con las instrucciones:

movlw 00H call LcdLocate

Se posiciona el cursor del display en la primera fila y en la primera columna de la pantalla. Los caracteres enviados sucesivamente, serán visualizados a partir de sta posición. Los cuatro bit más significativos del valor cargado en el registro W con la instrucción:

movlw 00H

Contienen el número de fila donde se quiere posicionar el cursor, los cuatro bit menos significativos, contienen el número de columna. Cambiando el valor en el registro w, obtendremos posicionamientos diferentes. Con el valor 10H, por ejemplo, obtendremos:

Page 39: Que son los PIC

Con el valor 12H, obtendremos:

A esta altura, para visualizar cada carácter de la frase, se usan las siguientes instrucciones:

movlw 'H' call LcdSendData

Y así sucesivamente para cada letra a ser visualizada. El incremento de la posicion del cursor, se hace automáticamente.

Subrutina de gestion del display LCD

Veamos brevemente qué funciones realizan las subrutinas suministradas con el programa LCD1.ASM.

Subrutina Función LcdInit Se ocupa de inicializar el display y de limpiar la pantalla. Debe ser llamada una sola

vez y antes de cualquier otra subrutina.

No requiere pasaje de parámetros. LcdClear Limpia el contenido de pantalla y reposiciona el cursor en la primera fila y primera

columna.

No requiere pasaje de parámetros. LcdLocate Posiciona arbitrariamente el cursor dentro del area visible del display.

Necesita el valor de fila y columna para posicionar el cursor en el registro W. Los bit desde D0 a D3 contienen el valor de columna (eje Y) y los bit desde D4 a D7 los valores de filas (eje X). La numeración de las filas parte de cero hacia arriba, la de columna parte de cero hacia la derecha.

LcdSendData Envía el carácter ASCII al LCD a ser visualizado en la posición donde se encuentra el cursor.

Requiere cargar en el registro W el valor ASCII del carácter. LcdSendCommand Envía un comando al LCD. Los comandos reconocidos por el LCD, están

especificados en la hoja de datos del mismo.

Requiere cargar en el registro W el valor de 8 bit del comando a enviar. LcdSendByte Esta función, es usada internamente por las demás y se ocupa de efectuar el

deslizamiento de los datos y comando de 8 bit en el bus de datos de 4 bit .

Mayor información sobre el uso de los display, puede obtenerse de la hoja de datos que el fabricante debe proveer.

Page 40: Que son los PIC