You know in programming and Computers there's no such thing as "immediate" or "without delay". Even the world's fastest supercomputer still takes time to execute an instruction. Now the big decision is "How fast is fast enough"?
If it's Push-Buttons (ie human involvement), then 1mS is more than adequate time to kill before detecting that a Button has been pressed. If it's an Optical Sensor detecting a Bullet whizzing past it, then obviously 1mS is totally inadequate.
So let's pretend that we can afford to waste 1mS keeping time without missing a Button Press... so what we'll do is have our MainLoop keeping our 250mS toggle continuously in 1mS steps, and in between those 1mS steps, we'll do all our checking and counting...
Break it all down into easy manageable processes... I've not included any code for disabling Comparators or ADC's or Voltage Refernce modules... that's up to you with your chosen PIC whatever it may be...
Now the above Code applied to have the LED's blinking ONLY whilst the Buttons are pressed.Code:CounterSmall var BYTE ' 1mS Counter CounterBIG var BYTE ' 250mS Counter SystemFlags var BYTE LEDToggle var SystemFlags.0 ' LED Toggle Flag OutputAFlag var SystemFlags.1 ' Button A Active Flag OutputBFlag var SystemFlags.2 ' Button B Active Flag ResetPulse con 40 ' Length of time of RESET Output ' calculated in steps of 250mS ' ' Hardware Defines ' ---------------- InputA var GPIO.0 InputB var GPIO.1 OutputA var GPIO.2 OutputB var GPIO.4 OutputReset var GPIO.5 ' Initialise: TRISIO=%00001011 Low OutputA Low OutputB Low OutputReset CounterBig=0 SystemFlags=0 ' MainLoop: ' ' Detect Button A ' --------------- If InputA=0 then OutputAFlag=1 else OutputAFlag=0 endif ' ' Detect Button B ' --------------- If InputB=0 then OutputBFlag=1 else OutputBFlag=0 endif ' ' Process LEDA ' ------------ If OutputAFlag=1 and LEDToggle=1 then High OutputA else Low OutputA endif ' ' Process LEDB ' ------------ If OutputBFlag=1 and LEDToggle=1 then High OutputB else Low OutputB endif ' ' Process RESET Output ' -------------------- If OutputAFlag=1 then If OutputBFlag=1 then If CounterBIG=0 then OutputRESET=1 CounterBIG=ResetPulse endif endif endif If CounterBIG=0 then OutputRESET=0 ' ' Keep Time ' --------- Pause 1 CounterSmall=CounterSmall+1 If CounterSmall=250 then LEDToggle=LEDToggle^1 If CounterBIG > 0 then CounterBIG=CounterBIG-1 endif ' Goto MainLoop
Re-reading your posts, I'm not sure if you want them to LATCH-ON and only reset once the 10-Second Pulse resets everything... in which case you need a small variant of the above...
Code:CounterSmall var BYTE ' 1mS Counter CounterBIG var BYTE ' 250mS Counter SystemFlags var BYTE LEDToggle var SystemFlags.0 ' LED Toggle Flag OutputAFlag var SystemFlags.1 ' Button A Active Flag OutputBFlag var SystemFlags.2 ' Button B Active Flag ResetPulse con 40 ' Length of time of RESET Output ' calculated in steps of 250mS ' ' Hardware Defines ' ---------------- InputA var GPIO.0 InputB var GPIO.1 OutputA var GPIO.2 OutputB var GPIO.4 OutputReset var GPIO.5 ' Initialise: TRISIO=%00001011 Low OutputA Low OutputB Low OutputReset CounterBig=0 SystemFlags=0 ' MainLoop: ' ' Detect Button A ' --------------- If InputA=0 then OutputAFlag=1 ' ' Detect Button B ' --------------- If InputB=0 then OutputBFlag=1 ' ' Process LEDA ' ------------ If OutputAFlag=1 and LEDToggle=1 then High OutputA else Low OutputA endif ' ' Process LEDB ' ------------ If OutputBFlag=1 and LEDToggle=1 then High OutputB else Low OutputB endif ' ' Process RESET Output ' -------------------- If OutputAFlag=1 then If OutputBFlag=1 then If CounterBIG=0 then OutputRESET=1 CounterBIG=ResetPulse endif endif endif If CounterBIG=0 then OutputRESET=0 ' ' Keep Time ' --------- Pause 1 CounterSmall=CounterSmall+1 If CounterSmall=250 then LEDToggle=LEDToggle^1 If CounterBIG > 0 then CounterBIG=CounterBIG-1 If CounterBIG=0 then OutputAFlag=0 OutputBFlag=0 endif endif endif ' Goto MainLoop




Bookmarks