Hi,
I hope this is the right place to grab your attention. I am using a 16F73 @ 20Mhz with Hardware USART @ 115Kbps. I am using RB0 external interrupt portb.0 (can't help it only it is available) . Initially it is set to fire interrupt on a Low2High edge. Now when inside the interrupt I want to toggle the INT edge bit in the option_reg to have an interrupt on High2Low edge. The simple idea is to reset a timer when a variable duty cycle pulse begin and read the timer value when it turns off. Can't sit in a tight loop to watch if portb.0 = 0 cause got other tasks to do. So I am using Darrel's INT in both ASM and PBP. Here is the code:
	Code:
	ASM
INT_LIST macro   ; IntSource,  Label,         Type,  ResetFlag?
    INT_Handler  INT_INT,     INT_ASM,        ASM,   NO
    INT_Handler  INT_INT,     _INT_PBP,        PBP,   YES    
    endm
    INT_CREATE               ; Creates the interrupt processor
ENDASM    
; BELOW IS THE ASM INTERRUPT HANDLER
ASM
INT_ASM
       BSF   STATUS, RP0             ; SELECT BANK 1
       BTFSS OPTION_REG, INTEDG      ; CHECK THE INTERRUPT EDGE
       GOTO  EDGE_LOW
; IF HERE THEN EDGE IS HIGH2LOW AND INT OCCURED AND NEEDS TO BE ALTERED/////////
EDGE_HIGH
       BCF   OPTION_REG, INTEDG      ; SET TO INTERRUPT ON LOW2HIGH TRANSITION
       CLRF  STATUS                  ; SELECT BANK0
       CLRF  TMR0                    ; CLEAR TIMER0
       BSF   _HIGH_EDGE              ; SET FLAG THAT THIS IS A LOW2HIGH_EDGE INT
       INT_RETURN                    ; RETURN FROM THE ASM INTERRUPT
; IF HERE THEN EDGE IS LOW2HIGH AND INT OCCURED AND NEEDS TO BE ALTERED ////////       
EDGE_LOW       
        ; BANK1 IS ALREADY SELECTED
       BSF   OPTION_REG, INTEDG      ; SET TO INTERRUPT ON LOW
       CLRF  STATUS                  ; SELECT BANK0
       MOVF  TMR0, 0                 ; MOVE TIMER0 TO W
       MOVWF _TIMER                  ; MOVE TO THE TIMER VARIABLE IN BANK 0
       BCF   _HIGH_EDGE              ; SET FLAG THAT THIS IS HIGH2LOW_EDGE INT
       INT_RETURN                    ; RETURN FROM THE ASM INTERRUPT
ENDASM
INT_PBP:                     '  PBP INTERRUPT HANDLER
IF HIGH_EDGE = 1 THEN        '
HSEROUT [10,"L2H",10]        '
@ INT_RETURN                 ; RETURN FROM INSTANT INTERRUPT
ELSE
HSEROUT [10,"H2L",#TIMER, 10]
ENDIF
@ INT_RETURN                 ; RETURN FROM INSTANT INTERRUPT
 Now my questions are :
1. Will this work ? Chances of false interrupt should not be, cause anyway while changing the option_reg the INT0 flag is not cleared and taken care of in the next PBP slice. Am I right ?
2. Should I manually check the transmit buffert (TRMT) and do the transmission to make things faster or let it be handled by PBP (keeps my hairfall under control  )
)
P.S. : Actually I am counting on the email notification and everybody working with Darrel's II  . Lester/Darrel please move this thread if you think that this should go as a new thread.
. Lester/Darrel please move this thread if you think that this should go as a new thread.
				
			
Bookmarks