Autor Tema: A vueltas con las interrupciones RB4:7 18F4520 (SOLUCIONADO)  (Leído 2996 veces)

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

Desconectado gredoss

  • PIC10
  • *
  • Mensajes: 7
    • Planetario viajero
A vueltas con las interrupciones RB4:7 18F4520 (SOLUCIONADO)
« en: 20 de Octubre de 2012, 09:37:48 »
Muy buenas.

Tengo desarrollado un medidor de consumo de combustible para un ultraligero que me muestra los datos en un GLCD 3310 de Nokia con un 18F4520.
Lo he tenido funcionando con todos los menús y el contador ajustado. He tenido que reprogramarlo porque he cambiado el captador que tiene diferencias en cuanto al número de pulsos/litro y varía el cálculo matemático.

El problema que me surge es que "no se qué p**etas he tocado" que ahora no me entra en la interrupción Rb4:7. :5] :5] :5]
He estado mirando por el foro y recuerdo que en su día tuve el mismo problema y estoy viendo los mismos mensajes que me leí entonces. El caso es que llevo varios días intentandolo y no termino de dar con la tecla (nunca mejor dicho). Tampoco recuerdo cómo lo solucioné.
He probado a programar el micro con un programa de prueba para encender un LED con las pulsaciones al entrar en la interrupción y tampoco entra, aunque en Proteus y Mplab si parece que funcione bien.

El código es el siguiente:
**********************************************************************

#include <18F4520.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV25 //Brownout reset at 2.5V
#FUSES PUT //Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOPBADEN //PORTB pins are configured as digital input channels on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES MCLR //Master Clear pin enabled
#FUSES NOXINST //No Extended set extension and Indexed Addressing mode enabled
#use delay(clock=20000000)

#define LOWTOHIGH false
#define HIGHTOLOW true

short int dbutton4, dbutton5, dbutton6, dbutton7;

#int_rb
void detect_rb_change() {
   int current;
   static int last=0;

   set_tris_b(0xF0);
   current=input_b();
  
   #if LOWTOHIGH
   if ((!bit_test(last,4))&&(bit_test(current,4))) {dbutton4=1;}
   if ((!bit_test(last,5))&&(bit_test(current,5))) {dbutton5=1;}
   if ((!bit_test(last,6))&&(bit_test(current,6))) {dbutton6=1;}
   if ((!bit_test(last,7))&&(bit_test(current,7))) {dbutton7=1;}
   #elif HIGHTOLOW
   if ((!bit_test(current,4))&&(bit_test(last,4))) {dbutton4=1;}
   if ((!bit_test(current,5))&&(bit_test(last,5))) {dbutton5=1;}
   if ((!bit_test(current,6))&&(bit_test(last,6))) {dbutton6=1;}
   if ((!bit_test(current,7))&&(bit_test(last,7))) {dbutton7=1;}
   #endif

   last=current;
}

void main() {
   dbutton4=0;
   dbutton5=0;
   dbutton6=0;
   dbutton7=0;
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_adc_ports(AN0_TO_AN1_ANALOG);
   set_adc_channel(0);

/////////// Prueba para ver que el código pasa por aqui//////////
   output_high(PIN_D2);
   delay_ms(500);
   output_low(PIN_D2);
   delay_ms(500);   
   output_high(PIN_D2);
   delay_ms(500);
   output_low(PIN_D2);
////////////////////////////////////////////////////////
   clear_interrupt(int_rb);
      enable_interrupts(INT_RB);
      enable_interrupts(GLOBAL);

   output_low(PIN_D2);
   while (TRUE) {
      if(dbutton6){
        output_high(PIN_D2);
        dbutton6=FALSE;
      }
      if(dbutton5){
        output_low(PIN_d2);
        dbutton5=FALSE;
      }
   }
}
**********************************************************

El caso es que pulsando los botones físicos nunca se llega a encender el led.
También le he probado a encender el led cuando entre en la interrupción y ..... nada.

Uso CCS

Espero que alguien me ayude a hacer memoria. Jeje.
Muchas gracias.


« Última modificación: 25 de Octubre de 2012, 12:56:24 por gredoss »
Mas vale tener la boca cerrada y parecer estúpido que abrirla y disipar toda duda.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: A vueltas con las interrupciones RB4:7 18F4520
« Respuesta #1 en: 20 de Octubre de 2012, 12:46:56 »
probá sacando la lína
   set_tris_b(0xF0);
de la interrupción y colocarla sólo una vez al inicio del programa, junto con el resto de la configuración inicial.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado gredoss

  • PIC10
  • *
  • Mensajes: 7
    • Planetario viajero
Re: A vueltas con las interrupciones RB4:7 18F4520
« Respuesta #2 en: 21 de Octubre de 2012, 14:34:20 »
probá sacando la lína
   set_tris_b(0xF0);
de la interrupción y colocarla sólo una vez al inicio del programa, junto con el resto de la configuración inicial.

Muchas gracias por molestarte en mirar el código BrunoF.
La línea a la que haces referencia viene incluida en el archivo de ejemplo del CCS (EX_PBUTT.C) y por eso la dejé. Es de suponer que los ejemplos del CCS deben funcionar bien.
La definición de TRISB la he pasado al inicio del programa de todos modos y he incluido aldunas líneas para borrar el Flag. En cualquier caso, pruebo con el Debug y con Proteus y me funciona, pero al grabar el micro con el PICSTART Plus me dice que me de una vuelta.
Intento borrar varias veces el bit RBIF por que si durante el retardo de 30 ms me cambia el flanco se me activa de nuevo el bit RBIF y al salir de la interrupción vuelve a entrar inmediatamente.

*************************************************
#int_rb
void detect_rb_change() {
      current=input_b();            leo el puerto B
   clear_interrupt(int_rb);      borro RBIF
      delay_ms(30);                  retardo antirrebotes
      
      output_high(PIN_D2);        enciendo un led para comprobar que entra en la interrupcion
   delay_ms(1000);
   output_low(PIN_D2);

   #if LOWTOHIGH
   if ((!bit_test(last,4))&&(bit_test(current,4))) {dbutton4=1;}
   if ((!bit_test(last,5))&&(bit_test(current,5))) {dbutton5=1;}
   if ((!bit_test(last,6))&&(bit_test(current,6))) {dbutton6=1;}
   if ((!bit_test(last,7))&&(bit_test(current,7))) {dbutton7=1;}
   #elif HIGHTOLOW
   if ((!bit_test(current,4))&&(bit_test(last,4))) {dbutton4=1;} ;compruebo qué tecla se ha pulsado
   if ((!bit_test(current,5))&&(bit_test(last,5))) {dbutton5=1;}
   if ((!bit_test(current,6))&&(bit_test(last,6))) {dbutton6=1;}
   if ((!bit_test(current,7))&&(bit_test(last,7))) {dbutton7=1;}
   #endif

   last=current;                           guardo la ultima posicion del puertoB
   current=input_b();                   vuelvo a leer para poder borrar RBIF por si ha cambiado
   clear_interrupt(int_rb);
}
***********************************************************

Creo que debería adquirir otro 18f4520 por si estuviera mal. Ya no se qué pensar.

Saludos
« Última modificación: 21 de Octubre de 2012, 14:41:15 por gredoss »
Mas vale tener la boca cerrada y parecer estúpido que abrirla y disipar toda duda.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: A vueltas con las interrupciones RB4:7 18F4520
« Respuesta #3 en: 21 de Octubre de 2012, 16:41:37 »
y que es lo que tienes conectado en RB4-RB7? Botones? En dicho caso, tienes las correspondientes pullups o pulldowns?

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado gredoss

  • PIC10
  • *
  • Mensajes: 7
    • Planetario viajero
Re: A vueltas con las interrupciones RB4:7 18F4520
« Respuesta #4 en: 22 de Octubre de 2012, 08:22:55 »
Pues si. Tengo 3 pulsadores que ponen a masa los pines RB4,RB5 y RB6, y están permanentemente a +5V a través de resistencias de 10K.
De todas formas, ya te digo que lo he tenido funcionando con su pcb terminada. El tema es que hace bastante tiempo que no tocaba el programa y al hacer una modificación mínima se me ha fastidiado todo.
Recuerdo que al abrir el proyecto en el MPLAB después de varios meses me decía que el CCS no lo encontraba en el directorio que le tenía asignado y le tuve que poner la ruta nueva.
Creo que de tanto probar y grabar el micro voy a superar el número de escrituras en la flash ...  :D  :5] :D :5] :D

Gracias de nuevo y saludos


Mas vale tener la boca cerrada y parecer estúpido que abrirla y disipar toda duda.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: A vueltas con las interrupciones RB4:7 18F4520
« Respuesta #5 en: 22 de Octubre de 2012, 10:00:22 »
  No sé como compilara CCS dicho código.

  Recuerdo que al programar en HiTEch además de borrar el flag RBIF, debía hacer una lectura del puerto para que desaparezca la condición de cambio de estado del puerto; de no hacer la lectura el bit RBIF se volvía a setear automáticamente.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: A vueltas con las interrupciones RB4:7 18F4520
« Respuesta #6 en: 22 de Octubre de 2012, 19:09:02 »
¿y has probado limpiando el portb después de cada escaneo del teclado?

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado gredoss

  • PIC10
  • *
  • Mensajes: 7
    • Planetario viajero
Re: A vueltas con las interrupciones RB4:7 18F4520
« Respuesta #7 en: 23 de Octubre de 2012, 09:50:15 »
Si. Leo y borro el portb tras cada entrada en la interrupción. El problema es que no entra en la interrupción.

Bueno, sigo observando cosas.
Compilo con la versión 3.203 y en la declación de fuses siempre me aparece PUT Enabled aunque coloque #FUSES NOPUT.
Sin embargo con la versión 4.104 me aparece PUT Disabled aunque le ponga #FUSES PUT.
Eso me ha llamado poderosamente la atención. Hay algo que no funciona bien al compilar o me falta algún pequeño detalle que se me escapa.
Por otra parte he estado mirando el código desensamblado y, según el datasheet, los vectores de interrupción están en las direcciones 0008h para la interrupción de alta prioridad y en 0018h el vector de baja prioridad. Pues bien, en esas posiciones de memoria hay código que no tiene nada que ver con la interrupción.

******************************************************
  0000    EF9C     GOTO 0x3b38
  0008    6E04     MOVWF 0x4, ACCESS
  000A    CFD8     MOVFF 0xfd8, 0x5
  000E    CFE0     MOVFF 0xfe0, 0x6
  0012    0100     MOVLB 0
  0014    CFE9     MOVFF 0xfe9, 0xc
  0018    CFEA     MOVFF 0xfea, 0x7
  001C    CFE1     MOVFF 0xfe1, 0x8
  0020    CFE2     MOVFF 0xfe2, 0x9
  0024    CFD9     MOVFF 0xfd9, 0xa
  0028    CFDA     MOVFF 0xfda, 0xb
  002C    CFF3     MOVFF 0xff3, 0x12
  .
  .
  0082    C00A     MOVFF 0xa, 0xfd9
  0086    C00B     MOVFF 0xb, 0xfda
  008A    C012     MOVFF 0x12, 0xff3
  008E    C013     MOVFF 0x13, 0xff4
  0092    C014     MOVFF 0x14, 0xffa
  0096    5004     MOVF 0x4, W, ACCESS
  0098    C006     MOVFF 0x6, 0xfe0
  009C    C005     MOVFF 0x5, 0xfd8
  00A0    0010     RETFIE 0
*******************************************************
Parece que se dedica a guardar un montón de información en la pila antes de atender la interrupción y devolverla a su sitio al retornar de la misma, pero lo que no me cuadra es en la posiciones de memoria en las que lo hace.

Estoy jugando con los bits de configuración y NO me los cambia al compilar como los defino en el código.

// REG CONFIG1H -- Dir 300001
   //LP,XT,HS,RC,EC,EC_IO,H4,RC_IO
   #FUSES HS                                //High speed Osc (> 4mhz)      -- HS habilitado y cambia. OK
   //FCMEN,NOFCMEN
   #FUSES FCMEN       //Fail-safe clock monitor enabled      -- FCMEN habilitado y cambia. OK
   //IESO,NOIESO
   #FUSES IESO      //Oscillator Switchover enabled      -- IESO habilitado y cambia. OK
// REG CONFIG2L -- Dir 300002
   //PUT,NOPUT
   #FUSES PUT       //Power Up Timer         -- PUT deshabilitado y NO cambia. FAIL
   //BROWNOUT_NOSL,BROWNOUT_SW,NOBROWNOUT,BROWNOUT
   #FUSES BROWNOUT      //Brown-out Reset enable      -- BOREN deshabilitado y NO cambia. FAIL
   //BORV20,BORV27,BORV42,BORV45
   #FUSES BORV20      //Brown-out Voltage bits      -- BORV en minimun setting y cambia. OK
//REG CONFIG2H -- Dir 300003
   //WDT,NOWDT
   #FUSES NOWDT       //No Watch Dog Timer      -- WDT deshabilitado y NO cambia. FAIL
   //WDT1,WDT2,WDT4,WDT8,WDT16,WDT32,WDT64,WDT128,WDT256,WDT512,WDT1024,WDT2048,WDT4096,WDT8192,WDT16384,WDT32768
   #FUSES WDT128       //Watch Dog Timer uses 1:128 Postscale   -- Timer WDT en 1:128 y cambia. OK
//REG CONFIG3H -- Dir 300005
   //CCP2B3,CCP2C1
   #FUSES CCP2B3      //CCP2 MPX con RB3         -- CCP2 MPX con RB3 y cambia. OK
   //PBADEN,NOPBADEN
   #FUSES NOPBADEN                    //PORTB pins are conf. as I/O on RESET   -- PORTB como I/O digital y cambia. OK
   //LPT1OSC,NOLPT1OSC
   #FUSES LPT1OSC       //Timer1 configured for low-power   -- TMR1 LowPower y cambia. OK
   //MCLR,NOMCLR
   #FUSES MCLR       //Master Clear pin enabled                          -- MCLR habilitado y cambia. OK
//REG CONFIG4L -- Dir 300006
   //NOSTVREN,STVREN
   #FUSES NOSTVREN                    //Stack full/underflow will cause RST   -- STVREN no causa RST y NO cambia. FAIL
   //NOLVP,LVP
   #FUSES NOLVP       //No low voltage prgming, B5 used for I/O   -- Supply ICSP disabled y NO cambia. FAIL
   //XINST,NOXINST
   #FUSES XINST       //No Extended set extension and Indexed Addressing mode enabled   -- Instr. Set disabled y NO cambia. FAIL
//REG CONFIG5L -- Dir 300008
   //PROTECT,NOPROTECT
   #FUSES NOPROTECT    //Code not protected from reading      -- No protegido y NO cambia. FAIL
//REG CONFIG5H -- Dir 300009
   //CPD,NOCPD
   #FUSES NOCPD       //No EE protection         -- EEP no protegida y NO cambia. FAIL
   //CPB,NOCPB
   #FUSES NOCPB       //No Boot Block code protection      -- Boot Block no protegida y NO cambia. FAIL
//REG CONFIG6L -- Dir 30000A
   //WRT,NOWRT
   #FUSES NOWRT       //Program memory not write protected   -- No protegida y NO cambia. FAIL
//REG CONFIG6H -- Dir 30000B
   //WRTC,NOWRTC
   #FUSES NOWRTC       //configuration not reg. write prot.   -- No protegida y NO cambia. FAIL
   //WRTB,NOWRTB
   #FUSES NOWRTB       //Boot block not write protected      -- No protegida y NO cambia. FAIL
   //WRTD,NOWRTD
   #FUSES NOWRTD       //Data EEPROM not write protected   -- No protegida y NO cambia. FAIL
//REG CONFIG7L -- Dir 30000C
   //EBTR,NOEBTR
   #FUSES NOEBTR       //Memory not protected from table reads   -- No protegida y NO cambia. FAIL
//REG CONFIG7H -- Dir 30000D
   //EBTRB,NOEBTRB
   #FUSES NOEBTRB       //Boot block not prot from table reads   -- No protegida y NO cambia. FAIL

*************************************************************************

No tengo ni idea de qué puede estar sucediendo.
Quiero agradeceros de nuevo las molestias que os estais tomando.
Saludos


Mas vale tener la boca cerrada y parecer estúpido que abrirla y disipar toda duda.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: A vueltas con las interrupciones RB4:7 18F4520
« Respuesta #8 en: 23 de Octubre de 2012, 14:34:26 »
en el código no veo que limpies el portb.

yo en mis codigos, coloco la instrucción en asm, pa´ estar seguro  #asm movf PORTB,0 #endasm y además "limpio" las columnas del teclado.


La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado gredoss

  • PIC10
  • *
  • Mensajes: 7
    • Planetario viajero
Re: A vueltas con las interrupciones RB4:7 18F4520
« Respuesta #9 en: 23 de Octubre de 2012, 15:14:03 »
en el código no veo que limpies el portb.

yo en mis codigos, coloco la instrucción en asm, pa´ estar seguro  #asm movf PORTB,0 #endasm y además "limpio" las columnas del teclado.


No es exacramente un teclado matricial. Simplemente se trata de 3 pulsadores.
Puede ser que no veas lo que hago con el portb porque he toqueteado mucho, pero te aseguro que he probado de todo desde dentro de la rutina de interrupción.
De todos modos, como digo el programa lo he tenido funcionando y ha sido al reprogramar el micro después de un tiempo cuando ha cascado.
He encontrado un hilo en el que se trata el tema de los bits de configuración:

Duda al configurar fuses en MPLAB y CCS

y habla de la posible forma de configurar el MPLAB para que coja los bits de configuración del modo correcto.
Siguiendo ese hilo, he intentado compilar el programa desde el entorno del CCS diréctamente e importar el .hex y el .cof con el MPLAB para grabar el micro con el PICSTAR Plus y .... SORPRESA. Ya me entra en las interrupciones. Si lo hago desde el MPLAB se me escoña.  :shock: :shock: :shock:

Resumiendo:
Cuando compilo con el MPLAB hace con los bits de configuración lo que le da la gana y no entro en la interrupción RRB4:7.
Cuando compilo con el PCW e importo el .hex a MPLAB, los bits de configuración se ponen en su sitio y el programa más o menos funciona (el que no vaya fino es debido al toqueteo al que le he sometido estos últimos días). Ahora me entra en la interrupción.

No se cómo hacer que los bits de configuración me hagan caso en el MPLAB.  :?
De momento creo que voy eliminando posibles caminos de investigación. Tengo que centrarme en los dichosos bits de configuración.
Por ejemplo, tengo la línea #FUSES PUT. Compilando con MPLAB me dice que PWRT disabled. Sin tocar el código, compilo con PCW, importo a MPLAB y me dice PWRT enabled.

Raro, raro.
Muchas gracias y saludos
Mas vale tener la boca cerrada y parecer estúpido que abrirla y disipar toda duda.

Desconectado gredoss

  • PIC10
  • *
  • Mensajes: 7
    • Planetario viajero
Re: A vueltas con las interrupciones RB4:7 18F4520 (SOLUCIONADO)
« Respuesta #10 en: 25 de Octubre de 2012, 12:55:42 »
Bueno pues ..... ya he dado con la tecla  :-/ :-/ :-/ :-/ :-/
Tenía mal configurada una puñetera opcción en el MPLAB, como me esperaba y ya sospechaba estos últimos días.

El tema se ha solucionado cambiando la opción de Debug a Release, dentro de Build Configuration en la persiana Project.
Si selecciono Debug, los bits de configuración se desmadran. Al ponerlo en Release, los bits de configuración se colocan en su sitio y se modifican si los cambio en el código.

Lo que todavía no termino de comprender es qué influencia pueden tener los Configuration Bits para que no me entre en la interrupción.
Ya investigaré. De momento voy a terminar de arreglar el pequeño estropicio que he armado toqueteando el código en los primeros intentos de solucionar el entuerto.

FIN DE LA HISTORIA.

Muchas gracias a todos los que os habéis interesado e intentado ayudarme respondiendo al hilo.

Miguel.
Mas vale tener la boca cerrada y parecer estúpido que abrirla y disipar toda duda.


 

anything