PicManía by RedRaven
 

Búsqueda personalizada

 

TÉCNICAS  EN C

 
 


Tareas Comunes Realizadas en C

 
 

Esta serie de contenidos titulada Técnicas en C pretende mostrar con ejemplos comentados la forma de implementar ciertos procesos muy usuales durante el uso de los Microcontroladores PIC de las series 16F y 18F.

 


  Midiendo un pulso. 2ª Parte. Tiempo en Alto mediante INTCCP


 
  • Seguimos dándole vueltas al Tema de Capturar el ancho de un pulso ...
  • En Midiendo un pulso. 1ª Parte. Tiempo en Alto con INTEXT hemos utilizado la técnica de recoger el valor de TMR1 cuando ocurre la interrupción externa por RB0, sea en el flanco de caída, sea en el de subida. Con los valores de ambos flancos y simplemente restando el uno del otro tenemos el valor del ancho del pulso.
  • Hay otra manera de hacer exactamente lo mismo de una forma absolutamente similar: Utilizando el módulo CCP del PIC funcionando en modo Capture.
A.- Conceptos involucrados:
 
  • Los conceptos son exactamente los mismos que los descritos en la parte anterior por lo que os ruego que la consultéis si os es necesario: Midiendo un pulso. 1ª Parte
 
B.- Técnica a Aplicar:
 
  • El módulo hardware CCP del PIC en configuración Capture realiza de forma automática (por hardware) lo que implementamos en nuestro anterior Técnica en C mediante la interrupción externa por RB0.
  • Cuando activamos el módulo CCP, le configuramos el flanco que deseamos que lo dispare, subida o bajada, automáticamente cada vez que se nos presente dicho flanco en el pin correspondiente se copia el valor de TMR1, de 16 bits, en la pareja de registros CCPRL y CCPRH.
  • Cada vez que llega un flanco tenemos en CCPR el valor en ese momento de TMR1.
  • Si además habilitamos la Interrupción CCP del PIC se producirá además una Petición de Servicio para esta interrupción cada vez que nuestro esperado flanco se presente en el pin correspondiente.
  • En esta rutina de interrupción podremos así cambiar el modelo de flanco a utilizar para el siguiente disparo del CCP, cambiándolo ahora al flanco de bajada, y así en el siguiente  disparo tendremos en CCPR el nuevo valor de TIMER1 con lo restando éste del anterior tendremos el ancho de pulso en High que deseamos.
  • Como veis es absolutamente idéntico al método anterior pero sin tener que recoger "a mano" el valor de TMR1.
 
C.- Implementación en C:
 
  • Nota Importante: En mi ejemplo utilizo el 18F4550 de la RRBOARD2 usando del módulo CCP2, de los dos que tiene este PIC, configurándolo además para que CCP2 en lugar de estar en RC1 como originalmente está configurado y que estoy usando para otras cosas, se multiplexe por RB3 que lo tengo libre. Esto último se consigue en el 18F4550 usando el fuse CCP2B3.
  • Para configurar inicialmente el flanco de subida a detectar utilizaremos igual que en la primera parte:

     
 
setup_ccp2(CCP_CAPTURE_RE);  // Configuro captura de 1er flanco de subida
flagToggleFlanco = 0;        // inicializo el Flag para cambiar de flanco
enable_interrupts(int_rda);  // Habilito las interrupciones necesarias
enable_interrupts(int_ccp2);
enable_interrupts(global);
 
     
 
  • Nuestra rutina ISR para CCP quedaría como sigue:

     
  #int_ccp2
void handle_ccp2_int(){
  if(flagToggleFlanco==0){      // He recibido Flanco de Subida
    t1=get_timer1();            // Guardo en t1 el valor de TMR1 al Flanco de Subida
    setup_ccp2(CCP_CAPTURE_FE); // Configuro para capturar siguiente flanco de Bajada
    flagToggleFlanco=1;         // Indico que el siguiente flanco será de Bajada
  } else {                      // He recibido Flanco de Bajada
    t2=get_timer1();            // Guardo en t2 el valor de TMR1 al Flanco de Bajada
    setup_ccp2(CCP_CAPTURE_RE); // Configuro para capturar siguiente flanco de subida
    flagToggleFlanco=0;         // Indico que el siguiente flanco será de Subida
    set_timer1(0);              // Reinicio TMR1
    if(flagHayDatos==0){        // Si los datos anteriores han sido procesados ...
      flagHayDatos=1;           // Indico que ya hay nuevos datos de flancos para calcular
    }
  }
}
 
     
 
 
D.- Ejemplo funcionando:
 

 

 

Esta página se modificó el 27/12/2008


Esta página usa la letra Ñ

Nota pública importante sobre las consultas al Webmaster de PicManía.


Sugerencias a Picmanía... (que serán leídas pero seguramente no podrán ser contestadas)

Esta página pertenece al grupo de páginas de Diego RedRaven

 

 



Nota: Esta página Web esta repleta de imágenes, textos, logotipos y demás material extraídos de los mas variados medios de los que no soy ni autor ni depositario de los correspondientes derechos de autor, uso y/o reproducción. Si Ud. es depositario de dichos derechos y desea que el material correspondiente sea eliminado de esta Web no dude en ponerse en contacto conmigo mediante e-mail y será inmediatamente retirado. Gracias.
 
Visitas
Totales : 15231 Hoy: 2 Activas: 1 Vistas: 15231

Esta página fue modificada el 07-08-2010 15:42:20

           
 DmSoft WAMP Escribir Unreal