Autor Tema: No sé cómo resolver problema con el pic16f628A  (Leído 6406 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re: No sé cómo resolver problema con el pic16f628A
« Respuesta #15 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!!!

Desconectado cmontoya

  • PIC10
  • *
  • Mensajes: 29
Re: No sé cómo resolver problema con el pic16f628A
« Respuesta #16 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);
}
}
}

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: No sé cómo resolver problema con el pic16f628A
« Respuesta #17 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
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado lucegiar2005

  • PIC24F
  • *****
  • Mensajes: 504
Re: No sé cómo resolver problema con el pic16f628A
« Respuesta #18 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
- Santiago -