TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: tavisho en 19 de Septiembre de 2008, 14:09:42

Título: No consigo entrar a la int RB0/INT
Publicado por: tavisho en 19 de Septiembre de 2008, 14:09:42
Saludos. Estoy haciendo un programita para hacer un pwm sincronizado con una onda seno de 60 hz ( bastante común en méxico ). Para sincronizar, cuando la onda seno pasa por 0 debo empezar con el pwm, para ello quiero valerme de la interrupción RB0/INT conectado a un detector de cruce por zero con op amp, que tentativamente debería manda el pulso para la interrupción.
El problema es que no consigo entrar mediante esta forma que ls comento, y he probado el programa con un SW y si que funciona; por lo que les pregunto si saben de alguna forma de como sincronizar usando a RB0/INT, o se les ocurre otra?  :-/
Título: Re: No consigo entrar a la int RB0/INT
Publicado por: vszener en 19 de Septiembre de 2008, 15:39:48
¿En qué lenguaje de programación estás trabajando?

Tanto en el subforo de ASM como en el de C y el de Basic hay ejemplos ilustrativos de como activar dicha interrupción.

PD: Sube tu programa para que podamos verlo.


Suerte!!! ;)
Título: Re: No consigo entrar a la int RB0/INT
Publicado por: tavisho en 19 de Septiembre de 2008, 17:09:03
Acá les dejo el programa.
Código: [Seleccionar]
;**************************************************;
; Programa hecho por Octavio Mauricio López Sánchez;
; entusiaste de la programación de los PIC    ;
;**************************************************;
List p=16f877
include "p16f877.inc"
__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON & _BODEN_OFF & _LVP_OFF
cblock 0x20
Auxiliar
endc
;*****************************************************************;
;Este programa se hace cargo de la interrupción de RB0/INT   ;
;y enciende por un segundo el led en el bit RA1 si fue por RB0/INT;
;además de mostrar un mensaje en el lcd, con el fin de sincronizar;
; al pic con una onda seno de 60 hz de entrada al PIC   ;
;*****************************************************************;
org 0x00
goto Inicio
org 0x04
;***************************************************************;
; La rutina de tratamien de interrupción es el alma del programa;
; desde ella se maneja el LED a encennder y el mensaje a mostrar;
; por la pantalla del LCD 2x16 ;
;***************************************************************;
Tratar_Interrupcion
btfss INTCON,INTF ; Se produjo la interrupción de RB0/int?
goto Fin_Tratamiento ; no, falsa alarma
nop ; si se produjo, haz el trataimento de interruipción
bcf INTCON,INTF ; repone el flag de la interrupción por INTCON
call LCD_Inicializa
movlw .0
call LCD_PosicionLinea1
movlw mensaje1
call LCD_Mensaje
bsf PORTA,1 ; enciende el valor de 1 en RA1
call Temporizado
bcf PORTA,1 ; como ya paso el segundo regresa a su valor original
call Temporizado
call LCD_Borra
bcf INTCON,INTE ; Prohibe la interrupción de RB0/INT por los ciclos de la inda seni
goto Principal
Fin_Tratamiento
retfie
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Aqui solo se muestra el mensaje en el LCD;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Mensajes
addwf PCL,1 ; suma w con pcl para extraer el valor a mostrar en el lcd
mensaje1
dt "Interrupcion RB0",0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; En la etiqueta inicio se hacen los ajustes necesarios ;
; tanto para salidas, para el lcd y los temporizados ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Inicio
bsf STATUS,RP0
movlw 0x06 ; cambia al banco 1 y programa E/S digitales
movwf ADCON1 ;
clrf TRISA
clrf TRISC
movlw 0x01
movwf TRISB ; el puerto A mostrará al led enceender por 1 segundo parpadeand
nop ; mientras que b servirá para enviar datos al LCD.
movlw 0x07 ; con este valor se asigna el 1:256 pre escaler a TMR0
movwf OPTION_REG
movlw b'11010000' ;con este valor se habilita GIE además de RBO/INT
movwf INTCON ;
bcf STATUS,RP0 ; Regresa a banco cero para iniciar el programa.
call LCD_Inicializa ; llama a la rutina para iniciar el trabajo con LCD.
Nada
nop
goto Nada
;*********************************************************************************;
; El programa principal hace la labor de pwm, en este momento es solo demostrativo;
; Se encarga de realizar el switcheo de las salidas del puerto C. Tentativamente  ;
; controlará a dos transistores.   ;
;*********************************************************************************;
Principal
bsf PORTC,1 ; pone a 1 el primer bit para el pwm
bcf PORTC,2
call Temporizado ; llama a la rutina para retardos
bcf PORTC,1
bsf PORTC,2 ; apaga el bit de puerto c
call Temporizado
;*******************************************************;
;Temporizado es la etiqueta que hace que el tmr0 le tome;
; apenas un segundo para su desbordamiento ;
;*******************************************************;
Temporizado
movlw .32
movwf Auxiliar ; debido a que el pic solo llega 16ms se necestia a auxiliar para llegar a 1 segundo
clrf TMR0 ; asocia el valor de 0 a tmr0 para que realice 256 incrementos
Sigue1
bcf INTCON,T0IF ; borra la bandera de desborde de tmr0
Sigue
clrwdt ;refresca el watchdog
btfss INTCON,T0IF ; ya se desbordo tmro?
goto Sigue ; no, sigue con el incremento en la etiqueta Sigue
decfsz Auxiliar,1 ; si, se desbordo , pregunta si auxiliar ya es cero
goto Sigue1 ; no, vuelve a temporizar con tmr0 y decrementa auxiliar una vez mas
return ; ya auxiliar es cero, vuelve al program pral.

include <LCD_4BIT.INC>
INCLUDE <LCD_MENS.INC>
INCLUDE <RETARDOS.INC>
end

Como ven, una vez que dtecta la interru´pción prohibe RB0/INT y salta al PWM en el programa principal . El punto es que quiero entrar a la RB0/INt mediante un dispositivo electrónico y no mecánico como el sw ( que si funciona ) . quiero entrar mediante dispositivo electrónico para realizar la sincronización con la línea de 60 hz. Lo intenté con un detector de cruce por zero con op amps, pero aparentemente los niveles de 0 lógico y 1 lógico no quedan muy claros para el pic. Alguna idea?
Título: Re: No consigo entrar a la int RB0/INT
Publicado por: migsantiago en 23 de Septiembre de 2008, 17:27:17
Hola

Disculpa pero no tengo muy claro qué quieres hacer. Lo poco que entiendo es que cuando una onda senoidal cruce por cero pasen 2 cosas: enviar mensaje "Interrupción RB0" a LCD y poner una terminal del pic a 5V por una cantidad de tiempo.

Me imagino que SW significa switch; si ese es el único método que te funciona por ahora quiere decir que la etapa del amplificador operacional la tienes mal configurada. Si estás usando un ampop en modo de saturación, deberás ver si realmente está saturando y entregando 5V a la terminal RB0/INT.

Una pregunta, ¿tu subrutina de lcd no cambia el valor i/o del pin RB0?
Título: Re: No consigo entrar a la int RB0/INT
Publicado por: tavisho en 23 de Septiembre de 2008, 21:24:33
Gracias por tu respuesta. En cuanto entra a la interrupción, manda un mensaje al lcd nada más por pura vanidad y de ahí se va a la parte llamada Principal; donde se va a realizar el pwm cuando pueda sincronizarme con la línea. Salta de la RSI a Principal para no reponer GIE y el micro no se reinicie cada vez que pase por cero la señal. El led que enciende es solo para cerciorarme que entró a la interrupción, lo cual solo ocurre con un switch, ya que he intentado varios comparadores para el cruce con cero con op amps, pero veo que en el osciloscopio se muestra algo de voltaje negativo; supongo que es el defecto que hace que el pic no lo reconozca como lógica TTL. Y he probado la interru´pción RB0/INT conectada directamente a la CA a través de una resitencia de 5M y tampoco entra a la RSI, me pregunto si es uno de los tantos errores que algunos me han comentado que comete el ISIS ( Proteus ) .
Título: Re: No consigo entrar a la int RB0/INT
Publicado por: migsantiago en 25 de Septiembre de 2008, 16:34:09
Gracias por tu respuesta. En cuanto entra a la interrupción, manda un mensaje al lcd nada más por pura vanidad y de ahí se va a la parte llamada Principal; donde se va a realizar el pwm cuando pueda sincronizarme con la línea. Salta de la RSI a Principal para no reponer GIE y el micro no se reinicie cada vez que pase por cero la señal. El led que enciende es solo para cerciorarme que entró a la interrupción, lo cual solo ocurre con un switch, ya que he intentado varios comparadores para el cruce con cero con op amps, pero veo que en el osciloscopio se muestra algo de voltaje negativo; supongo que es el defecto que hace que el pic no lo reconozca como lógica TTL. Y he probado la interru´pción RB0/INT conectada directamente a la CA a través de una resitencia de 5M y tampoco entra a la RSI, me pregunto si es uno de los tantos errores que algunos me han comentado que comete el ISIS ( Proteus ) .

Debes tener mucho cuidado con la conexión de Corriente Alterna al pic.

Cuando conectas la CA debes poner una R de 1Mohm de LINEA a RB0 y debes conectar NEUTRO a la TIERRA de tu circuito. Con 5Mohms no inyecta suficiente corriente como para detectar un 1 lógico.

Sobre tu circuito de ampop no puedo ayudar mucho sin poder verlo.
Título: Re: No consigo entrar a la int RB0/INT
Publicado por: tavisho en 26 de Septiembre de 2008, 13:29:16
gracias amigooo ya funciona el circuito¡¡