<div dir="ltr">Valeu pessoal, acabei fazendo um teste simples, tipo imprimir uma sequencia de números e por interrupções no meio do caminho. E ele fazia a tarefa completa.<div><br></div><div>O desafio aqui foi criar uma Roda Fônica [1] que gera sinais para uma central de injeção eletrônica, essa roda fônica é quase um PWM, mas a cada X ciclos os últimos ciclos não pulsam, é como se fosse uma marcação.</div><div><br></div><div>Deu certo, consegui gerar a onda no osciloscópio e deixar imprimindo umas bobagens na serial, 0 menor intervalo de ciclo que consegui foi 100us (na verdade consegui 80us mas tremia muito).</div><div><br></div><div>[1] - <a href="http://autoentusiastas.blogspot.com.br/2011/10/matemagica-da-roda-fonica.html" target="_blank" style="font-size:12.8000001907349px">http://autoentusiastas.blogspot.com.br/2011/10/matemagica-da-roda-fonica.html</a></div></div><div class="gmail_extra"><br><div class="gmail_quote">2015-05-06 13:33 GMT-03:00 DQ <span dir="ltr"><<a href="mailto:dqsoft.blogspot@gmail.com" target="_blank">dqsoft.blogspot@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><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.<span class="HOEnZb"><font color="#888888"><br><br>DQ<br>Escrevendo rotinas de interrupção deste 1980.</font></span><div><div class="h5"><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" rel="nofollow" target="_blank">http://playground.arduino.cc/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" rel="nofollow" target="_blank">https://github.com/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>======================================<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>======================================</div>
</div></div></div></div>
</blockquote></div></div></div>
<p></p>
-- <br><div class="HOEnZb"><div class="h5">
.--. .- .-. .- .--. --- ... - .- .-. . ... -.-. .-. . ...- .- .--. .- .-. .- .... .- -.-. -.- . .-. ... .--. .- -.-. . ... .--. .- - --. --- --- --. .-.. . --. .-. --- ..- .--. ... -.. --- - -.-. --- -- <br>
Regras da Lista: <a href="http://garoa.net.br/wiki/Lista:LeiaAntesDeClicarNoSend" target="_blank">http://garoa.net.br/wiki/Lista:LeiaAntesDeClicarNoSend</a><br>
Para mais informações sobre o Garoa Hacker Clube acesse <a href="http://garoa.net.br" target="_blank">http://garoa.net.br</a><br>
Maiores opções sobre o Google Groups, visite: <a href="http://groups.google.com/group/hackerspacesp" target="_blank">http://groups.google.com/group/hackerspacesp</a><br>
.--. .- .-. .- -- .- .. ... .. -. ..-. --- .-. -- .- . ... .- -.-. . ... ... . --- .-- .. -.- .. <br>
Epoch 0 <=> Fundação: 1298244863 s ~ 2.408064*10^52 tP (tempos de Planck)<br>
<br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">======================================<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>======================================</div>
</div>