Anda di halaman 1dari 60

MICROCONTROLADORES PIC

DOCENTE: ING. GUSTAVO ENRIQUE GUZMAN MIRANDA

PIC16F84A
Esta fabricado en tecnologa CMOS, posee memoria FLASH, y consumo bajo de potencia. Est compuesto bsicamente de una memoria ROM (1024 palabras de memoria de programa), una memoria RAM (de acceso aleatorio, 68 bytes), lneas de entrada y salida (2 Puertos) y una lgica de control que coordina la interaccin de los dems bloques.

PIC16F84A
Estos micros pertenecen a la gama media y dispone de un set de 35 instrucciones, tipo RISC (Computador con Set de Instrucciones Reducido) pocas pero muy poderosas.-

CARACTERISTICAS TECNICAS
Opera a una frecuencia mxima de 10 MHz 1Kbyte de memoria EEPROM para nuestro programa 68 bytes (de 8 bits) de memoria RAM 64 bytes de memoria EEPROM para datos (no voltiles) 35 instrucciones 13 pines de entrada/salida (un puerto de 8 bits + otro de 5 bits) Timer/contador de 8 bits

FUNCIONES ESPECIALES
Temporizador programable (Timer). Si se quiere medir periodos de tiempo entre eventos, generar temporizaciones o salidas con frecuencia especfica, etc. Perro Guardin o Watchdog. Consiste en un temporizador que, cuando se desborda ya pasa por 0, provoca un reset automtico, utilizado para sistemas que no tienen control de un supervisor, y al bloquearse el micro se resetea. Si se utiliza el cdigo debe resetearlo antes de que se desborde.

FUNCIONES ESPECIALES
Memoria EEPROM de 64 bytes, para guardar datos que no se alteran a pesar de quitar la alimentacin. Interrupciones, cuando una seal externa, o una condicin interna activa una lnea de interrupcin, dejando de lado la tarea que esta ejecutando, atiende dicha interrupcin y luego contina con lo que estaba haciendo.

FUNCIONES ESPECIALES
Proteccin ante fallo de alimentacin. Se trata de un circuito que resetea al micro cuando el voltaje Vdd es inferior al mnimo. Estado de bajo consumo. Sleep. Si el micro debe esperar mucho tiempo sin hacer nada, posee una instruccin especial, Sleep, que lo pasa al estado de reposo. Al activarse una interrupcin se despierta y reanuda su trabajo. (Reset externo, desbordamiento de Watchdog, interrupcin por RB0, interrupcin por cambio de nivel en RB4 a RB7, interrupcin por escritura completada en EEPROM)

PUERTOS
Este microcontrolador cuenta con dos puertos configurables como estradas y salidas, y consta de 18 pines los cuales se encuentran asignados de la siguiente manera:

PUERTOS
El puerto A tiene solo cinco pines, el pin 3, 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 Vdd de 1 Kohm. Cuando se configura como entrada, funciona como disparador Schmitt Trigger por lo que puede reconocer seales con un poco de distorsin.

PUERTOS
El puerto B tiene 8 pines que pueden ser configurados como entrada/salida. RB0 puede programarse adems como entrada de interrupcin externa. Los pines RB4 a RB7 pueden programarse para responder a interrupciones por cambio de estado y los pines RB6 y RB7 se corresponden con lneas de entrada de reloj y entrada de datos cuando esta en modo programacin. MCLR/Vpp, es la entrada de reset si esta a nivel bajo, tambin es habilitador de tensin de programacin. Cuando su tensin es Vdd el PIC funciona normalmente.

ALIMENTACION
Vss y Vdd, son los pines de masa y alimentacin. La tensin de alimentacin esta comprendida entre los 2 y 5.5 Volt. OSC1/CLKIN y OSC2/CLKOUT, pines de entrada externa de reloj y salida de oscilador a cristal respectivamente.

CAPACIDAD DE C0RRIENTE
La mxima capacidad de corriente de cada uno de los pines de los puertos en modo sumidero es de 25 mA y modo fuente de 20 mA. La mxima capacidad de corriente total de los puestos es, Puerto A: Modo sumidero 80 mA; Modo fuente 50 mA. Puerto B: Modo sumidero 150 mA; Modo fuente 100 mA.

OSCILADOR EXTERNO
Es un circuito externo que le indica al microcontrolador la velocidad a la que debe trabajar. Puede utilizar cuatro tipos distintos: RC, Oscilador con resistencia y condensador (Poco preciso) XT, Cristal de cuarzo. HS, Cristal de alta velocidad LP, Cristal de baja frecuencia y bajo consumo de potencia.

TIPOS DE OSCILADOR
Al momento de programar un micro se debe especificar que tipo de oscilador se usa. Internamente la frecuencia del oscilador es dividida por 4, as que si temeos un oscilador de 4 MHz, la frecuencia de trabajo es de 1 MHz, por lo que cada instruccin se ejecuta cada 1 us.

TIPOS DE OSCILADOR

Oscilador XT

Oscilador RC

C1=C2=33pF Crystal 4MHz

C1 alrededor de 20pF 5K R1 100K

RESET
El PIC 16F84A posee un temporizador interno conectado al pin de reset, que funciona cuando se da alimentacin al microcontrolador. Esto hace que al encender el sistema el microcontrolador quede en reset por un tiempo mientras se estabilizan todas las seales del circuito. Para tener control sobre el reset se utiliza el siguiente circuito:

CIRCUITO RESET

ESTRUCTURA INTERNA
Existen dos arquitecturas, la clsica de Von Neumann y la arquitectura Harvard, esta ultima es la que usan los PICs. Dispone de dos memorias independientes, una que contiene solo instrucciones y la otra solo contiene datos. Ambas disponen de sus respectivos buses de acceso y es posible realizar operaciones de acceso simultneamente en ambas.

La arquitectura von Neumann


Permite el diseo de programas con cdigo automodificable, prctica bastante usada en las antiguas computadoras que solo tenan acumulador y pocos modos de direccionamiento, pero innecesaria, en las computadoras modernas.

ARQUITECTURA HARVARD

ORGANIZACIN DE LA MEMORIA
Existen tres tipos de memoria: a) La memoria EEPROM donde almacenaremos el programa que haremos, esta memoria solo podr ser leida por el PIC (el PIC va leyendo las instrucciones del programa almacenado en esta memoria y las va ejecutando). Al apagar el PIC esta memoria no se borra.

ORGANIZACIN DE LA MEMORIA
b) La memoria RAM en cuyos registros se irn almacenando los valores de las variables que nosotros necesitemos, al apagar el PIC esta memoria se borra.

ORGANIZACIN DE LA MEMORIA
c) La memoria EEPROM para datos, es un espacio de memoria en la que se pueden guardar variables que queremos conservar aunque se apague el PIC.

MEMORIA DEL PROGRAMA


Aqu almacenamos nuestro programa o cdigo que debe ejecutar, la memoria del PIC16F84A es del tipo FLASH, es rpida, de bajo consumo y alta capacidad de almacenamiento. Se divide en 2048 posiciones, pero nuestro PIC solo tiene implementadas 1024 posiciones, de 0x00 hasta 0x3FF.

MEMORIA DEL PROGRAMA

MEMORIA DE USUARIO
El espacio marcado como "User memory Space" es el espacio de memoria donde ir nuestro programa, comprende las direcciones de memoria desde la 0000h hasta la 3FFh (3FFh en decimal es 1023, mas la direccin 0000h hacen 1024 direcciones, es decir, 1Kbyte)

INTERRUPCION
Cuando ocurre un reset, el contador de programa (PC) apunta a la direccin 0x00, y el micro inicia nuevamente. Aqu se debe escribir todo lo relacionado con la iniciacin del mismo, por ejemplo configuracin de puertos, etc. Si ocurre una interrupcin PC apunta a la direccin 0x04, y aqu debemos escribir el cdigo necesario para atender a dicha interrupcin

MEMORIA RAM ESTATICA


Donde se encuentran los 24 registros especficos (SFR) y 68 registros de propsito general (GPR). Se halla dividida en 2 Bancos de 128 bytes cada uno. Algo que se debe tener en cuenta es la pila o Stack, que consta de 8 posiciones, cada posicin contiene la direccin y datos de la instruccin que se esta ejecutando, as cuando se ejecuta una llamada call o una interrupcin, el PC sabe donde regresar.

MEMORIA RAM ESTATICA

BANCOS
Podemos observar en la imagen que esta memoria esta dividida en dos bancos, el banco 0 y el banco 1, antes de acceder a un registro de esta memoria tenemos que preguntarnos en que banco estamos, generalmente se trabaja en el banco 0, ya veremos mas adelante como cambiamos de banco de memoria

BANCOS
Fijndonos en el banco 1, las direcciones desde la 00h hasta la 0Bh estn ocupadas por registros del PIC, por lo que tendremos que empezar a guardar nuestras variables a partir de la direccin 0Ch.

BANCOS
Podremos acceder al resto de registros para cambiar la configuracin o el estado del pic. Faltara aadir a este cuadro el registro mas utilizado de todos, el acumulador (W) o registro de trabajo. No se trata de un registro propiamente dicho ya que no tiene direccin pero se usa constantemente para mover datos y dar valores a las variables (registros).

BANCOS
Si queremos copiar la informacin del registro 0Ch en el registro 0Dh no podremos hacerlo directamente, deberemos usar una instruccin para cargar el valor del registro 0Ch en el acumulador y despus otra instruccin para cargar el valor del acumulador en el registro 0Bh

PUERTO A
PORTA (Puerto A), Direccin 05h. Con este registro se puede ver o modificar el estado de los pines del puerto A (RA0 - RA4). Si un bit de este registro est a "1" tambin lo estar el pin correspondiente a ese bit. El que un pin est a "1" quiere decir que su tensin es de 5V, si est a "0" su tensin es 0V. Correspondencia:
RA0 ==> PORTA,0 RA1 ==> PORTA,1 RA2 ==> PORTA,2 RA3 ==> PORTA,3 RA4 ==> PORTA,4

PUERTO B
PORTB (Puerto B), Direccin 06h igual que PORTA pero con el puerto B Correspondencia:
RB0 ==> PORTB,0 RB1 ==> PORTB,1 RB2 ==> PORTB,2 RB3 ==> PORTB,3 RB4 ==> PORTB,4 RB5 ==> PORTB,5 RB6 ==> PORTB,6 RB7 ==> PORTB,7

ENSAMBLADOR
Podemos usar para escribir los programas el bloc de notas de Windows, Word o cualquier editor de texto, una vez escrito se guarda con extensin .asm y se convierte (ensambla) con un programa ensamblador. El resultado es un archivo con extensin .hex que podemos transferir al PIC16F84.

ETIQUETAS
EQU: Un ejemplo de esto son las etiquetas, podemos poner un nombre a un registro de memoria, esto se hace mediante la instruccin EQU. Por ejemplo: VARIABLE1 EQU 0CH A partir de ahora en lugar de escribir 0CH podemos escribir VARIABLE1 Con EQU tambin podemos poner nombre a constantes de la misma forma.

ETIQUETAS
#DEFINE: Otra instruccin para el ensamblador que usaremos ser la instruccin #DEFINE. Es parecido a EQU, solo que aqu no ponemos etiquetas a un registro, podemos ponerla a una instruccin entera, Por ejemplo: #DEFINE BANCO1 BSF STATUS,5 #DEFINE BANCO0 BCF STATUS,5 A partir de ahora, cuando escribamos BANCO 1 se pondr a "1" el bit de seleccin de banco y pasaremos al banco 1, al escribir BANCO 0 pasaremos al banco 0

ORG
ORG: Indica al ensamblador la direccin (de memoria de programa) donde se guardar la instruccin que vaya a continuacin. Por ejemplo: ORG 00H CLRF VARIABLE1 La instruccin CLRF est en la direccin de memoria de programa 00H (ser la primera instruccin en ser ejecutada por el pic)

END
END: Se escribe al final del programa para indicar que ya ha acabado. (es obligatorio, si no da error). Etiquetas a direcciones de Programa: muy tiles para usar con instrucciones CALL (Llamada a subrutina) o GOTO (Salto).

EL PROGRAMA
Importante llevar un poco de orden a la hora de escribir el programa, nos ayudar mucho: Al principio van los EQU y los #DEFINE, despus comenzamos con el programa. El programa se escribe en cuatro columnas separadas por tabuladores:
En la primera columna se ponen las etiquetas a direcciones de programa En la segunda columna se ponen las instrucciones (BSF, CLRF, BTFSC... etc.) En la tercera columna se ponen Los registros o parmetros a los que afecta la instruccin. En la cuarta columna se ponen los comentarios que creas pertinentes (cuantos mas mejor) seguidos de un punto y coma.

SUBRUTINAS

SUBRUTINAS
Durante el programa principal se llama varias veces a la subrutina SUBR (el nombre es lo de menos) con la instruccin CALL. Cuando el pic ejecuta una instruccin CALL se guarda en memoria la direccin de cdigo de programa a la que tiene que retornar de tal forma que cuando se encuentra con la instruccin RETURN vuelve al programa principal donde lo dej.

SUBRUTINAS
Una subrutina no solo puede ser llamada desde el programa principal, tambin puede hacerse desde otra subrutina (una subrutina que llama a otra subrutina) o desde una interrupcin

SUBRUTINAS
Cuando se produce una interrupcin el PIC deja automticamente lo que est haciendo, va directo a la direccin 04h de programa y ejecuta lo que encuentre a partir de all hasta encontrarse con la instruccin RETFIE que le har abandonar la interrupcin y volver al lugar donde se encontraba antes de producirse dicha interrupcin.

SUBRUTINAS
Para que se pueda producir una interrupcin hay que habilitar las interrupciones globalmente y la interrupcin en concreto que queremos utilizar (con el registro INTCON). Este pic tiene 4 tipos de posibles interrupciones:

SUBRUTINAS
Por cambio en los bits RB4-RB7 Por el estado de RB0 Por desbordamiento del Timer-contador Por fin de ciclo de escritura de la EEPROM de datos Mientras se est ejecutando una interrupcin no se puede producir otra interrupcin, el pic no lo permite.

SUBRUTINAS
Una cosa importante a tener en cuenta al usar interrupciones es que cuando estas se producen podramos estar trabajando con registros que pueden ser modificados en la propia interrupcin, como el acumulador o el STATUS. Para que la interrupcin no eche a perder el buen funcionamiento del programa principal conviene guardar los valores de estos registros en otras variables que no vayamos a modificar.

DISEO DEL CIRCUITO ELECTRONICO

DIAGRAMA DE FLUJO

CONFIGURACION DE FUSIBLES
Hay ciertos aspectos del PIC que han de ser activados o desactivados mediante hardware a la hora de programarlo. Esto quiere decir que no se pueden volver a cambiar hasta que el chip no se reprograme de nuevo. El PIC16F84A dispone de 4 fuses (los modelos superiores tienen ms). Cada fuse activa o desactiva una opcin de funcionamiento.

FUSES
OSC: Este fuse controla el modo de oscilacin que usar el PIC para funcionar. Como ya sabemos, el oscilador se puede configurar de 4 maneras distintas, dependiendo de la velocidad y del tipo de circuito oscilador empleado. WDT: El famoso "perro guardin" del PIC se configura aqu. Esta es una capacidad del microcontrolador de autorresetearse.

FUSES
PWRT: Si activamos este fuse, lo que conseguimos es que se genere un retardo en la inicializacin del microcontrolador. CP: Activando este fuse tendremos la garanta de que el cdigo que escribamos en el PIC no pueda ser ledo por otra persona, para que no nos lo copien, modifiquen, etc. (Code Protection). Esto no impide que el PIC funcione como siempre, ni que no se pueda sobrescribir su contenido.

ESPECIFICACION DEL MICROCONTROLADOR


Primero que nada debemos especificar con que microcontrolador estamos trabajando, esto lo realizamos en las dos primeras lneas: Cdigo PRUEBA (asm): ; **** Encabezado **** list p=16F84A #include P16F84A.inc En el archive P16F84A.inc se encuentran las definiciones de las direcciones de los registros especficos, los bits utilizados en cada registro y los fusibles del micro.

DEFINICION DE VARIABLES
Definicin de variables que utilizaremos en nuestro proyecto. En este caso solo definiremos bits, por ejemplo Led y Pulsador. Para organizar nuestro programa lo estructuraremos de la siguiente manera:

Nivel Directiva Operandos ; Comentarios Led equ 0 ; Definimos Led como el bit cero de un registro, en este caso PORTB. Pulsador equ 0 ; Definimos Pulsador como el bit 0, en este caso sera para PORTA

CONFIGURACION DE PUERTOS

Para la configuracin necesitamos los siguientes registros: STATUS 0x03; PORTA 0x05; PORTB 0x06; TRISA 0x85; TRISB 0x86; Por defecto los puertos quedan configurados como entradas de datos y si se quiere cambiar hay que configurarlos. Esto se realiza con los registros TRISA y TRISB, teniendo en cuenta que si se asigna un cero (0) a un pin, quedara como salida y si se asigna un uno (1), quedara como entrada.

CONFIGURACION DE PUERTOS
En nuestro caso se necesita colocar TRISA igual a 11111 (o se puede dejar por defecto) y TRISB 11111110. Ahora bien, cuando el PIC arranca se encuentra en el Banco 0, TRISA y TRISB se encuentran en el Banco 1, entonces debemos cambiar de Banco. Esto se realiza con el bit RP0 del registro STATUS. Si este se pone un cero a RP0, estaremos en el Banco 0. Si se coloca un uno, estaremos en el Banco 1. Registro W: es el registro ms importante que tiene el microcontrolador y es denominado ACUMULADOR.

PROGRAMA
;*** Configuracion de puertos *** Reset org 0x00 ; Aqui comienza el micro.goto inicio ; Salto a inicio de mi programa.Inicio bsf STATUS,RP0 ; Pasamos de Banco 0 a Banco 1.movlw b'11111' ; Muevo 11111 a W.movwf TRISA ; Cargo en TRISA.movlw b'11111110' movwf TRISB bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0 bcf PORTB,Led ; Comienza apagado.-

PROGRAMA
;**** Control de Led **** Bucle btfsc PORTA,Pulsador ; Preguntamos si esta en 0 logico.goto Apagar ; Esta a 1 logico, Apagamos Led.bsf PORTB,Led ; Esta a 0 logico, Encendemos Led.goto Bucle ; Testeamos nuevamente la condicion del Pulsador.Apagar bcf PORTB,Led ;Apagamos Led.goto Bucle ; Testeamos nuevamente la condicion del Pulsador.end

; **** Encabezado **** list p=16F84A #include P16F84A.inc __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ;**** Definicion de variables **** Led equ 0 ; Definimos Led como el bit cero de un registro, en este caso PORTB.Pulsador equ 0 ; Definimos Pulsador como el bit 0, en este caso sera para PORTA ;**** Configuracion de puertos *** Reset org 0x00 ; Aqui comienza el micro.goto Inicio ; Salto a inicio de mi programa.org 0x05 ; Origen del codigo de programa.Inicio bsf STATUS,RP0 ; Pasamos de Banco 0 a Banco 1.movlw b'11111' ; Muevo 11111 a W.movwf TRISA ; Cargo en TRISA.movlw b'11111110' movwf TRISB bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0 bcf PORTB,Led ; Comienza apagado.;**** Control de Led **** Bucle btfsc PORTA,Pulsador ; Preguntamos si esta en 0 logico.goto Apagar ; Esta a 1 logico, Apagamos Led.bsf PORTB,Led ; Esta a 0 logico, Encendemos Led.goto Bucle ; Testeamos nuevamente la condicion del Pulsador.Apagar bcf PORTB,Led ;Apagamos Led.goto Bucle ;Testeamos nuevamente la condicion del Pulsador.end