El PIC se suministra a 3.3V y tiene una velocidad de reloj de 16kHz. Para esta parte del diseño, necesito la interrupción externa para disparar en el borde descendente de una señal de onda cuadrada de 100Hz en RB0 y cambiar el estado de RD7.
En la siguiente figura, podemos ver que la interrupción funciona según lo previsto cuando lo estoy probando con un interruptor SPST. La siguiente imagen es el esquema cuando se usa el interruptor SPST (ignorar el LM324 y los componentes adjuntos)
Para el rastreo 1:
- Canal B (Azul) - Entrada de SPST
Para ambas trazas:
- Canal C (rosa) - Nivel de voltaje RD7
Sinembargo,cuandoadjuntolaondacuadrada(quesemuestraenlasiguientefigura),parecequesedisparaenelbordeascendentedelaondacuadrada.ParaTrace2:
- CanalB(Azul)-Señalde100Hz
AlprincipiopenséqueporalgunarazónelNE555estabacargandolaentradadeRB0,asíqueagreguéunbúferperoesonoayudó.TambiénintentéarrancarRB0peroesotambiénfalló.Busquéenelmanualyencontréesto:
Paraeventosdeinterrupciónexternos,comoelpinINTolainterrupcióndecambiodePORTB,lalatenciaserádetresocuatrociclosdeinstrucción.
¿Entoncespodríaserquelainterrupciónsedisparedemasiadorápido?Inclusoa16kHz,sinembargo,4ciclosdeinstrucciónserán0.001syelperíododeseñales0.01s.¿Alguiensabequépodríaestarcausandoestoycómosolucionarlo?
Softwareutilizado:ProteusProfessional8
EDITAR:Códigoeimagenagregados
LIST p=16f877
INCLUDE <P16F877.INC>
W_TEMP EQU 0x20
STATUS_TEMP EQU 0x21
time_hi EQU 0x22
time_lo EQU 0x23
time_cp EQU 0x24
timerCount EQU 0x25
ORG 0x00
goto main
ORG 0x04
goto ISR
ORG 0x20
main
BANKSEL TRISD
bcf TRISD,RD7
call interruptSetup
loop
goto loop
;--------------------------------Configure Interrupts-------------------------------
interruptSetup
call rb0FallingEdgeInt
call enableInterrupts
return
rb0FallingEdgeInt
bsf STATUS,RP0
bcf STATUS,RP1
bsf TRISB,RB0
bcf OPTION_REG,INTEDG
bsf INTCON,INTE
return
enableInterrupts
bsf INTCON,PEIE
bsf INTCON,GIE
return
;------------------------------ISR---------------------------------
ISR
movwf W_TEMP ; SAVE W AND STATUS REGISTERS
swapf STATUS,W
movwf STATUS_TEMP
bcf INTCON,GIE
btfsc INTCON,INTF
call fallEdgeIntHandler
bsf INTCON,GIE
swapf STATUS_TEMP,W ; RESTORE W AND STATUS REGISTERS
movwf STATUS
swapf W_TEMP,F
swapf W_TEMP,W
retfie
;---------------------------ISR HANDLERS------------------------------
fallEdgeIntHandler
BANKSEL PORTD
movlw B'10000000'
xorwf PORTD,W
movwf PORTD
bcf INTCON,INTF
return
END