Interrupción en el flanco descendente PIC16F877

0

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
    
pregunta S.Ramjit

0 respuestas

Lea otras preguntas en las etiquetas