0% encontró este documento útil (0 votos)
41 vistas20 páginas

Circuitos Electronicos

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
41 vistas20 páginas

Circuitos Electronicos

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

CIRCUITOS

ELECTRONICOS
 CONTACTO
 RSS
 TWITTER
 FORO
 TIENDA

8 de abril de 2009
Publicado por Oscar
en 11:54

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 eimplementaremos 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 <[Link]>

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 <[Link]>

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).

Etiquetas: Microcontroladores PIC

33 COMMENTS
Anónimo → 14 de septiembre de 2009 23:35
EXCELENTE ARTICULO

electronicomoderno → 23 de septiembre de 2009 15:05


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

Anónimo → 18 de octubre de 2009 08:19


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 "[Link]"
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@[Link]
[Link] → 7 de febrero de 2010 12:19
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 → 7 de febrero de 2010 17:02


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 → 1 de marzo de 2010 03:50


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 → 7 de marzo de 2010 22:02


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 → 19 de mayo de 2010 15:18


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@[Link]

Anónimo → 24 de mayo de 2010 10:01


XFAVOR COMO CONFIGURO EL PUERTO D COMO
SALIDAS YA L AGO DE VARIAS FORMAS Y UN BIT NO
SE ACTIVA
Anónimo → 24 de mayo de 2010 10:05
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@[Link]

Anónimo → 16 de junio de 2010 22:40


muy bueno aporte graciasss

Anónimo → 29 de septiembre de 2010 11:26


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

Oscar → 29 de septiembre de 2010 13:17


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).
[Link]
[Link]

Anónimo → 25 de marzo de 2011 09:24


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 → 13 de abril de 2011 07:59


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 → 20 de abril de 2011 00:31


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 → 26 de mayo de 2011 09:45


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 → 1 de junio de 2011 15:00


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

sergio → 16 de junio de 2011 09:08


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

Anónimo → 20 de julio de 2011 07:02


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 → 25 de septiembre de 2011 21:23


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

Anónimo → 21 de octubre de 2011 20:27


Oye disculpa mucho mi ignorancia pero a través de que
puerto se controla (usb, serie o paralelo)?
Jenniz → 2 de noviembre de 2011 22:34
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 → 15 de noviembre de 2011 08:27


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@[Link]

Anónimo → 24 de noviembre de 2011 17:46


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 → 14 de diciembre de 2011 19:53


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 → 26 de diciembre de 2011 15:30


Buena página

Anónimo → 10 de febrero de 2012 07:35


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

Anónimo → 13 de febrero de 2012 08:01


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@[Link]

sjaramillom@[Link] → 18 de marzo de 2012 16:40


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´¯`··._.· → 19 de marzo de 2012 17:28


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

`·.¸¸.·´´¯`Arknox´¯`··._.· → 25 de marzo de 2012 19:25


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

[Link]
v=qKoIfqeIK6I&feature=[Link]

fernando → 29 de marzo de 2012 20:24


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@[Link] 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.

PUBLICAR UN COMENTARIO EN LA
ENTRADA
Utiliza nuestro foro de electronica si tienes dudas no relacionadas con este tema.

← Entrada más recienteEntrada antigua →

SITIOS ASOCIADOS: Tecnoface electrónica :: Aplicaciones online :: Proyectos


electrónicos :: Cueva del Ingeniero Civil :: Comprar por internet :: Planos de
casas :: Felixls :: Otros sitios...

CONDICIONES DE USO

BUSCADOR.

¿Buscas algún tema?


Buscar

BUSCA POR ETIQUETAS.


Actividades y eventos (2) Componentes (6)Documentales (4) Editor (11) Electrónica
Analógica (10) Electrónica digital (5)Esquemas y Proyectos (8) Fuentes de
alimentación (3) Instrumentos (2) Manuales y
Tutoriales (18) Matemáticas (5)Microcontroladores
PIC (33)Notas (19) Otros (10) Programación C++(5) Revistas (7) Sistemas de

comunicación (1)Software (10)

Ó EN NUESTRO ÍNDICE.
Vea todos los artículos y notas del bloghaciendo clic aquí.

Copyright © 2011 CIRCUITOS ELECTRONICOS | Alojado en Blogger | Diseñado por 54BLOGGER

;LED del pin RB0 oscila entre ON/OFF


LIST p=16F877A
INCLUDE<[Link]>

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 REPITE
ACTIVAR ;Etiqueta ACTIVAR
bsf PORTB,0 ;RB0=1 (Enciendo el LED)
goto REPITE ;Salto hasta REPITE
END ;Fin de Programa.

CODIGO GENERADO PARA ENCENDER Y APAGAR UN LED CONECTADO AL PIN 0 DEL


DEL PUERTO B DEL PIC 16F877A

#include <16f877a.h>
#fuses xt,nowdt
#use delay(clock=4000000)

//Declaracion de variables globales


#define Led pin_b0//Nombra a pin_b0 como Led
#define Retardo delay_ms(500)//Nombra a delay_ms() como Retardo

//Programa principal
void main(){

//Configuracion de puertos E/S


SET_TRIS_B(0x00);//Configura el puerto B: 0=Salida; 1=Entrada
output_b(0x00); //Limpia el registro del puerto

//Estructura Programa principal


inicio://Etiqueta de retorno
output_high(led);//Pone en alto a led
retardo;//Demora
output_low(led);//Pone en bajo a led
retardo;//Demora
goto inicio;//Regresa a la etiqueta inicio
}

También podría gustarte