logotipo

img_google

 

 

 

CURSO BASICO DE MICROCONTROLADORES PIC

Primera Parte.-

El primer paso importante el ver el diagrama de pines del PIC16F84, en el cual se observa como estan distribuidos sus pines. Este circuito integrado cuenta con 2 puertos configurables como entradas o salidas segun sea el caso y consta de 18 patas las cuales se encuentran asignadas de la siguente manera:

 

  1. Pata 1: -------------------RA2
  2. Pata 2: -------------------RA3
  3. Pata 3: -------------------RA4/TOCKI
  4. Pata 4:--------------------Reset
  5. Pata 5:--------------------Tierra (GND)
  6. Pata 6:--------------------RB0/INT
  7. Pata 7:--------------------RB1
  8. Pata 8:--------------------RB2
  9. Pata 9:--------------------RB3
  10. Pata 10:-------------------RB4
  11. Pata 11:-------------------RB5
  12. Pata 12:-------------------RB6
  13. Pata 13:-------------------RB7
  14. Pata 14:-------------------Vcc
  15. Pata 15:-------------------Osc2
  16. Pata 16:-------------------Osc1
  17. Pata 17:-------------------RA0
  18. Pata18:--------------------RA1

El puerto A está denotado por el color Azul oscuro, el cual tiene sólo cinco pines que puedes configurar como entrada o salida. La pata 3, o sea, RA4/TOCKI puede ser configurado a su vez como entrada/salida o como temporizador/contador. Cuando es salida se comporta como colector abierto, por lo tanto debemos poner una resistencia Pull-up a Vcc de 1 Kohm. Cuando es configurada como entrada, funciona como disparador Schmitt Trigger por lo que puede reconocer señales con un poco de distorción.

El puerto B está denotado por el color anaranjado, y tiene ocho pines que igualmente se pueden configurar como entrada o salida. Los pines 15 y 16 son únicamente para el oscilador externo el cual estudiaremos con más detalle más adelante. El pin 4, o sea, el Reset se debe conectar con una resistencia de 10 Kohm a Vcc para que el Pic funcione, si lo queremos resetear entonces pondremos un micropulsador con una resistencia de 100 Ohm a tierra.

La máxima capacidad de corriente para los puertos se muestra en la siguiente tabla:

 
PUERTO A
PUERTO B
MODO SUMIDERO
80 mA
150 mA
MODO FUENTE
50 mA
100 mA

Por último tenemos los pines 14 y 5 que son la alimentación la cual no debe sobrepasar los 5 Voltios. Para esto nos aseguramos poniendo un regulador de voltaje (7805) en nuestro circuito.

Es importante denotar que los pines de los puertos no utilizados los debemos conectar a +5V (Vcc) con una resistencia de 10 Kohm.

Oscilador Externo:

Es necesario para que nuestro PIC pueda funcionar, puede ser contectado de cuatro maneras diferentes. En la siguiente tabla encontraras los diagramas necesarios para su conexión y una brebe descripción de cada uno.

RC
Oscilador compuesto por una resistencia y un condensador.
XT

Oscilador compuesto por un cristal y dos condensadores.

HS

 

Oscilador compuesto por un cristal de alta velocidad.

 

LP

 

Oscilador compuesto por un cristal de baja frecuencia y bajo consumo de potencia.

 

El siguiente paso importante para tener claro como debemos empezar a programar es conocer la tabla de registros. Esta tabla está dividida en dos partes llamadas BANCO 0 y Banco 1. Nos debemos interezar momentáneamente en: STATUS, PORTA, PORTB, TRISA y TRISB.

Para que nuestro PIC pueda trabajar debemos configurar sus puertos segun sea el caso, como entrada o como salida, haciendo antes la acotación que si le asignamos un CERO(0) a un pin éste será SALIDA y si asignamos un UNO (1) éste será ENTRADA.

Esta asignación de pines se hace programando los registros TRISA y TRIS B.

TRISA es el registro donde se almacenan los bits que asignan un pin como entrada o salida del PUERTO A. Recordemos que el puerto A sólo tiene 5 pines, por lo tanto un ejemplo de esto sería:

Si TRISA (puerto A) es igual a 00110 entonces esto se leería,

TRISA
ASIGNACION
ESTADO
RA0
0
SALIDA
RA1
1
ENTRADA
RA2
1
ENTRADA
RA3
0
SALIDA
RA4
0
SALIDA

El bit menos significativo se asigna desde RA0.

Si TRISB (puerto B) es igual a 00110010, entonces esto se leería,

TRISB
ASIGNACION
ESTADO
RB0
0
SALIDA
RB1
1
ENTRADA
RB2
0
SALIDA
RB3
0
SALIDA
RB4
1
ENTRADA
RB5
1
ENTRADA
RB6
0
SALIDA
RB7
0
SALIDA

Ahora bien, pero como ponemos este número en TRISA y TRISB?

Para esto tenemos que ir a la tabla, la cual se divide en BANCO 0 y BANCO 1. Cuanco el PIC arranca a correr el programa siempre se va a encontrar en el BANCO 0, por lo tanto debemos pasar al BANCO 1 para poder configurar los puertos asignando valores a TRISA y TRISB. Esto se logra a través del Registro STATUS, el cual nos servirá para cambiarnos de BANCO.

 

También es importante saber que este registro es de 8 BIT, o sea, ocho casillas, en la cual la No. 5 (RP0) define la posición del BANCO donde nos encontramos, por defecto siempre se encuantra en el BANCO 0.

Registro STATUS:

7
6
5
4
3
2
1
0
IRP
RP1
RP0
TO
PD
Z
DC
C

 

Si en la casilla 5 (RP0) del registro STATUS hay un CERO entonces estamos en el BANCO 0.

Si en la casilla 5 (RP0) del registro STATUS hay un UNO entonces estamos en el BANCO 1.

Pero como ponemos un UNO en la posición 5 del registro STATUS para entrar al BANCO 1?

Aqui es donde empezamos a ver las instrucciones de programa.

La dos primeras a utilizar son:

BSF que significa SET FILE REGISTER, es decir, pone un uno en la localización de la RAM especificada.

BCF que significa BIT CLEAR FILE REGISTER, es decir, pone un cero en la localización de memoria especificada.

Quiere decir entonces que para entrar al BANCO 1 tendriamos que poner un UNO en la posición 5 (RP0) del registro STATUS. La sintaxis sería:

bsf STATUS,5

Se lee, poner un UNO en la posición CINCO del registro STATUS. En este momento ya estamos dentro del BANCO 1.

NOTA: las intrucciones pueden se escritas en minusculas o mayusculas.

Ahora nos toca decidir según el proyecto que vallamos a hacer quien va a ser ENTRADA y quien va a ser SALIDA. Supongamos entonces que todos los pines del puerto A van a ser ENTRADA y y el puerto B SALIDA.

Tentriamos que asignar al puerto A : 11111

Y al puerto B : 00000000

Movamos entonces estos valores a TRISA y TRISB respectivamente a través de la siguiente sintáxis:

movlw B'11111'

movwf TRISA

En la primera línea estamos moviendo 11111 a W. La W es el Registro de Trabajo, el cual usaremos para almacenar momentáneamente los datos que queramos mover.Después que los datos están en el registro de trabajo W, los podemos mover a TRISA, de esta manera ya cofiguramos el puerto A. La ¨B¨ y las comillas es la manera más común de designar el dato como NUMERO BINARIO, de esta manera se nos hace más fácil saber en determinado momento a quién pusimos como ENTRADA o SALIDA.

Ahora configuremos el puerto B.

movlw B'00000000'

movwf TRISB

Configurado el puerto B nos salimos del BANCO 1 al BANCO 0 para enpezar ya a programar.

Para salirnos del BANCO 1 solo debemos poner un CERO en la posición 5 (RP0) del registro STATUS.

bcf STATUS,5

En este momento nos encontramos en el BANCO 0.

Práctica No.1

Empecemos entonces nuestro primer ejercicio!

El ejemplo más fácil y básico para aprender a manejar los puertos del PIC es encender y apagar uno o varios LED's.

Abre el editor de programa MPLAB y crea un nuevo proyecto.

Siempre que empecemos un programa debemos establecer como encabezado los registros con su dirección, dada al lado izquierdo de la tabla de registro. Es decir, pondremos primero los registros a utilizar con su respectiva dirección:

STATUS...........equ........0x3

PORTA.............equ........0x5

TRISA...............equ........0x5

PORTB.............equ........0x6

TRISB...............equ........0x6

 

; Los comentarios en un programa se inician con punto y coma ( ; ).

; Declaración de Variables

RP0...................equ........5

RB0...................equ........0...; Omita esta línea hasta que se le

.........................................; indique en el transcurso del programa.

CONTADOR.....RES........1.......; Reserva un espacio de memoria a la

.........................................; variable CONTADOR.

CONTADOR1...RES........1.... ..; Reserva un espacio de memoria a la

............................ ............; variable CONTADOR1.

; Estas dos líneas son variables definidas por el usuario reservadas para una subrutina de retardo que utilizaremos.

ORG..................0....; Hace referencia a una dirección

.................... .......; de memoria en el área de programa

............................; a partir de la cual insertaremos

............. .............; las instrucciones nemónicas que el

...........................; compilador deberá convertir.

; El siguiente paso es entrar al BANCO 1 para definir los puertos.

BSF.........STATUS,RP0..............; Entramos al BANCO 1, RP0 lo

.............................................; declaramos arriba

.............................................; y por lo tanto es igual a 5.

MOVLW............B'00000'............; Movemos 00000 al registro de trabajo.

MOVWF............TRISA..... .........; Configuramos el puerto A como salida.

MOVLW............B'00000000'...... .; Movemos 00000000 al registro de trabajo.

MOVWF............TRISB..... ..........; Configuramos el puerto B como salida.

BCF...................STATUS,RP0......; Salimos del BANCO 1.

; Ahora podemos conectar a cualquiera de las salidas un LED, encenderlo y apagarlo. Detalles de conexión

; al final. Conectemos un LED a la salida RB0 del puerto B, si lo quisieramos encender solo tendriamos que

; poner un UNO en la SALIDA RB0 del puerto B. Como?............... asi:

 

INICIO...............................; Etiqueta definida por el Usuario.

BSF..........PORTB,0.......; Usted podria poner tanbién en

.................................; vez del cero la variable

.................................; declarada RB0, asegurandose que

.................................; esté en el encabezado.

.................................; Si lo desea agregue la linea que

.................................; omitió y cambie el cero

.................................; por RB0

; Cuando el PIC ejecuta la línea anterior pone un UNO en la salida,

; o sea 5 voltios, y por lo tanto el LED se enciende.

; Para hacerlo intermitente solo tendríamos que apagarlo y repetir

; la operación, pero antes de repetir debemos poner un retardo para

; poder ver el efecto intermitente.

; Esta rutina de retardo la insertaremos antes de apagarlo, luego lo

; apagamos e insertamos otra rutina de retardo.

; para esto utilizaremos una instrucción nueva: CALL, además debemos

; asignar un nombre propio a la subrutina,

; el que queramos, para poder decirle adonde debe ir. Cuando termine de

; ejecutar la subrutina de retardo se encontrará con la instrucción RETURN,

; devolviendoce así donde quedamos.

CALL..................RETARDO...........; Llama a RETARDO, va y lo ejecuta y

..........................................................; luego se devuelve a la siguiente línea.

BCF....................PORTB,0.............; Apaga el LED.

CALL..........RETARDO...........; Llama a RETARDO

GOTO.........INICIO....................; Va a la etiqueta INICIO para mantener

...................................................; el LED intermitente,

...................................................; es decir, vuelve a empezar.

RETARDO

CALL..................RETARDO1

DECFSZ............CONTADOR,1

GOTO.................RETARDO

MOVLW.............80

MOVWF.............CONTADOR

RETURN

RETARDO1

DECFSZ.............CONTADOR1,1

GOTO..................RETARDO1

MOVLW..............80

MOVWF..............CONTADOR1

RETURN

END

Asi se verá nuestro circuito:


En la rutina de retardo encontramos un nueva instrucción de programa, DECFSZ la cual decrementa el registro y salta la linea siguiente solo si el registro se hace cero (0). La explicación de la rutina de retardo es la siguiente:

- La primera linea (call RETARDO1) llama a otra rutina denominada RETARDO1, es esta rutina se ejecuta la instrucción DECFSZ CONTADOR1,1 la cual decrementa el registro llamado CONTADOR1 y va a la siguiente línea (goto RETARDO1), ésta acción se repetirá hasta que CONTADOR1 se haga cero. Cuando esto ocurra la instrucción DECFSZ salta una línea y ejecuta MOVLW 80, la cual carga el registro de trabajo W con el valor especificado, en nuestro caso será 80. La siguiente línea mueve el valor cargado en W a CONTADOR1 y retorna para ejecutar la segunda línea de la rutina llamada RETARDO. En este punto se repite lo anterior, es decir, se decrementa el registro CONTADOR y va a la siguiente línea (goto RETARDO) hasta que se haga cero (0), salta la linea y mueve el valor especificado al registro CONTADOR, luego retorna al primer llamado CALL en el programa.

En la siguiente figura se muestra el diagrama del circuito en el cual trabajamos.

Terminado el programa procedemos a compilarlo y luego a grabarlo en el PIC.