Autor Tema: registros de 32 bits en micros  (Leído 1738 veces)

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

Desconectado Francirius

  • PIC10
  • *
  • Mensajes: 32
registros de 32 bits en micros
« 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

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: registros de 32 bits en micros
« Respuesta #1 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:
No contesto mensajes privados, las consultas en el foro

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: registros de 32 bits en micros
« Respuesta #2 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.

Desconectado Francirius

  • PIC10
  • *
  • Mensajes: 32
Re: registros de 32 bits en micros
« Respuesta #3 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. }

Desconectado sal0m0n

  • PIC12
  • **
  • Mensajes: 54
    • Sobre Mí
Re: registros de 32 bits en micros
« Respuesta #4 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);
Mis herramientas!
PicKit 3, MPLAB REAL ICE, OWON SDS6062, Zeroplus LAP-C 16128, Weller WES51, Probotix Fireball Meteor,  Altium Designer y otras mas!

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: registros de 32 bits en micros
« Respuesta #5 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?

Desconectado Francirius

  • PIC10
  • *
  • Mensajes: 32
Re: registros de 32 bits en micros
« Respuesta #6 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