Programas sencillos para el microcontrolador PIC16F877A.





En esta ocasión te presentaremos dos sencillos programas escritos en ensamblador para el PIC16F877A. El primero de ellos enciende y apaga un LED conectado al pin RA0 del microcontrolador; mientras que el segundo, prende secuencialmente los LEDs que han sido conectados al puerto B del mismo.

Además, aprenderemos a simular nuestro microcontrolador en Isis Proteus e implementaremos físicamente nuestro PIC en el protoboard.

- Para esta práctica utilizaremos un programador de PICs, que seguramente encontrarás en tu centro educativo.
- Usaremos el compilador gratuito de Microchip “MPLAB IDE” para escribir nuestro programa en ensamblador y obtener el archivo .HEX (utilizado por el programador para grabar el micro). Descargar MPLAB IDE.
- Aunque los PICs son resistentes a la estática, debemos tener cuidado de no tocar sus pines.

ENCENDIDO DE UN LED.
El siguiente código nos permitirá encender y apagar un LED conectado al pin RA0 del PIC.

__CONFIG _WDT_OFF&_PWRTE_ON&_XT_OSC&_LVP_OFF&_CP_OFF ; Configuración para 
el programador

LIST p=16F877A
INCLUDE <P16F877A.INC>

ORG 0x00 ;Inicio de programa

N EQU 0x00
cont1 EQU 0x20
cont2 EQU 0x21

BCF STATUS,RP0 ; Accede a banco 0
BCF STATUS,RP1 
CLRF PORTA ; Limpia PORTA
BSF STATUS,RP0 ; Accede a banco 1
CLRF TRISA ; Configura todos las patitas de PORTA como salidas
BCF STATUS,RP0 ; Regresa a banco 0

Encled 
BSF PORTA,0 ; La línea RA0 de PORTA toma el valor de 1, se enciende el LED
CALL Retardo ; Llamada a la rutina de retardo
BCF PORTA,0 ; La línea RA0 de PORTA toma el valor de 0, se apaga el LED
CALL Retardo ; Llamada a la rutina de retardo 
GOTO Encled ; Va a la etiqueta Encled

Retardo ; Rutina de retardo
MOVLW N 
MOVWF cont1
Rep1
MOVLW N
MOVWF cont2 
Rep2
DECFSZ cont2,1
GOTO Rep2 
DECFSZ cont1,1 
GOTO Rep1
RETURN ; Retorno a la llamada de rutina de retardo.

END ; Fin de programa

Y aquí, nuestro circuito implementado en el protoboard simplificado.
Para esta práctica hemos utilizado una resistencia (R1) de 10 Kilo Ohms, un cristal (XTAL) de 4 MHz y una resistencia (R2) de 200 a 300 Ohms para limitar la corriente que llegara a nuestro LED.

ENCENDIDO SECUENCIAL DE LEDs.
Este código nos permitirá encender secuencialmente los LEDs conectados al puerto B del micro, en un ciclo infinito de RB0 a RB7.

__CONFIG _WDT_OFF&_PWRTE_ON&_XT_OSC&_LVP_OFF&_CP_OFF ; Configuración para 
el programador

LIST p=16F877A
INCLUDE <P16F877A.INC>

ORG 0x00 ; Inicio de programa

N EQU 0x00
cont1 EQU 0x20
cont2 EQU 0x21

BCF STATUS,RP0 ; Accede a banco 0
BCF STATUS,RP1 
CLRF PORTB ; Limpia PORTB
BSF STATUS,RP0 ; Accede a banco 1
CLRF TRISB ; Configura todas las patitas de PORTB como salidas
BCF STATUS,RP0 ; Regresa a banco 0

BSF PORTB,0 ; La línea RA0 de PORTB toma el valor 1, se enciende el LED
Encledsec
CALL Retardo ; Llamada a la rutina de retardo
RLF PORTB,1 ; Recorre el bit de RB0 a RB7
GOTO Encledsec ; Va a la etiqueta Encledsec

Retardo ; Rutina de retardo
MOVLW N 
MOVWF cont1
Rep1
MOVLW N
MOVWF cont2 
Rep2
DECFSZ cont2,1
GOTO Rep2 
DECFSZ cont1,1 
GOTO Rep1
RETURN ; Retorno a la llamada de rutina de retardo.

END ; Fin de programa

Y aquí, su correspondiente implementación en el protoboard.
Para esta práctica hemos utilizado una resistencia (R1) de 10 Kilo Ohms, un cristal (XTAL) de 4 MHz, y 7 LEDs.

Es muy importante que entre la salida de los pines del microcontrolador y sus respectivos LEDs, coloquemos una resistencia de aproximadamente 200 Ohms, para evitar averías en nuestro microcontrolador.

IMPLEMENTACIÓN EN PROTEUS.

Seguramente te querrás asegurar de que tu programa funcione correctamente antes de ir a grabar tu PIC en la programadora y darte cuenta de que al implementar físicamente tu circuito, este no hace nada. Para probar el correcto funcionamiento de nuestro circuito existen programas como Isis Proteus que nos permiten simular una gran variedad de microcontroladores de una manera rápida y sencilla.

Para simular nuestros micros en ISIS:

1.- Escoger el modelo de nuestro microcontrolador y colocarlo en el espacio de trabajo.

2.- Hacer doble click sobre él, con lo que nos aparecerá la siguiente ventana:

En ella, simplemente hacemos click sobre la imagen de la carpetita (ubicada en la opción Program File) para buscar y cargar el archivo .HEX.

3.- Y listo, finalmente simularemos el microcontrolador para comprobar que nuestro circuito funcione perfectamente bien.

PARA QUE NUESTRO PIC FUNCIONE FÍSICAMENTE.
Nuestro código parece estar bien, nuestra simulación funciona perfectamente, pero ¡Oh Sorpresa!, a la hora de implementarlo en el protoboard nuestro proyecto no funciona. Aquí una serie de medidas a tomar en cuenta si nuestro microcontrolador PIC16F877A no hace nada.

1. Alimentar correctamente nuestro PIC.
Debemos asegurarnos de que nuestro micro este bien alimentado. Para ello veamos el diagrama de pines del microcontrolador,
En él, podremos apreciar que existen 4 pines marcados con los símbolos VDD y VSS, estas son las patillas de alimentación, donde VDD va conectado a voltaje y VSS a (masa) ó a tierra. Para alimentar a nuestro PIC solo debemos conectar dos de las cuatro patillas, una VDD y una VSS.

2. Realizar las siguientes conexiones.
El pin 1 del microcontrolador (MCLR/VPP) debe estar conectado a voltaje por medio de un resistor de 10 Kilo Ohms.

Además, conectaremos dos capacitores (C1 y C2) junto al oscilador de cristal (XTAL) como lo vemos en la siguiente imagen.
Los valores de los capacitores varían de acuerdo al tipo de oscilador utilizado (LP, XT, HS), en la siguiente tabla podemos ver estos valores.
En nuestras prácticas no hemos utilizado estos capacitores, ya que sin ellos funcionan bien.

3. Configurar correctamente los bits o fusibles de configuración.
Es decir, debemos asegurarnos de activar los bits correctos de acuerdo a las necesidades del proyecto. En muchas de las prácticas solo debemos escoger el tipo de cristal, así que deshabilitaremos todas las demás opciones de configuración. Para estas prácticas hemos utilizado el oscilador de cristal tipo XT.

Más información sobre osciladores.
Más información sobre fusibles de configuración.

Descargar pack1 _ encendido de un LED (Archivo .asm + archivo .hex + simulación en Proteus).
Descargar pack2 _ encendido secuencial de LEDs (Archivo .asm + archivo .hex + simulación en Proteus).

Descargar MPLAB IDE.
Descargar hoja de datos del PIC16F87XA (en inglés).


36 comentarios:

Anónimo dijo...

EXCELENTE ARTICULO

electronicomoderno dijo...

NO ESTA TAN LOCO PERO SI ME PUEDEN DECIR DE UNA PAGINA SIMILAR A ESTA PARA SEGUIR PRACTICANDO

Anónimo dijo...

tengo problemas con el 877a no me capta las entradas puesto que lo suministro un pulso en PORTA(0) PUESTO QUE ES MI ENTRADA ni en el programa ni en la vida real lo capta
desde btfsc PORTA,0
LIST p=16f877a
include "p16f877a.INC"
radix hex
conteo equ 0x20
reg1 equ 0x21
reg2 equ 0x22
reg3 equ 0x23
org 0x00
goto inicio
;---------configuracion----;
inicio bsf STATUS,5
movlw 0x06
movlw b'0000000'
movwf PORTC
movlw b'0000000'
movwf PORTD
bcf STATUS,5
clrf PORTA


;-------programa--------------;sc=1 ss=0

continue movlw b'1000000';anodo PORTC cero
movwf PORTC
movlw b'0111111';catodo PORTD cero
movwf PORTD

start movf PORTA
btfsc PORTA,0
goto pro
goto start
NOTA:miguel_754@hotmail.com

natal.mx dijo...

Hola, disculpa, yo estoy haciendo otro programa diferente con otros fines, pero observé que en el PIN1 del PIC le pones una resistencia de 10K, qué pasa si no le pongo esta? para qué sirve? sólo estoy metiendo 5V de mi fuente o necesito aun así ponerla?

Oscar dijo...

Lo pongo por costumbre, ya que mi profesor me lo enseño así, pero no es necesario. Lo que si es necesario, será colocar las resistencias correspondientes entre las salidas del micro y los LEDs (se que no es el mismo proyecto, pero por si acaso).

ceci dijo...

Hola!
Tengo un problema y me gustaría saber si alguien sabe que pasa:
Estoy programando un PIC16F877 con MPLAB con el programador PICSTART-Plus. Estoy probando un programa MUY sencillo que ponga una salida del micro a 1. El problema que tengo es que la salida se pone a 5V pero sólo durante unos segundos y luego se vuelve a poner a cero.

No se si el problema viene de los bits de configuracíon que los he puesto:
-OSC HS
-WDT Off
-PUT Off
-CP Off
-BODEN On
-LVP Enabled
-CPD off
-WRT_ENABLE Enabled

El programa que utilizo es tan sencillo como:

#include <16F877.H>

#define _16f877

#use delay(clock=20000000)

void main() {


do{
set_tris_b(0x00);

output_b(0xFF);

}while(TRUE);
}


En el circuito, por ahora, sólo he puesto:
-patitas 11 y 32 a 5v
-patitas 12 y 31 a 0v
-patitas 13 y 14: el cristal de 12 MHz con dos condensadores de 15pF.


Estaría muy agradecida si me pudiesen ayudar, no sé que mas probar!

Un saludo

gabriel dijo...

creo k la onda es que no loestas metiendo al ciclo en lugar de eso yo pondria:

void main() {
set_tris_b(0x00);
while(true){
output_b(0xFF);
}

}

eso mantendra encendido tu puerto espero te sirva si no prueva en el compilador CCS

Anónimo dijo...

hola soy lucia y quiero saber si alguna persona tiene q me facilite un programa en c++ con este pic16f877. proyectos un poco complejos. gracias mi correo es lulu_lucia_1898@yahoo.es

Anónimo dijo...

XFAVOR COMO CONFIGURO EL PUERTO D COMO SALIDAS YA L AGO DE VARIAS FORMAS Y UN BIT NO SE ACTIVA

Anónimo dijo...

XFAVOR ayudeme COMO CONFIGURO EL PUERTO D del pic 16f877a COMO SALIDAS en mplab YA L AGO DE VARIAS FORMAS Y UN BIT NO SE ACTIVA mi correo es joseeproducc@yahoo.es

Anónimo dijo...

muy bueno aporte graciasss

Anónimo dijo...

hola amigo con que programa hiciste los circuitos simulando que estan conectadosen el protoboard. saludos

Oscar dijo...

Con un programa de diseño, es difícil, afortunadamente existe un programa que te permite hacer esto fácilmente (sólo dibujar no diseñar).
http://www.circuitoselectronicos.info/2010/09/documentar-proyectos-con-fritzing.html

Anónimo dijo...

necesito saber kien me ayuda con todo el programa de el pic 16f877a para recibir un dato por el puerto a y sacarlo por el port b gracias
como seria entonces este :)

Javier dijo...

saludo a todos los usuarios de este blog

su pagina esta interesante, lo que quiero indicarles es que el uso de una resistencia en un pin al que se conecta un led es debido a que se debe controlar la corriente que circula a través del pin del micro.

para dimencionar a un valor de corriente que ustedes crean el mas adecuado utilicen ley de ohm con 5v y el valor de resistencia que deseen colocar solo tomen en cuenta que la corriente no sea superior a los 20mA.

con respecto al manejo del puerto a del micro debes primero configurar el registro adcom para que el puerto te sirva como entradas/salidas digitales caso contrario lo estas configurando como un puerto analógico.

Anónimo dijo...

Hola una duda muy importante, realice en un protoboard el circuito del programa que prende secuencialmente los leds y utilize varias configuraciones con el oscilador (XT y HS) y siempre que lo conectaba no funcionaba.

Finalmente hice caso al comentario de quitar los capacitores del oscilador de cristal y funciono por fin, pero mi duda es a que se debe que sin los capacitores funcione y con los capacitores no lo haga. Agradezco la atención y espero me puedan responder la duda.

leo dijo...

hola, como cambio los tiempos de encendido, ocea como hacer el secuencial de leds vaya mas rapido, ¿que tengo que modificar en el codigo?,

Anónimo dijo...

necesito construir un circuito de 21 leds alineados en lìnea recta a una distancia de 20cm y encender c/u cada 1seg.

sergio dijo...

den una idea para un proyecto sencillo pero interesante es para salvar una unidad

Anónimo dijo...

Hola saben como hacer un pinball con ese Pic, ke si se pasa de 5 led`s de izquierda o derecha anote si no se preciona un push buttn ??

Anónimo dijo...

hola saben como hacer que se desplieguen las letras de nombres en display por pic 16f887A ??

Anónimo dijo...

Oye disculpa mucho mi ignorancia pero a través de que puerto se controla (usb, serie o paralelo)?

Jenniz dijo...

el problema que yo tengo esq quiero encender un led en el puerto a pulsando un boton en el mismo puerto he tenido complicaciones con esto.
por decir pongo el boton en pin A1 y quiero que al presionarlo me encienda un led que pongo en el pin A4 del mismo puerto..........

Anónimo dijo...

Saludos a todos, alguien me podria ayudar en la programacion del pic 16f877a, le cuento lo que necesito: tengo una entrada que varia de 1 a 5 voltios que viene de un lm35 y entra al pic
, ok ahora necesito que su salida valla de 00 a 100, este se reflejaria en una lcd 16x2. dejo mi correo ventasenthernet@hotmail.com

Anónimo dijo...

Estan buenos los ejemplos pero quisiera saber si el cristal XTAL tiene que ir a fuerzas??
o puedo utilizar otro cristal de otra capacidad??
saludos.

Anónimo dijo...

una pregunta quisiera de favor si tiene el programa de como hacer la secudncia de ldes en un sentido y en otro como el del carro fantastico lo intente hacer pero no me sale gracias

alejandrorocket dijo...

Buena página

Anónimo dijo...

quien me podria facilitar un programa para encender y apagar un LED con rebote y temporizador? gracias!

Anónimo dijo...

Estimados
Si alguien me puede ayudar tengo que hacer un programa para el pic16f877 el cual consiste en ingresar 5 valores analogos ( una tencion de 5(vcc)) al pic y que este me entrege una señal digital respectibamente, si alguin sabe como se puede hacer se lo agradesco mucho
Saludos Cristian Escobar
caye328@hotmail.com

sjaramillom@hotmail.com dijo...

hola estoy algo connfundida
__CONFIG _WDT_OFF&_PWRTE_ON&_XT_OSC&_LVP_OFF&_CP_OFF ; Configuración para
el programador

en eswta instruccion tengo entendido que es la configuracion del quemador , pero el tuyo es icprog y el mio es pickit, se avalida para los dos y no entiendo explicam que hace esa intruccion

__CONFIG _WDT_OFF&_PWRTE_ON&_XT_OSC&_LVP_OFF&_CP_OFF ; Configuración para
el programador


gracias

`·.¸¸.·´´¯`Arknox´¯`··._.· dijo...

Ayuda por favor on se que hize mal pero no me funcionaaa ayudaa. mi correo es angel1d@hotmail.com se los agradeceria de todo corazon que me hechen una mano por favorrrr gracias.

`·.¸¸.·´´¯`Arknox´¯`··._.· dijo...

Bueno despues de muchos intentos estaba fallando al elegir el oscilado en el momento del grabado aqui el video q si funciona ^^

http://www.youtube.com/watch?v=qKoIfqeIK6I&feature=youtu.be

fernando dijo...

busco quien me pueda colaborar para poder hacer y programar el pic 16F877A para interactuar con leds para la fabricacion de un reloj, revisando el diagrama que aparece con un led y luego con 7 led se me hace que le faltan elementos tales como los condensadores que van en el cristal, la idea es comensar a interactuar con un led, tengo conocimientos de diseñar circuitos electronicos mas no de programacion, necesito alguien que me pueda informar sobre una agina donde ya haya un reloj interactuando con leds o me pueda brindar alguna informacion sobre esto mi correo es cubillosortizfernando@hotmail.com estare atento para revisar comentarios e ideas de las personas que me puedan colaborar ya que esto es muy importante para mi para poderme graduar gracias.

Anónimo dijo...

Vidal>justo lo que nesecitaba saber gacias Loko exitos

franklin dijo...

yo quisiera q me ayudaras yo tengo que hacer un proyecto con el pic 16f877a tengo que controlar tres reles desde la conputadora usando el rs232 pero no se como hacerle el programa al pic

Edwin Lemus dijo...

necesito realizar 4 secuencias diferentes alguien me puede ayudar

Publicar un comentario en la entrada

Utiliza nuestro foro de electronica si tienes dudas no relacionadas con este tema.