TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: cmontoya en 22 de Diciembre de 2013, 01:39:03

Título: No sé cómo resolver problema con el pic16f628A
Publicado por: cmontoya en 22 de Diciembre de 2013, 01:39:03
Hola Amigos
Tengo unos problemas con 2 proyectos que tengo hechos con un Pic 16f628A  el primero está funcionando con un cristal de 8MHz pero cuando lo pongo a funcionar a veces funciona y otras no me toco prenderlo apagarlo varias veces para que vuelva a funcionar o resetearlo.
Con el otro proyecto tengo casi el mismo problema, primero hice una rutina  que se activa  con un swits, primero lo probé en la protoboard y funciono bien, después diseñe  la PCB  y no funciona me toca oprimir reset y oprimir el swits varias veces para que coja la rutina, este pic está configurado con el oscilador interno (4MHz), solo tiene rutinas sencillas (if, else), el swits lo probé con otros pines para descartar posibles daño del pin pero siguió teniendo esta misma falla, para ambos proyectos tiene su propia fuente y su respectivo regulador.
La verdad no sé por qué pasa eso  Alguna solución??
Título: Re: No sé cómo resolver problema con el pic16f628A
Publicado por: Nocturno en 22 de Diciembre de 2013, 03:42:29
Tiene pinta de que el MCLR o los pines del cristal no hacen buen contacto.
Título: Re: No sé cómo resolver problema con el pic16f628A
Publicado por: ppyote en 22 de Diciembre de 2013, 07:29:48
tienes bien habilitado/deshabilitado el wdt? has habilitado el fuse PUT? condensadores de 100nf para interferencias de la alimentacion? NOBROWNOUT habilitado para evitar resets por caidas de tension? o de lo contrario tienes el reset por caida de tension habilitado?

lo mejor es que pusieras mas informacion asi como imagenes del circioto para descartar posibles problemas....
Título: Re: No sé cómo resolver problema con el pic16f628A
Publicado por: cmontoya en 23 de Diciembre de 2013, 01:51:01
tienes bien habilitado/deshabilitado el wdt? has habilitado el fuse PUT? condensadores de 100nf para interferencias de la alimentacion? NOBROWNOUT habilitado para evitar resets por caidas de tension? o de lo contrario tienes el reset por caida de tension habilitado?

lo mejor es que pusieras mas informacion asi como imagenes del circioto para descartar posibles problemas....
Hola
Pues en el codigo si los tengo como dices

Código: [Seleccionar]
    #include <16f628A.h>
    #fuses HS,NOWDT,NOLVP,PUT,NOBROWNOUT,MCLR
    #use delay(clock=8000000)
    #use fast_io(a)
    #use fast_io(b)
    #include <fonts.h>
    #include <string.h>
     
    #define clock PIN_A1
    #define strobe PIN_A2
    #define dato PIN_A0
    #define size_matriz_col 8 
    #define COLUMNAS 8     
    #define matriz_num COLUMNAS/size_matriz_col 
     
 

Anexo tambien la fuente con la cual esta diseñado
Título: Re: No sé cómo resolver problema con el pic16f628A
Publicado por: stk500 en 23 de Diciembre de 2013, 03:19:30
un 1uF para la salida ,es muy poco, deberia como minimo 10uF o 47uf aparte poner condensadores de desaclopo de 100n tantos en la entrada como en la salida de la alimentacion y tambien podria en la entrada del pic eso dependiendo como este hecho tu placa, revisa y lee bien todos los comentarios que te explicamos aqui y si no resuelve el problema deberia ser en otras cosas, pero deberia explicar con exactitud como lo tiene montados todos, asi podriamos descartar cosas.

Un Saludos
Título: Re: No sé cómo resolver problema con el pic16f628A
Publicado por: ppyote en 23 de Diciembre de 2013, 06:42:18
lo que también puedes probar es usar otra versión del compilador, no sería la primera vez que fuera culpa de el
Título: Re: No sé cómo resolver problema con el pic16f628A
Publicado por: cmontoya en 24 de Diciembre de 2013, 02:58:23
un 1uF para la salida ,es muy poco, deberia como minimo 10uF o 47uf aparte poner condensadores de desaclopo de 100n tantos en la entrada como en la salida de la alimentacion y tambien podria en la entrada del pic eso dependiendo como este hecho tu placa, revisa y lee bien todos los comentarios que te explicamos aqui y si no resuelve el problema deberia ser en otras cosas, pero deberia explicar con exactitud como lo tiene montados todos, asi podriamos descartar cosas.

Un Saludos

Hola

Segun tu opinion la fuente quedaria  como en el diagrama??

Saludos y Feliz Navidad
Título: Re: No sé cómo resolver problema con el pic16f628A
Publicado por: stk500 en 24 de Diciembre de 2013, 06:36:46
Exacto,pero aseguraste que el convertidor soporte el amperaje para todos lo que vaya a usar con el y que te esta dando 5 voltio a su salida,puede ser 4,90VCC, si te da mas es posible que la corriente de entrada es demasiado para el regulador, lo digo porque esos problemas que comenta me han sucedido a mi.
Saludos y Felices Fiestas
Título: Re: No sé cómo resolver problema con el pic16f628A
Publicado por: cmontoya en 25 de Diciembre de 2013, 22:07:02
Exacto,pero aseguraste que el convertidor soporte el amperaje para todos lo que vaya a usar con el y que te esta dando 5 voltio a su salida,puede ser 4,90VCC, si te da mas es posible que la corriente de entrada es demasiado para el regulador, lo digo porque esos problemas que comenta me han sucedido a mi.
Saludos y Felices Fiestas


Hola
Pues la verdad probé cambiando el condensador de 1uf a 47uf y anexarles los  otros condensadores pero lamentablemente sigue igual con el mismo problema  y midiendo con el multímetro me mide 5.01v  o 4.99vdc, puede con esto descartar La fuente  y pues los fuses y configuración está bien será que es un problema de los los pic???
Felices Pascuas
Título: Re: No sé cómo resolver problema con el pic16f628A
Publicado por: AngelGris en 25 de Diciembre de 2013, 22:47:15
  ¿Cómo está conectado el pin MCLR? ¿Colocaste los capacitores para el cristal? Sería bueno que subas un esquema.
Título: Re: No sé cómo resolver problema con el pic16f628A
Publicado por: stk500 en 26 de Diciembre de 2013, 03:57:22
Pues como te dice el amigo AngelGris, es mejor que suba el Esquema. estoy seguro que es un Fallo tuyo o mala Conexion.
o si no tiene el Esqema hecho, pon de algunos donde te ha guiado.
Título: Re: No sé cómo resolver problema con el pic16f628A
Publicado por: Darkman_A en 26 de Diciembre de 2013, 11:03:57
Hola Amigos
Tengo unos problemas con 2 proyectos que tengo hechos con un Pic 16f628A  el primero está funcionando con un cristal de 8MHz pero cuando lo pongo a funcionar a veces funciona y otras no me toco prenderlo apagarlo varias veces para que vuelva a funcionar o resetearlo.
Con el otro proyecto tengo casi el mismo problema, primero hice una rutina  que se activa  con un swits, primero lo probé en la protoboard y funciono bien, después diseñe  la PCB  y no funciona me toca oprimir reset y oprimir el swits varias veces para que coja la rutina, este pic está configurado con el oscilador interno (4MHz), solo tiene rutinas sencillas (if, else), el swits lo probé con otros pines para descartar posibles daño del pin pero siguió teniendo esta misma falla, para ambos proyectos tiene su propia fuente y su respectivo regulador.
La verdad no sé por qué pasa eso  Alguna solución??


Hola.
Controla con el tester las pistas y conecciones de los componentes.

Saludos.



Título: Re: No sé cómo resolver problema con el pic16f628A
Publicado por: cmontoya en 27 de Diciembre de 2013, 00:05:37
Hola amigos
Este es el diagrama el cual utilice para la simulación y para la PCB
Algún daño??
Título: Re: No sé cómo resolver problema con el pic16f628A
Publicado por: Geo en 27 de Diciembre de 2013, 03:03:04
Hola Amigos
Tengo unos problemas con 2 proyectos que tengo hechos con un Pic 16f628A  el primero está funcionando con un cristal de 8MHz pero cuando lo pongo a funcionar a veces funciona y otras no me toco prenderlo apagarlo varias veces para que vuelva a funcionar o resetearlo.
Con el otro proyecto tengo casi el mismo problema, primero hice una rutina  que se activa  con un swits, primero lo probé en la protoboard y funciono bien, después diseñe  la PCB  y no funciona me toca oprimir reset y oprimir el swits varias veces para que coja la rutina, este pic está configurado con el oscilador interno (4MHz), solo tiene rutinas sencillas (if, else), el swits lo probé con otros pines para descartar posibles daño del pin pero siguió teniendo esta misma falla, para ambos proyectos tiene su propia fuente y su respectivo regulador.
La verdad no sé por qué pasa eso  Alguna solución??

Pones muy poca información, para tratar de ayudarte hay que adivinar :(.
¿Cómo está conectada la entrada? ¿tienes resistencia de pull-up/down en dicha entrada? ¿qué hace la rutina?
Título: Re: No sé cómo resolver problema con el pic16f628A
Publicado por: AngelGris en 27 de Diciembre de 2013, 10:12:26
  Pues como dice Geo, es como que estamos adivinando... Sube tu programa, tal vez allí se encuentre la falla. ¿Los pines RA0 a RA2 son entradas o salidas? Si son entradas, ¿deshabilitaste los comparadores?
Título: Re: No sé cómo resolver problema con el pic16f628A
Publicado por: RALF2 en 27 de Diciembre de 2013, 11:29:30
cmotoya
Como te dicen los amigos para mi, sino es problema de hardware, los fallos deben estar en el software por la manera herratica en como te falla el programa, eso suele suceder. Asi que si quieres mas ayuda y resolverlo rapido pon tu codigo para revisarlo y probarlo   :mrgreen:

Felices fiestas!!!
Título: Re: No sé cómo resolver problema con el pic16f628A
Publicado por: cmontoya en 27 de Diciembre de 2013, 22:52:03
Hola amigos
El primer código  es un código que una matrix que compartió el compañero Cryn
El segundo código yo lo hice porque tuve la necesidad de hacer andar una lavadora de los 80´s con un programa de lavado sencillo que está en el manual de la lavadora  (llena, lava por 20 minutos, centrifuga 4 minutos, llena de nuevo, enjuaga por 10 minutos, centrifuga 5 minutos,  y listo) aparte de eso anexe la posibilidad con el pin A0 de lavar 10 minutos no más lo curiosos es que esta rutina si funciona de una pero la otra no toca chancletearla ,  prácticamente trate de desarrollar el código sencillo y basado en la información del manual de la lavadora, aparte de eso la lavadora no funciona con condensador si no con la fase.


Codigo de Cryn
Código: [Seleccionar]
    #include <16f628a.h>
    #fuses HS,NOWDT,NOLVP,PUT,NOBROWNOUT,MCLR
    #use delay(clock=8000000)
    #use fast_io(a)
    #use fast_io(b)
    #include <fonts.h>
    #include <string.h>
     
    #define clock PIN_A1
    #define strobe PIN_A2
    #define dato PIN_A0
    #define size_matriz_col 8  //cantidad de columnas por matriz
    #define COLUMNAS 40       //Defino cantidad de columnas a usar
    #define matriz_num COLUMNAS/size_matriz_col  //numero de matrices usado
     
    #byte portb=6
     
    int matriz[matriz_num+1][size_matriz_col]={"\0"};  //Almacena los datos a mostrar en el cartel
    int Fila;           //Fila actual a refrescar
    int VSync;          //Indica si es momento correcto de modificar lo que se esta mostrando...
    int Inhibit;        //Impide que se produzcan cambios en el cartel.
    const int mensaje[1][32]={"Feliz Navidad y Feliz 2014!!..."};
    const int num_msj=1;
    const int msj_length[num_msj]={31};
    int carries[6],msj,letra,desplazos;
     
    void ShowFila(void);
    void cargar(int datob);
    void desplazar_izq(void);
    void load_letra(int caracter);
     
    //Esta interrupcion debe suceder segun la cantidad de filas que tengas, y segun la cantidad de Hz a los que queres que tu cartel refresque...
    #int_TIMER0
    void  TIMER0_isr(void){
     
      ShowFila();                  //Mostremos la fila actual...
      Fila++;
      if(Fila==8){
         Fila=0;
         VSync=1;
         if(Inhibit!=0)
            Inhibit--;
         else
            desplazar_izq();
     }
     else
        VSync=0;
    }
     
    void main(void){
      setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
      enable_interrupts(INT_TIMER0);
      clear_interrupt(INT_TIMER0);
      enable_interrupts(GLOBAL);
      setup_comparator (NC_NC_NC_NC);
      //setup_adc(adc_off);
      //setup_adc_ports(no_analogs);
      set_tris_a(0);
      set_tris_b(0);
      output_b(0xFF);      //Apago cartel
      output_low(CLOCK);   //Aseguro inicialmente clock en bajo
      output_low(STROBE);
      Fila=0;              //Comienzo por la 1er fila
      Inhibit=5;
      VSync=1;             //Indico que comienzo con sync.
      desplazos=0;
      msj=0;
      while(true){}
    }
     
    void cargar(int datob){
      int contador;
     
      output_low(clock);
      delay_cycles(2);
      output_low(strobe);
      for(contador=0;contador<8;contador++){
         output_bit(dato,(datob & 0x1));
         datob>>=1;
         output_high(clock);
         delay_cycles(1);
         output_low(clock);
      }
      output_high(strobe);
      delay_cycles(1);
      output_low(strobe);
    }
     
    void ShowFila(void){
      int i;
     
      output_b(0xFF);
      for(i=0;i<5;i++){
         cargar(matriz[i][Fila]);
      }
      bit_clear(portb,fila);
    }
     
    void desplazar_izq(void){
      int i,j,a;
     
      if(desplazos==8 || desplazos==0){
         load_letra(mensaje[msj][letra]);
         desplazos=0;
      }
      for(i=0;i<8;i++){
         for(j=0;j<6;j++){
            a=matriz[j][i];
            carries[j]=shift_left(&a,1,0);
            matriz[j][i]=a;
         }
         for(j=0;j<6;j++){
            if(j!=5)
               matriz[j][i]|=carries[j+1];
            else
               matriz[j][i]|=carries[0];
         }
      }
      Inhibit=5;
      desplazos++;
      if(desplazos==8){
         letra++;
         if(letra>msj_length[msj])
            letra=0;
      }
    }
     
    void load_letra(int caracter){
      int i,j;
     
      if(isalnum(caracter)){
         if(isalpha(caracter)){
            if(isupper(caracter)){
               switch(caracter){
                  case 'A': i=0; break;
                  case 'B': i=1; break;
                  case 'C': i=2; break;
                  case 'D': i=3; break;
                  case 'E': i=4; break;
                  case 'F': i=5; break;
                  case 'G': i=6; break;
                  case 'H': i=7; break;
                  case 'I': i=8; break;
                  case 'J': i=9; break;
                  case 'K': i=10; break;
                  case 'L': i=11; break;
                  case 'M': i=12; break;
                  case 'N': i=13; break;
                  case 'O': i=14; break;
                  case 'P': i=15; break;
                  case 'Q': i=16; break;
                  case 'R': i=17; break;
                  case 'S': i=18; break;
                  case 'T': i=19; break;
                  case 'U': i=20; break;
                  case 'V': i=21; break;
                  case 'W': i=22; break;
                  case 'X': i=23; break;
                  case 'Y': i=24; break;
                  case 'Z': i=25; break;
               }
               for(j=0;j<8;j++){
                  matriz[5][j]=letrasM[i][j];
               }
            }
            else{
               switch(caracter){
                  case 'a': i=0; break;
                  case 'b': i=1; break;
                  case 'c': i=2; break;
                  case 'd': i=3; break;
                  case 'e': i=4; break;
                  case 'f': i=5; break;
                  case 'g': i=6; break;
                  case 'h': i=7; break;
                  case 'i': i=8; break;
                  case 'j': i=9; break;
                  case 'k': i=10; break;
                  case 'l': i=11; break;
                  case 'm': i=12; break;
                  case 'n': i=13; break;
                  case 'o': i=14; break;
                  case 'p': i=15; break;
                  case 'q': i=16; break;
                  case 'r': i=17; break;
                  case 's': i=18; break;
                  case 't': i=19; break;
                  case 'u': i=20; break;
                  case 'v': i=21; break;
                  case 'w': i=22; break;
                  case 'x': i=23; break;
                  case 'y': i=24; break;
                  case 'z': i=25; break;
               }
               for(j=0;j<8;j++){
                  matriz[5][j]=letras_m[i][j];
               }
            }
         }
         else{
            for(j=0;j<8;j++){
               matriz[5][j]=numeros[caracter-'0'][j];
            }
         }
      }
      else{
         switch(caracter){
            case ' ': i=0; break;
            case '!': i=1; break;
            case '"': i=2; break;
            case '#': i=3; break;
            case '$': i=4; break;
            case '%': i=5; break;
            case '&': i=6; break;
            case '´': i=7; break; //este es el acento
            case '(': i=8; break;
            case ')': i=9; break;
            case '*': i=10; break;
            case '+': i=11; break;
            case ',': i=12; break;
            case '-': i=13; break;
            case '.': i=14; break;
            case '/': i=15; break;
            case ':': i=16; break;
            case ';': i=17; break;
            case '>': i=18; break;
            case '=': i=19; break;
            case '<': i=20; break;
            case '?': i=21; break;
            case '[': i=22; break;
            case ']': i=23; break;
            case '^': i=24; break;
            case '_': i=25; break;
            case '{': i=26; break;
            case '|': i=27; break;
            case '}': i=28; break;
            case '@': i=29; break;
            case 'ñ': i=30; break;  // esta es la enie
            case '\f': i=31; break;
         }
         for(j=0;j<8;j++){
            matriz[5][j]=chars[i][j];
         }
      }
    }


Codigo de lavadora
Código: [Seleccionar]
#Include <16F628A.h>                                                               
#Fuses INTRC_IO, NOWDT, PUT, NOBROWNOUT, NOCPD, NOPROTECT, MCLR                   
#use delay(clock=4000000)                                                           
#Use Fast_Io(B)                                                                     
#Use Fast_Io(A)
#define run PIN_b3
#define izq PIN_b1
#define der PIN_b2
#define swit PIN_b0
#define llenado PIN_b4
#define lavado PIN_b5
#define centrifigado PIN_b6
#define final PIN_b7
#define presos PIN_a0

unsigned char paso;
   void main(void)

setup_comparator (NC_NC_NC_NC);
//setup_adc_ports(NO_ANALOGS);
set_tris_A(0x0b1111110);
set_tris_B(0x00);
output_b(0x00);
output_a(0x00);

while(true)
{


 if (input(PIN_A1) == 1)
 {
    do
    {

output_high(llenado);
delay_ms(700);

      while (input(PIN_A4) != 1); //espera al presostato
      output_low(llenado);
      delay_ms(11000);

output_high(lavado);
delay_ms(1000);

output_high(izq);
output_high(run);
output_high(swit);
delay_ms(600);

output_low(izq);
output_low(swit);

////////////20minutos Lavando////////////////////////
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
/////////////////////////////////

output_b(0x00);

delay_ms(60000);
delay_ms(60000);

/////////////Centrifugado/////////////////
output_high(centrifigado);

delay_ms(1000);

output_high(der);
output_high(run);
output_high(swit);
delay_ms(600);

output_low(der);
output_low(swit);
///////////////////////////////////////////
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);


///////////////////////////////////////////
output_b(0x00);

delay_ms(10000);

      paso--;
    }
while (pasadas > 0);

output_high(llenado);
delay_ms(700);

      while (input(PIN_A4) != 1); //espera al presostato
      output_low(llenado);
      delay_ms(11000);
//////////////////////lavado/////////////////
output_high(lavado);

delay_ms(1000);

output_high(izq);
output_high(run);
output_high(swit);
delay_ms(600);

output_low(izq);
output_low(swit);
/////////////Enjuagado///////////////
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);


///////////////////////////
output_b(0x00);

delay_ms(60000);
delay_ms(60000);



/////////////Centrifugado/////////////////
output_high(centrifigado);

output_high(final);////////////////////////////
delay_ms(700);/////////////bit////////////////
output_low(final);///////////////////////////

delay_ms(1000);

output_high(der);
output_high(run);
output_high(swit);
delay_ms(600);

output_low(der);
output_low(swit);
////////////////////////////////////
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);

///////////////////////////
output_b(0x00);

delay_ms(10000);

      paso--;
 }
 pasadas = 1;

 /////////////////////////////////////////anexo1/////////////////////////////////////////////////////
if (input(PIN_A0) == 1){

delay_ms(1000);
//////////////////////lavado/////////////////
output_high(lavado);

delay_ms(1000);

output_high(izq);
output_high(run);
output_high(swit);
delay_ms(600);

output_low(izq);
output_low(swit);
//////////lavado 10 minutos//////////////////
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);
delay_ms(60000);

///////////////////////////
output_b(0x00);

delay_ms(5000);
}
}
}
Título: Re: No sé cómo resolver problema con el pic16f628A
Publicado por: AngelGris en 27 de Diciembre de 2013, 23:37:56
  En el segundo programa en la parte de anexo1 quieres leer el pin RA0 y sin embargo RA0 supuestamente está configurado como salida.

  ¿Está bien como estás configurando el TRISA, 0x0b11111110? Yo supondría que lo lógico sería 0xaa para el caso de un valor en hexa y/o 0baaaaaaaa para un valor en binario
Título: Re: No sé cómo resolver problema con el pic16f628A
Publicado por: lucegiar2005 en 28 de Diciembre de 2013, 13:53:33
Hola,, buenos dias a todos. Espero hayan tenido unas lindas fiestas y comiencen un mejor 2014.
Si me permiten una duda y perdonan mi poco conocimiento quisiera preguntar si: ¿funciona bien en la protoboard y falla en la placa diseñada y hecha?, al menos así lo expresa, eso me parece más error de diseño o fabricación de la placa, o me equivoco en el concepto. De ser correcto el problema quizá desaparezca resoldando componentes. Yo comenzaría resoldando todo y veo que pasa. Un abrazo