Autor Tema: Ayuda con Pic 16f877A y lenguaje C  (Leído 2066 veces)

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

Desconectado apollo11

  • PIC10
  • *
  • Mensajes: 12
Ayuda con Pic 16f877A y lenguaje C
« en: 08 de Febrero de 2005, 20:58:00 »
Bueno espero me puedan ayudar, les cuento soy nuevo en lo que se refiere a programación en C, generalmente lo hacia en ASM, pero el programa que estoy haciendo es muy largo.
Bueno les cuento, tengo que controlar 3 motores paso a paso por medio de un teclado (matriz 4x4). El programa lo tengo hecho y compilado, ademas lo he simulado en el MPLAB y funciona de lo más bien. El problema es que cuando intento probarlo en el protoboard, no hace lo que debiera. He notado quie al parecer no incrementa unas variables que asigne como indice de tres arreglos que declare (de 8 pos. en donde se encuentran los valores para hacer mover el motor). Aqui se encuentra el programa:


Cuando presiono una tecla, es detectada y guardada en la variable "TECLA" ,
luego pasa a una sentencia "switch" que ejecuta un trozo de codigo dependiendo el valor de la variable "Tecla". Cuando ingresa a este código, dentro de el se encuentran las variables de tipo indice para los arreglos "pos_y" , "pos_x"  y "pos_z".

estas variables en el MPLAB se incrementa, pero cuando implemento el circuito parece ser que no, ya que ya que el puerto C no cambia su valor.



espero alguien me pueda ayudar.

saludos.




#define pb 0xf0
#define pc 0x00
#define pd 0xff
#define pa 0xf0


void main()
{
   int tecla=0, col=0,aut, temp, scan=0xff;
   int  velocidad, pos_z=0;
   int  paso_m;
   int  pos_x=0, pos_y=0;
   int tabla_mx[8]={0x01, 0x03, 0x02, 0x06,0x04, 0x0c, 0x08, 0x09};
   int tabla_my[8]={0x10, 0x30, 0x20, 0x60,0x40, 0xc0, 0x80, 0x90};
   int tabla_mz[8]={0x01, 0x03, 0x02, 0x06,0x04, 0x0c, 0x08, 0x09};
    setup_adc_ports(NO_ANALOGS);
    setup_adc(ADC_OFF);
    setup_psp(PSP_DISABLED);
    setup_spi(FALSE);
    setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1);
    set_tris_a(pa);
    set_tris_b(pb);
    set_tris_c(pc);
    set_tris_d(pd);
    set_tris_e(0xff);
    port_b_pullups(true);
   #use delay(clock=20000000)
   #use fast_io(B)    
   #use fast_io(C)          
   #use fast_io(A)      
   velocidad=100;
inicio:    aut=input_a();
   #asm
      bcf 0x03, 0x05
      bcf   0x03, 0x06         
      clrf   0x05
      clrf   0x07
   #endasm
                            if( bit_test(aut,4)==0 )   
         {    
     
          do
      {
               
      bit_clear(scan,col);
               
 /*Pone a cero
el n° de bit, segun dato en variable col */
            
   #asm
      bcf 0x03, 0x05
      bcf   0x03, 0x06         
      movf   scan,0
      movwf   0x06
   #endasm
   
   delay_ms(50);
   
   #asm
      bcf 0x03, 0x05
      bcf   0x03, 0x06         
      movf   0x06,0
      movwf   tecla
   #endasm
            
   

   switch (tecla)
      {

      case 0x7d: /* tecla 0  */

         goto inc_col;

      case 0xee:/* tecla 1 (+y) */
                                                              paso_m=tabla_my[pos_y];                                 temp=paso_m;               delay_us(velocidad);
         ++pos_y;
         if (pos_y==8)                 pos_y=0;                 /* tecla 1 (-x) */
                                                           paso_m=tabla_mx[pos_x];
                                                            paso_m=(temp ^ paso_m);
                                                             output_c(paso_m);
                                                                delay_us(velocidad);
                                                                pos_x;
         if (pos_x==0xff)
            {pos_x=7;
                              goto inc_col;}
         else                                        goto inc_col;   
      case 0xed: /* tecla 2 (+y) */
                                                         paso_m=tabla_my[pos_y];
                                                          temp=paso_m;
                                                       paso_m=tabla_mx[pos_x];
                                                        paso_m=(temp ^ paso_m);
                                                       output_c(paso_m);
                  
                                                       delay_us(velocidad);
                                                    ++pos_y;
                                    if    (pos_y==8)                                   {pos_y=0;
                                                               goto inc_col;}
                else                    goto inc_col;
            
   case 0xeb:/* tecla 3 (+y) */
                                      paso_m=tabla_my[pos_y];
                                     temp=paso_m;
                                    delay_us(velocidad);
                                   ++pos_y;
                                   if     (pos_y==8)
                                    pos_y=0;
                  
                       /* tecla 7 (+x) */
                                   paso_m=tabla_mx[pos_x]; /* variables de arreglo*/
                                   paso_m = (temp ^ paso_m);
                                   output_c(paso_m);
                                    delay_us(velocidad);
                                   ++pos_x;  /*aqui se incrementa*/
                  if (pos_x==8)
                                     {pos_x=0;
                                             goto inc_col;}
                                                else   
                                               goto inc_col;


               

   case 0xde: /* tecla 4 (-x) */
                  

                                    paso_m=tabla_mx[pos_x];      
                                     temp=paso_m;
                                    paso_m=tabla_my[pos_y];
                               paso_m=(temp ^ paso_m);
                                 output_c(paso_m);
                                  delay_us(velocidad);
                  --                                        pos_x;
                  if (pos_x==0xff)
                                        {pos_x=7;
                                            goto inc_col;}
                                              else   
                                        goto inc_col;

         

   case 0xdd: /* tecla  5 */

                   goto inc_col;

   case 0xdb: /* tecla 6 (+x) */
                                paso_m=tabla_mx[pos_x];
                                  temp=paso_m;
                                  paso_m=tabla_my[pos_y];
                                 paso_m=(temp ^ paso_m);
                                output_c(paso_m);
                                 delay_us(velocidad);
                                 ++pos_x;
   if (pos_x==8)
                               {pos_x=0;
                                  goto inc_col;}
                             else   
                                    goto inc_col;


   case 0xbe:/* tecla 7 (-y) */
                              paso_m=tabla_my[pos_y];
                              temp=paso_m;
                  --                                pos_y;
                  if            (pos_y==0xff)
                               pos_y=7;
                  
                       /* tecla 7 (-x) */
                              paso_m=tabla_mx[pos_x];
                               paso_m = (temp ^ paso_m);
                              output_c(paso_m);
                               delay_us(velocidad);
                  --                               pos_x;
                  if            (pos_x==0xff)
                              {pos_x=7;
                                     goto inc_col;}
                             else   
                                         goto inc_col;

                  

   case 0xbd:
                   /*  tecla 8 (-y) */
                            paso_m=tabla_my[pos_y];
                              temp=paso_m;
                              paso_m=tabla_mx[pos_x];
                              paso_m=(temp ^ paso_m);
                              output_c(paso_m);
                              delay_us(velocidad);
                  --                                   pos_y;
                  if           (pos_y==0xff)
                     {pos_y=7;
                     goto inc_col;}
                  else
   
                  goto inc_col;
               
         

               case 0xbb:/* tecla 9 (+x) */
                  paso_m=tabla_mx[pos_x];
                  temp=paso_m;
                  ++pos_x;
   if (pos_x==8)
                             pos_x=0;
                  
                       /* tecla 9 (-y) */
                  paso_m=tabla_my[pos_y];
                  paso_m = (temp ^ paso_m);
                  output_c(paso_m);
                  delay_us(velocidad);
                  --                   pos_y;
                  if          (pos_y==0xff)
                              {pos_y=7;
                                      goto inc_col;}
                            else   
                                 goto inc_col;

               

   case 0x7e: /* tecla A */

      goto inc_col;

      case 0x7b:  /* tecla  B  */

      goto inc_col;
   
   case 0x77: /*tecla F4 -z */
                                       paso_m=tabla_mz[pos_z];
                                       output_a(paso_m);
                                        delay_us(velocidad);
                  --                                            pos_z;
                  if                (pos_z==0xff)
                                {pos_z=7;
                                       goto inc_col;}
                                  else   
                                goto inc_col;
 
         
   case 0xb7:/* tecla F3(+z) */
                                   paso_m=tabla_mz[pos_z];
                                                           output_a(paso_m);
                                 delay_us(velocidad);
                                 ++pos_z;
                  if                 (pos_z==8)
                                   {pos_z=0;
                                     goto inc_col;}
                                                      else   
                                            goto inc_col;

               
               
   case 0xd7: /* tecla F2    decrementa velocidad motor */
                                 
                                      velocidad=read_eeprom(1);      
                     --velocidad;
                                                          delay_ms(100);
         write_eeprom(0,velocidad);
        goto inc_col;
                                       case 0xe7:/* tecla F1 aumentavelocidad motor */
                                                      velocidad=read_eeprom(1);   
           ++velocidad;
          delay_ms(100);
          write_eeprom(0,velocidad);
               
                  
               }            
inc_col:         bit_set(scan,col);
         ++col;
            }
         while (col!=4);
         col=0;
          goto inicio;
            
                  
   }
}



Desconectado juanelete

  • PIC12
  • **
  • Mensajes: 74
RE: Ayuda con Pic 16f877A y lenguaje C
« Respuesta #1 en: 09 de Febrero de 2005, 00:50:00 »
Hola

Asi, a "a bote pronto", sin pararme a analizar el codigo, he visto que tienes un error.

En C, todos los "case " deben de terminar con "break", sino se ejecutara tambien
el case siguiente, hasta que se encuentre break o se llegue al final.

Saludos Giño

Desconectado apollo11

  • PIC10
  • *
  • Mensajes: 12
RE: Ayuda con Pic 16f877A y lenguaje C
« Respuesta #2 en: 10 de Febrero de 2005, 17:50:00 »
Juanelete con respecto a lo del break tenias razon, sin embargo a pesar de arreglarlo no logro solucionar el problema.
Espero puedas ayudarme porque estoy bien aproblemado.