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.
- 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.
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.
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.
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).
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).
EXCELENTE ARTICULO
ResponderEliminarNO ESTA TAN LOCO PERO SI ME PUEDEN DECIR DE UNA PAGINA SIMILAR A ESTA PARA SEGUIR PRACTICANDO
ResponderEliminartengo 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
ResponderEliminardesde 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
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?
ResponderEliminarLo 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).
ResponderEliminarHola!
ResponderEliminarTengo 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
creo k la onda es que no loestas metiendo al ciclo en lugar de eso yo pondria:
ResponderEliminarvoid 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
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
ResponderEliminarXFAVOR COMO CONFIGURO EL PUERTO D COMO SALIDAS YA L AGO DE VARIAS FORMAS Y UN BIT NO SE ACTIVA
ResponderEliminarXFAVOR 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
ResponderEliminarmuy bueno aporte graciasss
ResponderEliminarhola amigo con que programa hiciste los circuitos simulando que estan conectadosen el protoboard. saludos
ResponderEliminarCon 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).
ResponderEliminarhttp://www.circuitoselectronicos.info/2010/09/documentar-proyectos-con-fritzing.html
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
ResponderEliminarcomo seria entonces este :)
saludo a todos los usuarios de este blog
ResponderEliminarsu 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.
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.
ResponderEliminarFinalmente 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.
hola, como cambio los tiempos de encendido, ocea como hacer el secuencial de leds vaya mas rapido, ¿que tengo que modificar en el codigo?,
ResponderEliminarnecesito construir un circuito de 21 leds alineados en lìnea recta a una distancia de 20cm y encender c/u cada 1seg.
ResponderEliminarden una idea para un proyecto sencillo pero interesante es para salvar una unidad
ResponderEliminarHola 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 ??
ResponderEliminarhola saben como hacer que se desplieguen las letras de nombres en display por pic 16f887A ??
ResponderEliminarOye disculpa mucho mi ignorancia pero a través de que puerto se controla (usb, serie o paralelo)?
ResponderEliminarel 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.
ResponderEliminarpor 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..........
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
ResponderEliminar, ok ahora necesito que su salida valla de 00 a 100, este se reflejaria en una lcd 16x2. dejo mi correo ventasenthernet@hotmail.com
Estan buenos los ejemplos pero quisiera saber si el cristal XTAL tiene que ir a fuerzas??
ResponderEliminaro puedo utilizar otro cristal de otra capacidad??
saludos.
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
ResponderEliminarBuena página
ResponderEliminarquien me podria facilitar un programa para encender y apagar un LED con rebote y temporizador? gracias!
ResponderEliminarEstimados
ResponderEliminarSi 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
hola estoy algo connfundida
ResponderEliminar__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
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.
ResponderEliminarBueno despues de muchos intentos estaba fallando al elegir el oscilado en el momento del grabado aqui el video q si funciona ^^
ResponderEliminarhttp://www.youtube.com/watch?v=qKoIfqeIK6I&feature=youtu.be
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.
ResponderEliminarVidal>justo lo que nesecitaba saber gacias Loko exitos
ResponderEliminaryo 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
ResponderEliminarnecesito realizar 4 secuencias diferentes alguien me puede ayudar
ResponderEliminarnecesito ayuda estan ahi
ResponderEliminarsoy nuevo programando y necesitorealizar un programa donde x medio de una rueda que gira x un optocoplador me indique la longitud de la circunferencia y que conforme vaya girando vaya sumando y que esta suma se vaya mostrando en un lcd de 16 pines
ResponderEliminarhola mi puedes ayudar aser un programa con sensor DHT11 en mplab
ResponderEliminarhola alguen me puede ayudar a hacer un secuencial de led de 25 canales con pic 16f877a con velocidad variable porfa urgente info : cesar2016ml@hotmail.com
ResponderEliminarHola, me encuentro realizando un proyecto de electrónica donde estoy utilizando un pic16f877a, necesito ayuda en la parte de programación, mi duda es si puedo utlizar 1 pic y 3 sensores de entrada.
ResponderEliminarnesecito un programa en ensamblador que resuelva el area de un triangulo
ResponderEliminaralguien me puede hayudar con un programa
ResponderEliminaralguien me puede hayudar con un programa
ResponderEliminarpodrian enviarme informacion de como programar en mplab x con simulacion en proteus porfavor,muchisimas gracias les quedo muy agradecido
ResponderEliminarhola podrian volver a subir los dos ejemplos en proteus porfavor ya que al intentar descargarlo sale que lo han borrado o lo han movido ... help me please!!!
ResponderEliminarHola una pregunta quisiera hacer lo mismo pero activar cada LED con una tecla de la computadora crees que me puedas ayudar con eso
ResponderEliminarUtiliza nuestro foro de electronica si tienes dudas no relacionadas con este tema.