<div dir="ltr">Messias,<br><br>O conceito de interrupção é justamente interromper o código que está sendo executado e depois retomá-lo exatamente onde parou. Dentro de certos parâmetros, a interrupção não é percebida pelo código que foi interrompido. Digo "dentro de certos parâmetros", pois ela vai consumir um tempo do processador e as ações que a rotina de interrupção executar podem interferir o que estava sendo executado. Estes são os principais desafios para o uso de interrupção: fazer rotinas rápidas e se proteger contra interferências.<br><br>Note que a interrupção é no nível de linguagem de máquina, não no nível de linha de código C. Por exemplo, considere o código abaixo:<br><br>uint32_t cont;<br><br>void loop ()<br>{<br> // um monte de coisa<br><br> cont = 100000;<br><br> // outro monte de coisa<br> <br> if (cont == 0L)<br> {<br> }<br><br> // etc<br>}<br><br>// Rotina chamada pela interrupção de timer<br><br>rotIntTimer ()<br>{<br> if (cont != 0L)<br> cont--;<br>}<br><br>O teste cont == 0L requer várias instruções de máquina, pois é uma variável de 4 bytes e as instruções do ATmega trabalham com um byte de cada vez. A interrupção pode acontecer em qualquer ponto deste teste, o que pode causar um bug pois a rotina principal pode testar alguns bytes antes do decremento e outros depois. Uma forma de evitar isto é proteger o acesso a várias compartilhadas desabilitando as interrupções no programa principal durante o teste. A consequência é que isto aumenta o tempo para responder à interrupção.<br><br>Na verdade este exemplo tem um outro erro: se você não disser nada o compilador não vai saber que uma rotina de interrupção pode alterar o valor de cont e vai otimizar considerando que o valor só é alterado pela atribuição. Para evitar isto é necessário usar o modificador volatile na declaração de cont.<br><br>Em resumo (o assunto é extenso) interrupção é um recurso muito importante (eu diria até que essencial para uma programação limpa) mas requer vários cuidados.<br><br>Obs: Já usei várias vezes a TimerOne e é muito boa.<br><br>DQ<br>Escrevendo rotinas de interrupção deste 1980.<br><br><br>On Wednesday, May 6, 2015 at 12:40:29 PM UTC-3, Mesias wrote:<blockquote class="gmail_quote" style="margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir="ltr">Caros, estava lendo sobre esta biblioteca de Timer: <div><a href="http://playground.arduino.cc/code/timer1" target="_blank" rel="nofollow" onmousedown="this.href='http://www.google.com/url?q\75http%3A%2F%2Fplayground.arduino.cc%2Fcode%2Ftimer1\46sa\75D\46sntz\0751\46usg\75AFQjCNFaym98sFi7_zRMsY4FKR7hpdJ0pQ';return true;" onclick="this.href='http://www.google.com/url?q\75http%3A%2F%2Fplayground.arduino.cc%2Fcode%2Ftimer1\46sa\75D\46sntz\0751\46usg\75AFQjCNFaym98sFi7_zRMsY4FKR7hpdJ0pQ';return true;">http://playground.arduino.cc/<wbr>code/timer1</a><div><br></div><div>Que cita esta outra biblioteca de Timer (mantida mais recente):</div><div><a href="https://github.com/PaulStoffregen/TimerOne" target="_blank" rel="nofollow" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fgithub.com%2FPaulStoffregen%2FTimerOne\46sa\75D\46sntz\0751\46usg\75AFQjCNH85v9vYGzrtzH0KXwu-fMLg8EIsw';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fgithub.com%2FPaulStoffregen%2FTimerOne\46sa\75D\46sntz\0751\46usg\75AFQjCNH85v9vYGzrtzH0KXwu-fMLg8EIsw';return true;">https://github.com/<wbr>PaulStoffregen/TimerOne</a><br><div><br></div><div><div><br></div><div>Minha dúvida é a seguinte: se o Arduino sofre uma interrupção durante a execução do "loop", ao retornar da interrupção ele para de onde estava ou faz uma nova execução de "loop" ?</div><div><br></div>-- <br><div>==============================<wbr>========<br>Alejandro Mesias André Nebra Perez<br>Java/Python/Js/Something else Developer<br>Twitter: @meszias<br>Linux User #442506<br>Campinas - SP - Brasil - South America<br>==============================<wbr>========</div>
</div></div></div></div>
</blockquote></div>