TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Francirius en 14 de Septiembre de 2012, 20:30:57

Título: Simulacion funciona OK, vida real NO!
Publicado por: Francirius en 14 de Septiembre de 2012, 20:30:57
hola amigos, necesito su guia...tengo un programilla para leer un encoder, el programa está hecho 100% por mi, quizas medio largo, pero es de la forma que lo entendi...la cosa es que funciono, lo simule en proteus, y ningun problema...pero en la vida real se queda pegado!...a alguien le ha pasado?
Código: C++
  1. #include <16F877A.h>
  2.  #fuses XT,NOWDT,NOPUT,NOPROTECT
  3.  #use delay(clock=4000000)
  4.  #include <lcd_portc.c>
  5. /******************************************************************************/
  6.  //Definicion de variables.
  7.  int cuenta,cambio;
  8.  /*****************************************************************************/
  9. // Vector interrupcion.
  10.  #INT_RB
  11.  void ext_isr(){
  12.  switch(cambio){
  13.    case 0:     if((input(PIN_B4))&&(!input(PIN_B5))){
  14.                cuenta++;
  15.                lcd_gotoxy(1,2);
  16.                printf(lcd_putc,"%U",cuenta);
  17.                cambio=0x01;
  18.                }else{
  19.                if((!input(PIN_B4))&&(input(PIN_B5))){
  20.                cuenta--;
  21.                lcd_gotoxy(1,2);
  22.                printf(lcd_putc,"%U",cuenta);
  23.                cambio=0x02;
  24.                }
  25.                }
  26.                break;
  27.    case 1:    if((input(PIN_B4))&&(input(PIN_B5))){
  28.               cuenta++;
  29.               lcd_gotoxy(1,2);
  30.               printf(lcd_putc,"%U",cuenta);
  31.               cambio=0x03;
  32.               }
  33.               break;
  34.    case 2:    if((input(PIN_B4))&&(input(PIN_B5))){
  35.               cuenta--;
  36.               lcd_gotoxy(1,2);
  37.               printf(lcd_putc,"%U",cuenta);
  38.               cambio=0x03;
  39.               }
  40.               break;
  41.    case 3:     if((!input(PIN_B4))&&(input(PIN_B5))){
  42.                cuenta++;
  43.                lcd_gotoxy(1,2);
  44.                printf(lcd_putc,"%U",cuenta);
  45.                cambio=0x04;
  46.                }else{
  47.                if((input(PIN_B4))&&(!input(PIN_B5))){
  48.                cuenta--;
  49.                lcd_gotoxy(1,2);
  50.                printf(lcd_putc,"%U",cuenta);
  51.                cambio=0x05;
  52.                }
  53.                }
  54.                break;
  55.    case 4:    if((!input(PIN_B4))&&(!input(PIN_B5))){
  56.               cuenta++;
  57.               lcd_gotoxy(1,2);
  58.               printf(lcd_putc,"%U",cuenta);
  59.               cambio=0;
  60.               }
  61.               break;
  62.    case 5:    if((!input(PIN_B4))&&(!input(PIN_B5))){
  63.               cuenta--;
  64.               lcd_gotoxy(1,2);
  65.               printf(lcd_putc,"%U",cuenta);
  66.               cambio=0;
  67.               }
  68.               break;
  69.                
  70.    default:    break;
  71.  }
  72.  }
  73. /******************************************************************************/
  74.  
  75.  
  76. void main(){
  77.    cuenta=0;
  78.    cambio=0;
  79.    enable_interrupts(int_rb);             //habilita la interrupcion externa (Rb0).
  80.    lcd_init();
  81.    lcd_gotoxy(1,1);
  82.    printf(lcd_putc,"Prueba");
  83.    enable_interrupts(GLOBAL);
  84.    do{
  85.    }while(TRUE);
  86. }

A todo esto, el codigo lo hice por las mias, por que nunca pude entender algunos de los que ponian aca...
Saludos y gracias!!
Título: Re: Simulacion funciona OK, vida real NO!
Publicado por: Nocturno en 15 de Septiembre de 2012, 02:25:39
Esas funciones lcd_gotoxy y printf dentro de la interrupción te van a dar tormento. Cuando el encoder se mueva rápido, los cambios en las señales B4 y B5 se producirán cuando todavía se esté ejecutando el anterior.
En la interrupción deberías limitarte a actualizar los contadores (cuenta, cambio...) que puedes imprimir desde el main.
Título: Re: Simulacion funciona OK, vida real NO!
Publicado por: Francirius en 16 de Septiembre de 2012, 01:57:24
Gracias por la respuesta. Inicialmente mi programa era asi, en la subrutina de la interrupcion solamente incrementaba registros, y en el main desplegaba, pero pasaba lo mismo, cuando lo progrmaba en la vida real, se colgaba...
Título: Re: Simulacion funciona OK, vida real NO!
Publicado por: BrunoF en 16 de Septiembre de 2012, 04:31:59
No veo que modifiques el cambio de flanco de la interr de RB0. No creo que logres hacerlo funcionar bien si no vas alternando el cambio de flanco de la interr.
Título: Re: Simulacion funciona OK, vida real NO!
Publicado por: Nocturno en 16 de Septiembre de 2012, 04:49:13
Creo que con las interrupciones pin-on-change no hace falta cambiar el flanco, Don Bruno, saltan siempre que hay un cambio hacia arriba o hacia abajo.
Título: Re: Simulacion funciona OK, vida real NO!
Publicado por: BrunoF en 17 de Septiembre de 2012, 09:56:17
Ah si, perdón. Pensé que estaba usando RB0...
Título: Re: Simulacion funciona OK, vida real NO!
Publicado por: MGLSOFT en 17 de Septiembre de 2012, 11:19:44
Cuando se trata de un encoder de dos hilos, es necesario leer ambos flancos de cada linea para saber la direccion de giro del encoder.
Puede ser por eso que lo necesita, pero repito, es para dos hilos de un encoder incremental.
Título: Re: Simulacion funciona OK, vida real NO!
Publicado por: jukinch en 17 de Septiembre de 2012, 11:39:36
post Editado. No creo que contribuya dar el pescado. Será mejor enseñar a pescar.
                Saludos a todos nuevamente
                       Jukinch