<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Helvetica;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Helvetica;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.apple-converted-space
        {mso-style-name:apple-converted-space;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=FR-CA link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Here is what I’m trying so far..<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>void __interrupt() TMR1_isr (void) <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> {<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  // Rotary encoder pin interrupts setup<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  if(IOCBF0) // negative edge detected on RB0 (encoder A)<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  </span></i></b><b><i><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>{ <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>   TMR1IE = 0; // disable TMR1 interrupt<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>   encoder_in_transition = TRUE;<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>   manage_encoder_change(0); // 0 = encoder pin A   <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>   IOCBF0 = 0; // clear RB0 flag <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>   //TMR1IE = 1; // enable TMR1 interrupt<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  </span></i></b><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>}    <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>      <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  if(IOCBF1) // negative edge detected on RB1 (encoder B)<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  { <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>   TMR1IE = 0; // disable TMR1 interrupt<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>   encoder_in_transition = TRUE;<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>   manage_encoder_change(1); // 1 = encoder pin B  <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>   IOCBF1 = 0; // clear RB0 flag <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>   //TMR1IE = 1; // enable TMR1 interrupt<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  }  <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  if(IOCBF2) // negative edge detected on RB2 (encoder SW)<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  { <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>   TMR1IE = 0; // disable TMR1 interrupt<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>   encoder_in_transition = TRUE;<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>   manage_encoder_change(2); // 2 = encoder pin SW  <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>   IOCBF2 = 0; // clear RB1 flag <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>   TMR1IE = 1; // enable TMR1 interrupt  <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  </span></i></b><b><i><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>}<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  TMR1IF = 0; // clears TMR1 interrupt flag <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> }<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></i></b></p><p class=MsoNormal><b><i><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>//// Functions definitions ////////////////<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>///////////////////////////////////////////////<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>void manage_encoder_change(unsigned char rotary_direction)<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>{ <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  IOCIE = 0; // disable PORTx changes interrupt temporarily<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>    <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> if(rotary_direction == 0) // encoder 'A' pin falling edge detected so CW<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  {<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>     while((ROTARY_A != 0) && (ROTARY_B != 0)); // while in pulses first step<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>     while((ROTARY_A != 1) && (ROTARY_B != 0)); // while in pulses second step     <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>     while((ROTARY_A != 1) && (ROTARY_B != 1)); // while in pulses third step <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>     __delay_ms(1); // debounce<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>     <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>    if(SCALE_TRANSPOSE_SELECT == 0) // scale-transpose switch to 'scale' position<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>     { if(scale_counter < MAX_SCALE_NUMBER_VALUE) scale_counter++; }<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>      <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>    else // scale-transpose switch to 'transpose' position<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>       if(transpose_counter < MAX_TRANSPOSE_NUMBER_VALUE) transpose_counter++;  <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  }       <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>    <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  if(rotary_direction == 1) // encoder 'B' pin falling edge detected so CCW<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  {<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>     while((ROTARY_A != 0) && (ROTARY_B != 0)); // while in pulses first step<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>     while((ROTARY_A != 0) && (ROTARY_B != 1)); // while in pulses second step     <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>     while((ROTARY_A != 1) && (ROTARY_B != 1)); // while in pulses third step <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>     __delay_ms(1); // debounce<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>     <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>    if(SCALE_TRANSPOSE_SELECT == 0) // scale-transpose switch to 'scale' position<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>     { if(scale_counter > 0) scale_counter--; }<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>      <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>    else // scale-transpose switch to 'transpose' position<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>       if(transpose_counter > 0) transpose_counter--;  <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  } <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>        <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  IOCBF0 = 0; // clear the interrupt flag RB0 (encoder A)<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  IOCBF1 = 0; // clear the interrupt flag RB1 (encoder B)<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  IOCBF2 = 0; // clear the interrupt flag RB2 (encoder SW)<o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  </span></i></b><b><i><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>IOCIE = 1; // re-enable PORTx changes interrupt <o:p></o:p></span></i></b></p><p class=MsoNormal><b><i><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></i></b></p><p class=MsoNormal><b><i><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> }<o:p></o:p></span></i></b></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b><span lang=FR style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>De :</span></b><span lang=FR style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Synth-diy [mailto:synth-diy-bounces@synth-diy.org] <b>De la part de</b> Tom Wiltshire<br><b>Envoyé :</b> 6 août 2021 15:22<br><b>À :</b> John Speth<br><b>Cc :</b> synth-diy@synth-diy.org<br><b>Objet :</b> Re: [sdiy] Need goog working rotary encoder in C code..<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>+1 agree with these points.<o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Use polling, and make sure you can easily adjust the rate you check the inputs in case you need to slow it down. I used a loop of 2msecs, I think, and the software debounce required 4 stable reads to consider an input changed (so 8msecs in the same state). These numbers depend on the type of encoder used, and you should probably go as *slow* as you dare. Going faster is tempting as it “makes it more responsive” but at some point the bouncing will get worse, and then your code will no longer cope. Either test with half-dead, heavily-worn encoders, or work to a worse-case scenario!<o:p></o:p></p></div><div><p class=MsoNormal>The code should detect each input change, which is to say, on the encoders I used there are four changes between each detent. Keeping track of the changes allows both direction detection and some degree of error correction.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Interrupt based code is just going to throw a lot of unnecessary interrupts every time the input bounces, unless it’s all debounced in the hardware…in which case, what’s the software for?!?<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>My favourite debounce routine is a vertical counter debounce since it can do eight inputs in a single pass (or 16 on a word-based processor).<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal><br><br><o:p></o:p></p><div><p class=MsoNormal>On 6 Aug 2021, at 19:05, John Speth via Synth-diy <<a href="mailto:synth-diy@synth-diy.org">synth-diy@synth-diy.org</a>> wrote:<o:p></o:p></p></div><p class=MsoNormal><o:p> </o:p></p><div><div><p class=MsoNormal><span style='font-size:9.0pt;font-family:"Helvetica","sans-serif"'>I have substantial experience with the application but not in a musical context. My extensive trials and errors has convinced me of the following:<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:9.0pt;font-family:"Helvetica","sans-serif"'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='font-size:9.0pt;font-family:"Helvetica","sans-serif"'>1. You'll need to know when inputs change state, not just when the signals go low. Consider rising and falling edge interrupts on both inputs. You can detect rotation direction using this strategy.<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:9.0pt;font-family:"Helvetica","sans-serif"'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='font-size:9.0pt;font-family:"Helvetica","sans-serif"'>2. There WILL be bouncing so plan for it. Contact type switches will bounce more than optical switches. Contact type switches will degrade over time.<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:9.0pt;font-family:"Helvetica","sans-serif"'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='font-size:9.0pt;font-family:"Helvetica","sans-serif"'>3. Interrupts vs polling: Interrupts are great but they have a hidden hazard in that they can flood and overwhelm some MCUs (YMMV of course). A capacitor can help alleviate the problem but it's better to find a non-cap solution. I've found polling is better. I use a digital integration method (*) and a fast polling interval. That works so well, I automatically go to that design solution for most applications.<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:9.0pt;font-family:"Helvetica","sans-serif"'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='font-size:9.0pt;font-family:"Helvetica","sans-serif"'>* --- A digital integration method uses a counter that counts up and down and outputs a state change signal when a count threshold is reached. Increment the counter while the input is high and decrement the counter when the input is low. Reset the count when the output state changes. Adjust the polling interval for speed and accuracy. As a frame of reference, I use a 5 msec polling interval for keyboard debouncing. You'll probably want a faster interval if your encoder can be turned fast. I'll warn you that there can be a surprisingly large number of lines of code for such a simple task like digital debouncing.<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:9.0pt;font-family:"Helvetica","sans-serif"'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='font-size:9.0pt;font-family:"Helvetica","sans-serif"'>JJS<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:9.0pt;font-family:"Helvetica","sans-serif"'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='font-size:9.0pt;font-family:"Helvetica","sans-serif"'>On 8/6/2021 8:46 AM, Jean-Pierre Desrochers wrote:<o:p></o:p></span></p></div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt;font-variant-caps: normal;orphans: auto;text-align:start;widows: auto;-webkit-text-size-adjust: auto;-webkit-text-stroke-width: 0px;word-spacing:0px'><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>Hi everybody.<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'> <o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>I’m doing some tests on a rotary encoder and a PIC16F1783.</span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'><o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>A standard Bourns encoder like<span class=apple-converted-space> </span><a href="https://www.google.ca/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjyoqDF3JzyAhUmhOAKHf3lAzoQFnoECAoQAw&url=https%3A%2F%2Fwww.bourns.com%2FPDFs%2Fpec11l.pdf&usg=AOvVaw2RyieyzPnujiOTS7LBcbpw"><span style='color:purple'>THIS</span></a><span class=apple-converted-space> </span>.</span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'><o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>Connected using 2 x 10k pullups with 0.01uf caps to ground</span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'><o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>to PORTB of the micro. Interrupt calls (falling edges) used on encoder pins A & B.</span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'><o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>I struggled so far to get clean increments/decrements out of it.</span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'><o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>Many missing counts occur..</span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'><o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>I tried many source codes on the web with no luck..</span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'><o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>Is there anybody who’d have worked on this in the past<br>and have a working c code ?</span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'><o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>No ARDIUNO please.</span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'><o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-CA style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>Thanks !</span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'><o:p></o:p></span></p></div><p class=MsoNormal><span style='font-size:9.0pt;font-family:"Helvetica","sans-serif"'><o:p> </o:p></span></p></blockquote><p class=MsoNormal><span style='font-size:9.0pt;font-family:"Helvetica","sans-serif"'>_______________________________________________<br>Synth-diy mailing list<br><a href="mailto:Synth-diy@synth-diy.org">Synth-diy@synth-diy.org</a><br><a href="http://synth-diy.org/mailman/listinfo/synth-diy">http://synth-diy.org/mailman/listinfo/synth-diy</a><br>Selling or trading? Use <a href="mailto:marketplace@synth-diy.org">marketplace@synth-diy.org</a></span><o:p></o:p></p></div></div><p class=MsoNormal><o:p> </o:p></p></div></div></body></html>