<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:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
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;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Texte brut Car";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
span.TextebrutCar
        {mso-style-name:"Texte brut Car";
        mso-style-priority:99;
        mso-style-link:"Texte brut";
        font-family:"Calibri","sans-serif";
        mso-fareast-language:FR-CA;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;}
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=MsoPlainText><span lang=EN-CA style='color:#215968;mso-style-textfill-fill-color:#215968;mso-style-textfill-fill-alpha:100.0%'>Here is my complete interrupt routine,<o:p></o:p></span></p><p class=MsoPlainText><span lang=EN-CA style='color:#215968;mso-style-textfill-fill-color:#215968;mso-style-textfill-fill-alpha:100.0%'>This routine could be called by the USART, Timer0 or Timer1<o:p></o:p></span></p><p class=MsoPlainText><span lang=EN-CA style='color:#215968;mso-style-textfill-fill-color:#215968;mso-style-textfill-fill-alpha:100.0%'>And so reacts on which is calling..<o:p></o:p></span></p><p class=MsoPlainText><span lang=EN-CA style='color:#215968;mso-style-textfill-fill-color:#215968;mso-style-textfill-fill-alpha:100.0%'>Problem doing that ?<o:p></o:p></span></p><p class=MsoPlainText><span lang=EN-CA style='color:#215968;mso-style-textfill-fill-color:#215968;mso-style-textfill-fill-alpha:100.0%'>And yes I have to check for any USART overrun OERR flag here<o:p></o:p></span></p><p class=MsoPlainText><span lang=EN-CA style='color:#215968;mso-style-textfill-fill-color:#215968;mso-style-textfill-fill-alpha:100.0%'>To see if it sometimes happens..<o:p></o:p></span></p><p class=MsoPlainText><span lang=EN-CA><o:p> </o:p></span></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>///////////////////////////////<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>// ----------------------------<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>//  interrupt service routine<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>// ----------------------------<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>///////////////////////////////                              <o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'><o:p> </o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>void interrupt tmr0_USART_isr (void) <o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'> {<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>  char  x;      // intermediate byte value<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'><o:p> </o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>  // RS232 receive interrupt                       <o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>  if (RCIF == TRUE && RCIE == TRUE) <o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>   {                                                     <o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'><o:p> </o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>    if (OERR == TRUE)     // overrun, reset UART<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>     {                                              <o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>      CREN = FALSE;       // disable UART<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>      CREN = TRUE;        // re-enable UART<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>     }                                         <o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>   <o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>    else <o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>     { <o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>      x = RCREG;<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>      if((x & 0xF0) != 0xF0)    // Ignore all 1 byte commands<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>       {                                  // data without errors<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>        rcvbuf[rcvoffset] = x;            // move byte to rcv buffer                                                    <o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>        rcvoffset++;                     // offset next byte<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'><o:p> </o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>        if (rcvoffset == RCVBUFSIZE)    // beyond buffer boundary<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>          rcvoffset = 0;                // wrap to begin<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>       }  <o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'><o:p> </o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>      MIDI_ACTIVITY_LED = ON; //RC0 = 0; // Set led MIDI ACTIVITY to ON<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>      TMR0 = 0; // restart timer0<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>      T0IE=1;   // Activates overflow interrupt of TMR0 register<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>      </span></b><b><span style='font-family:"Courier New"'>RCIF = 0; // Erase MIDI RX flag<o:p></o:p></span></b></p><p class=MsoPlainText><b><span style='font-family:"Courier New"'>      }<o:p></o:p></span></b></p><p class=MsoPlainText><b><span style='font-family:"Courier New"'><o:p> </o:p></span></b></p><p class=MsoPlainText><b><span style='font-family:"Courier New"'><o:p> </o:p></span></b></p><p class=MsoPlainText><b><span style='font-family:"Courier New"'>    </span></b><b><span lang=EN-CA style='font-family:"Courier New"'>}<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'><o:p> </o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>  // Timer0 interrupt<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>  if (T0IF == TRUE)<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>   {<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>    MIDI_ACTIVITY_LED = OFF; //RC0 = 1; // Shut down MIDI ACTIVITY led<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>    T0IF = 0;<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>    T0IE=0; // Prevent overflow interrupt of TMR0 register<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>   }<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'><o:p> </o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'><o:p> </o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>  // Timer1 interrupt<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>  if (TMR1IF == TRUE)<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>   {<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>    TIMER1_mult++;<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>    if(TIMER1_mult == TIMER1_MUL_MAX)<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>     {<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>      TIMER1_mult = 0;<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>      ARPEGGIO_LED ^= 1;  // RC1 ^= 1;<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>     }<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>    TMR1H = arpeggio_rate;<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>    TMR1L = 0;<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>    TMR1IF = 0;<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'>   }<o:p></o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'><o:p> </o:p></span></b></p><p class=MsoPlainText><b><span lang=EN-CA style='font-family:"Courier New"'> }<o:p></o:p></span></b></p><p class=MsoPlainText><span lang=EN-CA><o:p> </o:p></span></p><p class=MsoPlainText><span lang=EN-CA><o:p> </o:p></span></p><p class=MsoPlainText><span lang=EN-CA><o:p> </o:p></span></p><p class=MsoPlainText><span lang=EN-CA><o:p> </o:p></span></p><p class=MsoPlainText><span lang=EN-CA>*************************************************************************<o:p></o:p></span></p><p class=MsoPlainText><span lang=FR>-----Message d'origine-----<br>De : Synth-diy [mailto:synth-diy-bounces@synth-diy.org] De la part de René Schmitz<br>Envoyé : 20 mars 2020 10:49<br>À : synth-diy@synth-diy.org<br>Objet : Re: [sdiy] MIDI I/O c code..</span></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>On 20.03.2020 15:11, Jean-Pierre Desrochers wrote:<o:p></o:p></p><p class=MsoPlainText>> Hi Mikko,<o:p></o:p></p><p class=MsoPlainText>> <o:p></o:p></p><p class=MsoPlainText>> Here is my USART Rx  interrupt routine :<o:p></o:p></p><p class=MsoPlainText>> Maybe you’ll spot any errors or things I forgot.. ??<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Without looking at the interrupt setup code I'm not sure, but it seems <o:p></o:p></p><p class=MsoPlainText>you check the USART in a Timer ISR is that the intention? (by how you <o:p></o:p></p><p class=MsoPlainText>named things.)<o:p></o:p></p><p class=MsoPlainText>if so, it could be that sometimes you miss a byte because there is an <o:p></o:p></p><p class=MsoPlainText>overrun between two timer cycles. have you tried seeing if the overrun <o:p></o:p></p><p class=MsoPlainText>flag is actually set? (maybe toggle a pin so you can check with a scope.)<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Best,<o:p></o:p></p><p class=MsoPlainText>  René<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>--<o:p></o:p></p><p class=MsoPlainText>synth@schmitzbits.de<o:p></o:p></p><p class=MsoPlainText>http://schmitzbits.de<o:p></o:p></p><p class=MsoPlainText>_______________________________________________<o:p></o:p></p><p class=MsoPlainText>Synth-diy mailing list<o:p></o:p></p><p class=MsoPlainText>Synth-diy@synth-diy.org<o:p></o:p></p><p class=MsoPlainText>http://synth-diy.org/mailman/listinfo/synth-diy<o:p></o:p></p></div></body></html>