<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>