prueba básica PIC blinkear un led

Hola Amigos:
Estoy intentando hacer mis primeros pinitos con los microcontroladores, de momento mi intención es activar y desactivar un puerto del PIC.

Lo intento con el PIC C Compiler (Modo Wizard).

Código:
#include "C:\Users\PIC's\Programas\SV v1.h"

//salidas
#define E1 PIN_A2 
#define E2 PIN_A3 
#define E3 PIN_A4
#define E4 PIN_A5
#define E5 PIN_B0
#define E6 PIN_B1
#define E7 PIN_B2
#define E8 PIN_B3
#define E9 PIN_A1 
#define E10 PIN_A0 
#define E11 PIN_A7
#define E12 PIN_A6
#define E13 PIN_B7
#define E14 PIN_B6
#define E15 PIN_B5
#define E16 PIN_B4

//estados
#define on output_high
#define off output_low

void main()
{

   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);
   setup_oscillator(False);

   // TODO: USER CODE!!
   
   WHILE(1){
   on(E1);
   delay_ms(500);
   off(E1);                   
   delay_ms(500);    
   
   }
}

y aquí os dejo también el SV v1.h:
Código:
#include <16F628A.h>

#FUSES NOWDT                 	//No Watch Dog Timer
#FUSES INTRC                 	//Internal RC Osc
#FUSES PUT                   	//Power Up Timer
#FUSES NOPROTECT           	//Code not protected from reading
#FUSES BROWNOUT             	//Reset when brownout detected
#FUSES MCLR                  	//Master Clear pin enabled
#FUSES LVP                   	//Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD                 	//No EE protection

#use delay(clock=4000000)

Y adjunto una foto de la prueba en una protoboard

a la Izquierda tengo 5V y a la derecha ground
No disponía de una resistencia de 4k7 para el MCLEAR así que lo he intentado ajustar lo mejor posible con lo que tenía, 1k + 1k + 2k2 = 4k2

Como podréis observar no dispongo de Xtal, utilizo el oscilador interno.

He probado el esquema en el proteus:


Le he introducido el programa y funciona correctamente, pero cual a sido mi sorpresa al desconectar el MCLEAR, que sigue funcionando del mismo modo... ¿No debería de resetearse, y dejar de funcionar?

Cuando lo pruebo en la protoboard, se enciende el LED pero no se apaga, se queda permanentemente encendido.

Alguien tiene idea que hago mal?
 
Fusible? Yo pensaba que el mclr si no lo alimentabas se reseteaba el
pic por estar negado. Pero de todas formas, el pic
funciona pero no blinkea, se queda encendido. Por cierto no programo en el circuito para evitar posibles fallos, programo aparte.
 
Podes subir la imagen del esquema? porque ya no se ven las que subiste. El MCLR probá conectándolo directamente a 5V sin ninguna resistencia, comprobaste que el cristal sea de 4MHz? Colocaste los capacitores de 15pF en el cristal? Tal vez el PIC no este arrancando y tu led se encienda por el estado aleatorio que toman las entradas el darle tensión al PIC. Colocá esto en el comienzo de tu programa, justo despues del main():

output_a(0x00);

y fijate si aún enciende el LED.

PD: while(TRUE) genera mucho menos código que while(1) porque si colocas while(1) el compilador genera el código para comprobar si 1 es igual a 1 algo tonto pero lo hace.

Saludos
 
Hola muy buenas, lo primero decirte, que no utilizo cristal, intento ponerlo en funcionamiento con el oscilador interno.

Pensaba que no se podría poner directamente a 5v MCLEAR, si se puede ¿Por que se pone a traves de una resistencia?

Cambiaré el while, no tenía ni idea, muchas gracias.

¿No te deja ver la fotos?, yo estoy en la universidad y si que me deja, cuando llegue a casa, si no te van, las volveré a subir.
 
La conexión del MCLR a través de un resistencia se hace para poder colocar un pulsador por ejemplo que ponga un estado lógico 0 para resetear al PIC y no provocar un cortocircuito, si tu intención no es resetearlo sino que siempre se mantenga en funcionamiento lo colocas a positivo sin ninguna resistencia.
Para configurar el oscilador interno tenes que hacer esto:

#use delay (type=internal)

Y luego en tu programa escribir:

setup_oscillator(OSC_8MHZ); //este es un ejemplo

Todas las configuraciones posible para el setup_oscillator las encontras en el #include <16F628A.h> que agregas a tu programa ahi estan todas las confguraciones posibles, de otro modo tu PIC como está ahora no está funcionando.

Saludos
 
Vaya!, pues se supone que la había configurado con el wizard del PIC C COMPILER.
Pensaba que era la línea:
#FUSES INTRC //Internal RC Osc

He visto que el oscilador interno del 16F628A es de 4MHz

Nada... le he introducido lo dicho y nada, se queda encendido el led y nada más...

edit:
Me daba la impresión que el led no estaba funcionando como debería, así que he desempolvado el osciloscopio y he obtenido lo siguiente:

Lo colores no son lo más acertado así que traduzco por si no se observa en condiciones:
Amplitud de 4.71v periodo 20mS, y el ciclo de trabajo es sobre la mitad.
Permanece en on 10mS y abajo otros tantos.

a todo esto meto el programa en el chip en proteus, y blinkea cada 3 segundos :LOL:

¿Que estará ocurriendo?
Por cierto Dragondgold, muchas gracias por tu interés.
 
Me podrías decir que es lo básico que debería poner en un programa.
quiero decir, de todo lo de:
Código:
#FUSES NOWDT                 	//No Watch Dog Timer
#FUSES INTRC                 	//Internal RC Osc
#FUSES PUT                   	//Power Up Timer
#FUSES NOPROTECT           	//Code not protected from reading
#FUSES BROWNOUT             	//Reset when brownout detected
#FUSES MCLR                  	//Master Clear pin enabled
#FUSES LVP                   	//Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD                 	//No EE protection
   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);
   setup_oscillator(False);

que no tengo ni idea para que sirve, que es lo mínimo que debería de poner para hacerlo funcionar?
 
A eso PIC lo configuro así:

#FUSES XT, NOWDT, NOPROTECT, NOBROWNOUT

El XT sigifica que uso un cristal de hasta 4MHz, te recomendaría que intentes primero colocando un oscilador externo antes de probar con el interno así te aseguras primero de que este bien el código y los FUSES, una vez que sepamos que eso funciona probas con el oscilador interno.

Saludos
 
Bueno pues entonces tardaré en probarlo, la razón por la que probaba con el oscilador interno, es por que no disponía de ningún cristal, en cuanto pueda conseguir uno, lo pruebo.

una pregunta, con lo que tu configuras el xt no te hace falta poner luego:
#use delay(clock=4000000) ?

Un saludo
 
El #use delay(clock=4000000) se usa para decirle al compilador la velocidad del cristal para que configura los baudios del RS232, calcule los delay y esas cosas asi si es necesario. Tambien podes poner así:

#use delay(clock=4M)

Saludos
 
No, si te vas a la pestaña View del compilador verás que hay un ícono que dice Valid Fuses, ahí te mostrará los FUSES que puedes colocar para cada micro una descripción de cada uno.
Los PIC16 tienen 4 tipos de oscilador, LP = si usas un oscilador menor a 300KHz, XT = si usas un cristal menor o igual a 4MHz, HS = si usas un cristal mayor a 4MHz y RC = si usas una red RC para hacer el oscilador.
El use #delay(clock=4M) es para indicarle al compilador la velocidad exacta del cristal.

Saludos
 
Buenas Dragondgold, ya he comprado los cristales y he conseguido que me funcione, muchas gracias, el único problema es que el RA4 no se encienda, ni físicamente ni en el Proteus... Se tiene que agregar alguna configuración especial?

Adjunto el programa:
Código:
¨#include <16F628A.h>

#FUSES XT, NOWDT, NOPROTECT, NOBROWNOUT, NOPUT
#use delay(clock=4M)

//salidas
#define E1 PIN_A2 
#define E2 PIN_A3 
#define E3 PIN_A4
#define E4 PIN_B0
#define E5 PIN_B1
#define E6 PIN_B2
#define E7 PIN_B3
#define E8 PIN_A1 
#define E9 PIN_A0 
#define E10 PIN_B7
#define E11 PIN_B6
#define E12 PIN_B5

//estados
#define on output_high
#define off output_low

//tiempos
int time = 50;

void main()
{
   // TODO: USER CODE!!
   
   WHILE(true){
   on(E1);
   delay_ms(time);
   off(E1);
   delay_ms(time);
   
   on(E2);
   delay_ms(time);
   off(E2);
   delay_ms(time);
   
   on(E3);
   delay_ms(time);
   off(E3);
   delay_ms(time);
   
   on(E4);
   delay_ms(time);
   off(E4);
   delay_ms(time);
   
   on(E5);
   delay_ms(time);
   off(E5);
   delay_ms(time);
   
   on(E6);
   delay_ms(time);
   off(E6);
   delay_ms(time);
   
   on(E7);
   delay_ms(time);
   off(E7);
   delay_ms(time);
   
   on(E8);
   delay_ms(time);
   off(E8);
   delay_ms(time);
   
   on(E9);
   delay_ms(time);
   off(E9);
   delay_ms(time);
   
   on(E10);
   delay_ms(time);
   off(E10);
   delay_ms(time);
   
   on(E11);
   delay_ms(time);
   off(E11);
   delay_ms(time);
   
   on(E12);
   delay_ms(time);
   off(E12);
   delay_ms(time);  
   }
}
Se que el programa es una mierda, y que simplemente con un "for" podría haberlo reducido muy considerablemente, pero no me preocupa la programación e intentado simplificarlo al máximo.

16f628-48.gif


Una pregunta, el PIC aguantará el entregar por cada uno de sus pines 30mA?
 
Última edición:
Perdon sento87 no me llego la notificación de que respondieron al post. Que bien que te funcionó entonces el problema esta en la configuración del oscilador interno habría que investigar un poco. RA4 no funciona directamente porque es de colector abierto, para que funcione como un pin común debes colocarle una R a 5V por ejemplo de 4K7. Los pines no te van a tirar 30mA cada uno menos todos en el mismo puerto vas a tener que usar transistores.

Saludos!!
 
Atrás
Arriba