Sorry to keep beating on this post! I just really want to figure this out and having support is nice. Also, this is what I do on my lunch break ha-ha... So I write everthing in notepad, post it here and then I can cut and paste to my IDE when I get home
Anyone care to look and maybe do a little bug hunting? I'm probably doing something wrong here. Something feels funny about having interrupts enable other interrupts. Maybe something will go wrong when those interrupts return? I'm not used to "Main" sitting there twirling away and then having my TMR0 doing it's own thing, which also happens to the be the starting point for all the real work.
But what i think should happen is: each time the PulseGen ISR fires off a rising edge, it will start by intializing everything and then it will start TMR1 ticking and look to see which CCP interrupt was last enabled, and if the first one wasn't, it will enable it and mask it so it doesn't get selected the next go around. When CCP1 gets a rising edge, it will stop TMR1, disable itself and TMR1 interrupts, get the count from TMR1 into a variable and return (uh-oh...)
If all goes to plan, it will start over and do the same with CCP2 and unmask CCP1 for the next round.
My worries are since all this is happening from the TMR0 PulseGen interrupt, its timing will be at the mercy of those CCP and TMR1 interrupts... Also where those interrupts are getting returned to. Is that a safe place? Will it continue to skip out of the IF THEN ELSE traps and allow PulseGen to continue on? Maybe a GOTO PulseGen: added to the return points???
Interrupts are hard on the brain!
Thanks again!!! I promise once I get this going as desired I will give a full disclosure as to what it's for - some of you might find a good use for it. Oh, and I'll shut up and go away for a while
Code:INCLUDE "DT_INTS-18.bas" ' Base Interrupt System INCLUDE "ReEnterPBP-18.bas" ' Include if using PBP interrupts DEFINE OSC 20 ' Running with a 20MHz x-tal DEFINE HSER_BAUD 9600 DEFINE HSER_TXSTA 20h @ __CONFIG _CONFIG1H, _HS_OSC_1H & _FSCM_OFF_1H & _IESO_OFF_1H @ __CONFIG _CONFIG2L, _PWRT_OFF_2L & _BOR_OFF_2L @ __CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_1_2H @ __CONFIG _CONFIG4L, _STVR_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L @ __CONFIG _CONFIG3H, _CCP2MX_OFF_3H & _PBAD_DIG_3H & _MCLRE_OFF_3H ADCON1 = 7 ' Turn off analog inputs TRISB = %11110111 ' Set PortB direction. T0CON = %10000001 ' TMR0 16 bit Prescaler 1:4 ratio T1CON = %00000000 ' TMR1 prescale 1:1 clock=Fosc/4, TMR1=off (200nS per count @20MHz) CCP1CON = %00000101 ' CCP1 Capture mode, capture on rising edge CCP2CON = %00000101 ' CCP2 Capture mode, capture on rising edge TrigOut VAR PortB.3 ' Pin for 60Hz output OverFlows VAR BYTE ' Timer1 overflow total Remainder1 VAR WORD ' Remaining Timer1 ticks after first pulse capture Remainder2 VAR WORD ' Remaining Timer1 ticks after second pulse capture FirstCapt VAR BIT : FirstCapt = 0 PreLoad VAR WORD : PreLoad = 52000 ' Preload TMR0 for 120Hz interrupt rate ;----[High Priority Interrupts]------------------------------------------------------------------- ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler TMR0_INT, _PulseGen, PBP, yes INT_Handler TMR1_INT, _Timer1, PBP, yes INT_Handler CCP1_INT, _Capture1, PBP, yes INT_Handler CCP2_INT, _Capture2, PBP, yes endm INT_CREATE ' Creates the interrupt processor ENDASM @ INT_ENABLE TMR0_INT ' Enable the 120Hz interrupt for the square wave generator. '------------------------------------------------------------------------------------------------- '---[Main Routine]-------------------------------------------------------------------------------- Main: IF T1CON.0 = 0 THEN ' If TMR1 done, show result HSEROUT["Timer Overflows = ",DEC OverFlows,"Ticks 1 = ",DEC Remainder1,"Ticks 2 = ",DEC Remainder2,10,13] ENDIF GOTO Main: '------------------------------------------------------------------------------------------------- '---[TMR0 - Interrupt handler / 60Hz Squarewave Trigger Pulse Generator]-------------------------- PulseGen: IF TrigOut = 0 THEN ' If trig output is low.... TrigOut = 1 ' Set trig output high TMR1L = 0 ' Clear Timer1 Low Byte count TMR1H = 0 ' Clear Timer1 High Byte counts T1CON.0 = 1 ' Turn Timer1 on at rising edge capture OverFlows = 0 ' Clear over flow counts Remainder = 0 ' Clear remainder PIR1.0 = 0 ' Clear Timer1 overflow flag before enable @ INT_ENABLE TMR1_INT ' Enable Timer 1 Interrupts IF FirstCapt = 0 THEN ' If first pulse hasn't been looked for yet... FirstCapt = 1 ' Mark it as such and... @ INT_ENABLE CCP1_INT ' Start looking for 1st pulse ELSE FirstCapt = 0 ' Reset first pulse search mask and... @ INT_ENABLE CCP2_INT ' Start looking for 2st pulse ENDIF ELSE TrigOut = 0 ' Trig output was high, set it low. ENDIF TMR0L = PreLoad.LowByte ' TMR0 High and low bytes preloaded TMR0H = PreLoad.HighByte @ INT_RETURN '------------------------------------------------------------------------------------------------- '---[CCP1 - interrupt handler]-------------------------------------------------------------------- Capture1: T1CON.0 = 0 ' Stop Timer1 @ INT_DISABLE TMR1_INT ' Disable Timer 1 Interrupts @ INT_DISABLE CCP1_INT ' Disable CCP1 Interrupts Remainder1.LowByte = TMR1L ' Get remaining Timer1 counts Remainder1.HighByte = TMR1H @ INT_RETURN '------------------------------------------------------------------------------------------------- '---[CCP2 - interrupt handler]-------------------------------------------------------------------- Capture2: T1CON.0 = 0 ' Stop Timer1 @ INT_DISABLE TMR1_INT ' Disable Timer 1 Interrupts @ INT_DISABLE CCP2_INT ' Disable CCP2 Interrupts Remainder2.LowByte = TMR1L ' Get remaining Timer1 Remainder2.HighByte = TMR1H @ INT_RETURN '------------------------------------------------------------------------------------------------- '---[TMR1 - interrupt handler]-------------------------------------------------------------------- Timer1: OverFlows = OverFlows + 1 ' Count the number of times TMR1 overflows @ INT_RETURN '------------------------------------------------------------------------------------------------- GOTO Main: END






Bookmarks