TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Cryn en 02 de Junio de 2010, 21:51:59

Título: [RESUELTO] Problema con interrupción externa 0 en C18
Publicado por: Cryn en 02 de Junio de 2010, 21:51:59
Hola, empezando con las interrupciones en C18, con las guías de suky y microcadver; me tropecé con esto para un micro 18F1320:

Código: C#
  1. #include <p18f1320.h>
  2. #include <delays.h>
  3. #include <portb.h>
  4.  
  5. #pragma config OSC=INTIO2, FSCM=OFF, IESO=OFF, PWRT=ON, BOR=OFF, WDT=OFF, MCLRE=ON, STVR=OFF
  6. #pragma config LVP=OFF, DEBUG=OFF, CP0=OFF, CP1=OFF, CPB=OFF, CPD=OFF, WRT0=OFF, WRT1=OFF
  7. #pragma config WRTB=OFF, WRTC=OFF, EBTR0=OFF, EBTR1=OFF, EBTRB=OFF
  8.  
  9. #define true 1
  10.  
  11. volatile char bandera=0;
  12. char a=0;
  13.  
  14. void int_extISR(void);
  15.  
  16. // Creamos una nueva seccion de codigo a partir de la direccion 0x08.-
  17. #pragma code Interrupcion = 0X0008
  18. void VectorInterrupcion(void){
  19.   _asm goto int_extISR _endasm
  20. }
  21. #pragma code // Cerramos seccion.-
  22.  
  23. // Rutina de Interrupcion.-
  24. #pragma interrupt int_extISR
  25. void int_extISR(void){
  26.   if(INTCONbits.INT0IF==1){
  27.     bandera=1;       // Indicamos que se ha producido la interrupción.-
  28.     INTCONbits.INT0IF=0;  // Borramos bandera.-
  29.   }
  30. }
  31.  
  32. void main(void){
  33.         OSCCON=0b1110010;       //Oscilador interno a 8MHz
  34.         TRISA=255;                      //puerto a entradas
  35.         TRISB=0x7f;                     //solo RB7 salida
  36.         LATBbits.LATB7=1;       //RB7 puesto a uno
  37.         OpenRB0INT(PORTB_CHANGE_INT_ON & FALLING_EDGE_INT & PORTB_PULLUPS_OFF);
  38.         //INTCON = 0X90;//configuramos la interrupcion externa del RB0
  39.         //INTCON2 = 0X40;//configuramos el flanco de subida para la interrupcion
  40.         RCONbits.IPEN=0;  // Deshabilitamos Prioridades
  41.         //INTCONbits.INT0IE=1;  //Habilitamos Interrupción Externa 0
  42.         INTCONbits.GIE=1;    // Habilitamos interrupcion Global.
  43.         while(true){
  44.                 if(bandera==1){
  45.                         do{}while(PORTBbits.RB0==0);
  46.                         if(a==0)
  47.                                 PORTBbits.RB7=0;
  48.                         else
  49.                                 PORTBbits.RB7=1;
  50.                         a=~a;
  51.                         bandera=0;
  52.                 }
  53.         }
  54. }
He estado simulando en proteus 7.4sp3con el .cof y no ocurre la interrupción en el flanco de bajada al que lo configuré, no se donde está el error, o que podría faltar, ya revisé y revisé y no pillé nada... será porque soy muy noob con C18?

He probado con OpenRB0INT y sin open también, solo configurando los registros correspondientes y nada, o será que me falta algún registro por configurar?

Espero puedan ayudarme con este programa, muchas gracias.

saludos.
Título: Re: Problema con interrupción externa 0 en C18
Publicado por: Cryn en 07 de Junio de 2010, 11:21:30
Se me olvidó aclarar que lo probaba en la simulación de proteus y también en circuito real armado.

Al final pude dar con el problema, es que faltaba darle las configuraciones al conversor A/D:

ADCON1=0x7f;

y listo con eso ya funciona muy bien, pero lo que me extraña es el tipo de error, ya que ni por si acaso estaba usando algún pin del conversor A/D :?

total, ahora a colocar siempre digitales aunque no se usen los pines Analógicos como Digitales.
Título: Re: Problema con interrupción externa 0 en C18
Publicado por: willynovi en 07 de Junio de 2010, 11:29:53
Eso de inicializar los A/D como entradas digitales lo he visto en los programas de demo de microchip, no he averiguado porque es esto, pero como norma debe hacerse así. Luego miro algo del datasheet a ver si dice algo de esto, por simple curiosidad.

Luego en caso de usar cada uno de los A/D lo inicializas a demanda.