Autor Tema: Deco de control remoto Sony de revista Ucontrol  (Leído 1998 veces)

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

Desconectado Francirius

  • PIC10
  • *
  • Mensajes: 32
Deco de control remoto Sony de revista Ucontrol
« en: 16 de Enero de 2011, 18:39:11 »
Hola compañeros, recientemente he estado tratando de programar un deco de control remoto, y milagrosamente salio en la revista uControl #10 un ejemplo, e iba por buen camino, pero en esta revista salen trozos sueltos del progrma, y trate de unirlos, agregando las declaraciones de variables y configuracion, pero no me resulta, el programa debe mostrar en un lcd la tecla pulsada, pero en el mio se queda el display prendido sin ningun caracter. Alguien lo ha probado??
Revista uControl 10
Ahi esta la revista por si la quieren ver. Saludos!
Código: C++
  1. #include <16F876.h>
  2.  #fuses XT,NOWDT,NOPUT,NOPROTECT
  3.  #use delay(clock=4000000)
  4.  #use standard_io(b)
  5.  #include <lcd_portb.c>
  6. /******************************************************************************/
  7.  //Definicion de variables.
  8.  int1 cambio,start,dato_recibido;
  9.  int tiempo,longitud,i,j,command,address;
  10.  int16 word;
  11.  /*****************************************************************************/
  12.  #INT_EXT
  13.  void ext_isr(){
  14.  if(cambio){
  15.  set_timer0(0);
  16.  tiempo=0;
  17.  EXT_INT_EDGE(L_TO_H);
  18.  cambio=1;
  19.  }else{
  20.  tiempo=get_timer0();
  21.  EXT_INT_EDGE(H_TO_L);        
  22.  cambio=0;
  23.  }
  24.  if((tiempo>140) && (tiempo<160)){   //"Start", si está entre 2240 y 2560 us.
  25.  start=1;                        //Flag start activado.
  26.  i=0;                            //contador de bits a 0.
  27.  }
  28.  if(start){
  29.    if((tiempo>27) && (tiempo<55)){  //Entre 432 y 880 us, es cero.
  30.    bit_clear(word,i);
  31.    i++;
  32.    }
  33.    if((tiempo>65) && (tiempo<90)){   //Entre 1040 y 1440 us es uno.
  34.    bit_set(word,i);
  35.    i++;
  36.    }
  37.   }
  38.  if(i==longitud){
  39.  dato_recibido=1;
  40.  EXT_INT_EDGE(H_TO_L);
  41.  start=0;                        //para reiniciar lectura.
  42.  }
  43. }
  44. /******************************************************************************/
  45.  //Rutinas de separacion de comando y direccion.
  46.  void take_address(void){
  47.  i=longitud-1;
  48.  address=0;
  49.  for(j=0;j<longitud-7;j++){
  50.    address= address<<1;
  51.    address=address+bit_test(word,i);
  52.    i--;
  53.    }
  54.  }
  55.  
  56.  void take_command(void){
  57.  i=6;
  58.  command=0;
  59.  for(j=0;j<7;j++){
  60.    command=command<<1;
  61.    command=command+bit_test(word,i);
  62.    i--;
  63.    }
  64. }
  65. /******************************************************************************/
  66. void main(){
  67.    port_b_pullups(TRUE);   //Pull-up para RB0
  68.    setup_timer_0(RTCC_INTERNAL | RTCC_DIV_16);    //configuracion del timer0.
  69.    lcd_init();
  70.    ext_int_edge(H_TO_L);                   //En canto de bajada se activa int.
  71.    cambio=0;                                //control de cambio, para que comience a contar.
  72.    longitud=0x0B;                         //para los 12 bits de la palabra
  73.    enable_interrupts(int_ext);               //habilita la interrupcion externa (Rb0).
  74.    if(start){
  75.       while(dato_recibido){              //en el prgrma original aparecia "while(!dato_recibido)" pero no le encontre sentido, ya que al recibir data, se pone a 1
  76.       dato_recibido=0;
  77.       DISABLE_INTERRUPTS(INT_EXT);
  78.       take_address();
  79.       take_command();
  80.       lcd_gotoxy(0,0);
  81.       switch(command){
  82.       case 0: printf(lcd_putc,"\fCanal 1");break;
  83.       case 1: printf(lcd_putc,"\fCanal 2");break;
  84.       case 2: printf(lcd_putc,"\fCanal 3");break;
  85.       case 3: printf(lcd_putc,"\fCanal 4");break;
  86.       case 4: printf(lcd_putc,"\fCanal 5");break;
  87.       case 5: printf(lcd_putc,"\fCanal 6");break;
  88.       case 6: printf(lcd_putc,"\fCanal 7");break;
  89.       case 7: printf(lcd_putc,"\fCanal 8");break;
  90.       case 8: printf(lcd_putc,"\fCanal 9");break;
  91.       case 9: printf(lcd_putc,"\fCanal 0");break;
  92.       case 16: printf(lcd_putc,"\fCanal +");break;
  93.       case 17: printf(lcd_putc,"\fCanal -");break;
  94.       case 18: printf(lcd_putc,"\fVolumen +");break;
  95.       case 19: printf(lcd_putc,"\fVolumen -");break;
  96.       case 20: printf(lcd_putc,"\fSilencio");break;
  97.       case 47: printf(lcd_putc,"\fStandBy");break;
  98.       default: printf(lcd_putc,"\fCom:%3U Adr:%2U",command,address);
  99.       }
  100.       ENABLE_INTERRUPTS(INT_EXT);
  101.       }
  102.    }
  103.  
  104. }
« Última modificación: 17 de Enero de 2011, 12:25:20 por un Moderador, Razón: Decía Micropic en lugar de Ucontrol »

Desconectado jim_17

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
    • Blog personal
Re: Deco de control remoto Sony de revista Ucontrol
« Respuesta #1 en: 19 de Enero de 2011, 12:08:24 »
Hola, soy el autor del articulo de la revista...

1r fallo: sustituye todos los 0 por 1 en la variable cambio, es decir cuando pones cambio=0 debería poner cambio=1. Donde pone cambio=1 debe poner cambio=0.

2o fallo: longitud debe tener el valor 12, A=10, B=11, C=12 por lo tanto longitud=0x0C y no 0x0B como tienes en el main.

3o en el programa original pone "while(!dato_recibido)" debido a que mientras dato recibido no valga 1, el programa se detendrá ahí hasta que valga 1. Igualmente lo que has propuesto es válido.

Si lo requieres te puedo pasar el código y archivo en proteus originales. Aunque este implementa un pequeño cifrado por contraseña donde esta vale 3.




Share the world !

Blog's

http://www.area0x33.com

Desconectado Francirius

  • PIC10
  • *
  • Mensajes: 32
Re: Deco de control remoto Sony de revista Ucontrol
« Respuesta #2 en: 19 de Enero de 2011, 22:55:28 »
Correcto, desde la pagina de la revista el proyecto original tenia esa parte con contraseña, voy a probar lo que me dices, aunque igual estaria agradecido si subes el archivo.
Ah! y por si acaso (dsps me di cuenta del error) faltaba lo mas importante.... Activar las variables GLOBALES, se me habia pasado eso jeje.
Gracias! :-/

**Correccion** no habia leido que eras el autor, gracias, esta re bueno el articulo, yo estaba tratando de hacer uno parecido, pero para un samsung, y tiene 32 bits :S asi que primero voi a probar con el tuyo que es mas didactico.
Gracias...
pd:ojala puedas subir los archivos, saludos
« Última modificación: 19 de Enero de 2011, 23:50:11 por Francirius »

Desconectado Francirius

  • PIC10
  • *
  • Mensajes: 32
Re: Deco de control remoto Sony de revista Ucontrol
« Respuesta #3 en: 21 de Enero de 2011, 12:33:56 »
Ahora me salio el codigo, a parte de lo que sugeriste, le agregue un loop infinito a la parte del main que se encargaba de leer el comando y direccion y evaluarlo en el "switch".
No se como lo habrás echo tu, me gustaria comparar.
Gracias por los consejos! :-/

Desconectado jim_17

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
    • Blog personal
Re: Deco de control remoto Sony de revista Ucontrol
« Respuesta #4 en: 21 de Enero de 2011, 16:08:08 »
Mi código es el de la revista, el loop infinito lo tengo puesto (se pone en todos los programas) y lo demás aproximadamente es igual.
Share the world !

Blog's

http://www.area0x33.com