Autor Tema: Ayudame por favor con las interrupciones de b4..b7 en el PIC16F886?  (Leído 2011 veces)

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

Desconectado piticlini

  • PIC10
  • *
  • Mensajes: 4
 Hola buena gente inteligente, ya es muy tarde y me duelen los ojos. Por mas que he buscado, preguntado no hay manera de que yo pueda hacer funcionar las interrupciones en un PIC16F886. Se que hay que convertir los pines de analogico a digitales y se que se utiliza ANSEL y ANSELH pero yo no puedo. juro que lo intente todo y nada resulto. Bueno... aqui estare, sentado a un ladito... atento! Gracias :shock:

P.D: Ah, ya se me olvidaba, dejo adjunto el proyecto para que no te me limites compadre. Un abrazo, gracias!

Este es el codigo:
Código: C
  1. #include <idea.h>
  2.  
  3. #Byte PortA= 5
  4. int flag=0;
  5.  
  6. #int_RB
  7. void  RB_isr(void)
  8. {
  9.    bit_set(PortA,0);
  10.    flag=1;
  11. }
  12.  
  13.  
  14.  
  15. void main()
  16. {
  17.    enable_interrupts (INT_rb) ;
  18.    enable_interrupts (global) ;
  19.    //ANSEL = 0; // Todos los pines de E / S se configuran como digitales
  20.    //ANSELH = 0;
  21.    set_tris_a (0); //Configurar el puerto A
  22.    set_tris_b (0b11110000); // RB[7 - 4] son entradas
  23.    port_b_pullups (true);
  24.  
  25.    while(TRUE)
  26.    {
  27.       if (flag==1) {
  28.          disable_interrupts (INT_TIMER0) ;
  29.          clear_interrupt (INT_rb); // RBIF = 0 limpia la bandera
  30.          flag=0;
  31.          delay_ms(100);
  32.          bit_clear (PortA,0);
  33.          enable_interrupts (INT_rb) ;
  34.          flag=0;
  35.          delay_ms(100);
  36.          bit_clear (PortA,0);
  37.       }
  38.    }
  39.  
  40. }
« Última modificación: 20 de Enero de 2018, 13:56:34 por piticlini »

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:Por que todos escriben ANSEL = ANSELH = 0; asi de facil y yo no puedo :?
« Respuesta #1 en: 09 de Enero de 2018, 03:08:04 »
Que tal PITICLINI. Casi no programo yo en C, uso mas el ensamblador pero bueno. Lo que entendi de tu codigo es que deseas habilitar las interrupciones por cambio de estado en RB.

Tienes que tener en cuenta dos cosas:

Tienes principalmente dos vectores super inportantes el primero que es el ORG 0x00 que es donde se va el micro despues del reset ó despues del encendido,  aqui es donde regularmente encuentras tu main. Y el org 0x04 que es el vector de interrupciones donde cada que existe una interrución el apuntador del micro se coloca en este bloque de codigo. Dependiendo del compilador que uses este se determina con algun nombre. Me parece que son void ISR() o algo similar.

Y tambien, tu codigo solo es un ciclo donde estas habilitando y deshabilitado las interrupciones cada 100ms.

Una interrupción solo se configura y se habilita una vez. Despues cuando entras al vector de ISR testeas los flags de acuerdo a la interrupción con la que desees trabajar.

Espero te sea de ayuda.

Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Por que todos escriben ANSEL = ANSELH = 0; asi de facil y yo no puedo :?
« Respuesta #2 en: 09 de Enero de 2018, 06:09:26 »
Tu problema es el compilador CCS, este compilador alienta al usuario a que no toque jamas un registro (distinto a XC8 que es directamente el registro ), y te manejes siempre con las funciones que el provee. entonces para hacer analogo los pines, lo haces con  setup_adc_ports (NO_ANALOGS), las interrupciones se habilitan al ultimo, y como ves tampoco es necesario definir PORTA.

Código: C
  1. #include <idea.h>
  2.  
  3.  
  4. #int_RB
  5. void  RB_isr(void)
  6. {
  7.    output_toggle(PIN_A0);
  8. }
  9.  
  10. void main()
  11. {
  12.    set_tris_a (0); //Configurar el puerto A
  13.    set_tris_b (0b11110000); // RB[7 - 4] son entradas
  14.    port_b_pullups (true);
  15.    setup_adc_ports (NO_ANALOGS);   // Lo mismo que ANSEL = ANSELH = 0
  16.    enable_interrupts (INT_rb) ;
  17.    enable_interrupts (global) ;
  18.  
  19.  
  20.    while(TRUE)
  21.    {
  22.    }
  23. }

Otra cosa mas... el compilador CCS por si solo modifica el TRIS a su gusto. es decir, si vos tenes output_high(PIN_B7) a pesar que vos pusiste su TRIS como entrada, el mismo compilador lo va a cambiar a salida, lo mismo si haces un input(PIN) lo cambia a entrada. Para quitar este comportamiento y que solo haga caso a tus TRIS, debes agregar las directivas de preprocesamiento:

#USE FAST_IO(A)
#USE FAST_IO(B)

Para mas informacion podes buscar el manual en PDF de CCS.

Desconectado piticlini

  • PIC10
  • *
  • Mensajes: 4
Re:Por que todos escriben ANSEL = ANSELH = 0; asi de facil y yo no puedo :?
« Respuesta #3 en: 09 de Enero de 2018, 13:43:51 »
Pinolillo hermano, gracias por tu guia ver el codigo de esa manera sin dudas ayuda a ubicar mejor la meta. Killer maestro que buena intervencion, me has aclarado muchisimo el camino, pero hermano aun sigo como piojo en una peluca, resulta que implemente tu consejo y nada. Incluso reemplaze mi codigo por el tuyo y nada. Ciertamente si antes pensaba que convertir los pines a digital resolveria el problema ahora ni eso. Me declaro nulo o vacio de mi cabeza jajaja.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Por que todos escriben ANSEL = ANSELH = 0; asi de facil y yo no puedo :?
« Respuesta #4 en: 09 de Enero de 2018, 21:29:08 »
proba tambien poniendo los comparadores como no conectados:

Código: C
  1. setup_comparator(NC_NC_NC_NC);

Desconectado piticlini

  • PIC10
  • *
  • Mensajes: 4
Re:Por que todos escriben ANSEL = ANSELH = 0; asi de facil y yo no puedo :?
« Respuesta #5 en: 10 de Enero de 2018, 00:27:11 »
Killer, gracias por la invaluable ayuda que me estas dando, honestamente aprecio muchisimo tu colaboracion. He intentado la posibilidad que me indicaste y no hubo un resultado diferente, tambien me he leido el datasheet del pic16f886 y aunque esta muy bien explicado ahi como implementar las interrupciones por cambio de estado en el puerto B no tengo el conocimiento y la experiencia suficientes para ponerlo en practica. De nuevo Killer gracias por tu pasiencia y tiempo.

Desconectado piticlini

  • PIC10
  • *
  • Mensajes: 4
Re:Ayudame por favor con las interrupciones de b4..b7 en el PIC16F886?
« Respuesta #6 en: 11 de Enero de 2018, 01:48:09 »
Sin lugar a dudas las noches son mas productivas que los dias y he logrado mucho. Consegui activar las interrupciones pero... pues si, siempre hay un pero. Aunque conozco cual es el flag no logro resetearlas antes de activarlas otra vez y se queda pegada la interrupcion en un ciclo sin fin.
Aqui dejo el codigo y en mi primera entrada esta un zip que incluye la simulacion de proteus.
Quien me hecha una mano por favor????

Código: C
  1. #include <idea.h>
  2. #USE FAST_IO(A)
  3. #USE FAST_IO(B)
  4.  
  5.  
  6. #byte TRISB_REG = 0x86
  7. #byte OPTION_REG = 0x81
  8. #bit RBPU = OPTION_REG.7 // option register RBPUbit - enables pullup resistors on port B if is clear
  9. #byte WPUB_REG = 0x95 // WPUB register, each bit enables the corresponding pullup resistor on port B if is set
  10. #byte IOCB_REG = 0x96 //defines which pin of port B may cause an interrupt if is set and if is enabled.
  11. #byte INTCON_REG = 0x8B
  12. #bit RBIE = INTCON_REG.3 //RB Port Change Interrupt Enable bit. Enables port B interrupts if is set.
  13. #bit RBIF = INTCON_REG.0 //RB Port Change Interrupt Flag bit. It is set if interrupt occured.
  14. #bit GIE  = INTCON_REG.7 //Global Interrupt Enable interrupts are enabled if is set.
  15.  
  16. #int_RB
  17. void  RB_isr(void)
  18. {
  19.    output_toggle(PIN_A0);
  20.    RBIE = 0;            //Interrupciones desabilitadas en el puerto B
  21.    //clear_interrupt (INT_rb);
  22.    //RBIE = 1;            //Interrupciones habilitadas en el puerto B
  23. }
  24.  
  25. void main()
  26. {
  27.    set_tris_a (0); //Configurar el puerto A  
  28.    setup_adc_ports( NO_ANALOGS );
  29.    trisb_reg = 0b11110000;     //PB[7 - 4] son entradas
  30.    RBPU = 0;                   // Pull-up resistencias habilitadas
  31.    WPUB_REG = 0b11110000;      //PB[7 - 4] pullup habilitadas
  32.    IOCB_REG = 0b11110000;      //PB[7 - 4] habilitadas las interrupciones
  33.    INTCON_REG = 0b11110000;  
  34.    RBIF = 0;            //Limpiar Flag
  35.    GIE = 1;    
  36.    RBIE = 1;            //Interrupciones habilitadas en el puerto B
  37.  
  38.    while(TRUE)
  39.    {
  40.    }
  41. }
« Última modificación: 11 de Enero de 2018, 02:01:17 por piticlini »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayudame por favor con las interrupciones de b4..b7 en el PIC16F886?
« Respuesta #7 en: 11 de Enero de 2018, 09:45:29 »
Lo raro es que CCS se encarga de limpiar el Flag por vos, no necesitas limpiarlo. Y actuando sobre todos los registros para eso pasate a XC8. Sino usa las funciones que te provee CCS