Autor Tema: 16F887 se resetea por RB4!(¿?)  (Leído 2244 veces)

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

Desconectado JaM0N

  • PIC10
  • *
  • Mensajes: 19
16F887 se resetea por RB4!(¿?)
« en: 07 de Febrero de 2012, 23:03:49 »
Hola, recién termino de armar en la proto una primera versión de mi último proyecto y me sorprendí al ver que todo andaba de maravillas, pero pronto caí en la realidad y noté un error: de 4 pulsadores conectados a [RB4:RB7] (con sus respectivas pull-down) hay 1, el RB4, que me resetea el PIC.

Busco y busco y no encuentro nada, para colmo el RB4 debe ser el puerto más simple del integrado, es I/O y AN. Probé de intercambiar cables con otro pulsador y el problema persiste en RB4 :S...

Otro dato interesante es que reinicia "on change": resetea cuando presiono, y cuando suelto reinicia de nuevo... Está configurada la interrupción, pero de la misma manera que el resto de los pulsadores y en proteus lo simula bien  :5]

Espero que alguien le haya pasado :D

PD: olvide poner que estoy corriendo con INTOS, no clk out a 8MHz. La resistencia en MCLR de 1K a Vss y otra de 47K desde RB3 a GND para el LVP.

Desconectado martincnc

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 352
Re: 16F887 se resetea por RB4!(¿?)
« Respuesta #1 en: 08 de Febrero de 2012, 00:17:25 »
Hola JaM0N. Con los datos que das de tu proyecto solo te puedo sugerir que revises a donde va el programa cuando presionas el pulsador conectado a RB4. Es posible que la interrupción por RB4 no este bien atendida y en algún momento se dirija al inicio del programa, reiniciandolo en cada cambio de estado de este pin (de bajo a alto y viceversa).

Saludos!

Desconectado JaM0N

  • PIC10
  • *
  • Mensajes: 19
Re: 16F887 se resetea por RB4!(¿?)
« Respuesta #2 en: 08 de Febrero de 2012, 13:20:58 »
Hola JaM0N. Con los datos que das de tu proyecto solo te puedo sugerir que revises a donde va el programa cuando presionas el pulsador conectado a RB4. Es posible que la interrupción por RB4 no este bien atendida y en algún momento se dirija al inicio del programa, reiniciandolo en cada cambio de estado de este pin (de bajo a alto y viceversa).

Saludos!

Programado en CSS, en proteus se simula requete-bien

El vector de interrupcion:
Código: C
  1. #int_RB
  2. void  RB_isr(void)
  3. {
  4.         delay_ms(25);     //retardo antirrebotes (los tiempos no son importantes)
  5.         changes = last_b ^ port_b;    //guarda los cambios
  6.         last_b = port_b;    //y actualiza el registro
  7.         bandera = 1; mas = 0; menos = 0; cancel = 0; set = 0;    //aseguro que todo esté en 0, excepto bandera que se usa en el programa
  8.         if (bit_test(changes,4 )&& bit_test(last_b,4)) { i_state = arriba; mas = 1; }     // busco un flanco ascendente bit a bit
  9.         if (bit_test(changes,5 )&& bit_test(last_b,5)) { i_state = abajo; menos = 1; }  // ...
  10.         if (bit_test(changes,6 )&& bit_test(last_b,6)) { i_state = salir; cancel = 1; }     // ...
  11.         if (bit_test(changes,7 )&& bit_test(last_b,7)) { i_state = entrar; set = 1;}        // ...
  12. }

Y acá el main, con todos los setups:

Código: C
  1. void main(void)
  2. {
  3.  
  4.         setup_adc_ports(NO_ANALOGS|VSS_VDD);
  5.         setup_adc(ADC_OFF);
  6.         setup_spi(SPI_SS_DISABLED);
  7.         setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  8.         setup_timer_1(T1_DISABLED);
  9.         setup_timer_2(T2_DISABLED,0,1);
  10.         setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
  11.         enable_interrupts(INT_RB4); //debí poner así, ya que INT_RB no funcionaba,
  12.         enable_interrupts(INT_RB5); //las interrupciones se configuran pin a pin
  13.         enable_interrupts(INT_RB6);
  14.         enable_interrupts(INT_RB7);
  15.         enable_interrupts(GLOBAL); // enable a todas...
  16.         setup_oscillator(OSC_8MHZ);
  17. //---------------------------------
  18.         lcd_init();
  19.         Lcd_putc("Panobot V1.0");  // <<<--- Acá me trae al cambiar RB4 (o más arriva...), la unica forma de llegar acá es reiniciando
  20.         delay_ms(1000);
  21.         set_tris_c(0b11110000);
  22.         port_c = 1;
  23.         bandera = 1;
  24.         while (1) {
  25.                 if (bandera == 1) { //acá entra la bandera, si está en 0 no hace nada...
  26.                         bandera = 0; // si se produjo la interrupción, resetea la bandera y
  27.                         menu();        // ejecuta el menu (que es donde se hace todo...)
  28.                 }
  29.         }
  30. }

Bueno, reitero, en el proteus el codigo anda bien, por lo que tiene que ser algo más (o algo que le faltó y el proteus no se da cuenta)...
Seguramente es una de esas tonterias que uno pasa por alto y son las más difíciles de diagnosticar  :5]

Saludos y gracias por responder :D

Desconectado JaM0N

  • PIC10
  • *
  • Mensajes: 19
Re: 16F887 se resetea por RB4!(¿?)
« Respuesta #3 en: 13 de Febrero de 2012, 12:39:44 »
Bueno, al final era una pavada, como suponía!

Cuando se usa el LVP, se debe poner a masa RB3 (PIC16) o RB5 (PIC18), cosa que hice mediante una resistencia de 4K7. Resulta que por algún motivo cuando mandaba tensión a RB4 o RB2 (adyacentes) se reiniciaba. El problema se solucionó al cambiar la resistencia por un cable :D... En otras palabras, con una resistencia anda bien (no se reinicia por ruido), pero se reinicia la aplicar 5V a los pines adyacentes (aunque esto puede ser un desperfecto de los 16f887 o del mío en particular).

Ahora surgió un nuevo desperfecto, no funciona bien un secuenciador básico para un motor pap unipolar :@... pero eso es otro tema :D

Saludos.-