Autor Tema: Cursillo en C18 para PICS DESDE CERO  (Leído 250322 veces)

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

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #330 en: 09 de Abril de 2011, 12:54:18 »
Gracias maestro Suky por la respuesta.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #331 en: 09 de Abril de 2011, 21:33:24 »
Hola de nuevo, no doy pie con bola, estoy seguro que es una tonteria en la configuracion, pero no consigo que funcione con la interrupcion de baja prioridad  :5]
Código: CSS
  1. //********************************************************************************
  2. /* ** Programa para generar una Interrupcion cada 4,096ms usando el TIMER0 ** */
  3. /* ** Con Interrupcion de Baja Prioridad ** */
  4. //********************************************************************************
  5.  
  6. /* ** Archivo con definicion de registros y bits del microcontrolador elegido ** */
  7.  
  8. #include <p18f4550.h>
  9.  
  10. /* ** Include para realizacion de Demoras ** */
  11.  
  12.  
  13.  
  14. /* ** Include para Timer0 ** */
  15.  
  16. #include <timers.h>
  17.  
  18. /* ** Configuracion de los Fuses del microcontrolador ** */
  19.  
  20. #pragma config FOSC = XT_XT,FCMEN = OFF,IESO = OFF,CPUDIV = OSC1_PLL2
  21. #pragma config PWRT = ON,BOR = OFF,BORV =0,WDT = OFF
  22. #pragma config WDTPS = 32768,CCP2MX = OFF,PBADEN = OFF,LPT1OSC = OFF
  23. #pragma config MCLRE = ON,STVREN = OFF,LVP = OFF,ICPRT = OFF
  24. #pragma config XINST = OFF,DEBUG = OFF,CP0 = OFF,CP1 = OFF
  25. #pragma config CP2 = OFF,CP3 = OFF,CPB = OFF,CPD = OFF
  26. #pragma config WRT0 = OFF,WRT1 = OFF,WRT2 = OFF,WRT3 = OFF
  27. #pragma config WRTC = OFF,WRTB = OFF,WRTD = OFF,EBTR0 = OFF
  28. #pragma config EBTR1 = OFF,EBTR2 = OFF,EBTR3 = OFF,EBTRB = OFF
  29.  
  30. /* ** Directivas de Preprocesador ** */
  31.  
  32. //#define LED_ROJO              LATBbits.LATB0
  33. //#define LED_VERDE             LATBbits.LATB1
  34.  
  35. /* ** Declaracion de Funciones a utilizar ** */
  36.  
  37. void Temporizacion(void);
  38.  
  39. /* ** Variables de uso General ** */
  40.  
  41. volatile int Cont = 0;
  42.  
  43. /* ** Seccion de codigo a partir de la direccion 0x18 ** */
  44.  
  45. #pragma code interrupcion = 0x18
  46. void VectorInterrupcion(void)
  47. {
  48.         _asm goto Temporizacion _endasm
  49. }
  50. #pragma code    // Cerramos seccion.-
  51.  
  52. /* ** Rutina de Interrupcion ** */
  53.  
  54. #pragma interrupt Temporizacion
  55. void Temporizacion(void)
  56. {
  57.         if(INTCONbits.TMR0IF==1)
  58.         {
  59.                 PORTB=~PORTB;
  60.                 Cont++;
  61.                 INTCONbits.TMR0IF=0;
  62.         }
  63. }
  64.  
  65.  
  66. /* ** Main ** */
  67.  
  68. void main(void)
  69. {
  70.  
  71. ADCON1 = 0X0F;
  72. TRISB = 0X00;
  73. PORTB = 0X00;
  74. OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_16);
  75. INTCON2bits.TMR0IP = 0;         // Prioridad baja.-
  76. RCONbits.IPEN = 0;              // Desabilitamos nivel de Prioridad.-
  77. INTCONbits.GIE = 1;
  78. INTCONbits.TMR0IE = 1;
  79. WriteTimer0(0);         // Inicializamos el Timer0.-
  80.        
  81. while(1);
  82. }

Saludos
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #332 en: 09 de Abril de 2011, 22:36:09 »
Pero si es con prioridades tenes que colocar:

RCONbits.IPEN=1;         // Habilitamos prioridades.-
INTCONbits.GIEL=1;         // Habilitamos interrupciones de baja prioridad.-

Vector 0x0018

Sino:

RCONbits.IPEN=0;    // Deshabilitamos Prioridades
INTCONbits.PEIE=1;    // Habilitamos interrupcion de perifericos .-
INTCONbits.GIE=1;    // Habilitamos interrupcion Global .

Vector 0x0008

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #333 en: 10 de Abril de 2011, 13:07:38 »
Gracias Suky por tu tiempo, lei lo del PEIE/GIEL pero entendi que era para configurar las interrupciones donde uses perifericos.
When IPEN = 1 (1= Enables all low-priority peripheral interrupts)

Gracias de nuevo.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #334 en: 10 de Abril de 2011, 13:14:26 »
 :oops: Perdon se me habia olvidado,  para realizar un ciclo for para que repita la interrupcion un cierto numero de veces, es mejor hacerlo dentro de la misma interrupcion o por el contrario hacerlo en el main.

Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #335 en: 11 de Abril de 2011, 10:07:36 »
Lo mejor es tener el menor código posible dentro de una interrupción, setear banderas o algun proceso corto, preferiblemente dejar de lado ciclos largos y retardos del orden de los milisegundos. Ya en el main, a partir de las banderas cambiadas, realizar lo procesos necesarios.

No he trabajado con las interrupciones de baja prioridad todavía, seguramente es algún detallito en las configuraciones, revisa con más detenimiento la hoja de datos.
.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #336 en: 11 de Abril de 2011, 13:15:59 »
No entendí, sigue sin funcionar?

El tema de las interrupciones, depende de que se trate... Pero lo mejor es como dice Cryn, activar una bandera y tratarla en el bucle principal.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #337 en: 11 de Abril de 2011, 16:43:48 »
Miquel_S :
         Puntualmente en esto no entiendo a que te referís:
...repita la interrupcion un cierto numero de veces..
              Saludos a todos.
               Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #338 en: 11 de Abril de 2011, 16:47:41 »
Gracias por vuestras respuestas, de funcionar me funciona, despues de configurar lo que Suky me dijo, preguntaba lo del ciclo for porque me interesaba repetir hasta conseguir 20ms,  pero lo hice con do while, pero necesita terminar de pulir.

De nuevo Muchas Gracias.
Código: CSS
  1. //********************************************************************************
  2. /* ** Programa para generar una Interrupcion cada 4,096ms usando el TIMER0 ** */
  3. /* ** Con Interrupcion de Baja Prioridad ** */
  4. //********************************************************************************
  5.  
  6. /* ** Archivo con definicion de registros y bits del microcontrolador elegido ** */
  7.  
  8. #include <p18f4550.h>
  9.  
  10. /* ** Include para realizacion de Demoras ** */
  11.  
  12.  
  13.  
  14. /* ** Include para Timer0 ** */
  15.  
  16. #include <timers.h>
  17.  
  18. /* ** Configuracion de los Fuses del microcontrolador ** */
  19.  
  20. #pragma config FOSC = XT_XT,FCMEN = OFF,IESO = OFF,CPUDIV = OSC1_PLL2
  21. #pragma config PWRT = ON,BOR = OFF,BORV =0,WDT = OFF
  22. #pragma config WDTPS = 32768,CCP2MX = OFF,PBADEN = OFF,LPT1OSC = OFF
  23. #pragma config MCLRE = ON,STVREN = OFF,LVP = OFF,ICPRT = OFF
  24. #pragma config XINST = OFF,DEBUG = OFF,CP0 = OFF,CP1 = OFF
  25. #pragma config CP2 = OFF,CP3 = OFF,CPB = OFF,CPD = OFF
  26. #pragma config WRT0 = OFF,WRT1 = OFF,WRT2 = OFF,WRT3 = OFF
  27. #pragma config WRTC = OFF,WRTB = OFF,WRTD = OFF,EBTR0 = OFF
  28. #pragma config EBTR1 = OFF,EBTR2 = OFF,EBTR3 = OFF,EBTRB = OFF
  29.  
  30. /* ** Directivas de Preprocesador ** */
  31.  
  32. //#define LED_ROJO              LATBbits.LATB0
  33. //#define LED_VERDE             LATBbits.LATB1
  34.  
  35. /* ** Declaracion de Funciones a utilizar ** */
  36.  
  37. void Temporizacion(void);
  38.  
  39. /* ** Variables de uso General ** */
  40.  
  41. volatile int Cont = 0;
  42. int FlagRTCC=0;
  43.  
  44. /* ** Seccion de codigo a partir de la direccion 0x0018 ** */
  45.  
  46. #pragma code interrupcion = 0x0018
  47. void VectorInterrupcion(void)
  48. {
  49.         _asm goto Temporizacion _endasm
  50. }
  51. #pragma code    // Cerramos seccion.-
  52.  
  53. /* ** Rutina de Interrupcion ** */
  54.  
  55. #pragma interrupt Temporizacion
  56. void Temporizacion(void)
  57. {
  58.         if(INTCONbits.TMR0IF==1)
  59.         {
  60.                 Cont++;
  61.                         if(Cont==4)
  62.                         {
  63.                                 WriteTimer0(52);
  64.                         }
  65.                         if(Cont==5)
  66.                         {
  67.                                 FlagRTCC=1;
  68.                                 Cont=0;
  69.                         }
  70.                 INTCONbits.TMR0IF=0;
  71.         }
  72. }
  73.  
  74.  
  75. /* ** Main ** */
  76.  
  77. void main(void)
  78. {
  79.  
  80. ADCON1 = 0X0F;
  81. TRISB = 0X00;
  82. PORTB = 0X00;
  83. OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_16);        // Config.Timer0.-
  84. INTCON2bits.TMR0IP = 0;         // Prioridad baja.-
  85. RCONbits.IPEN = 1;              // Habilitamos nivel de Prioridad.-
  86. INTCONbits.GIEL = 1;            // Habilitamos todas las Interrupt de baja prioridad.-
  87. INTCONbits.GIE = 1;             // Permite todas las interrupt de alta Prioridad.-
  88. INTCONbits.TMR0IE = 1;          // Habilitamos Interrupt por overflow .-
  89. WriteTimer0(0);         // Inicializamos el Timer0.-
  90.        
  91. do
  92. {
  93.         if(FlagRTCC==1)
  94.         {
  95.                 FlagRTCC=0;
  96.                 PORTB=~PORTB;
  97.         }
  98.                
  99. } while (1);
  100. }
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #339 en: 18 de Abril de 2011, 16:56:38 »
Hola de nuevo, me surge otra duda, quisiera hacer dos interrupciones una para el TMR0 la cual la tengo funcionando, y otra para el control del RS232.
Teniendo esta parte de codigo:
Código: CSS
  1. /* ** Seccion de codigo a partir de la direccion 0x0018 ** */
  2.  
  3. #pragma code interrupcion = 0x0018
  4. void VectorInterrupcion(void)
  5. {
  6.         _asm goto Temporizacion _endasm
  7. }
  8. #pragma code    // Cerramos seccion.-
  9.  
  10. /* ** Rutina de Interrupcion ** */
  11.  
  12. #pragma interrupt Temporizacion
  13. void Temporizacion(void)
  14. {
  15.         if(INTCONbits.TMR0IF==1){
  16.                 Cont++;
  17.                         if(Cont==4){
  18.                                 WriteTimer0(AJUSTE_FINO);
  19.                         }
  20.                         if(Cont==5){
  21.                                 FlagRTCC=1;
  22.                                 Cont=0;
  23.                         }
  24.                 INTCONbits.TMR0IF=0;
  25.         }
  26. }
Seria correcto poner otro _asm goto Interrupt_RS232 _endasm dentro del mismo #pragma code interrupcion = 0x0018, o por el contrario debo crear otro #pragma code usando la misma direccion del vector de interrupcion que estoy usando.

Gracias

Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #340 en: 18 de Abril de 2011, 17:53:17 »
No, ahora es como en ASM, si tienen la misma prioridad pregunta por la bandera xxIF para saber cual interrupción se ha activado.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #341 en: 18 de Abril de 2011, 18:05:10 »
Hola Suky, gracias por tu pronta respuesta, no estoy seguro de entender lo que propones pero lo intentare, entiendo lo de explorar la bandera,  pero seria escribiendo otro #pragma code en la misma direccion.
 
Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #342 en: 18 de Abril de 2011, 18:35:42 »
Hola Suky, gracias por tu pronta respuesta, no estoy seguro de entender lo que propones pero lo intentare, entiendo lo de explorar la bandera,  pero seria escribiendo otro #pragma code en la misma direccion.
 
Gracias.

No, Así:

Código: C
  1. #pragma code interrupcion = 0x0018
  2. void VectorInterrupcion(void)
  3. {
  4.         _asm goto Interrupcion _endasm
  5. }
  6. #pragma code    // Cerramos seccion.-
  7. /* ** Rutina de Interrupcion ** */
  8.  
  9. #pragma interrupt  Interrupcion
  10. void  Interrupcion(void)
  11. {
  12.         if(INTCONbits.TMR0IF==1){
  13.                 Cont++;
  14.                         if(Cont==4){
  15.                                 WriteTimer0(AJUSTE_FINO);
  16.                         }
  17.                         if(Cont==5){
  18.                                 FlagRTCC=1;
  19.                                 Cont=0;
  20.                         }
  21.                 INTCONbits.TMR0IF=0;
  22.         }
  23.         if(PIR1bits.....){
  24.        
  25.         }
  26.         if(PIR1bits....){
  27.  
  28.         }
  29. }

No hay que confundir el tema de los #pragma code, alli solo estás diciendo que en el vector 0x0018 se coloque un goto a la función ISRxxx, en tu caso la llamaste Temporización. Si colocas otro #pragma code con la misma dirección el compilador debe indicar error o sobre-escribir el anterior.





Saludos!
« Última modificación: 18 de Abril de 2011, 18:38:08 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #343 en: 18 de Abril de 2011, 18:48:04 »
Hola suky, tengo una pregunta, como se convierte 2 variables de 8 bits a una de 16bits?

Esto lo quisiera para convertir los 2 datos leídos del ADC, y colocarlos a una solo variable INT.

muchas gracias, un saludo
.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #344 en: 18 de Abril de 2011, 21:30:34 »
Hola suky, tengo una pregunta, como se convierte 2 variables de 8 bits a una de 16bits?

Esto lo quisiera para convertir los 2 datos leídos del ADC, y colocarlos a una solo variable INT.

muchas gracias, un saludo

Lo más fácil es crear un typedef con una estructura para poder cargar cada byte por separado, o usar punteros:

Código: C
  1. typedef union{
  2.      unsigned int Val;
  3.      struct{
  4.           unsigned char LB;
  5.           unsigned char HB;
  6.      };
  7. }VAL_INT16;
  8.  
  9. VAL_INT16 myVar;
  10.  
  11. myVar.LB=0x16;
  12. myVar.HB=0x56;

O con punteros;

Código: C
  1. unsigned char myVar;
  2.  
  3. *((char *)&myVar)=0x16;
  4. *((char *)&myVar+1)=0x56;


Saludos!
No contesto mensajes privados, las consultas en el foro


 

anything