# LED parpadeante con PIC



## jams2006 (Ene 3, 2008)

Buenas, soy nuevo en este foro y tambien nuevo en lo que respecta a electronica .
Compre un PIC16F877A hace rato, ya tengo el programador tambien y no creo que batalle mucho en aprender a programarlo, he estado buscando un buen proyecto para comenzar y parece que el "Hola Mundo" del PIC es hacer parpadear un LED. Pero los diagramas que encuentro en internet son para otro tipo de PIC (principalmente el 16f84 o algo asi). Esperaba que me pudieran ayudar para armar el mismo circuito en el f877a, hay muchas diferencias? 

Gracias y saludos.

1) Tema del proyecto: Led que parpadea.

2) Descripción del proyecto: N/A

3) Que busca demostrar el proyecto: Iniciarme con los PIC.

4) Nivel de conocimientos de electrónica que posee: Muy Básico, nunca realicé ningún circuito.

5) Lenguaje de programación que maneja: C/C++, Assembler basico, Java, PHP.

6) Nivel académico: Secundaria.


----------



## canales (Ene 3, 2008)

Hola amigo jams...

Pues lo que quieres hacer con el micro es algo bastante fácil. Veo que sabes algo de assembler, pues no va a ser tan dificil para tí hacer lo que quieres. Las instrucciones esenciales que necesitas para encender y apgar el led son bsf y bcf, respectivamente. Entra a la página web de Microchip y allí encontrarás el data sheet de ese pic. Cabe señalar que después de cada una de estas dos instrucciones necesitas hacer un retardo para que el led quede un momento encendido y otro momento apagado. Te sugiero que manejes el led a través del puertoB. 

Con lo referente a las conexiones del led. Coloca una resistencia entre 220 y 560 ohmios en la salida del micro, la otra patita de la resistencia únela con la patita mas larga del led, mientras que la patita mas corta del led conectala a tierra.

Saludos.... [/b]


----------



## jams2006 (Ene 3, 2008)

Gracias, ya compre resistencias y el LED. Tambien compre un cristal de 4 porque se que lo necesitare, tengo una protoboard para montar todo. Cuanto voltaje necesito para encender el circuito? Esta bien con baterias? 
Saludos.


----------



## El nombre (Ene 3, 2008)

A buen entendedor con pocas palabras basta!

Consigue un simulador de pics (Como pueda ser Isis de Preoteus) y montas y pruebas tu circuito sin hacer falta programador y demás cosas. 

Saludos


----------



## jams2006 (Ene 4, 2008)

ops:  Baje el programa pero no tengo ni idea de como usarlo disculpen la ignorancia apenas empiezo con esto, todavia no puedo ser un buen entendedor  jejej Como es que alimento con una bateria el pic? donde conecto tierra y donde la masa? (en que pines) como es que se llegan a conectar el cristal y el pic?


----------



## anthony123 (Ene 10, 2008)

Bueno yo soy totalmente nuevo en esto de los codigos y quiero una opinion de este:
Led parpadeante
16F84A


```
STATUS    equ   0x3
PORTA     equ   0x5

TRISA     equ   0x5

PORTB     equ   0x6

TRISB     equ   0x6

ORG    0
BSF      STATUS,RP0

MOVLW    B'00000'

MOVWF   TRISA

MOVLW    B'00000000'

MOVWF  TRISB

BCF   STATUS,RP0

INICIO
    
    BSF    PORTB,0
  
    CALL        RETARDO ; Llama a RETARDO

GOTO    INICIO

RETARDO

        CALL  RETARDO1

        DECFSZ  CONTADOR,1

        GOTO  RETARDO

        MOVLW 80

        MOVWF CONTADOR

        RETURN

RETARDO1

        DECFSZ  CONTADOR1,1

        GOTO  RETARDO1

        MOVLW   80

        MOVWF   CONTADOR1

        RETURN

        EN
```


----------



## El nombre (Ene 11, 2008)

antony ¿En que linea esactamente apagas el Led?

Como disfruto.

No lo malinterpretes, es constructiva.


----------



## jcarlosr (Ene 12, 2008)

pues la verdad tampoco conosco mucho de pics pero me interesa mucho lo de la programacion como podria iniciar?


----------



## luis_e (Ene 12, 2008)

Hola, anthony123 a tu programa le falta la parte en donde apaga el led, antes de agregar la instruccion goto INICIO agrega esto:

    BCF    PORTB,0 

    CALL        RETARDO ; Llama a RETARDO 

Por lo que veo a tu rutina de retardo le tendrias que cargar el valor en los contadores al incio del programa, despues de configurar el puerto B y cambiar de banco agrega lo siguiente: 


        MOVLW   80 

        MOVWF   CONTADOR 

        MOVWF   CONTADOR1 

Tengo un programa que es para calcular retardos, es muy facil de usar y nos da todo el codigo en ensamblador para agregar al programa, lo unico que hay que hacer es indicar la frecuencia a la que corre el micro, indicar el tiempo del retardo y luego copiar y pegar, tambien hay que definir una o mas variables que necesita la rutina de retardo.

Este programa de anthony123 se puede usar en casi cualquier micro que tengo el puerto B.

jams2006 te recomiendo que empieces con un pic16f84 porque es uno de los micros mas faciles de usar y ademas podes encontrar toneladas de ejemplos en internet, libros, revistas, etc

Cualquier cosa avisen y les hago un programa para que parpadee un led o cualquier cosa.

Saludos y espero que les sirva el programa


----------



## anthony123 (Ene 13, 2008)

El nombre dijo:
			
		

> antony ¿En que linea esactamente apagas el Led?
> 
> Como disfruto.
> 
> No lo malinterpretes, es constructiva.



Amigo no se q trataste de decir! Pero buehh aqui estoy en la lucha! Este proyecto me lo propuse desde hace mucho y quiero aprender a manejar los "fucking, assholes" codigos!

EDIT1: No cree el program! :S

EDIT2: Gracias  por los consejos pero no se como tomarlos :S!


----------



## El nombre (Ene 14, 2008)

Pues hombre:
Un buen comienzo es simular tu proyecto. Te darás cuenta que se enciende el led y no se apaga.


----------



## anthony123 (Ene 14, 2008)

Simular en fisico o en la compu? que pograma puede simular circuitos con pic's?


----------



## PICMIND (Ene 14, 2008)

Bueno lo del simulador es muy buena opcion y sobre todo el PROTEUS que es el que yo uso, a continuacion voy a poner el codigo para hacer parpadear un led, yo actualmente uso el lenguaje C, por tanto necesitarás un compilador como el CCS.

ahi tienes el código:

#include <16f877a.h>                 //Incluye el archivo de cabecera para el PIC 
#use delay (clock=4000000)   //Define la velocidad del Oscilador
#bit Led=5.0             //Define la patita RA0 como LED


main()                        //Empieza el programa principal

{
set_tris_a(0x00);      //Configura PORTA como salidas
set_tris_b(0x00);      //Configura PORTB como salidas
output_a(0x00);        //Todas las salidas de PORTA a 0
output_b(0x00);        //Todas las salidas de PORTB a 0


while(1)                     //Entra en un ciclo infinito

{
Led=1;                      //Enciende el LED
delay_ms(1000);     //Espera 1 segundo
Led=0;                      //Apaga el LED
delay_ms(1000);     //Espera 1 segundo
}
}

si te interesan algunos otros proyectitos sencillitos, (como para comenzar) puedes visitar mi página web: www.picmind.es.tl

suerte y ánimo con tu proyecto.


----------



## anthony123 (Ene 14, 2008)

Porque no hay un buen tutorial que explique todo: Como hacer el codigo, como compilar el hex, como emplear los programas, etc...
Todos siempren culminan asi

"Finalmente nos *toca copilar* e insertar el codigo en el pic"


----------



## El nombre (Ene 15, 2008)

no es asi. 

Hay muy buenos tutoriales. Cada uno tiene el mejor. Cada uno aprende de una forma.


----------



## anthony123 (Ene 15, 2008)

Podrias darme un ejemplo amigo?


----------



## snakewather (Ene 15, 2008)

hola amigos espero esta información les sirva si manejan el pic 16f877 para este tipo de programa esta bien solo que se me hace demaciada capaciad de memoria para la funcion que va hacer el programa asi que pueden usar un 16f84.

como ustedes quieran le recomiendo que empiezen por realizar un diagrama de flujo del funcionamiento del programa creanme cuando uno empieza con pics ayuda mucho.

hasta pronto......


----------



## PICMIND (Ene 15, 2008)

lo de compilar es de lo mas sencillo lo unico que tienes que hacer es copiar el codigo en el MPLAB crear un proyecto donde incluyas el archivo y listo le das F10 o le dices en el botoncito de compilar y YA!

No tiene misterio.

SUERTE


----------



## anthony123 (Ene 15, 2008)

No tiene misterio para ti! pero para mi si!


----------



## snakewather (Ene 29, 2008)

hola anthony123 aqui esta el codigo del programa para hacer parpadear un led con un 16f84
te lo explico paso a paso y lo puedes simular com MPLAB Software  aqui te dejo el link para que lo bajes es este solo paciencia por que si se tarda un buen(MPLAB IDE v8.01 Interim Release Zipped Installation 
 Release Notes for MPLAB IDE v8.01)

http://www.microchip.com/stellent/i...E&nodeId=1406&dDocName=en019469&part=SW007002

te anexo el archivo para poderlo simular .ASM y como te dije el diagrama para su realizacion.

ojala te sirva.


----------



## anthony123 (Ene 29, 2008)

Hola amigo gracias por la ayuda! con respecto a lo del MPLAB, ya tengo el v7.6! Cuando tenga un rato libre me pongo a jugar con los codigos a ver si me sale algo 

PD: Que lenguaje es?


----------



## snakewather (Feb 11, 2008)

es enzamblador en los documentos que postee ahi vienen las instrucciones del 16f84 y 628
checalas con un buen tutorial tienes para aprender


----------



## anthony123 (Feb 11, 2008)

En que post?


----------



## hisaac (Jul 17, 2009)

luis_e dijo:
			
		

> Hola, anthony123 a tu programa le falta la parte en donde apaga el led, antes de agregar la instruccion goto INICIO agrega esto:
> 
> BCF    PORTB,0
> 
> ...





Hyo quiero hacer un retardo para un segundo y cheque tu programa pero no etiendo algunnas cosas espero me aclares....

que debo de poner en el campo de retardo y en el de periodo en cual de los 2 deberia ir 1 seg y en cilos delay que iria y ya obtenido el codigo lo pieso usar asi:

inicio
bsf portb,0
call demora
bcf portb,0
goto inicio
end

si asi estaria bien o falraia algo...


----------



## m9197 (Feb 26, 2015)

tambien soy nuevo en esto de los pics, he comprado un pic16f877a, viendo unos videos en youtube, vi un codigo sencillo, que solo enciendo y apaga un led, en el video el codigo corre sin problemas, pero a mi no me compila, es bastante corto el codigo, pero no encuentro el error, dejo una captura haber si me pueden ayudar. 



el codigo esta escrito en ccs c o PCW algo asi se llama el programa.


----------



## jonathanriv (Feb 26, 2015)

m9197 te falta el Main



Void main ()
{
definir pin como salida
tu codigo

}

Espero te sirva 

Saludos


----------



## m9197 (Feb 26, 2015)

y como lo defino? se me ocurre asi, pin_b0=1, estoy en lo correcto?

el codigo quedaria asi?

Void main ()
{
pin_b0=1;
WHILE(TRUE){

output_high(pin_b0); // PIN_B0=1
delay_ms(500);
output_low(pin_b0); // PIN_B0=1
delay_ms(200);
               }
}


----------



## D@rkbytes (Feb 27, 2015)

Cuando se usan las instrucciones *output_low(pin);* y *output_high(pin);* ya no es necesario configurar el pin a usar como salida.
Éstas instrucciones convierten automáticamente como salida al pin cuando se invocan.
*input(pin);* hace lo contrario. Convierte al pin seleccionado como entrada.

Lo que le hace falta a ese programa, son los datos de cabecera.
O sea, la librería del PIC que se va a usar y los fuses o palabra de configuración. (Programa básico)

Algo así como ésto:

```
#include <16f877a.h>                // Seleccionar la librería del PIC
// Con la siguiente configuración el compilador usará los fuses requeridos.
#use     delay(crystal = 4MHz)

void main (void)              // Programa principal.
{
   while (true)               // Bucle del programa.
   {
      output_high(pin_b0);    // RB0 = 1
      delay_ms(500);          // Retardo de 500 ms.
      output_low(pin_b0);     // RB0 = 0
      delay_ms(200);          // Retardo de 200 ms.
   }                          // Fin del bucle.
}                             // Fin del programa.
```
También se puede hacer con *output_toggle(pin); *y a continuación un retardo, pero así ya no se obtendrá un periodo para el encendido y otro para el apagado.

Y si definimos y establecemos un pin de salida que llamaremos "*led*", sería de esta forma:

```
#include <16f877a.h>                // Seleccionar la librería del PIC
// Con la siguiente configuración el compilador usará los fuses requeridos.
#use     delay(crystal = 4MHz)

#byte    portb = getenv("SFR:PORTB")   // Se define el puerto B
#bit     led = portb.0                 // Se define el bit 0 del puerto B
   
void main (void)              // Programa principal.
{
   set_tris_b(0b11111110);    // RB0 como salida
   
   while (true)               // Bucle del programa.
   {
      led = 1;                // RB0 = 1
      delay_ms(500);          // Retardo de 500 ms.
      led = 0;                // RB0 = 0
      delay_ms(200);          // Retardo de 200 ms.
   }                          // Fin del bucle.
}                             // Fin del programa.
```
Ambos programas harán lo mismo, pero están realizados de forma diferente.


----------



## Dr34Dl0rD (Mar 3, 2015)

Que tal amigos, me he percatado que justamente estan en situacion similar a la mia, sin embargo yo ya despegue de muchas dudas e incertidumbres de modo de que compartiré mi experiencia. Todo lo que hay que hacer, es leer. Aqui tengo un libro que consegui por casualidad pero que me ayudó a empezar de lleno en esto de los microcontroladores. Aun asi yo no me meteria mucho con lenguaje ensamblador salvo que sea estrictamente necesario. En su lugar me dediquè a aprender C o Basic.

Uno es Microcontroladores pic en Basic - Carlos Reyes, y el otro es  "Diseño y simulación de sistemas microcontrolados en lenguaje C" - Juan Ricardo Clavijo Mendoza

Busquenlos ya que ni se me permite subir links ni subir los libros por regla del foro. Saludos


----------



## m9197 (Mar 4, 2015)

el problema solo era un corchete, es que el codigo de cabecera se agrega automaticamente, no lo verificaba porque suponia que el error no deberia estar ahi, sin embargo al verificarlo resulta que en esa parte se abria un corchete que yo deberia cerrar y no lo estaba haciendo, ese era el error. hasta pena me da reconocer este error, pero me imagino que todos debieron pasar por esto.

el problema que no he podido solucionar ahora es en el protoboard, el led no parpadea a la velocidad que yo indico, yo indico 100 ms y parpadea a 500 ms y a veces hasta 1 min. solo corre mas rapido si toco con mi dedo el cristal de cuarzo. yan intente poner capacitores de 25 pF en las patas del cuarzo a tierra pero el problema persiste.

alguna solucion?
 debo aclarar que en la simulacion en proteus si parpadea a 100 ms. pero en el protoboard no.


----------



## D@rkbytes (Mar 4, 2015)

Entonces supongo que estás utilizando el wizard para generar tu proyecto.
Pega la palabra de configuración que te está generando el wizard para verla.


----------



## m9197 (Mar 4, 2015)

estoy utlizando el ccs c compiler y proteus 8 profesional para simular. a que te refieres con wizard?


----------



## D@rkbytes (Mar 4, 2015)

Pues a la aplicación que tiene el PICC Compiler de CCS para crear un proyecto. 
De otra forma, no sé como obtengas la palabra de configuración. 

Tal vez tengas una versión diferente y no sea la misma ventana, pero ese de la imagen es el Project Wizard.


----------



## m9197 (Mar 4, 2015)

yo lo configure asi. y el cristal de cuarzo es de 4 Mhz


----------



## D@rkbytes (Mar 4, 2015)

Sí, claro, pero el Project Wizard o PIC Wizard por tu versión, genera un archivo **.h *con las configuraciones.
El contenido de ese archivo es lo que debes pegar o adjuntarlo en un archivo comprimido.
Esto es con el motivo de verlo para saber si es correcta la configuración que está generando.


----------



## m9197 (Mar 7, 2015)

no tengo ningun archivo .h ó te refieres al .hex?


----------



## D@rkbytes (Mar 7, 2015)

Si no tienes ningún archivo *.h, entonces en algún lado debe estar la palabra de configuración.
Eso es lo que se requiere saber para determinar la configuración de registros SFR del PIC.
Es algo como esto:
#include <librería del microcontrolador>
*#fuses Los fuses para el PIC*
#use delay(Frecuencia del oscilador)


----------



## m9197 (Mar 7, 2015)

pues yo solo selecciono el pic a usar y el programa me agrega el codigo de cabecera automaticamente, mi codigo empieza despues de TODO:USER CODE. quedando asi:



```
#include "C:\Users\juan\SkyDrive\Documentos\parpadeo_led.h"


void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   // TODO: USER CODE!!
  

WHILE(TRUE){
output_high(pin_b0); // PIN_B0=1
delay_ms(25);

output_high(pin_b1); // PIN_B0=2
delay_ms(25);
output_low(pin_b0); // PIN_B0=1
delay_ms(25);
output_high(pin_b2); // PIN_B0=3
delay_ms(25);
output_low(pin_b1); // PIN_B0=1
delay_ms(25);
output_high(pin_b3); // PIN_B0=1
delay_ms(25);
output_low(pin_b2); // PIN_B0=1
delay_ms(25);
output_high(pin_b4); // PIN_B0=1
delay_ms(25);
output_low(pin_b3); // PIN_B0=1
delay_ms(25);
output_high(pin_b5); // PIN_B0=1
delay_ms(25);
output_low(pin_b4); // PIN_B0=1
delay_ms(25);
output_high(pin_b6); // PIN_B0=1
delay_ms(25);
output_low(pin_b5); // PIN_B0=1
delay_ms(25);
output_high(pin_b7); // PIN_B0=1
delay_ms(10);
output_low(pin_b6); // PIN_B0=1
delay_ms(10);
output_high(pin_b6); // PIN_B0=1
delay_ms(10);
output_low(pin_b7); // PIN_B0=1
delay_ms(10);
output_high(pin_b5); // PIN_B0=1
delay_ms(10);
output_low(pin_b6); // PIN_B0=1
delay_ms(10);
output_high(pin_b4); // PIN_B0=1
delay_ms(10);
output_low(pin_b5); // PIN_B0=1
delay_ms(10);
output_high(pin_b3); // PIN_B0=1
delay_ms(10);
output_low(pin_b4); // PIN_B0=1
delay_ms(10);
output_high(pin_b2); // PIN_B0=3
delay_ms(10);
output_low(pin_b3); // PIN_B0=1
delay_ms(10);
output_high(pin_b1); // PIN_B0=2
delay_ms(10);
output_low(pin_b2); // PIN_B0=1
delay_ms(10);
output_high(pin_b0); // PIN_B0=1
delay_ms(10);
output_low(pin_b1); // PIN_B0=1
delay_ms(10);

}

}
```


----------



## D@rkbytes (Mar 7, 2015)

¿Lo ves? Ahí está el archivo *.h
*#include* "C:\Users\juan\SkyDrive\Documentos\*parpadeo_led.h*"

Pero mira. No es necesaria toda esa configuración, con tan solo escribir éstas líneas debe funcionar.

```
[COLOR=Red]#include[/COLOR] <[COLOR=SeaGreen]16[/COLOR]f877a.h>             // Librería del microcontrolador
[COLOR=Red]#use[/COLOR]     delay(crystal = 4MHz)   // Frecuencia del oscilador (Incluye palabra de configuración)


[COLOR=Blue]void[/COLOR] main ([COLOR=Blue]void[/COLOR])                 // Programa principal.
{
   output_high(pin_b7);          // RB7 = 1
   delay_ms([COLOR=SeaGreen]500[/COLOR]);                // Retardo de 500 ms.
   
   [COLOR=Blue]while[/COLOR] (true)                  // Bucle infinito.
   {
      output_toggle(pin_b7);     // Cambiar de estado RB7 (Toggle)
      delay_ms([COLOR=SeaGreen]500[/COLOR]);             // Retardo de 500 ms.
   }                             // Fin del bucle.
}
```
Así de sencillo.
De la forma en como se está usando #*use* *delay()* en este programa y para el PIC16F877A, el compilador usa los fuses requeridos para usar un cristal de 4MHz. (XT_OSC o XT en PICC)

El esquema que debes seguir, es éste: 
No debes tener problemas con este programa porque es básico y muy sencillo.
Lo único que debes hacer, es abrir el PICC Compiler y copiar el código, lo compilas y listo.​


----------



## m9197 (Mar 7, 2015)

muchas gracias, era eso. ya funciona!


----------



## D@rkbytes (Mar 7, 2015)

m9197 dijo:


> Muchas gracias. Era eso. Ya funciona!


Me parece bien. Sé que al ser nuevo en C o en PICC Compiler, tengas que usar el Wizard.
Pero no te lo recomiendo. Es mejor que seas tú quien defina las configuraciones.

Mucha información la puedes encontrar en la misma ayuda del programa con tan solo presionar la tecla F1.

Y por cierto. Al parecer estás realizando una secuencia de desplazamiento de bits.
Lo puedes hacer de una forma más sencilla si lo haces con bucles.
Por ejemplo, de ésta forma:

```
#include <16f877a.h>             // Librería del microcontrolador
#use     delay(crystal = 4MHz)   // Frecuencia del oscilador (Incluye palabra de configuración)
#byte    portb = getenv("SFR:PORTB")   // Definir el puerto B


void main (void)                 // Programa principal.
{
   int8 i;                       // Variables de 8 bits.
   int16 retardo = 127;          // Variable de 16 bits. (Valor inicial = 127)
   
   setup_adc_ports(AN0);         // Configurar el ADC para el canal 0
   setup_adc(ADC_CLOCK_INTERNAL);   // El ADC usará el reloj interno RC
   set_adc_channel(0);           // Establecer el canal 0
   delay_us(50);                 // Dar un tiempo al conversor.
   
   set_tris_b(0x00);             // Todo el puerto B como salidas.
   portb = 1;                    // RB1 = 1
   delay_ms(retardo);            // Retardo inicial de 127 ms. (Mitad de 255)
   
   while (true)                  // Bucle infinito.
   {
      retardo = read_adc();
      if(retardo <30) retardo = 30; // No permitir que "retardo" sea menor a 30
      
      for(i=1;i<=7;i++)          // Bucle de 1 a 7 pasos.
      {
         portb <<=1;             // Desplazar hacia la izquierda el bit activo del puerto B.
         delay_ms(retardo);      // Retardo de x ms.
      }
      
      for(i=1;i<=7;i++)          // Bucle de 1 a 7 pasos.
      {
         portb >>=1;             // Desplazar hacia la derecha el bit activo del puerto B.
         delay_ms(retardo);      // Retardo de x ms.
      }
   }                             // Fin del bucle.
}                                // Fin del programa.
```
Este programa realiza una secuencia de bits en el puerto B y la velocidad es controlada con un potenciómetro de 10 KΩ en el pin RA0.
Si se desea, se pueden eliminar las instrucciones para el ADC y establecer un retardo fijo.

Suerte.


----------



## m9197 (Mar 8, 2015)

Lo probare, gracias.


----------

