I have used RBC_INT many times before with no problems, but have encountered a problem with it as implemented in a unique code set that is driving me crazy.
Here is how it is supposed to work for comparison to code I will provide below:
1) DS1337 Real-time-clock generates an Alarm1 interrupt every minute on its _INTA pin which is connected to RB2 on my 16F886.
2) RBC_INT is supposed to recognize _INTA signal falling edge and go to handler labled "Alarm".
3) The ISR "Alarm" sets logflag=1 which is recognized by IF statement in main loop and calls subroutine "Logging" to log date/time stamped data.
I have extensive LED blinking codes embedded at various places in my code so I can see what is going on at run time. I also am writing key values to EEPROM to help in post-run troubleshooting. From these test techniques I can see very clearly what is going on but can't figure out how to correct it. Here is what is happening:
a) EEPROM entries show the clock has the correct Alarm1 time and is keeping good time and generates _INTA falling edge at correct Alarm1 time.
b) Lack of LED flashes indicate no entry to the Alarm handler...hence RBC_INT is not recognizing the _INTA signal change.
c) Therefore, the code in the Alarm Handler is not setting the logflag, resetting the _INTA on the RTC, or reading PortB to eliminate the mismatch.
d) With no set of the logflage, no triggering of the Logging subroutine in the mainloop.
d) Hence no further _INTA signals are generated by the RTC and the _INTA signal stays low as confirmed by a voltmeter.
e) With no further _INTA signals there are no further RTC_INT actions and my code malfunctions.
Hopefully with these code excerpts someone out there can tell me where I am going wrong and why the RBC_INT is not recognizing the _INTA. ANY HELP GREATLY APPRECIATED!!
Here is the code that I think sets up the RBC_INT correctly...can anyone see anything wrong with this?
Here is my mainloop code to show how things happen while waiting for RBC_INT occurence...LED blinks indicate it is operating correctly. but call to Logging subroutine is never triggered, indicated the logflag was never set in the RBC_INT handler:Code:'--- Setup Interrupts ---------------------------------------------------- ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _Alarm, PBP, yes endm INT_CREATE ; Creates the interrupt processor ENDASM ' Per DT, DT_INTS already takes care of setting INTCON register ' but this code doesn't work unles below registers also set as indicated: IOCB.2= 1 ' ENABLE IOC INERRUPT ON PORTB.2 (RB2) for Alarm1 TRISB = %00010100 ' RB2 set as input from RTC Alarm1 ' PORTB.2 is also an interrupt from manual switch GND ' PORTB.4 is set for input as A/D Channel 11 WPUB = 0 ' DISABLE all PortB pull-ups CM1CON0 = 0 ' DISABLE COMPARATORS CM2CON0 = 0 ' DISABLE COMPARATORS
Here is my handler for the RBC_INT that is not being entered the way it should and hence actions required to reset flags and interrupts aren't happening:Code:mainloop: ' Blink Green LED 1x short at start of mainloop as heart beat TOGGLE LED_GRN PAUSE 250 TOGGLE LED_GRN PAUSE 2000 ' Read current time/date I2CREAD SDA, SCL, RTCdevice, SecReg,[sec,MINs,hr,day,date,mon,yr] PAUSE 20 ' Display current Date/Time if LCD installed IF LCD_Flag = 1 THEN ' Display only if LCD installed LCDOUT $fe,1 ' Clear Display LCDOUT $fe,Line1,HEX2 mon,"/",HEX2 date,"/", HEX2 yr LCDOUT $FE,Line2,HEX2 hr,":",HEX2 MINs,":",HEX2 sec ENDIF ' Read temperature & log to EEPROM for test readout GOSUB Temperature WRITE 6, temp 'COMMENTED OUT DURING OPS TO SAVE EEPROM 'Check to see if Alarm1 Interrupt occured and service if it did IF logflag = 1 THEN ' Alarm1 interrupt has occured ;@ INT_DISABLE RBC_INT ' Disable RBC interrupts during routine GOSUB Logging ' Log the interrupt ;@ INT_ENABLE RBC_INT ' Re-enable RBC interrupts after routine ENDIF ' Send Email if temperature below/above threshold IF (temp <= $28) THEN ' If temp <= 40 deg F send email GOSUB Email ELSEIF (temp >= $55) THEN ' If temp >= 85 deg F send email GOSUB Email ENDIF 'ADCON1 = %00001110 ' Write current temperature to EEPROM ....Uncomment FOR TEST ONLY WRITE 10, temp GOTO mainloop END
And here is my logging subroutine that should be executed after each interrupt causes logflag to be set in handler (which obviously isn't happening):Code:Alarm: ' Blink Red LED 3x at start of Alarm interrupt...Uncomment FOR TEST ONLY 'THIS IS NEVER SEEN TELLING ME RBC_INT DIDN'T RECOGNIZE _INTA from RTC! FOR I = 0 TO 2 TOGGLE LED_RED PAUSE 250 Toggle LED_RED PAUSE 250 NEXT logflag = 1 ' Set flag to log this RB2 interrupt in mainloop dummy = PORTB ' Read PortB to eliminate mismatch on interrupt ' Clear the Alarm flags to be ready for next RTC interrupt ' Reset Alarm1 (INTA) interrupt by clearing STATUS register I2CWRITE SDA, SCL, RTCdevice, StatusReg,[$00] PAUSE 1000 ' Resume Main Program where Interrupt happened @ INT_RETURN
Code:Logging: ' Blink the RED LED 1 sec 3x FOR I = 0 TO 2 TOGGLE LED_RED PAUSE 1000 TOGGLE LED_RED PAUSE 1000 NEXT PAUSE 1000 IF J > 220 THEN ' If EEPROM logging space is full, reset logging J = 0 ' index to start of logging space. ' Logging space covers time stamps for 220 interrupts ENDIF ' Log date/time stamped temperature from LM34 sensor to EEPROM WRITE 16+J, hr WRITE 17+J, MINs WRITE 18+J, sec WRITE 19+J, temp J = J+4 ' Put code here to send email of current temperature logflag = 0 ' Reset logflag before returning to mainloop RETURN





Bookmarks