Você está na página 1de 10

201761 Tutorial:Executandofunesemintervalosdetempofixos(timers)comArduinoLaboratoriodeGaragem(arduino,eletrnica,robotica,hacking)

Procurar
PesquisarLaboratoriodeGaragem(arduino,eletrnica,robotica,hacking)

Registrese
Acessar

LaboratoriodeGaragem(arduino,eletrnica,robotica,hacking)

#42

Incio
Perfil
Garagistas
reaTcnica
Frum
Blog
Galeria
Grupos
Sobre

Todasasmensagensdoblog
Meublog
Adicionar

Tutorial:Executandofunesemintervalosdetempofixos(timers)
comArduino
PostadoporTiagodeFranaQueirozem5agosto2012s17:41
Exibirblog

Essetutorialeuposteioriginalmentenomeublog:blog.tiago.eti.br,edecidireproduziloaqui.

EmboraoArdionosejaumaplataformamuitofcildeutilizarecombastanterecursos,euachoqueelaaindadeixaadesejaremalgunsapectos.
Umdelesafaltadoacessodiretoaostimerspelabibliotecapadrodoarduino.Nesseposteuvoumostrarcomoutilizarumabibliotecapara
configurardeformasimplesostimersdoArduino.

MasoquesoosTimers?
Umtimernadamaisdoqueumcontadorqueincrementadoacadaintervalodetempo(emalgunsmicrocontroladoresintervalopodeser
configurado,oArduinoumdeles).Ostimersfuncionamcomoumrelgioquepodeserusadoparacontarotempo,mediraduraodecertos
eventos,entreoutrasaplicaes.

OArduinovemequipadocomummicrocontroladorATmega168ouATmega328(quediferemapenasnaquantidadedememriainterna).Esses
microcontroladorespossuemetimres:timer0,timer1andtimer2,Timer0etimer2socontadoresde8bits,ouseja,contamde0a255,eotimer1
umcontadorde16bits,contade0a65535.

OArduinoMegavemequipadocomoATmega1280ouATmega2560(quediferemapenasnaquantidadedememria).Elespossuem
6timers:timer0,timer1,timer2,timer3,timer4,timer5.Ostimers0,1e2soidnticosaosdoATmega168/328,eostimers3,4e5soambosde
16bits.

timer0:

Otimer0utilizadopeloArduinoparafunescomodelay(),millis()emicros().Entonosedeveutilizaressetimerparaevitarcomprometer
essafunes.

Timer1:

NoArduinoUNOesseotimerutilizadopelabibliotecadecontroledeservos.Casovocnoestejautilizandoessabiblioteca,essetimerestlivre
paraserutilizadoparaoutrospropsitos.NoArduinoMegaessetimersserutilizadoparacontrolarosservossevocestiverusandomaisde12
servos.

Timer2:

Essetimerutilizadopelafunotone().Entosevocnoprecisardafunotone()essetimerestlivreparaoutrasaplicaes.

Timer3eTimer4:

http://labdegaragem.com/profiles/blogs/tutorialexecutandofunesemintervalosdetempofixostimers?id=6223006%3ABlogPost%3A155493&page=1# 1/10
201761 Tutorial:Executandofunesemintervalosdetempofixos(timers)comArduinoLaboratoriodeGaragem(arduino,eletrnica,robotica,hacking)
EssestimerssestopresentesnoArduinoMegaeelessseroutilizadospelabibliotecadoArduinocasovocsestejautilizandomaisde24
servos.De25a36servosotimer3serutilizadoede37a48servosotimer4serutilizado.

timer5:

NoArduinoMegaesseotimerpadroparaocontroledeservos,ouseja,sevocestiverutilizandode1a12servos,apenasessetimerser
utilizadopelabiblioteca.

Usandoostimers
Ostimerspodemserconfiguradosparagerarumainterrupoquandooseucontadorchegaraovalormximo(timeroverflow).Masoqueso
interrupes?

Interrupes

NoArduino(enosmicrocontroladoresdeformageral)oprogramaexecutadosequencialmente,linhaapslinha,instruoapsinstruo.Uma
interrupoumeventoexternoqueinterrompeaexecuodoprogramaechamaumafunoparatratarainterrupo,apsofimdessafunoa
execuonormaldoprogramaretomadadeondeparou.

Ostimerspodemserconfiguradosparaquandoatingiremovalormximodacontagem(overflow)geraremumainterrupoechamaremuma
funoespecfica.

Configurandoostimers
Aconfigurao"manual"dostimersbemchataetrabalhosapoisexigeamanipulaodevriosregistradoresdomicrocontrolador,mas
felizmenteexistemalgumasbibliotecasquepermitemfazerissodeformabemsimples.OmeuobjetivomostrarcomousarabibliotecaTimer1e
Timer3queestnoArduinoPlayground,etambmemumaversomodificadadelasqueeufizparapodertrabalharcomostimers4e5.Aminha
versomodificadapodeserbaixadaaqui.

Oprimeiropassobaixarasbibliotecasecolocalasnapastahardware/libraries/queestdentrodapastadoArduinoouemsketchbook/libraries/.
Olocalexatodestesdiretriosdependedosistemaoperacional(Linux,MacouWindows)etambmdaformacomoaIDEdoArduinofoi
instalada.

Usandoabiblioteca
Adescriocompletadofuncionamentodabibliotecaestnestelink,maseuireifazerumbreveresumoaqui.Asprincipaisfunesdabiblioteca
so:

inicializar(periodo)

Essemtododeveserchamadoantesdequalqueroutromtodo,poiseleresponsvelpelasconfiguraesiniciais.Vocpodeopcionalmente
informarointervalo(emmicrosegundos)noqualainterrupodevesergerada.Omenortempoaceito1microsegundoeotempomximo
de8.388.480microsegundos,ouseja,aproximadamente8,3segundos.Caosnosejainformadonenhumvalor,seratribudoovalorpadrode
1.000.000microsegundos(1segudo).Quandousadootimer1oanalogWrite()nospinos9e10doArduinoparamdefuncionar.

setPeriod(PERIODO)

Modificaoperododainterrupo.

attachInterrupt(funcao,periodo)

Atribuiumafunoparaserchamadaacadainterrupogeradapelotimer.Senoforespecificadoumperodo,serutilizadooperododefinido
nainicializaoouporsetPeriod.

Testandoabiblioteca
Paratestaressabibliotecanonecessrionenhumhardwareadicional,bastausarmosoLEDconectadoaopino13daplacadoArduinoeescrever
umnovoblink.

Aquiestaversotraduzidadoexemploqueestnapginadabiblioteca:

/*
*Timer1libraryexample
*August2012TranslatedbyTiagodeFranaQueiroz
*June2008|jessedottaneatgmaildotcom
*/

#include"TimerOne.h"

voidsetup()
{
pinMode(13,OUTPUT)
Timer1.initialize(500000)//InicializaoTimer1econfiguraparaumperodode0,5segundos
http://labdegaragem.com/profiles/blogs/tutorialexecutandofunesemintervalosdetempofixostimers?id=6223006%3ABlogPost%3A155493&page=1# 2/10
201761 Tutorial:Executandofunesemintervalosdetempofixos(timers)comArduinoLaboratoriodeGaragem(arduino,eletrnica,robotica,hacking)
Timer1.attachInterrupt(callback)//Configuraafunocallback()comoafunoparaserchamadaacadainterrupodoTimer1
}

dechamadaderetornovazio()
{
digitalWrite(13,digitalRead(13)^1)
}

voidloop()
{
//Seucdigovaiaqui...
}

Parausarosoutrostimersbastasubstituiro#include<TimerOne.h>por#include<TimerTree.h>,#include<TimerFour.h>ou#include
<TimerFive.h>enorestodocdigosubstituaTimer1porTimer3,Timer4,ouTimer5.

Essasbibliotecassoteisemvriassituaes,comoquandooloopprincipaldoseuprogramaestbloqueadoporalgummotivo(esperandoum
botoserpressionado,porexemplo)evocprecisaatualizarumdisplay,oulerumsensorindependentementedoloopprincipal,entreoutras.

importantelembrarqueotemponecessrioparaexecutarasfunesquesochamadasnainterrupodostimersdeveserMENORdoqueo
tempoentreasinterrupes!

Lembresequeaversoqueeumodifiqueiafunodepwm(queeunofaleinessepost)estdesativado.

Referncias:

http://letsmakerobots.com/node/28278

http://arduino.cc/playground/Code/Timer1

Exibies:56418

Curtir
4membroscurtemisto

Tweetar
Compartilhar Facebook

Curtir 15

Comentar

VocprecisaserummembrodeLaboratoriodeGaragem(arduino,eletrnica,robotica,hacking)paraadicionar
comentrios!

EntraremLaboratoriodeGaragem(arduino,eletrnica,robotica,hacking)

ComentriodeJooEstevoem14julho2015s11:47

Bom,ningummerespondeukkmasfuandomuito,finalmenteconseguiumaresposta!
Easoluofoiusarotimer1doarduinoUnomesmo!Spreciseiusaralgumasfunesquejexistemkkk
Asfunesqueuseipararesolveromeuproblemaestoemnegritonocdigo:

#include<TimerOne.h>
inttempo
intIN1=4//pino4DoArduino
intIN2=5//pino5fazerArduino
voidsetup()
{
Serial.begin(9600)
Timer1.initialize(10000)//InicializaoTimer1eConfiguraparahumPerodode0,01Segundos
Timer1.pwm(9,0)
Timer1.attachInterrupt(retornodechamada)//ConfiguraumachamadaderetornoFuno()comoumaChamadaFunoParaSeruma
interrupoCadafazerTimer1

}
voidcallback()
{
time++
}
voidloop()
{
Serial.println(time)

http://labdegaragem.com/profiles/blogs/tutorialexecutandofunesemintervalosdetempofixostimers?id=6223006%3ABlogPost%3A155493&page=1# 3/10
201761 Tutorial:Executandofunesemintervalosdetempofixos(timers)comArduinoLaboratoriodeGaragem(arduino,eletrnica,robotica,hacking)
digitalWrite(IN1,LOW)
digitalWrite(IN2,HIGH)
if(time>200){
Timer1.setPwmDuty(9,512)
}
}
Aprimeiralinhaemnegritodizquevamosusarpwmnopino9equepracomearcomvalor0.

Asegunda,setaopino9paraumnovovalordepwm.

Elasresolverammeuproblema,masapesardisso,constateiquenopodereivariarmuitoosintervalosdasinterrupes.Noseiexplicaro
pq,masnaofuncionou....sfuncionoucomcentisemosdesegundos.

ComentriodeJooEstevoem8julho2015s11:51

Parabnscara!Muitobomotutorial!Meajudoubastante.
Masestoutendoumproblemaegostariadesabersealgumtemalgumaideiaparameajudar.
Seguinte,estouusandoesseexemploquevocdeunomeuprojetoeestavatudodandocerto.Mas,eupreciseicomearausaroArduinoUno,
eparoudefuncionarcomoeuqueria.QUandoeuusavaoarduinoMegaconseguiarealizarasinterrupoesecontrolaravelocidadedeum
motordccompwm,mascomoUnonoconsigo!Omotorsfuncionaquantoovalordopwm255,ouseja,quandomaximo.Fizum
testeequandoeunaousoainterrupoomotorcontroladodamaneiracomoeuprojetei.Pelooqueeuli,entendiqueusarotimer1s
afetariaocontroledeumservo,nodopwm.Jpenseiemusaroutrotimerprafazerainterrupo,masnopossopqprecisodos16bits.
Enfim,achamquesconsigoresolveresseproblemasevoltarausaromega?Oualguemjapassouporissoetemalgumasoluoemmente?

Desdejaagradeo.

ComentriodeThiagoMagalhesem12janeiro2015s12:37

#include<TimerThree.h>

Voidsetup(){

Timer3.initialize(3000000)
Timer3.start()
Timer3.attachInterrupt(par)//Casonoreiniciarocontadoreleparaasrodas

voidloop(){

Sex(){

analogWrite(enable1,velocidade1)//velociadadefazerdomotor1.
analogWrite(ENABLE2,velocidade1)//velociadadefazerdomotor2.

digitalWrite(30,HIGH)//RODADOMEIOESQUERDA
digitalWrite(31,LOW)
digitalWrite(32,ALTA)
digitalWrite(33,LOW)

//noprogramavaiterumafunoqueirachamaresse"FRE"nessafunaoestficandoassim:

Fre()

Timer3.restart()//masnodarestarteorobonofuncionaquandoeucoloco.

.....algumaideia?

ComentriodeThiagoMagalhesem12janeiro2015s12:31

CarameuprogramanoestdandoRestartnocontador!nocasoocomandoseriaTimer3.restart()

http://labdegaragem.com/profiles/blogs/tutorialexecutandofunesemintervalosdetempofixostimers?id=6223006%3ABlogPost%3A155493&page=1# 4/10
201761 Tutorial:Executandofunesemintervalosdetempofixos(timers)comArduinoLaboratoriodeGaragem(arduino,eletrnica,robotica,hacking)

ComentriodeRafaelPolettiem7maro2014s18:17

BoanoiteTiago.

Tiagoporgentileza,vcsaberiameinformarsepossivelemdadoinstantedesligartemporariamenteoTimer?.PorexemplooTimer0ou1.

Grato

ComentriodeDiogoSantosSilvaem20setembro2013s22:06

Construiumpequenoprogramautilizandoomillis(),quepermiteoarduinoreceberdedadosenquantocontrolaasminibombas.

Pormestoutendoproblemaemdoisquesitos:

1_nahoradeinserironmerofinitoderepeties!

2_comointercalarofuncionamentodoscomponentes(Ex:oprimeiroativaenquantoosegundocontinuapausadoe/ouocontrrio)

intcomponente1=8
intComponent2=9
intcomponent3=10
intcomponent4=11
intcount=0

longospreviousMillis=0
longointervalo=1000
intledState=BAIXA

inttecla_pressionada=0

intpul=0//nmerodepulsos
intbinaria=0//indicaonmerodeintercalaes
intreplicata=0//nmerodereplicasdeamostragem

voidsetup()
{
Serial.begin(9600)

pinMode(component1,OUTPUT)
digitalWrite(component1,LOW)
pinMode(component2,OUTPUT)
digitalWrite(component2,LOW)
pinMode(component3,OUTPUT)
digitalWrite(component3,LOW)
pinMode(component4,OUTPUT)
digitalWrite(component4,LOW)

}

voidloop()
{

Serial.flush()

chartecla_pressionada
tecla_pressionada=Serial.read()

if(tecla_pressionada=='p'|tecla_pressionada=='P')
{
unsignedlongcurrentMillis=millis()

if(currentMillispreviousMillis>interval)
{
previousMillis=currentMillis

if(ledState==LOW)

http://labdegaragem.com/profiles/blogs/tutorialexecutandofunesemintervalosdetempofixostimers?id=6223006%3ABlogPost%3A155493&page=1# 5/10
201761 Tutorial:Executandofunesemintervalosdetempofixos(timers)comArduinoLaboratoriodeGaragem(arduino,eletrnica,robotica,hacking)
ledState=HIGH
else
ledState=LOW

digitalWrite(8,ledState),digitalWrite(10,ledState)
digitalWrite(9,ledState)

}

}

Serial.println(analogRead(A2))
}

Algumsaberiacomoresolveressatreta!?

Tenteiaplicaramesmalgicadooutroprograma(usandodelay()),pormoloop()nosnoreconheceocomandoderepetiodo
"processo"comotambminviabilizaocontroleviateclado!

ComentriodeDiogoSantosSilvaem18setembro2013s21:55

Oh....desculpatentareisermaisclaro,quandoeudisse

"Queinterrompaumadeterminadafuno,pormpermitirqueoutrasocorram"

queriadizer:

Seexisteumaformadeinterromperdeterminadoprocesso,pelotempoquefornecessitado,emesmosaindodoestadodeinterrompidoseja
possvelexecutarumsegundoprocessocomoporexemploreceberdadosdeumsensor?

Nocasooarduinoagiriadeformapassiva!

Comoosensorfuncionainterruptamenteeoarduinoapenasreceberiadadosenoocontrolaria!

Odelay()temumaaplicabilidademuitosimpleseeficiente,pormeleinterrompequalquerprocessoqueestejaemexecuo!Apartirdisso
surgiuaideiadetrabalharcomociclosdetempo(usandoumabibliotecatimeroupelomillis()).Naqualaindaestava(eaindaestou)com
dvidapormnoconseguirexpressaressadvidadeformaclara!

Entoparaficarmaisclarovoupostarpartedomeuprograma(paranoestenderdemaisopost).Neleest"algo"quejtesteiefunciona
pormportrabalharcomdelay()nopermitequesejaimplementadoumsensordeluz.

/*

Nessesketchseeucolocarum"Serial.println(fotometro)"emqualquerpartedovoidloop()noconsigorecebernadapeloserialmonitor
apsterativadoocomandodeacionamentopeloteclado,poisodelay()interrompeoprocesso.

Parasermaisprecisoconsigofazerosistemafuncionar,seesomentese,euestivertrabalhandocomduasplacas.Ondeumaficapor
controlaroscomponenteseaoutraficaacargodereceberosdadosdosensor.Oquetornaoprojetoinvivel!

Nesseprojetoestoutrabalhocomoarduinodue.

*/

intinicio[]={8,9,10,11}//pinosdasminibombasevlvula
intcount=0
intfotometro=A2//sensornaportaanalgicaA2
intteclapressionada=0//irarmazenaroestadodequaltecla(P,L,B,A)estpressionado
intpul=0

voidsetup()
{

Serial.begin(9600)//indicandoqueserospinosdesada

para(count=0contagem<4contagem++)
{
pinMode(inicio[cont],OUTPUT)
digitalWrite(inicio[cont],LOW)
}

http://labdegaragem.com/profiles/blogs/tutorialexecutandofunesemintervalosdetempofixostimers?id=6223006%3ABlogPost%3A155493&page=1# 6/10
201761 Tutorial:Executandofunesemintervalosdetempofixos(timers)comArduinoLaboratoriodeGaragem(arduino,eletrnica,robotica,hacking)

voidloop()//etapadeamostragem
{

Serial.flush()
chartecla_pressionada

tecla_pressionada=Serial.read()

if(tecla_pressionada=='b'|tecla_pressionada=='B')
{

intpul=0//varivelnumerodepulsosporreagentes
intbinaria=0//varivelnmerodeciclosbinrios
intreplicata=0//varivelnmerodereplicatasporamostras

para(replicado=0replicado<1replicado++)
{
para(binrio=0binrio<2binrio++)
{

para(pul=0pul<150pul++)
{

digitalWrite(11,ALTA)
digitalWrite(8,ALTA)digitalWrite(9,ALTA)
atraso(100)
digitalWrite(9,LOW)digitalWrite(8,LOW)
atraso(100)
}

DigitalWrite(11,LOW)

}
}

else
if(tecla_pressionada=='a'|tecla_pressionada=='A')
{

intpul=0//varivelnumerodepulsosporreagentes
intbinaria=0//varivelnmerodeciclosbinrios
intreplicata=0//varivelnmerodereplicatasporamostras

para(replicado=0replicado<1replicado++)
{
para(binrio=0binrio<2binrio++)//indicaumNmerodeintercalaes
{

for(pul=0pul<150pul++)//indicaonmerodepulsodeamostraereagente.
{

digitalWrite(10,ALTA)

digitalWrite(9,ALTA)digitalWrite(8,ALTA)digitalWrite(10,LOW)
atraso(100)
digitalWrite(9,LOW)digitalWrite(8,LOW)
atraso(100)
}

/*
http://labdegaragem.com/profiles/blogs/tutorialexecutandofunesemintervalosdetempofixostimers?id=6223006%3ABlogPost%3A155493&page=1# 7/10
201761 Tutorial:Executandofunesemintervalosdetempofixos(timers)comArduinoLaboratoriodeGaragem(arduino,eletrnica,robotica,hacking)
Nomomentoconsegui(umpoucoantesdocomputador"bugar"emeobrigaraformatlo)fazeroscomponentesesensortrabalharem
juntos.Pormnoestouacertandocomodevoescreverosketch,paraque,hajaumacomutaonofuncionamentodoscomponentes
(enquantoumaminibombaestativadaoutraestejadesativadadeacordocomumtempoprdeterminado)ehajaocontrolepeloteclado
porqueoarduinoaindanoenxergaoquefeitonoloop().

DepoisquereinstalartudonovamentenoPcerefazerosketchqueestavaconstruindoireipostalo.

*/

ComentriodeTiagodeFranaQueirozem18setembro2013s10:08

Ento,internamenteodelayusaotimer,eununcaolheiaimplementao,masideiaessa:
1Setaotimerparaodelayquevcquer,seodelayformaiordoqueotimerpodecontar,colocaacallbackpracontarumnmeroXde
interrupes.

2Colocaotimerpradar
3Colocaumaesperaocupadaondevcquerodelay.Algocomo"while(!flag)"
4Desativaotimer
5Continuaoprograma.

Eunoentendidireitooquevcfazer....especialmenteessaparte:"Queinterrompaumadeterminadafuno,pormpermitirqueoutras
ocorram".

Oarduinospodeexecutarumafunoporvez.Omximoquedapraconseguirusarinterrupesdesoftware(comoostimers)e
hardware.Oefeitodissovaiserinterromperoqueestsendoexecutado,executarafunorelacionadacomainterrupoedepoisretomara
execuoquefoiinterrompida.

Normalmenteemaplicaescomtecladoecoisasdotipovctemqueficarlendoasteclasotempotodoatdetectarqueumafoipressionada.

Explicacommaisdetalhesoquevcquerfazerqueeutentotedarumarespostamelhor.

ComentriodeDiogoSantosSilvaem13setembro2013s10:46

Certo,mas...entonoexiste"nada"quepossaservirdealternativaparaodelay()?

Estavaolhandoomillis()(quandoviopostsobreabiblioteca"timer"),quetambmpossibilitaocontroleporciclosdetempo,pormparao
quepretendo(aesdocomponentesseremativadasportecladodeacordocomomomento)suaaplicaonoprtica.

Existealgoqueseaproximedessetipodeao?

Queinterrompaumadeterminadafuno,pormpermitirqueoutrasocorram.

EvaleupelaexplicaoTiago!

ComentriodeTiagodeFranaQueirozem12setembro2013s18:56

Diego,afunodelay()etimersobemdiferentes.Paracoisasbemsimplescomooblinkelasparecemiguais,masnoso.

Basicamenteodelay()paraaexecuodoprogramapordadotempoenquantoqueostimersexecutamumafunoacadaintervalode
tempo.

Quandoumainterrupodotimergeradooloop()interrompidoeafunoregistradacomattachInterruptexecutadaedepoisoloop()
continuasendoexecutado.

Oobjetivodotimer(nocasodoexemplodessepost)executarumafunoemumintervaloregulardetempoindependentedoqueest
sendoexecutadonoloop().

Euconseguiesclarecersuadvida?

Anterior
1
2
Prximo
Pgina 2 e

RSS

Bemvindoa
LaboratoriodeGaragem(arduino,eletrnica,robotica,hacking)

http://labdegaragem.com/profiles/blogs/tutorialexecutandofunesemintervalosdetempofixostimers?id=6223006%3ABlogPost%3A155493&page=1# 8/10
201761 Tutorial:Executandofunesemintervalosdetempofixos(timers)comArduinoLaboratoriodeGaragem(arduino,eletrnica,robotica,hacking)

Registrese
ouacesse

Ouentrecom:

Destaques

Registreseno
LabdeGaragem
Clicandoaqui

Convideum
amigoparafazer
parte

http://labdegaragem.com/profiles/blogs/tutorialexecutandofunesemintervalosdetempofixostimers?id=6223006%3ABlogPost%3A155493&page=1# 9/10
201761 Tutorial:Executandofunesemintervalosdetempofixos(timers)comArduinoLaboratoriodeGaragem(arduino,eletrnica,robotica,hacking)

2017CriadoporMarceloRodrigues.Ativadopor

Badges|Relatarumincidente|Termosdeservio

Entrarnobatepapo

http://labdegaragem.com/profiles/blogs/tutorialexecutandofunesemintervalosdetempofixostimers?id=6223006%3ABlogPost%3A155493&page=1 10/10