LED parpadeante con PIC

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?
 
es enzamblador en los documentos que postee ahi vienen las instrucciones del 16f84 y 628
checalas con un buen tutorial tienes para aprender
 
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

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



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

Captura_de_error.PNG

el codigo esta escrito en ccs c o PCW algo asi se llama el programa.
 
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);
}
}
 
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:
PHP:
#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:
PHP:
#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.
 
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
 
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.
 
Última edición:
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.
 
Pues a la aplicación que tiene el PICC Compiler de CCS para crear un proyecto. Project Wizard.jpg
De otra forma, no sé como obtengas la palabra de configuración. :confused:

Tal vez tengas una versión diferente y no sea la misma ventana, pero ese de la imagen es el Project Wizard.
 
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.
 
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)
 
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:


Código:
#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);

}

}
 
¿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.
Código:
[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)
Fuses XT PICC Compiler.jpg
El esquema que debes seguir, es éste: Esquema LED 16F877A.jpg
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.
 
Atrás
Arriba