TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: pmoreno en 30 de Marzo de 2008, 16:09:30
-
Hola a todos,
Necesito capturar el cruce por cero de la senoidal 230v 50Hz. Utilizo un 12f683 y en otras aplicaciones lo realizo mediante el pin gp2 y la interrupción externa ( una r de 10M entre el pin y fase "2 de 5M en serie como protección", el neutro está conectado a negativo del circuito y cambio la detección del flanco de subida o bajada en cada semiciclo). El concepto de esquema es similar al del "Minidimmer" de Nocturno. Todo me funcionaba perfecto hasta que he necesitado ese pin ( que es CCP ) para generar pwm (no tengo ciclos para generarla por soft).
Estoy intentando utilizar la interrupcion por cambio de estado de cualquier otro pin pero no me funciona, os dejo copia de cómo lo hago esperando me aportéis alguna idea:
#INT_RA
void RA_isr(void){
if ( INPUT(PIN_A2) != FlancoAnterior ){
FlancoAnterior = !FlancoAnterior;
........
........
}
}
Este pic (12f683) dispone de interrupciones para cambio de estado individual de un pin pero no he conseguido que CCS me admita directivas del tipo:
#INT_RA1
Agradecería cualquier ayuda o sugerencia.
Un saludo a todos.
-
Hola amigos!
por que no usa el Buscador ya en Foro se ha hablado muchos de estos, eso que desea es algo complicado dependiendo su uso, te recomiendo use el Buscador en el Foro General
Saludo
-
Hola de nuevo,
Muchas gracias por la sugerencia. Debí añadir al post que ya me he leído en el foro todo lo que he encontrado relacionado con el tema de captura de paso por cero. Creí que el texto dejaba por sentado que sé cómo implementarlo y ya lo he hecho otras veces y quizás debí resumir la cuestión de la siguiente manera:
Hola a todos,
Después de documentarme en este foro y otros recursos, decidí implementar la deteccion de cruce por cero de la senoidal 230v 50h utilizando el sistema que propone la AN521 de Microchip. Algunos habéis probado y teneis experiencia con ello y consiste en capturar los cambios en flancos de bajada y subida desde la int_ext del pic conectando el pin correspondiente a fase utilizando como limitador de intensidad una resistencia ( el negativo del circuito deberá estar conectado a neutro ).
Ahora debido a que, en el modelo de pic que utilizo, el pin para int_ext es el mismo que para generar pwm, y necesito esta última función querría consultaros si es posible con el mismo método de conexion capturar el cruce por cero desde otro pin ( en lugar de utilizar la int_ext, aprovechar la interrupción por cambio de estado int_ra ). Lo he intentado, no lo he conseguido y no encuentro fallo software. El código de la interrupcion está en mi primer post. Por razones constructivas lo deseable es no añadir componentes.
Un saludo,
-
Tal vez sería más fácil hacer el PWM por software en otro pin.
Un saludo
-
Según las definiciones de dicho micro en CCS puedes utilizar todas estas interrupciones:
// Constants used in ENABLE/DISABLE_INTERRUPTS() are:
#define GLOBAL 0x0BC0
#define INT_RTCC 0x0B20
#define INT_EXT 0x0B10
#define INT_AD 0x8C40
#define INT_TIMER1 0x8C01
#define INT_TIMER2 0x8C02
#define INT_TIMER0 0x0B20
#define INT_EEPROM 0x8C80
#define INT_COMP 0x8C08
#define INT_RA 0x0B08
#define INT_CCP1 0x8C20
#define INT_OSC_FAIL 0x8C04
#define INT_RA0 0x010B08
#define INT_RA1 0x020B08
#define INT_RA2 0x040B08
#define INT_RA3 0x080B08
#define INT_RA4 0x100B08
#define INT_RA5 0x200B08
¿Cuál es el error que te da si compilas con INT_RA1?
-
Hola, INT_RA1, INT_RA2, etc. solo pueden ser utilizados en enable_interrupts();
si se utilizan como #INT_RA1, el programa no compila.
Para entrar a la interrupcion debes utilizar #INT_RA y dentro de la interrupcion ver que pin cambio de estado, eso si activaste mas de un int_rax.
Saludos
-
ok, gracias por la ayuda. No acababa de entender el tema de int_ra1,int_ra2 y demás. Ahora habilito la interrupción como int_ra1 y en la rutina de atención utilizo la directiva #int_ra.
Como es el unico pin con interrupcion por cambio habilitada el sistema ha sido sencillo.
Me ha quedado libre gp2 para generacion de pwm y además me ahorro cambiar el flanco de detección en cada cruce por cero (usando int_ext era obligatorio).
Un saludo,