You are on page 1of 7

Clase 03. Manejo de los puertos de I/O.

En esta oportunidad vamos a aprender a trabajar con los puertos "digitales" que trae el PIC16F877A. El uso del puerto analgico se ver ms adelante, cuando lleguemos al Conversor A/D. Primero que nada se tiene que aclarar varios puntos: 1. Librera P16F877A.INC En el problema 3 hicimos uso de la librera P16F877A.INC con el comando INCLUDE<P16F877A>, por qu? bueno, en la Memoria de Datos se encuentran los Registros Especiales o SFR los cuales gobiernan al uC y sus recursos, solo hace falta configurarlos para poder hacer uso de ellos. Por tal motivo debemos conocer en que direccin se encuentra el registro que nos permite, por ejemplo, configurar los puertos como entradas o salidas, o que registro nos permite usar el perifrico PWM, etc. Cada registro posee una direccin establecida (ver Memoria de Datos) pero hay una manera ms sencilla de utilizar estos registros y no tener que memorizar cada direccin, Microchip en el MPLAB nos facilita esta tarea con las libreras *.INC segn el modelo del uC, en estas libreras encontraremos los nombres de los registros asignados a su direccin respectiva, por ejemplo: STATUS EQU H'0003' RP0 EQU H'0005' 2. bsf STATUS,RP0 ;el bit 5 del registro STATUS se pone a 1 es lo mismo que poner: bsf .3,.5 solo que el primer ejemplo lo entendemos mejor, nos indica que estamos configurando el bit RP0 del Registro STATUS. Estas libreras las encontramos en la carpeta Microchip/MPASM Suite por si queremos indagar ms. EQU es un comando que sirve para relacionar un valor con un nombre, viene de la palabra "equal" que significa "igual", lo podemos usar no solo

para relacionar direcciones sino tambin para crear constantes y variables, eso lo veremos en los ejemplos. 3. Qu es el Registro de Estado (STATUS) El Registro de Estado se encuentra en los 4 bancos de la memoria RAM (pueden constatarlo en el artculo Memoria de Datos) es un Registro muy usado porque, entre otras cosas, nos permite acceder a los registros de cualquier banco de memoria con solo configurar algunos bits, y para que necesitamos eso? pues los registros que hacen posible configurar los puertos como Entrada o Salida de datos pues estn en el Banco 1 y por defecto nos encontramos en el Banco 0. El registro STATUS tienen la siguiente estructura: -----| IRP | RP1 | RP0 | TO# | PD# | Z | DC | C | Bit-----7-----6------5------4------3-----2---1-----0 Por ahora solo nos interesa conocer como cambiar de Banco, para esto se utilizan los bits RP1 y RP0. RP1 y RP0: Nos permiten elegir el Banco de Memoria | RP1| RP0 | |--0--|---0--| |--0--|---1--| |--1--|---0--| |--1--|---1--| Banco | Banco 0 | Banco 1 | Banco 2 | Banco 3 |

4. Ejemplo: Estamos en el Banco 0 y queremos pasar a Banco 1 bsf STATUS,RP0 ;RP1=0 y RP0=1 con lo que estamos pasando al Banco 1 segn la tabla anterior (RP1=0 por defecto luego de resetear el uC). Bueno vamos aprovechar tambin para conocer para que sirven los bits Z y C. Z: ms conocido como sealizador de 0, se activa o pone en nivel alto "1" cuando el resultado de una operacin es 0, por ejemplo: movlw .10

sublw .10 esta operacin da como resultado 0, en ese instante el bit Z del Registro STATUS cambia a "1". C: ms conocido como sealizador de acarreo, se pone en nivel alto "1" en las operaciones de suma cuando existe acarreo y se pone en nivel bajo "0" en las operaciones de resta cuando tambin existe acarreo por lo general cuando se resta un numero mayor de uno menor, por ejemplo: movlw .255 addwl .1 la suma supera los 8 bits, por lo tanto se activa "1" el sealizador de acarreo indicando que se ha superado el lmite de registro, es decir, hubo un desbordamiento y por consiguiente un acarreo. movlw .5 sublw .4 la resta da como resultado un nmero negativo, por lo tanto se pone a "0" el sealizador de acarreo. movlw B'10000000' movwf 22H rlf 22H,7 en este caso tambin se activa "1" el sealizador de acarreo. 1. Puertos A, B, C, D y E Puerto A: Tiene 6 bits, de los cuales 5 pueden trabajar como Entradas Analgicas o Entradas/Salidas Digitales. Por defecto, al resetear el PIC, estos 5 bits (RA0,RA1,RA2,RA3 y RA5) se configuran como entradas o canales analgicos para trabajar con el Conversor A/D. Para configurarlos con Entradas/Salidas Digitales se debe configurar antes el registro ADCON1, ubicado en la

direccin 9FH en el Banco 1, con el valor 0000011x, x puede ser 1 o 0. movlw B'00000110' movwf ADCON1 De esta forma se configura el puerto A como Entradas/Salidas Digitales, luego para especificar que pines son de Entrada y cuales de Salida se debe modificar el Registro TRISA. bsf STATUS,RP0 movlw B'11110000' movwf TRISA bcf STATUS,RP0 Esto significa que los bits 0..3 estn configurados como Salidas Digitales y los pines 4..7 estn configurados como Entradas Digitales. Puerto B: Este puerto es netamente Digital, tiene 8 bits y solo basta con modificar el Registro TRISB para especificar que bits son de Entrada y cuales de Salida. Por defecto, luego de un Reset todos los puertos estn configurados como entradas (TRISX=11111111). Puerto C: Este puerto es similar al Puerto B, con la diferencia que tambin pueden cumplir otras funciones que no veremos por ahora. Por defecto es un puerto Digital y solo hay que configurar los bits como Entrada o Salida por medio del Registro TRISC. Puerto D: Este puerto a diferencia de los 2 anteriores dispone en sus entradas de un Trigger Schmitt. Cuenta con 8 bits, por defecto es un puerto Digital y solo hay que configurar los bits como Entrada o Salida por medio del Registro TRISD. Puerto E: Este puerto tiene 3 bits y se puede configurar como E/S Digitales o como entradas analgicas.Por defecto es Digital y hay que configurar si son Entradas o Salidas por medio del Registro TRISE.

2. Problema 4. Colocamos una resistencia de 220ohms en serie con un LED a la salida del pin RB0, el nodo del LED se conecta con la resistencia y el ctodo a tierra. Se pide encender el LED.
3. Cdigo: [Descargar] [Ocultar] [Seleccionar]

5. ;Activar el LED del pin RB0. A la salida del Pin RB0 se coloca una ;resistencia en serie con el nodo del LED y el ctodo del LED a tierra. LIST P=16F877A INCLUDE<P16F877A.INC> ;Librera para el PIC16F877A ORG 0000H Cdigo de Programa bsf STATUS,RP0 bcf TRISB,0 RB0 como salida bcf STATUS,RP0 ;Direccin inicial del ;Cambiando al Banco-1 ;Configurando el pin ;Regresando al Banco-0

bsf PORTB,0 ;Mandando una seal ALTA "1" por RB0 para encender ;el LED goto $ ;Bucle infinito END 6. Problema 5. Encender y Apagar el LED sucesivamente.
7. Cdigo: [Descargar] [Ocultar] [Seleccionar]

;Fin de Programa.

9. ;LED del pin RB0 oscila entre ON/OFF LIST p=16F877A INCLUDE<P16F877A.INC> ORG 0000H bsf STATUS,RP0 ;Banco-1 bcf TRISB,0 ;RB0 como salida bcf STATUS,RP0 ;Banco-0 REPITE ;Etiqueta REPITE btfss PORTB,0 ;Es RB0=1? goto ACTIVAR ;NO lo es -> salto hasta ACTIVAR bcf PORTB,0 ;SI lo es -> RB0=0 (Apago el LED)

goto ACTIVAR bsf LED) goto END

REPITE PORTB,0 REPITE ;Etiqueta ACTIVAR ;RB0=1 (Enciendo el ;Salto hasta REPITE ;Fin de Programa.

Problema 6. Conteo Binario. Esta vez colocamos un pulsador a la entrada de RB0, se configura para que cada pulso ingrese un "1" al pin RB0. A la salida del Puerto D colocamos 8 LEDs con sus respectivas resistencias de tal manera que se enciendan cuando se mande un "1" por el Pierto D. Se pide encender los LEDs cada vez que se presione el pulsador, de tal manera que se visualize un conteo binario de 8 bits.
Cdigo: [Descargar] [Ocultar] [Seleccionar]

;Enciendo LEDs colocados en Puerto D luego de presionar un pulsador colocado ;en RB0. Se visualiza un conteo en binario cada que presionamos el Pulsador. LIST p=16F877A INCLUDE<P16F877A.INC> ORG 0000H bsf STATUS,RP0 ;Banco-1 bsf TRISB,0 ;RB0 como entrada clrf TRISD ;PORTD como salida bcf STATUS,RP0 ;Banco-0 ;========================================= clrf PORTD ;PORTD=00 (Apago todos los LEDs) REPITE btfss PORTB,0 ;Es RB0=1? (Se presion el pulsador?) goto $-1 ;NO -> Regreso a la instruccin anterior incf PORTD,1 ;SI -> PORTD=PORTD+1 (Encienden los LEDs) btfsc PORTB,0 ;Es RB0=0? (Se solt el pulsador?) goto $-1 ;NO -> Regreso a la instruccin anterior goto REPITE ;SI -> Repito el proceso o bucle END ;Fin de Programa.

As finalizamos esta clase. Espero haya sido de su agrado. Bytes.

1. NOTA: Agregar .INC al nombre de la librera, es decir, debe decir P16F877A.INC dentro de los smbolos <> luego del INCLUDE, yo uso la opcin CODE para publicar el cdigo pero por alguna razn este elimina la extensin INC del nombre de la librera. Agregenle la extensin y vuelvan a compilar sus programas. Usen la opcin DESCARGAR para bajar el cdigo y luego le cambian la extensin .txt por .asm, finalmente abren el cdigo con el MPLAB y lo agregan a su proyecto. Suerte.

____________ Comparte el conocimiento !!! Si lo oigo, lo olvido; Si lo veo, lo recuerdo; Si lo hago, lo entiendo. Proverbio. Just Burz Luego de la teora viene la prctica.

You might also like