INT_CREATE in Column 1
INT_CREATE not in Column 1Code:ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler RX_INT, _DoIntStuff, PBP, yes endm INT_CREATE ; Creates the interrupt processor INT_ENABLE RX_INT ; enable external UART RX interrupts ENDASM
Code:ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler RX_INT, _DoIntStuff, PBP, yes endm INT_CREATE ; Creates the interrupt processor INT_ENABLE RX_INT ; enable external UART RX interrupts ENDASM
Thank you Bruce. I learned something today that what a single press on the tab key can do for your code.
You are truly a master.
Thanks again.
If you do not believe in MAGIC, Consider how currency has value simply by printing it, and is then traded for real assets.
.
Gold is the money of kings, silver is the money of gentlemen, barter is the money of peasants - but debt is the money of slaves
.
There simply is no "Happy Spam" If you do it you will disappear from this forum.
Hi, I am back again with a problem. This time it looks like the interrupt is serviced but only once and code does not move forward. Can you please have a look at my code and advise me if I am doing it right ?
When power is applied this is what happens:Code:Define OSC 4 ' OSCCON defaults to 4MHz on reset INCLUDE "DT_INTS-14.bas" ; Base Interrupt System INCLUDE "ReEnterPBP.bas" ; Include if using PBP interrupts Include "modedefs.bas" @ __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _CP_ON & _BOD_ON & _CPD_ON & _IESO_OFF & _FCMEN_ON & _WUREN_OFF ' Pin Definations are here ToTx var GPIO.2 ToRx var GPIO.3 Monitor var GPIO.4 T1CON=49 main: ' Initialize the processor TRISIO = %011000 CMCON0 = 7 GPIO=0 OPTION_REG = %00000111 WDA.4=1 : WPUDA.4=1 ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler TMR1_INT, _Setval, PBP, yes endm INT_CREATE ; Creates the interrupt processor ENDASM start0: gpio.0=1 ' LED1 start: gpio.1=1 ' LED 2 @ INT_ENABLE TMR1_INT Serin ToRx, N2400,["pp3"],code @ INT_DISABLE TMR1_INT if code=0 then goto start0 ' ELSE CHECK OTHER VALUES FOR THE RECEIVED CODE goto start0 Setval: code=0 gpio.0=0 : pause 200 @ INT_RETURN
1) Both LED1 & LED2 glow
2) LED 1 (gpio.0) goes off
and system stays like this though LED should turn ON after 200mS. Please help me know what am I doing wrong?
Sounds like it's working exactly like it should be.
1. TMR1 interrupts while it's sitting in your SERIN routine waiting for 3 ASCII characters
followed by the byte that gets placed in code (which by the way hasn't been declared).
2. Once the interrupt service routine executes, it returns right back to your SERIN
routine with the LED off.
Insert a toggle command in your int handler for a quick visual indication of the int handler
executing. That would tell you it's working or not.
And -as-is, it's never going to execute any code below your SERIN routine unless all 3 ASCII
characters + the byte that goes into your undeclared code VAR are received.
Hi Bruce, I did that and yes you are right (as always) about it. I Learnt a bit more about interrupts as well while dealing with this problem.
Can you please advise/explain me how can I make the code jump and move to the next line of Serin with help of Interrupts. I really appreciate your help.
Thanks
P.S: This is not the full code, all variables are declared in my code. I just tried to highlight the problem to you with minimum code here.
Last edited by Megahertz; - 31st December 2009 at 20:26.
I don't know if this is what you had in mind,
but it could be a possibility for your Timeout wishes.
With the extra features of the 12F635, you should be able to to create a WDT based timeout for the SERIN or other command(s).
Starting with the WDT turned off, and DEFINE NO_CLRWDT 1
And this un-tested code ... (don't have a 12F635)Prior to starting a SERIN command, it saves an address to the Timeout1 Label and starts the WDT.Code:DEFINE OSC 4 ' OSCCON defaults to 4MHz on reset DEFINE NO_CLRWDT 1 ' stop kicking the DOG ASM CFG = _INTRC_OSC_NOCLKOUT ; Oscillator CFG=CFG& _WDT_OFF ; Watch Dog Timer <-- Very Important CFG=CFG& _PWRTE_ON ; Power-on Timer CFG=CFG& _MCLRE_OFF ; Master Clear Reset CFG=CFG& _BOD_OFF ; Brown-out Detect CFG=CFG& _IESO_OFF ; Internal External Switchover CFG=CFG& _FCMEN_ON ; Fail-Safe Clock Monitor CFG=CFG& _WUREN_OFF ; Wake-up and Reset CFG=CFG& _CP_OFF ; Code Protect CFG=CFG& _CPD_OFF ; EEPROM Data Protect __CONFIG CFG ENDASM INCLUDE "modedefs.bas" '----[Pin Definations]------------------------------------------------------ LED1 VAR GPIO.0 LED2 VAR GPIO.1 ToTx VAR GPIO.2 ToRx VAR GPIO.3 Monitor VAR GPIO.4 ;----[Variables/Aliases]---------------------------------------------------- TOaddr VAR WORD BANK0 SYSTEM code VAR BYTE WDTO VAR STATUS.4 ; WatchDog Timer Timeout bit SWDTEN VAR WDTCON.0 ; Software WDT Enable BAUD CON N2400 '----[Initialize]----------------------------------------------------------- Init: IF !WDTO THEN ; If the WDT timed out TOGGLE LED2 ASM movf TOaddr + 1, W ; Goto Timeout Address movwf PCLATH movf TOaddr, W movwf PCL ENDASM ELSE ; Power-on, or other Reset CMCON0 = 7 GPIO=0 OPTION_REG = %00000111 WDA.4=1 : WPUDA.4=1 WDTCON = %00010110 ; 1:65536, WDT off ENDIF ;----[Main Program Loop]---------------------------------------------------- Main: TOGGLE LED1 ASM movlw LOW(_TimeOut1) ; Set the Timeout jump Address movwf TOaddr movlw HIGH(_TimeOut1) movwf TOaddr + 1 CLRWDT ; kick the DOG first ENDASM SWDTEN = 1 ' enable the WDT Serin ToRx, BAUD,["pp3"],code SWDTEN = 0 ' disable the WDT SELECT CASE code ' CHECK VALUES FOR THE RECEIVED CODE CASE 0 ' Null code, no action CASE 1 ; do code 1 CASE ELSE ' Unknown Code ; don't know the code. Ignore or Warn END SELECT GOTO Main TimeOut1: ' Timeout occured SWDTEN = 0 ' disable the WTD ; notify user of timeout ; or do timeout cleanup GOTO Main
If the WDT times out during the SERIN command, the processor will RESET.
At the top of the program, it checks to see if the reset was from power-up, or the WDT. If it was from the WDT, it was a Timeout, so it jumps to the timeout label that was saved prior to starting the SERIN command.
All previous Stack levels are discarded. So the label that it jumps to MUST be in the Main loop.
Timeout period can be adjusted by changing the WDTCON prescaler.
Food for thought while drinking Champaigne.
Happy New Year!
DT
Thanks Darell, it is very interesting how you can go around things in programming.
Is it possible you can provide PBP statements for the following lines of the code:
Also I wonder if similar way of using WDT can be adopted for 12c671/12F508/16F676 as I have few little projects pending involving these and all of them will have one thing common - A noisy RF receiver attached to one pinCode:1) TOaddr VAR WORD BANK0 SYSTEM 2) ASM movf TOaddr + 1, W ; Goto Timeout Address movwf PCLATH movf TOaddr, W movwf PCL ENDASM 3) ASM movlw LOW(_TimeOut1) ; Set the Timeout jump Address movwf TOaddr movlw HIGH(_TimeOut1) movwf TOaddr + 1 CLRWDT ; kick the DOG first ENDASM
Thanks
P.S - No problem if you have not tested the code. I will try to my best to do it first, just after I know the PBP equivalent of the above statements.
Bookmarks