Selectable Events OR'ed together?
Phonos
Posts: 45
I have an been using a single interrupt routine to handle events from 3 separate interrupts. 1) Is it possible to define a selectable event that can OR 3 separate pin rising events? 2) Is it possible to set an interrupt based on 3 OR'ed selectable events? 3) Is there a better way to approach the problem?
mov x, f_pins 'get f_pins for interrupt setup and x, #$3F 'f_pins base -> UL fet or x, #%001_000000 'use selectable event IN rising setse1 x 'set selectable event1 to UL fet rising add x, #2 setse2 x 'set selectable event1 to VL fet rising add x, #2 setse3 x 'set selectable event1 to WL fet rising mov ijmp1, #isr1 'use 3 interrupt to trap fet switch high mov ijmp2, #isr2 mov ijmp3, #isr3 setint1 #event_se1 'these interrupts will never co-occur setint2 #event_se2 setint3 #event_se3 isr1 call #get_amp reti1 isr2 call #get_amp reti2 isr3 call #get_amp reti3 get_amp akpin f_pins akpin amp_pin waitx ##SAMP_CLK << 1 rdpin amp, amp_pin mov y, whl_dat add y, #_AMP << 2 setq #2 wrlong amp, y get_amp_ret ret
Comments
You can try to OR the pins with the input logic that every pin has and then use only one interrupt on the first pin.
You OR A input and B input but mux the B input from the pin+2. This pin+2 ORs its input and that from pin+2 (=first pin+4).
Not sure if such an OR chain works, but it's very possible.
Something like that:
Andy
Sounds plausible but, my independent pins are smart pins with PWM outputs. How does the pin input logic work when the IN feature is controlled by smartpin?
No in this case it can not work. The IN is occupied by the smartpin.
The ORed input of the 3 physical pins would go into the first smartpin statemachine, but not used there in case of PWM.
Edit: If some neighborhood pins IN logic is free (no smartpin, only as OUT used) then you can use this pin(s) to OR it together.
You could maybe use the pattern match event. That will only work if the pins all go low again before the next interrupt though.
Morning brain untested code snippet:
_clr
for not-equal. Also needs a couple more instructions to mask off the pin range.Ada has it right about event triggering, all three smartpin's IN will have to go back low for the event/IRQ to be retriggerable. If any two go high together before acknowledging the first smartpin then the second smartpin won't trigger an event. And if the second smartpin isn't then also acknowledged then no further events will occur.
Keep in mind that SETPAT events are an edge trigger, not a level trigger. This detail is not stated in the docs.
I like the pattern event approach. In the application here, only one of the smart pins will go high at any given time so I am not sure about a fixed pattern, therefore the original OR question. Did I miss something there?
So I am taking a back-step up the logic chain to put a conditional on which smart pin is active (which is known) and re-define the selectable event for a single interrupt for that pin. This is might be the approach a more experienced programmer would have taken to begin with...
You can program the interrupt for a pattern mismatch. That is, you set the pattern to match when all pins are low and then it fires the interrupt when it stops matching, i.e. one of the pins went high.
Perfect. Once again I am grateful for the insights from the forum!
Reassigning SETSE1 in sequence is a good idea too. You might find such easier to manage in the end.
I'll try both and see what appears to tighten up the code the best.
Update: setpat approach works great. It reduced code length and took computation out of the process loop.
Thank you for the expert help.