Autor Tema: Interrupcion para PWM  (Leído 1552 veces)

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

Desconectado Ryuzaki

  • PIC10
  • *
  • Mensajes: 16
Interrupcion para PWM
« en: 29 de Junio de 2015, 23:23:02 »
Buenas, soy nuevo en el foro. Estoy precisando saber como agregarle una interrupcion al modulo PWM en MikroC, para que cuando aumento el duty1 al llegar a 255 no se pase a 0. De interrupciones se muy poco y lo que estuve leyendo no lo pude entender lo suficiente como para ponerlo en practica. Dejo el programa adjunto. Espero que alguien pueda darme una mano ya que la necesito con urgencia, gracias!  :)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Interrupcion para PWM
« Respuesta #1 en: 30 de Junio de 2015, 05:19:29 »
Las interrupciones no es de lo que vos quieras hacer, por ejemplo el timer es por rebosamiento, el portb algunos es por flanco y otros por nivel. etc
El modulo PWM no posee "inetrrupcion propia" sino que la unica interrupcion que se podria usar es la del TMR y la del CCP. Pero nada de esto te va a ayudar.
Lo tuyo es solucionable modificando un poco el programa.

Código: C
  1. void main()
  2. {
  3. short duty1 = 125; // initial value for Duty cycle
  4.  
  5. TRISD = 0xFF; // Set PORTD as input
  6. TRISC = 0X00; // Set PORTC as output
  7.  
  8. PWM1_Init(2000);
  9. PWM1_Start();
  10. PWM1_Set_Duty(duty1);
  11.  
  12.         while (1)
  13.         {
  14.                 if (!PORTD.F0)                                  // PORTD.F0=0 ? , si el resultado de PORTD.F0 es 0, el ! lo "niega" y queda en 1, por lo tanto entra al if, si es 1 el "negado" seria 0 y no entraria.
  15.                 {
  16.                         Delay_ms(10);                           // Antirebote
  17.                         while(!PORTD.F0);                       // Espero que suelte antes de aumentar, es decir mientras sea 0 PORTD.F0 va a estar atrapado aca, es util para que cuando se presione no cuente muchas veces, sino que entre 1 ves
  18.                         if(duty1<=250)                          // duty1 es menor o igual a 250? si es 250+5 = 255 maximo
  19.                         {
  20.                                 duty1 += 5;                     // Sumo 5, lo mismo que hacer duty1 = duty1 + 5
  21.                         }
  22.                         else
  23.                         {
  24.                                 duty1=255;                      // Si llego aca es por que es 251,252,253,254 o 255, cualquiera sea si sumo el tope es 255
  25.                         }
  26.                         PWM1_Set_Duty(duty1);                   // Seteo duty
  27.                 }
  28.                 else if(!PORTD.F1)                              // No se presiono PORTD.F0 y se presiono PORTD.F1 , es decir PORTD.F1=0
  29.                 {
  30.                         Delay_ms(10);                           // Antirebote
  31.                         while(!PORTD.F1);                       // Espero que suelte el boton
  32.                         if(duty1!=0)                            // Aca puedo preguntar por 0 ya que se resta de a 1, si restara de a 5 como el anterior
  33.                         {                                       // deberia hacer algo parecido, para cuando es mayor o igual a 5 if(duty1>=5){duty1-=5;}else{duty1=0;}
  34.                                 duty1--;                        // Resto duty
  35.                                 PWM1_Set_Duty(duty1);           // Seteo el duty
  36.                         }
  37.                 }
  38.         }
  39. }

Consejo: el anidado ( con el TAB y no con un espacio ) hace que sea mucho mas legible el codigo
« Última modificación: 30 de Junio de 2015, 05:28:11 por KILLERJC »

Desconectado Ryuzaki

  • PIC10
  • *
  • Mensajes: 16
Re: Interrupcion para PWM
« Respuesta #2 en: 30 de Junio de 2015, 23:47:02 »
Muchas gracias!!
Como sería para hacer una interrupcion de ccp??
Porque el tema es que esos pulsadores son de un mando remoto para un drone, pero cada vez que el drone se desestabiliza debería interrumpir mi mando y permitir el acelerometro, por el momento no tengo idea de como hacer el programa ni tengo algun esquematico. Pero me vendría de 10 si me pudieses explicar como usar la interrupcion, que cosas deveria tener en cuenta? que banderas usar? como saber cuales? Desde ya muchas gracias!  :mrgreen:

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Interrupcion para PWM
« Respuesta #3 en: 01 de Julio de 2015, 02:43:03 »
el CCP es el modulo de Capture/Compare/PWM

Esa interrupcion sucede cuando el TMR2/1/3 segun el PIC que sea, se compara con el contenido del registro del modulo CCP (CCPRxL/CCPRxH), cuando son iguales produce una interrupcion, en realidad activa una flag ( un bit ) que si esta activada la interrupcion, executa el codigo de interrupcion, esto vendria a ocurrir cuando se cumple el periodo del PWM, si observas esto es inutil para lo que queres hacer.

Citar
Porque el tema es que esos pulsadores son de un mando remoto para un drone,

Eso quiere decir que va a ir por RF, y luego va a entrar de forma serial al micro, segun como sea la interfaz de tu modulo receptor ( por ejemplo SPI,UART,etc ) podes usar la interrupcion de esos modulos.
Creo que estas confundiendo el concepto de "interrupcion"

La interrupcion es algo que saca al programa de su flujo normal, es decir lo que esta haciendo para ejecutar lo otro ( que es urgente ) y luego volver a lo que estaba haciendo. Basicamente eso es responder rapido a esa peticion.
Tu programa del drone para poder hacer lo que queres deberias tener algo asi:

- Tu control deberia enviar SI o SI cierta informacion cada cierto tiempo. Esto te va a permitir 2 cosas, saber que se esta mandando datos, como para saber que se perdio la señal del control, si en cierto tiempo no se detecto nada, entonces que se maneje solo.
En eso, tu programa deberia hacer su funcionamiento y leer si hay o no señal del control, teniendo 2 interrupciones, una para la llegada de datos del control y otra de un timer, entonces cada ves que llega un dato entra a una interrupcion, guarda el dato y pones a 0 el timer, de esa forma ocurren 2 cosas, una que tu dato se atendio lo mas rapido posible, y segundo que estas reiniciando el timer ( al enviarse a cada rato una señal),
Si en un momento el control pierde señal con el drone, el timer no se va a reiniciar y se produciria una interrupcion, esa interrupcion pondria a 1 un bit que luego al programa principal le va a indicar que debe usar el accelerometro para posicionarse correctamente.

Código: C
  1. Int_Recepcion(){
  2.         guardo_dato();
  3.         TMR = 0;
  4.         todo_ok=1;     
  5. }
  6.  
  7. Int_Timer(){
  8.         todo_ok=0;
  9. }
  10.  
  11. Prog_principal(){
  12.         while(1)
  13.         {
  14.                 if(todo_ok==1)
  15.                 {
  16.                         hago_caso_al_control();
  17.                 }
  18.                 else
  19.                 {
  20.                         hago_caso_al_accelemetro();    
  21.                 }
  22.         }
  23. }

Citar
pero cada vez que el drone se desestabiliza debería interrumpir mi mando y permitir el acelerometro, por el momento no tengo idea de como hacer el programa ni tengo algun esquematico. Pero me vendría de 10 si me pudieses explicar como usar la interrupcion, que cosas deveria tener en cuenta? que banderas usar? como saber cuales?

Antes te di el caso de cuando se pierde la señal del control. Con respecto al sobre lo de "desestabilizarse" eso va a depender de tu programa, yo pienso que deberia leer siempre el accelerometro, y actuar segun el valor de este, si esta dentro de los rangos correctos hacerle caso al control y cosas asi.

Como usar la interrupcion?
Te puedo dar ejemplos burdos pero en MikroC no se, no lo utilizo y deberias buscar algun ejemplo simple de interrupcion.
Que interrupciones usar?
Eso ya depende de vos, cada modulo posee una interrupcion, esas te pueden o no servir, de ahi es tu imaginacion como las combines para que te sirva alguna, o para que haga cierta accion. Para saber todas las interrupciones simplemente te vas al datasheet y ahi esta todo.
Que banderas usar?
No se a que banderas te referis, si es el de las interrupciones , va a depender de que interrupcion uses, si es la de algun modulo esta explicado en el datasheet, incluso al final de cada seccion de cada modulo aparece la lista de registros que usa ese modulo, y ahi tenes los bits que usa.

Desconectado Ryuzaki

  • PIC10
  • *
  • Mensajes: 16
Re: Interrupcion para PWM
« Respuesta #4 en: 01 de Julio de 2015, 13:18:28 »
Genial! muchas gracias crack me aclarastes muchas dudas!!
Ya se masomenos por donde tengo que trabajarlo, cualquier problemita que me surga seguro te lo comente!
Saludos!  :mrgreen: