Acá les dejo el programa.
;**************************************************;
; 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?