Vous êtes sur la page 1sur 4

El PIC16f877A dispone de 5 puertos de E/S (Entrada/Salida): La puerta A posee 6 linias RA0 - RA5 que tienen funciones digitales y analogicas,

estas ultimas funcionan con un ADC interno, y ademas una de ellas soporta 2 funciones multiplexadas. Se trata del RA4/TOCK1, que puede actuar como linia de E/S o como pin en el cual se reciben los impulsos que debe contar TMR0 (Timer 0). La puerta B tiene 8 linias, RB0 - RB7, y tambien tiene una con funciones multiplexadas, la RB0/INT, que ademas de liniatipica de E/S, tambien sirve como patita por la que se reciben los impulsos externos que provocan una interrupcin; una puerta C de 8 bits que van desde RC0 - RC7, con funciones multiplexadas para la transmision serial y otras funciones especiales; una puerta D, igualmente con 8 lineas E/S, RD0 - RD7; y finalmente un puerto E, solamente con 3 lineas RE0 - RE2, las cuales tienen funciones Analogicas de igual modo que la Puerta A. La informacion que entra y sale por las puertas recide en las posiciones 5, 6, 7, 8, 9 del Banco 0, mientras que TRISA, TRISB, TRISC, TRISD, TRISE, que son los registros de configuracion, ocupan las direcciones 5, 6, 7, 8, 9 del Banco 1. LA PUERTA A Las lineas RA0 - RA3 y la linea RA5; admiten niveles de entrada TTL y de salida CMOS; ademas disponen de lineas de entradas analogicas. La linea RA4/T0CKI dispone de un circuito Schmitt Triguer que proporciona una buena inmunidad al ruido y la salida tiene Drenador Abierto. RA4 multiplexa su funcion de E/S con la de entrada de impulsos externos para TMR0. Cuando se lee una linea de la Puerta A se recoge el nivel logico que tiene en ese momento. Las lineas cuando actuan como salidas estan <<lacheadas>>, lo que significa que sus patitas sacan el nivel logico que se haya cargado por ultima vez en el Registro "PORTA". La escritura de una puerta implica la operacion <<lectura/modificacion/escritura>>, primero lee la puerta, luego se modifica el valor y finalmente se escribe en el lach de salida. LA PUERTA B Consta de 8 lineas bidireccionales de E/S, RB7 - RB0, cuya informacion se almacena en el registro PORTB, que ocupa la direccion 6 del banco 0. El registro de configuracion TRISB ocupa la misma direccion en el Banco 1. La linia RB0/INT tiene dos funciones multiplexadas. Ademas de patita E/S, actua como patita para la peticion de una interrupcion Externa, cuando se autoriza esta funcion mediante la adecuada programcion del registro INTCON, del que se hablara mas adelante. A todas las linias de esta puerta se les permite conectar una resistencia de Pull-up. Para este fin hay que programar en el registro OPTION en el bit RBPU# = 0. MANEJO DE LOS PUERTOS Para el manejo de los puertos es necesario manejar dos tipos de registros, en el caso del puerto A, tenemos el registro PORTA ubicado en la posicion 5 del banco 0, el cual nos permite escribir y leer los datos en el puerto. El registro TRISA ubicado en la posicion 5 del banco 1, registro especial de configuracion de la bidireccionalidad del puerto A. Cuando cambiamos los bits del TRISA a estados altos, ponemos esas linias del puerto A como entradas, caso contrario como salidas. Un aspecto importante a no olvidar, es cambiar el puerto A, como entradas y salidas digitales, esto lo hacemos en el registro ADCON1, en sus 3 primeros bits. ejemplo: BSF STATUS, RP0 ;cambiamos al banco 0 BSF STATUS, RP1 MOVLW 0X00 MOVWF TRISA movlw 0x06 movwf ADCON1

; configuramos el purtoA como salida ; configura todos los pines ; del PORTA como entradas ; digitales

MODULO TIMER0

El modulo Timer0 (control de tiempo / contador), tiene las siguientes caracteristicas: - 8 bits (control de tiempo / contador), - Habilidad de escritura y lectura - Reloj interno y externo seleccionable - Activa una interrupcion interna, cuando se desborda - Registro de configuracion para seleccion del reloj interno o externo Diagrama del modulo del Timer0 La selelcion del modo de operacion del Timer0 se realiza a traves del registro de configuracion OPTION_REG, en el bit 5 (T0CS), el cual cuando esta en estado bajo, configura al timer 0 como control de tiempo; caso contrario en estado alto, configura al modulo del Timer 0, como contador de pulsos provenientes del pin RA4/T0CK1.

;Programa de ejemplo para inicializacin del MCU y uso de puertos I/O list p=16f877 ;Definicin del microcontrolador a usar

#include<p16f877.inc> ;Cabecera que define los registros del MCU ;Bits de configuracin del MCU cfg1equ _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_ON cfg2equ _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC __config cfg1 & cfg2 ;_CP_OFF: ; Proteccin de cdigo apagada (el MCU se puede volver a leer usando el ; programador) ;_DEBUG_OFF: ; Modo de depuracin deshabilitado (para uso con ICD o pickit solamente) ;_WRT_ENABLE_OFF: ; El MCU no puede sobre escribir su propio cdigo ;_CPD_OFF: ; Proteccin de EEPROM apagada (la EEPROM del MCU se puede leer con el

; programador) ;_LVP_ON: ; Programacin a bajo voltaje habilitada (se debe activar con el ; entrenador del PIC16F877, ya que no cuenta con un programador de alto ; voltaje) ;_BODEN_OFF: ; El MCU no se reiniciar si el voltaje de alimentacin decae por debajo ; de 4.5V ;_PWRTE_ON: ; Activa el timer de encendido del MCU para que este espere un breve ; tiempo tras ser alimentado ;_WDT_OFF: ; Apaga el temporizador perro guardin (as no hay necesidad de ejecutar ; clrwdt peridicamente ;_XT_OSC: ; Configura el oscilador para usar un cristal de mediana frecuencia ; (4-8 MHz) PROG1 code;El programa se ubicar en la pgina 0 ;Vector de arranque del PIC. Aqu es la direccin 0x00000 bsf STATUS, RP0 ;Selecciona el banco 1 (inicialmente es el 0) movlw 0xFF movwf TRISC clrf TRISD ;Establece todo puerto D como salidas ;Establece todo puerto C como entradas

bcf STATUS, RP0 ;Selecciona el banco 0 Rutina: movf PORTC, w ;Toma el dato del puerto C

xorlw 0x55 movwf PORTD goto Rutina end

;Invierte los bits en las posiciones pares ;Guarda el nuevo dato en el puerto D ;Repite el proceso ;La palabra "end" debe escribirse siempre al final

Listado 1 Cdigo fuente del programa a implementar.

Propuesta timer 0

P r o g r a ma r e l T M R 0 p a r a g e n e r a r u n r e t a r d o d e u n s e g u n d o . A p a r t i r d e l c u a l s e i n c r e me n t a u n contador cuyo valor se muestra por el PORTC


list p=16f877 ;Comando que indica el Pic usado include "p16f877.inc" ;Etiquetas genricas para el Pic16F877 CONTA EQU 0x20 ;Variable CONTA en direccin 0x20 hexadecimal de ;memoria RAM org 0x00 ;Inicio del programa en la posicin cero de memoria nop ;Libre (uso del debugger) nop _inicio bsf STATUS,RP0 ;Ir banco 1 bcf STATUS,RP1 clrf TRISA ;PORTA salida clrf TRISB ;PORTB salida clrf TRISC ;PORTC salida clrf TRISD ;PORTD salida clrf TRISE ;PORTE salida movlw b'11000110' ;Configuracin del modulo TMR0 movwf OPTION_REG ;Preescaler = 128 bcf STATUS,RP0 ;Ir banco 0 bcf STATUS,RP1 clrf PORTC ;PORTC = 0 _bucle call _retardo ;Llama la rutina de retardo incf PORTC,F ;Incrementa el valor del PORTC goto _bucle ;Ir _bucle _retardo ;T = 4 * Tosc * Valor de TMR0 * Preescaler movlw d'64' ;Cargar el valor de CONTA para 1 segundo movwf CONTA _espera1 clrf INTCON ;Deshabilitar interrupciones movlw d'134' ;Cargar el valor de TMR0 para 122 cuentas movwf TMR0 ;(Complemento) _espera btfss INTCON,T0IF ;Esperar desborde del TMR0 goto _espera decfsz CONTA,F ;Decrementar el registro CONTA hasta cero goto _espera1 ;Si no es cero: ir a _espera1 return ;retorno de call end