TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Francirius en 07 de Marzo de 2011, 06:36:26

Título: registros de 32 bits en micros
Publicado por: Francirius en 07 de Marzo de 2011, 06:36:26
Hola compañeros, tengo la siguiente duda, declare una variable de 32 bits, en la que guardo un valor. Este quiero compararlo con un valor determinado y que active una salida, pero intente con un "if" y no me funciona, no reacciona, y yo veo el valor del registro en el Proteus y es el valor con el que lo estoy comparando....
esta es la porcion del codigo...
Código: C++
  1. if(word==0x00A0){
  2.       output_high(PIN_B1);

De antemano muchas thank you
Título: Re: registros de 32 bits en micros
Publicado por: Suky en 07 de Marzo de 2011, 09:30:43
Si el valor de word es 0x000000A0 debe ingresar al if, no hay vueltas al asunto.  :undecided:
Título: Re: registros de 32 bits en micros
Publicado por: pocher en 07 de Marzo de 2011, 13:40:47
Efectivamente, como dice Suky, si tienes int32 word y word vale 0xA0 (independientemente si pones más o menos ceros a la izquierda de la A), debe de entrar en el if.

Revisa el código.
Título: Re: registros de 32 bits en micros
Publicado por: Francirius en 09 de Marzo de 2011, 16:46:44
Este es el codigo, la idea es decodificar una señal de un control remoto Samsung, que usa 32 bits. Para la simulacion en proteus uso 17, por que el generador me deja eso.
Tambien adjunto el archivo de proteus.
Código: C++
  1. #include <16F876.h>
  2.  #fuses XT,NOWDT,NOPUT,NOPROTECT
  3.  #use delay(clock=4000000)
  4.  #use standard_io(b)
  5. /******************************************************************************/
  6. /******************************************************************************/
  7.  //Definicion de variables.
  8.  int1 cambio=0,start,dato_recibido;
  9.  int longitud=17,i,j;
  10.  int16 data,address;
  11.  int32 word;
  12.  long tiempo;
  13.  /*****************************************************************************/
  14.  #INT_EXT
  15.  void ext_isr(){
  16.  if(!cambio){
  17.  set_timer1(0);
  18.  tiempo=0;
  19.  EXT_INT_EDGE(L_TO_H);
  20.  cambio=1;
  21.  }else{
  22.  tiempo= get_timer1();
  23.  EXT_INT_EDGE(H_TO_L);        
  24.  cambio=0;
  25.  }
  26.  if((tiempo>4250) && (tiempo<4650)){   //"Start", si está entre 4450 y 4650 us.
  27.  start=1;                        //Flag start activado.
  28.  i=0;                            //contador de bits a 0.
  29.  }
  30.  if(start){
  31.    if((tiempo>300) && (tiempo<580)){  //Entre 355 y 550 us, es cero.
  32.    bit_clear(word,i);
  33.    i++;
  34.    }
  35.    else if((tiempo>1350) && (tiempo<1750)){   //Entre 1550 y 1650 us es uno.
  36.    bit_set(word,i);
  37.    i++;
  38.    }
  39.  if(i==longitud){
  40.  dato_recibido=1;
  41.  EXT_INT_EDGE(H_TO_L);
  42.  start=0;                        //para reiniciar lectura.
  43.  }
  44. }
  45.  }
  46. /******************************************************************************/
  47. /******************************************************************************/
  48.  //Rutinas de separacion de comando y direccion.
  49.  void take_data(void){
  50.  i=16;
  51.  data=0;
  52.  for(j=0;j<9;j++){
  53.    data= data<<1;
  54.    data=data+bit_test(word,i);
  55.    i--;
  56.    }
  57.  }
  58.  
  59.  void take_address(void){
  60.  i=8;
  61.  address=0;
  62.  for(j=0;j<8;j++){
  63.    address=address<<1;
  64.    address=address+bit_test(word,i);
  65.    i--;
  66.    }
  67. }
  68. /******************************************************************************/
  69. /******************************************************************************/
  70. void main(){
  71.    //port_b_pullups(TRUE);   //Pull-up para RB0
  72.    setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);    //configuracion del timer0.
  73.    ext_int_edge(H_TO_L);                   //En canto de bajada se activa int.
  74.    //cambio=0;                                //control de cambio, para que comience a contar.
  75.    //longitud=12;
  76.    enable_interrupts(int_ext);               //habilita la interrupcion externa (Rb0).
  77.    enable_interrupts(GLOBAL);
  78.     do{
  79.       if(dato_recibido){
  80.       DISABLE_INTERRUPTS(INT_EXT);
  81.       if(word==0x0008){
  82.       output_high(PIN_B1);
  83.       ENABLE_INTERRUPTS(INT_EXT);
  84.       }
  85.      }
  86.     }while(TRUE);
  87. }
Título: Re: registros de 32 bits en micros
Publicado por: sal0m0n en 10 de Marzo de 2011, 15:02:50
el problema puede ser que los datos se almacenan de atras para adelante, es decir:

si tengo 32 bits para guardar una variable estos se verían así:

00 00 00 00

ahora si yo quiero guardar por decir algo el numero 1, quedaría asi:

01 00 00 00

haz una comparación bit a bit a ver si coinciden, no valla a ser que estés modificando otros bytes, o trata colocando (int32) antes de la expresión que quieres comparar
por ejemplo algo asi


Código: [Seleccionar]
   1.       if(word==(int32)160){  //equivalente a (int32)0xA0
   2.       output_high(PIN_B1);
Título: Re: registros de 32 bits en micros
Publicado por: pocher en 11 de Marzo de 2011, 16:26:35
Mirándolo deprisa.

B1 solo se activará si word=8 ... ¿seguro que word va a ser 8 alguna vez?
Título: Re: registros de 32 bits en micros
Publicado por: Francirius en 13 de Marzo de 2011, 21:10:17
si, de echo en la simulacion de proteus veo los registros y "word" esta en ocho, y si cambio la palabra cambia el registro, por lo que se que esta decodificando la señal