I'm having a hard time again...
My interrupts seem to be taking over, and my main loop never gets executed.
The project I'm working on controls a few simple outputs based on some user input , some machine inputs, and the real time from a DS1302.
The user input comes from the "touch sensors" available in the 16F727. The time (minutes and seconds only) and other numeric info are displayed on a 4 digit, 7-segment LED display.
The touch sensors use Interrupts based on TMR1 and TMR0.
I had much of my program working until I added the touch sensor routine, then everything went to hell....
I've trimmed my code back to just the touch sensor and RTC code trying to get it to work. The problem is that the interrupts seem to "take over the show" and my main loop never gets executed.
This bit of test code should display the "ones of minutes" and the tens and ones of seconds on a LED display.
When a sensor button is touched, the number of the button pressed should be momentarily displayed on the 4th digit of the display.
The problem is that while the touch sensors work fine and the appropriate number is displayed when touched, the time is *not* displayed because the main loop is never executed. If I disable the interrupts so that the touch sensors don't work, then the main loop is executed and the time is displayed just fine.
Why does the interrupt routine highjack the show and keep the main loop from executing?
Here's the bit of test code that I'm working with... any suggestions would be a appreciated.
It's a little too big, so I'll split it into 2 posts....
Finish below....Code:'**************************************************************** Include "MODEDEFS.BAS" ' Include Shiftin/out modes INCLUDE "DT_INTS-14.bas" ' Base Interrupt System INCLUDE "ReEnterPBP.bas" ' Include if using PBP interrupts DEFINE LCD_DREG PORTD ' Set LCD Data port DEFINE LCD_DBIT 4 ' Set starting Data bit (0 or 4) if 4-bit bus DEFINE LCD_RSREG PORTC ' Set LCD Register Select port DEFINE LCD_RSBIT 5 ' Set LCD Register Select bit DEFINE LCD_EREG PORTC ' Set LCD Enable port DEFINE LCD_EBIT 6 ' Set LCD Enable bit DEFINE LCD_BITS 4 ' Set LCD bus size (4 or 8 bits) DEFINE ADC_BITS 8 ' Set number of bits in ADC result DEFINE ADC_CLOCK 3 ' Set clock source for ADC (rc = 3) DEFINE ADC_SAMPLEUS 100 ' Set ADC sampling time in microseconds define I2C_SCLOUT 1 ' Set I2C Clock to drive high instead of needing pullup DEFINE CCP2_REG PORTC 'Hpwm2 port DEFINE CCP2_BIT 1 'Hpwm2 bit DEFINE OSC 16 '16 MHz OSCCON = %00110000 'set OSC to 16 mHz. @ __config _CONFIG1, _DEBUG_OFF & _PLL_EN & _BORV_2_5 & _BOR_ON & _CP_OFF & _MCLRE_OFF & _PWRT_EN & _WDT_ON & _INTOSCIO @ __config _CONFIG2, _VCAP_RA6 TRISA= %00000000 'Set 'em all to outputs TRISB= %11111111 'all input TRISC= %00011000 'Set portC all outputs except C.3 and C.4 TRISD= %00000000 'Set portD all outputs TRISE= %00000000 'Set portE all outputs ANSELA= %00000000 ' Set all pins to digital ANSELB= %11111111 ' all analog ANSELD= %00000000 ' Set all pins to digital ANSELE= %00000000 ' Set all pins to digital CPSCON0 = %10001101 'Cap sense on, high range oscillator '---------VARIABLES----------------------------------- 'LED Driver (CAT4016) Variables----------------------- LEDData var byte numeral var byte LEDCounter var byte digit1 var byte : digit1=0 digit2 var byte : digit2=0 digit3 var byte : digit3=0 digit4 var byte : digit4=0 'DS1302 RTC Variables----------------------- rtcyear var byte rtcday var byte rtcmonth var byte rtcdate var byte rtchr var byte rtcmin var byte rtcsec var byte rtccontrol var byte mathtemp var Byte 'For doing BCD to Decimal conversion 'Touch sensor related Variables---------------------- index var byte : index=0 'for the CSM buttons timercount var word[6] : timercount = 0 ' raw count from TMR1, for each channel timerave var word[6] : timerave = 0 ' long term average of timercount, for each channel AvgCount var byte : AvgCount = 32 'number of samples to average delay var word : delay = 0 ' to delay startup until the timers have stabilized. '---------I/O PINS----------------------------------- 'Alias pins - DS1302--------------------------------- RST var PORTE.2 '1302 CS IO var PORTE.1 '1302 I/O SCLK var PORTE.0 '1302 Clock 'Alias pins - EEPROM--------------------------------- SDA var PORTC.4 'EEPROM data SCL var PORTC.3 'EEPROM Clock 'Alias pins - LED display---------------------------- S_IN var PORTA.3 'CAT4016 data LEDCLK var PORTA.2 'CAt4016 clock BLANK var PORTC.1 'CAT4016 blanking line LATCH VAR PORTA.0 'Cat4016 Latch 'Initialize variables-------------------------------- hpwm 2,100,1000 'set LED brightness timerave = 2000 'preset the timer average to a "close" value '----------------------------------------------------------------- 'Set initial time (this can be removed in final version) 'rtcyear = $09 'Set Year 'rtcday = $1 'Set Day 'rtcmonth = $1 'Set Month 'rtcdate = $1 'Set Date of month 'rtchr = $1 'Set Hour 'rtcmin = $1 'Set Minutes 'rtcsec = $1 'Set Seconds 'Gosub settime ' DO IT! - Set the time '-------------------------------------------------------------------------------- 'initialize the DS1302 and set the trickle charge rate Low SCLK low rst ' Reset RTC high rst ' RTC Ready for transfer Shiftout IO, SCLK, LSBFIRST, [$8e, 0] ' Enable write low rst high rst Shiftout IO, SCLK, LSBFIRST, [$90, %10101011] ' Set charger on and to "2 diodes, 8Kohm" Low RST ' Reset RTC pause 5 ' -----Grab the time out of the RTC and display it-------------------------- gosub gettime gosub sortdigits pause 1000 '-----Set up Interrrupts-------------------------------------------- ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler TMR1GATE_INT, _CheckCount, PBP, yes endm INT_CREATE ; Creates the interrupt processor ENDASM @ INT_ENABLE TMR1GATE_INT ; enable Timer1 gate interrupt '----- Timer Setup------------------------------------------------ OPTION_REG = %11010110 'setup source and prescaler for TMR0 INTCON.2 = 0; // clear TMR0 interrupt flag INTCON.5 = 1; // enable TMR0 interrupt T1CON = %11000101 'Timer clock source=CAPOSC, prescale=1:1, dedicated OSC disabled, no external clock synchronize, timer on T1GCON = %11100001 'Timer1 gate init/ Toggle Mode PIR1.7 = 0 'Clear Gate Interrupt Flag '----------JUST GET IT GOING------------------- GOTO Main 'skip the subroutines and get on with it.





Bookmarks