Hi Jimmy,<div>  This problem will arise if you use a timer and need to extend the timer range (say using a 16bit to measure a time as 32bit), so you catch/count the overflows of the timer. This all works fine until both interrupts can occur together. Diagram below hopefully shows you that when it comes to the handling of the interrupts, you can not determine which one came first. (I&#39;ve used another ISR, however it could even be the interrupt prologue/epilogue, where the global interrupts are turned off).</div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;, monospace; ">OTHER ISR (no-nesting) ---###########------------</span></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><div style="font-family: arial; "><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><meta http-equiv="content-type" content="text/html; charset=utf-8"><div style="font-family: arial; ">
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace">EXT INTERRUPT          ------1-------------------</font></div><div style="font-family: arial; "><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-style-span" style="font-family: arial; "></span></font></div>
COUNTER OVERFLOWS      ----------2---------------</font></div></font></div></div></font></div></font></div></font><span class="Apple-style-span" style="font-family: &#39;courier new&#39;, monospace; ">Handling of external   --------------####-------- (since higher priority than overflow)</span></div>
<div><div><font class="Apple-style-span"><div><font class="Apple-style-span"><div><div><font class="Apple-style-span"><div><font class="Apple-style-span"><div style="font-family: &#39;courier new&#39;, monospace; "><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">Handling of overflow   ------------------###-----</font></div>
<div style="font-family: &#39;courier new&#39;, monospace; "><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><font class="Apple-style-span" face="arial"><br></font></font></div><div style="font-family: &#39;courier new&#39;, monospace; ">
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><meta http-equiv="content-type" content="text/html; charset=utf-8"><div style="font-family: &#39;courier new&#39;, monospace; "><span class="Apple-style-span" style="font-family: &#39;courier new&#39;, monospace; ">OTHER ISR (no-nesting) ---###########------------</span></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" style="font-family: &#39;courier new&#39;, monospace; "><div style="font-family: arial; "><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><div style="font-family: arial; ">
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace">EXT INTERRUPT          ----------2---------------</font></div><div style="font-family: arial; "><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-style-span" style="font-family: arial; "></span></font></div>
COUNTER OVERFLOWS      ------1-------------------</font></div></font><span class="Apple-style-span" style="font-family: &#39;courier new&#39;, monospace; ">Handling of external   --------------####-------- (since higher priority than overflow)</span><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><div>
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><font class="Apple-style-span">Handling of overflow   ------------------###-----</font></font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><div><br></div><div style="font-family: &#39;courier new&#39;, monospace; "></div></font></div></font></div></font></div></font></div><div style="font-family: &#39;courier new&#39;, monospace; ">
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><font class="Apple-style-span" face="arial">PS. I&#39;m using an AVR ATmega8, and no I can&#39;t use the capture timer pin.</font></font></div><div>Hope that helps peoples understanding,</div>
<div>/s</div><div style="font-family: &#39;courier new&#39;, monospace; "><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"></font></div></font></div></font></div></div><div style="font-family: &#39;courier new&#39;, monospace; ">
<br></div></font></div></font></div></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font><br><div class="gmail_quote">On 22 July 2011 23:14, jimmy allen <span dir="ltr">&lt;<a href="mailto:jimmy1248@gmail.com">jimmy1248@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">&gt; I&#39;ve had a frustrating day trying to code up a brushless DC motor<br>
&gt; controller... (hence the procrastinating).<br>
&gt; Anyway I&#39;d like to put this winning chocolate fish up for grabs again to the<br>
&gt; first person that tells me how to measure a pulse-width (connected to an<br>
&gt; external interrupt), glitch-free!! :<br>
&gt; This is roughly what I got:<br>
&gt;<br>
&gt; #define TIMERWRAP     1024<br>
&gt;<br>
&gt; ISR(ExternalInterrupt)  // highest priority<br>
&gt; {<br>
&gt;     if (triggered on +ve edge) {<br>
&gt;        set to trigger on -ve edge;<br>
&gt;        count = TIMERWRAP - Timer;<br>
&gt;     }<br>
&gt;     else {<br>
&gt;         set to trigger on +ve edge;<br>
&gt;         count += Timer;<br>
&gt;         // Now Count should be the pulse length... but it has glitches see<br>
&gt; below<br>
&gt;     }<br>
&gt; }<br>
&gt;<br>
&gt; ISR(TimerOverflow)   // overflows at TIMERWRAP ticks<br>
&gt; {<br>
&gt;     count += TIMERWRAP;<br>
&gt;     ....<br>
&gt; }<br>
&gt;<br>
&gt; ISR(other)<br>
&gt; {<br>
&gt;    ...<br>
&gt; }<br>
&gt;<br>
&gt; Now the problem occurs (very infrequent) when both the TimerOverflow and<br>
&gt; External interrupt occur while another (non-nesting) ISR is being processed.<br>
&gt; The Ext Interrupt will be processed first therefore missing out on the<br>
&gt; extra TIMERWRAP. I&#39;ve tried compensating by reading the interrupt flag<br>
&gt; register when processing the external interrupt, it reduces the frequency of<br>
&gt; glitches but as-long as there is any time between reading the flags register<br>
&gt; and the timer I get glitches.<br>
&gt; Is this one of those impossible micro-processor problems?<br>
&gt;<br>
&gt;<br>
<br>
Hi Cynco<br>
<br>
Could this problem be solve using a timer in very much the same way<br>
ADC is done using a timer.Also what processor is being used.<br>
<br>
Jimmy<br>
<br>
_______________________________________________<br>
Chchrobotics mailing list <a href="mailto:Chchrobotics@lists.linuxnut.co.nz">Chchrobotics@lists.linuxnut.co.nz</a><br>
<a href="http://lists.ourshack.com/mailman/listinfo/chchrobotics" target="_blank">http://lists.ourshack.com/mailman/listinfo/chchrobotics</a><br>
Mail Archives: <a href="http://lists.ourshack.com/pipermail/chchrobotics/" target="_blank">http://lists.ourshack.com/pipermail/chchrobotics/</a><br>
Web site: <a href="http://kiwibots.org" target="_blank">http://kiwibots.org</a><br>
Meeting Time and Location uncertain while Science Alive is out of action.<br>
<br>
When replying, please edit your Subject line to reflect new content.<br>
</blockquote></div><br></div>