I am new to PIC programming and had a question regarding using Interrupts. I had tried using the "Standard" way, but I stumbled upon Darrel's instant interrupts and they seemed much easier and more reliable, so I gave them a try. My goal is to make a programmable clock using a PIC16F627A using a Sony remote and TSOP receiver. I have made simple IR comms work and display, along with a clock, but my issue is that I was having trouble interrupting the clock function when I press my program key on the remote. It just wanted to keep timing and ignore my command, so I gave instant interrupts a try.
My goal in the end is to have my main routine looking for IR pulses, and the interrupt generating the time, but for now I just wanted to make sure I am using the interrupt right, so I am trying to use the interrupt to generate 1/10th second counts. Here is my code.
Basically the code sits at the default 12:00 and never moves. Judging from this, it would seem that it gets to the display time DEBUG statement, or I would have a display of 8888, but I'm not really sure what happens after that. I am assuming the PIC is fast enough to get through the clock routine when Counts = 10 before it is interrupted, but again, not sure where I am hanging up.Code:'**************************************************************** '* Name : UNTITLED.BAS * '* Author : [select VIEW...EDITOR OPTIONS] * '* Notice : Copyright (c) 2009 [select VIEW...EDITOR OPTIONS] * '* : All Rights Reserved * '* Date : 2/11/2009 * '* Version : 1.0 * '* Notes : * '* : * '**************************************************************** ; Initialize your hardware first INCLUDE "DT_INTS-14.bas" ; Base Interrupt System INCLUDE "ReEnterPBP.bas" ; Include if using PBP interrupts Include "modedefs.bas" Define OSC DEFINE LOADER_USED 1 ' Using boot-loader for initial prototype DEFINE DEBUG_REG PORTB DEFINE DEBUG_BIT 0 DEFINE DEBUG_BAUD 19200 define DEBUG_MODE 0 ' 1 = inverted, 0 = true Second var byte Minute2 VAR BYTE ' Ones column for minutes Minute1 VAR BYTE ' Tens column for minutes Hour2 VAR BYTE ' Ones column for hours Hour1 VAR BYTE ' Tens column for hours AMPM VAR BIT ' 1 when PM Counts VAR BYTE ' Counts for timer Second = 0 Minute1 = 0 Minute2 = 0 Hour1 = 1 Hour2 = 2 AMPM = 0 ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler TMR1_INT, ReloadTMR1, ASM, no ; MUST be first INT_Handler TMR1_INT, _T1handler, PBP, yes endm INT_CREATE ; Creates the interrupt processor ENDASM ;--- Change these to match the desired interrupt frequency ------------------- ;--- See http://DarrelTaylor.com/DT_INTS-14/TimerTemplate.html for more Info. @Freq = 10 ; Frequency of Interrupts in Hz @Prescaler = 2 ; Timers Prescaler setting T1CON = $10 ; $30 = Prescaler 1:8, TMR1 OFF ; $00=1:1, $10=1:2, $20=1:4, $30=1:8 -- Must match @Prescaler value @ INT_ENABLE TMR1_INT ; enable Timer 1 interrupts GOSUB StartTimer ; Start the Timer Main: IF counts = 10 then Second = Second + 1 'Calculate time and change values If Second = 60 then Minute2 = Minute2 +1 Second = 0 IF Minute2 = 10 THEN Minute1 = Minute1 + 1 Minute2 = 0 IF Minute1 = 6 then Hour2 = Hour2 + 1 Minute1 = 0 IF Hour2 = 10 THEN Hour1 = 1 Hour2 = 0 endif endif endif endif IF Hour1 = 1 AND HOUR2 = 3 THEN 'Roll clock over to 1 from 12 Hour1 = 0 Hour2 = 1 IF AMPM = 0 THEN 'Establish AM and PM times AMPM = 1 endif IF AMPM = 1 THEN AMPM = 0 ENDIF endif If Hour1 = 0 then 'If hour 1 is 0 then do not display it Hour1 = 20 'SLED-C4 will not display anything if the Endif 'value is above 10 DEBUG "D", Hour1,Hour2,Minute1,Minute2 ' Display time DEBUG "P",12,"~" ' Display Colon Else GOTO Main ENDIF T1handler: Counts = Counts + 1 ; Increase the 1/10th sec count @ INT_RETURN ;---[TMR1 reload - interrupt handler]----------------------------------------- ASM ; Calculate Timer Reload Constant ReloadInst = 8 ; # of Intructions used to reload timer if ((Prescaler == 1)||(Prescaler == 2)||(Prescaler == 4)||(Prescaler == 8)) MaxCount = 65536 + (ReloadInst / Prescaler) TimerReload = MaxCount - (OSC*1000000/4/Prescaler/Freq) if ((TimerReload < 0) || (TimerReload > (65535-ReloadInst))) error Invalid Timer Values - check "OSC", "Freq" and "Prescaler" endif else error Invalid Prescaler endif ENDASM @Timer1 = TMR1L ; map timer registers to a word variable Timer1 VAR WORD EXT TimerReload CON EXT ; Get the External Constant TMR1ON VAR T1CON.0 ; Alias the Timers ON/OFF bit ;---Reload Timer1------ ASM ReloadTMR1 MOVE?CT 0, T1CON, TMR1ON ; 1 stop timer MOVLW LOW(TimerReload) ; 1 Add TimerReload to the ADDWF TMR1L,F ; 1 value in Timer1 BTFSC STATUS,C ; 1/2 INCF TMR1H,F ; 1 MOVLW HIGH(TimerReload) ; 1 ADDWF TMR1H,F ; 1 MOVE?CT 1, T1CON, TMR1ON ; 1 start timer INT_RETURN ENDASM ;---Start/Stop controls ----- StartTimer: Timer1 = TimerReload ; Load Timer TMR1ON = 1 ; start timer RETURN StopTimer: TMR1ON = 0 ; stop timer RETURN
Any suggestions from some of the PIC veterans out there?
Another quick question. I don't think I saw how to disable instant interrupts from occuring when I get to a point that I dont want them?




Bookmarks