Вы находитесь на странице: 1из 22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC

ProjetosetutoriaissobreprogramaodePIC,AVReArduno.

Incio

Frum

Doaes

PRAQUEMEST/ESTAVAACOMPANHANDO
ASVIDEOAULAS,ELASESTO...
Excelente
Maisoumenos
Ruim
PrecisamelhorarMUITO...

<<

>>

Votar

Exibirresultados

Votosatomomento:51
Diasrestantesparavotar:62

PESQUISARNESTEBLOG

Curso de Programao em C para Microcontroladores PIC


1

Fazerumabusca...

NOVIDADESDOBLOG30/03/15

01/11/12

AVR:Display7Segmentos

UtilizandooTIMER0doPIC

UtilizandooTIMER0doPIC
O TIMER0 normalmente utilizado em projetos para fazer a base de tempo, ou seja, o relgio do
projeto, como contar tempo para repetir ou considerar um evento.

AVR:Pullups
AVR:PiscaPiscacomATMega328P
Todososcdigosdoblogestohospedados
noGitHubGist
Curso:Aula03Variaveis,vetoresefunes
PIC:25XX320
PIC:RDA5807
PIC:SSD1306

O TIMER0 utiliza normalmente trs registros especiais (SFR), dependendo do PIC a ser utilizado. Mostrarei
como utilizar o TIMER0 do PIC16F877A.

Curso:EmentaAtualizada
Curso:Aula02PortasI/O
PIC:PCF8583
Curso:Aula01
AtualizaodeCdigo:DHT11
Tutorial:Ellipsis
PIC:MCP4XXX
ArduinoUnoparaProteus

TRANSLATE

Selecioneoidioma
Poweredby

http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

Tradutor

1/22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC

MARCADORES
ApostilaseLivros(3)
Arduino(11)
AVR(12)
Bibliotecas(37)
Circuitos(3)
Componentes(1)
Curso(4)
Downloads(10)
Games(2)
Ladder(1)
PIC(77)
Projetos(47)
Sensores(9)
Tutoriais(47)
Wireless(2)

SEGUIRMEPOREMAIL
Emailaddress...

Submit

PIC16F877A
O temporizador/Contador TIMER0 possui as seguintes caractersticas:

temporizador/contador de 8 bits;
leitura e gravao;
software prescaler de 8 bits programvel;
Relgio interno ou externo selecionavel;
Interrupo no estouro de FFh para 00h;
Borda de seleo para relgio externo;

POSTAGENSDOBLOG
2015(5)
2014(34)
2013(60)
2012(48)
Dezembro(17)
Novembro(7)
Projeto14:VoltimetroAnalogicoe
Digital

Registros associados ao TIMER0:

Projeto13:ContadordePulsos
Projeto12:RelgioDigital
1

mais Prximoblog Criarumblog

Tutorial5:BliblotecaMikroC:Sound
Projeto11:TecladoMusicalcomPIC
Tutorial4:BibliotecaMikroC:PS/2
UtilizandooTIMER0doPIC
Outubro(8)
Setembro(16)

MODO CONTADOR:
O TIMER0 funciona como contador, quando voc usa como oscilador os pulsos externos aplicado no pino
RA4/T0CKIN.

TOPSEMANAL

Proteus8.1
Professional

Voc deve configurar o seguinte registro:


1,5mil
Curtir

81

MikroCPROfor
PIC,dsPIC,PIC32,
8051,AVR

ArduinoUnoparaProteus
http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

2/22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC

0
Tweetar

T0CS - Define a fonte de clock do TIMER0:


1 - Externa (PINO RA4/T0CKIN) - Modo contador;
0 - Interna (Cristal de quartzo) - Modo temporizador;

Projeto20:Timer
utilizandoo
PIC16F628A

T0SE - Seleo da borda de transio do pino RA4/T0CKIN


1 - transio nivel alto-baixo (transio negativa);
0 - transio nivel baixo-alto (transio positiva);

ArduinoComponenteparao
Proteus

PSA - Habilitao do prescaler(no modo CONTADOR comum desabilitar);

1 - Desabilitado;
0 - Habilitado;

PS2, PS1, PS0 - Seleo do prescaler( somente no modo temporizador);

bits / TMR0 rate


0001:2
0011:4
0101:8
0111:16
1001:32
1011:64
1101:128
1111:256

Livrossobre
Programaode
Arduino

UtilizandooTIMER0
doPIC

PIC:RFIDMFRC522

SEGUIDORES
Participardestesite
GoogleFriendConnect

Exemplo:

Membros(96) Mais

01.

voidmain()

02.

03.

TRISB=0;

04.

OPTION_REG=0b10111000;//modocontador

05.

TMR0=0;//InicializaoregistroTMR0comovalor0.

06.

while(1)

07.

08.

if(INTCON.TMR0IF)

09.

10.

INTCON.TMR0IF=0;//limpaaflag

11.

TMR0=0;

12.

portb=~portb;//quandoacontecerooverflow(acada256pulsos)interverassaidas

13.

14.

delay_ms(10);

15.

16.

Jummembro?Fazerlogin

CONTATO

microcontrolandos2012@gmail.com

PERFIL

TiagoMelo-GraduandoemCinciada
ComputaonaUniversidadeFederal
deItajub-UNIFEIeTcnicoem
EletrnicapeloSENAI.

O registro TMR0 o registro que armazena o estado inicial da contagem. Possui 8 bits, por isso conta de
0 a 255. Quando acontece o overflow ele retorna a contagem inicial 0. O bit do overflow o
INTCON.TMR0IF e deve ser limpo por software.
http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

3/22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC

MODO TEMPORIZADOR:
O temporizador do TIMER0 funciona quando voc usa o oscilador interno do PIC ou o cristal de quartzo
externo.
Voc deve configurar os seguintes bits do registro OPTION_REG:

T0CS- Define a fonte de clock do TIMER0:


1- Externa (PINO RA4/T0CKIN) - Modo contador;
0 - Interna (Cristal de quartzo) - Modo temporizador;
PSA- Habilitao do prescaler(no modo CONTADOR comum desabilitar);
1- Desabilitado;
0 - Habilitado;

PS2, PS1, PS0- Seleo do prescaler;

bits / TMR0 rate


000 1:2
001 1:4
010 1:8
011 1:16
100 1:32
101 1:64
110 1:128
111 1:256

Voc deve estar perguntando: O que prescaler?


Prescaler o divisor de frequncia do clock do TIMER0. usado no modo temporizador para poder obter
tempos maiores.

A frmula do tempo para o overflow a seguinte:


= ciclo de mquina * prescaler * contagem ( 256 - TMR0 );
ciclo de mquina = 4 / Fosc;

Fosc a freqncia do clock do cristal oscilador.


EXEMPLO:
O clock de um PIC de 4MHz, utlizado o prescaler de 1:256 e contagem de 0 a 256, qual ser o tempo?
ciclo de mquina = 4/4 = 1us.
t = 1 * 256 * 256;
t = 65536us ou 65,536ms
para ter tempos ainda maiores, como alguns segundos,um dos meios de se conseguir utilizando a
interrupo.
Veja um exemplo: utilizando clock 4Mhz e prescaler de 1:4.

http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

4/22

21/04/2015

01.

Microcontrolandos:UtilizandooTIMER0doPIC

unsignedcontagem;

02.
03.

voidinterrupt()

04.

05.

contagem++;//paracadainterrpodoTMR0incrementaavarivelcontagem

06.

TMR0=0;

07.

INTCON.TMR0IF=0;//limpaooverflow.

08.

09.
10.

voidmain()

11.

12.

INTCON.GIE=1;//habilitainterrupoglobal;

13.

INTCON.PEIE=1;//habilitainterrupodosperifericos;

14.

INTCON.TMR0IE=1;//habilitainterrupodoTMR0;

15.

TMR0=0;//TIMER0iniciacomovalor0;

16.

OPTION_REG=0b10000001;//ModoTemporizador,prescaler1:4;

17.

//tempo=1us*4*256=1ms

18.

...

19.

while(1)

20.

21.

if(contagem==1000)//quandoocontagem=1000,tempo=1000*1ms=1s;

22.

23.

portb.RB0=~portb.RB0;//inverteoestadodopinorb0

24.

contagem=0;//resetaavariavelcontagem

25.

26.

27.

Podertambmgostarde:

TextoRolantecom
MatrizePIC

ComunicaoI2C

Utilizandoo
Comparadordo
PIC

Utilizandoo
TIMER1doPIC

Utilizandoas
interrupesdo
PIC

Linkwithin

Curtir

Compartilhar

16

Tweetar

+1 Recomende isto no Google

65comentrios:
Samuka quinta-feira, 6 de dezembro de 2012 15:07:00 BRST
Boa tarde.
No texto voc coloca t=65,536ms e no cdigo 4,096ms
uma diviso por 16 que eu no consegui entender.
Outra coisa, preciso contar um segundo com um cristal de 20MHz, pode me ajudar na conta mais
precisa /
Responder
Respostas

http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

5/22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC

Tiago Henrique
15:51:00 BRST

quinta-feira, 6 de dezembro de 2012

Muito obrigado pelo seu comentrio! o primeiro do blog!!!


Voc tem razo,acabei utilizando o prescaler de 1:256 sendo que na verdade de 1:16,
me desculpe pelo erro e j corrigi.
No seu caso:
ciclo de mquina = 4 / 20MHZ = 0,2 us.
tempo = 0,2 * 4 * 125 = 100us.
utilizando prescaler de 1:4 e TMR0=131(256 - 125) => ir contar de 131 a 256.
Para cada interrupo gerada, voc pode incrementar uma varivel (x) e quando essa
varivel chegar no valor de 10000 executar alguma coisa.
No final de tudo: 10000 * 100us = 1segundo.
Espero que possa ter entendido! Muito obrigado pelo seu comentrio!!

Responder

Tiago de Bortoli sbado, 23 de maro de 2013 15:01:00 BRT


Boa tarde,
Primeiramente gostaria de lhe dar os parabns pela explicao, pesquisando, no encontrei nada nem
mesmo similar. Muito bom!!!
Infelizmente no estou entendendo muito bem a configurao do "optionreg" j li e reli o datasheet
do pic16f877a mas ainda tenho duvidas sobre como delarar as variveis do pre escale.
Estou tentando fazer um led piscar com a funar timer0, voc poderia me auxiliar?
Responder

Tiago Henrique

sbado, 23 de maro de 2013 16:06:00 BRT

Obrigado :)
Cada bit do registro OPTION_REG tem uma funo. os bits 2, 1 e 0 possui a funo de configurar o
prescaler. Ento, caso OPTION_REG = 0B10000111, como os ultimos bits so 111, o prescaler ser
1:256.
para poder fazer um led piscar, voc deve configurar TIMER0 no modo temporizador(bit 5). Atraves
da formula dito acima, voc calcula o tempo.
Faz de conta que utilize um cristal de 4Mhz(ciclo maquina = 1us),precaler 1:128, e carregue o TMR0
como o valor 100 O perido ser: 1 * 128 * (256 - 100) = 19968us = 20ms. O led piscara num intervalo
de 20ms.
O codigo ficaria assim:
void main(){
TMR0 = 100
OPTION_REG = 0B10000110//como os ultimos bits sao 110, prescaler e 1:128.
TRISB.F0 = 0
while(1){
if(INTCON.TMR0IF==1){//flag de sinalizacao quando TMR0 e maior q 255
PORTB.F0 = ~PORTB.F0//pisca o led
TMR0 = 100//necessita carregar o TMR0, senao volta pra 0
INTCON.TMR0IF=0//limpa a flag
}
}
}
Responder
Respostas

Tiago de Bortoli sbado, 23 de maro de 2013 16:19:00


BRT
Nossa, que gil a resposta hehehe...^^
Com um exemplo tudo comea ficar mais claro, agora consegui associar a funo de cada

http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

6/22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC
bit do "OPTION_REG". Li o Cap. 2 e 5 do datasheet mas faltava uma dica para unir a
teoria com a pratica.
A atividade que estou desenvolvendo pede que eu configure a fonte de clock com
configurao do pre escaler 1:256 e que siga o seguinte algoritmo:
configurar fonte de clock
conf. pre escaler 1:256
enquanto timer<15625 espere
timer = 0
acended lad
enquando timer<15625, espere
timer = 0
apaga led
O meu cdigo encontra-se assim:
void main() {
TRISA=0b11111110 //Porta A tm o pino A0 configurado como "sada"
OPTION_REG=0b10000111
for()
{
while (TMR0<255) {
TMR0=0
PORTA=0b00000000} //Pino A0 libera "sada alta" (5V)
while (TMR0<255) {
TMR0=0
PORTA=0b00000001} //Pino A0 libera "sada alta" (5V)
}
}
Mas no funciona por nada hehehe.... alguma luz?

Tiago Henrique
BRT

sbado, 23 de maro de 2013 16:43:00

Eu faria assim:
void main() {
TRISA = 0b11111110
OPTION_REG = 0b10000111
for()
{
while (TMR0<255)
TMR0 = 0
PORTA = 1
while (TMR0<255)
TMR0 = 0
PORTA = 0
}
}
No seu codigo, dentro do while, vc carregou TMR0=0, como o TMR0=0 sera sempre
menor q 255, nunca iria sair do loop.

Tiago de Bortoli sbado, 23 de maro de 2013 17:08:00


BRT
Entendi, eu havia criado uma funo que nunca sairia do loop T_T... Farei apenas mais um
questionamento, o que o algoritmo do problema que estou tentando resolver quer dizer
com "... timer<15625...", pois, qualquer valor que entro, se maior do que 255, o programa
no funciona como esperado.

Tiago Henrique
BRT

sbado, 23 de maro de 2013 17:13:00

O mdulo timer0 na verdade conta ate 255, pois possui um registro contador(TMR0) de
8 bits. Para o timer1, possui um registro de 16 bits(TMR1H/TMR1L) e pode contar at
65536.

http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

7/22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC

Tiago de Bortoli sbado, 23 de maro de 2013 17:24:00


BRT
Muito obrigado pelas explicaes, apesar de conceitos bsicos, foram essenciais para
clarear minha vida =)...

Responder

Bruno Barbosa tera-feira, 21 de maio de 2013 23:15:00 BRT


Estou com uma duvida
Estou tentando acender 4 leds um de cada vez com intervalo de 2segundos utilizando o pic 18f4520,
porem ele s acende o primeiro?
Oque estaria errado?

void main() {
int segundos = 0
trisb=0
portb=0
T0CON=0b10000110
TMR0L=0XEE
TMR0H=0X85
INTCON.TMR0IF = 0
while(1){
if(segundos == 0 && INTCON.TMR0IF == 1){
//porta = 0
portb.f0 = 1
TMR0L=0XEE
TMR0H=0X85
INTCON.TMR0IF = 0
segundos++
}else if(segundos == 1 && INTCON.TMR0IF == 1){
portb.f0 = 0
portb.f1 = 1
TMR0L=0XEE
TMR0H=0X85
INTCON.TMR0IF = 0
segundos++
}else if(segundos == 2 && INTCON.TMR0IF == 1){
portb = 0
portb.f2 = 1
TMR0L=0XEE
TMR0H=0X85
INTCON.TMR0IF = 0
segundos++
}else if(segundos == 3 && INTCON.TMR0IF == 1){
portb = 0
portb.f3 = 1
TMR0L=0XEE
TMR0H=0X85
INTCON.TMR0IF = 0
segundos++
}else if(segundos == 4 && INTCON.TMR0IF == 1){
segundos = 0
}else{
portb = 0
TMR0L=0XEE
TMR0H=0X85
INTCON.TMR0IF = 0
segundos++
}
}
}
Responder

http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

8/22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC

Respostas

Vi_ sbado, 23 de agosto de 2014 06:58:00 BRT


Na linha:
INTCON.TMR0IF = 0
adicione:
INTCON.TMR0IE = 0

Responder

Tiago Henrique

tera-feira, 21 de maio de 2013 23:40:00 BRT

Ol!
Veja que no ultimo "else" voce incrementa a variavel segundos. como o intervalo do timer de 2
segundos(eu acho) durante esse tempo, o pic ira executar esse "else" milhares de vezes, ou seja, a
variavel incrementara milhares de vezes, e nunca sera 1,2,3 ou 4.
simplifiquei seu codigo:
void main() {
int segundos = 0
trisb=0
portb=0
T0CON=0b10000110
TMR0L=0XEE
TMR0H=0X85
INTCON.TMR0IF = 0
while(1){
if(INTCON.TMR0IF==1)
{
PORTB = (1 << segundos++)
if(segundos==4) segundos=0
TMR0L=0XEE
TMR0H=0X85
INTCON.TMR0IF = 0
}
}
}
Responder

Cristiano Jeferson domingo, 26 de maio de 2013 18:52:00 BRT


Ol, minha dvida a seguinte:
Preciso de uma contagem de 0 a 20ms, ou seja, 0 a 20000us.
Meu cristal de 4MHz. Minha aplicao com USB, ento preciso de 48MHz. Consigo isso
modificando o prescaler do clock. Mas esse prescaler o mesmo do timer0?
Outra coisa, o ciclo de mquina nesse caso seria:
4/48=0.08333us
O tempo de overflow :
T=ciclo de maq*prescaler*contagem
20000=0.08333us*128*contagem
Ta certo isso?
Responder
Respostas

Tiago Henrique
BRT

domingo, 26 de maio de 2013 19:34:00

Ol!
O prescaler do PLL e do timer0 NAO o mesmo.
Vc teria q configurar o prescaler PLL para 1:1 e ativar o PLL.
Depois vc configura o prescaler do timer0.

http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

9/22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC
A conta esta certinho!

Cristiano Jeferson domingo, 26 de maio de 2013 23:15:00


BRT
Ol Tiago, obrigado pela rpida resposta!
Existe algum comando no MikroC (sou novato) para que eu possa pegar o valor atual de
um timer? Quero dizer, eu quero fazer uma interrupo no timer e pegar o valor da
contagem na hora dessa interrupo. No CCS existe o "get_timer0()", existe algo
parecido no MikroC?

Tiago Henrique
09:56:00 BRT

segunda-feira, 27 de maio de 2013

Recomendo que voc leia o datasheet do PIC q vc est utilizando.


Na verdade no existe nenhum comando, voc tem q pegar o valor de registro.
Provavelmente, vc esta utilizando um timer de 16bits, entao voce tera q pegar o valor do
registro TMR0H(8bits) e TMR0L(8bits)
Exemplo:
int valorDoTimer //declara uma varivel do tipo int(16 bits)
valorDoTimer = (TMR0H<<8) + TMR0L//desloca 8 bits do TMR0H para esquerda e soma
com TMR0L

Responder

Annimo quarta-feira, 3 de julho de 2013 19:54:00 BRT


cara para fazer um programa que tenha um boto com duas funes por exemplo: se eu s o
aperto ele faz alguma coisa tipo acende um led mas se eu o aperto e segura por meio segundo ele faz
outra coisa. Como eu fao isso?? com timer??
Responder
Respostas

Tiago Henrique
22:33:00 BRT

quarta-feira, 3 de julho de 2013

Nesse caso, voce pode utilizar delay. Veja um exemplo:


char funcao = 0
void main()
{
TRISB = 255
TRISC = 0
while(1)
{
funcao = 0
if(PORTB.F0==1)//botao pressionado
{
funcao = 1
delay_ms(500)
while(PORTB.F0)// a cada 500ms, uma nova funcao ao botao
{
funcao++
delay_ms(500)
}
switch(funcao)//define uma acao para a funcao
{
case 1: PORTC = 1 break
case 2: PORTC = 2 break
case 3: PORTC = 4 break

http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

10/22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC
default: PORTC = 0 break
}
}
}
}

Annimo quinta-feira, 4 de julho de 2013 00:53:00 BRT


vlw cara
obrigado, me ajudou bastante, gosto muito do seu blog

Responder

Annimo domingo, 4 de agosto de 2013 12:18:00 BRT


Ol Boa tarde!
Encontrei este blog e achei-o muito bom, sendo em C e eu que estou a dar os passos em Mikrobasic.
Estou a tentar fazer um contador de eventos para contar n de voltas de uma base de uma
paletelizadora e depois desenvolver todo o programa.
parabns.
cump.
Jorge
Responder

Nemweb sexta-feira, 9 de agosto de 2013 21:20:00 BRT


Muito obrigado! Voc me ajudou em um antigo problema!
Responder

Ricardo Kraftman quarta-feira, 25 de setembro de 2013 13:13:00


BRT
Primeiro queria dizer que essa pgina do seu blog muito legal, li todos os posts e vc explica muito
bem.
Minha duvida com timer a seguinte.
Vejo que todo mundo faz um timer que faz alguma coisa alternada, ou seja, com uma base de tempo s.
Ex: No seu programa a cada estouro do timer muda o estado de uma saida =~, ou seja, se o timer tiver
estouro de 20ms, a cada 20ms a saida estar em nivel 1 e passados 20ms ela vai para nivel 0, assim se
visualizarmos essa saida em um osciloscpio teremos um formato de onda quadrada e simtrica. Isso
eu consegui, o meu problema que eu quero uma interrupo assimetrica.
Por exemplo, quero fazer um programa que fique 2ms em nivel 1 e 18ms em nivel 0, mas queria fazer
isso atravs de uma varivel e proporcional, quando um subir o outro desce, assim se o nivel alto se
manter por 5ms o baixo se mantm por 15ms.
Existe uma maneira de fazer isso?
Outra coisa que percebi que quando uso timer o delay_ms no funciona.
Responder

Tiago Henrique
BRT

quarta-feira, 25 de setembro de 2013 13:42:00

Voce pode faz o seguinte:


Define o estouro do timer para 1ms e...
char i = 0, state = 0, var = 3
//1ms
void interrupt()
{
if (TMR0IF_bit)
{
TMR0IF_bit = 0
TMR0L = 0x05

http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

11/22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC

i++
if(i == (2 + var) && state == 0) //Depois de 2ms + var
{
PORTB.B0 = 0
i = 0
state = 1
}
else if(i == (18 - var) && state == 1) //Depois de 18ms + var
{
PORTB.B0 = 1
i = 0
state = 0
}

}
}
Responder

Ricardo Kraftman sbado, 28 de setembro de 2013 15:32:00 BRT


Obrigado por responder, testei esse cdigo mas no funcionou.
Voc consegue fazer um timer que conte um estou a cada 2us com um oscilador de 8Mhz, no resto eu
me viro, a minha maior dificuldade o timer pois nunca trabalhei com timer antes.
Obrigado.
Responder
Respostas

Tiago Henrique
16:12:00 BRT

sbado, 28 de setembro de 2013

void Interrupt()
{
if (TMR0IF_bit)
{
TMR0IF_bit = 0
TMR0 = 251
//Seu cdigo
}
void InitTimer0()
{
OPTION_REG = 0x88 //Prescaler 1:1
TMR0 = 251
INTCON = 0xA0
}

Responder

Ricardo Kraftman domingo, 29 de setembro de 2013 20:06:00 BRT


Obrigado mais uma vez por responder, mas est dando erro no TMR0 q eu depois declarei como
variavel int, depois fica dando erro no InitTimer0.
Este cdigo devo colocar acima do void main() ?
Responder

Ricardo Kraftman domingo, 29 de setembro de 2013 20:07:00 BRT


Estou usando o 18F4520
Responder
Respostas

Tiago Henrique
20:42:00 BRT

domingo, 29 de setembro de 2013

void Interrupt()

http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

12/22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC
{
if (TMR0IF_bit)
{
TMR0IF_bit = 0
TMR0L = 0xFB
//Seu cdigo
}
}
void InitTimer0()
{
T0CON = 0xC8
TMR0L = 0xFB
GIE_bit = 1
TMR0IE_bit = 1
}
void main()
{
InitTimer0()
//Seu cdigo
}

Responder

Anderson Eurico quarta-feira, 9 de outubro de 2013 16:05:00 BRT


Opa Tiago, pode me dar uma fora?
Estou usando um Pic 12F675
O programa que estou tentando criar funciona assim:
Estou usando GP0 como entrada e GP2 como saida.
Funciona assim:
A saida GP2 fica em nivel 1.
No momento que eu mudo o estado da entrada "GP0" atraves de um boto, depois de 5 minutos a saida
vai a 0 e permanece assim por 5s e volta para "1".
At ai tudo bem, funciona, porm se eu antes dos 5 minutos deixar de pressionar o boto, no era
mais pra acionar a sada, mas no isso que acontece, mesmo assim a sada vai para "0".
Pode me ajudar?
Responder
Respostas

Tiago Henrique
16:25:00 BRT

quarta-feira, 9 de outubro de 2013

vc tem o programa q vc esta fazendo.


Eu nao entendi muito, se puder passar mais detalhes.

Anderson Eurico quinta-feira, 10 de outubro de 2013


10:21:00 BRT
Bom dia Tiago, obrigado pela ateno.
Segue o programa.
void main() {
ansel = 0
cmcon = 7
trisio = 0x01
gpio = 0
while(1){
if (GP0_bit == 0){

http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

13/22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC
GP2_bit = 0
}
else{
delay_ms (300000)
GP2_bit = 1
delay_ms (5000)
GP2_bit = 0
}
}
}
Como sou novo no assunto, ainda no sei trabalhar com os timers e interrupes, meus
programas so todos do nvel acima, mas t praticando, e te agradeo por perder tempo
comigo. A lgica do programa t invertida em relao ao que eu escrevi ontem, mas s
isso.

Anderson Eurico quinta-feira, 10 de outubro de 2013


10:37:00 BRT
Ah, esqueci,
O problema que no consigo resolver : se eu pressiono o boto(GP0_bit) e solto ele no
deveria acionar a sada (GP2_bit), mas ele entra no looping de tempo, ai j era. Porque
se eu solto o boto, antes dos 5 minutos, ele teria que interromper a contagem do
tempo e zerar a contagem.

Tiago Henrique
12:07:00 BRT

sexta-feira, 11 de outubro de 2013

void main()
{
unsigned i=0
ansel = 0
cmcon = 7
trisio = 0x01
gpio = 0
Label1:
while(1)
{
if (GP0_bit == 0)
{
GP2_bit = 0
}
else
{
while(GP0_bit && i < 30000)
{
delay_ms(10)
i++
}
if(!GP0_Bit)
{
i=0
GP2_Bit = 0
goto Label1
}
GP2_bit = 1
delay_ms(5000)
GP2_Bit = 0
i=0
}
}
}

Anderson Eurico domingo, 13 de outubro de 2013 22:46:00


BRT
Thiago o que significa este Label 1 e o Goto Label?
Muito obrigado.

http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

14/22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC

Annimo domingo, 13 de outubro de 2013 22:56:00 BRT


A instruao goto significa ir para. ela direciona o contador de programa do mcu
para um endereo, no caso, para o label1, que o inicio do while.

Anderson Eurico tera-feira, 15 de outubro de 2013


23:09:00 BRT
Obrigado pela resposta!

Responder

Ricardo Kraftman sexta-feira, 11 de outubro de 2013 10:14:00 BRT


Anderson, voc quer que a saida permanea em nivel 1 durante o tempo que o boto est
pressionado ou vc d um toque no boto e ele fica em nivel 1 por 5s e depois volta pra 0?
Vi no seu programa que vc colocou um delay de 300.000ms, isso igual a 300s. Assim qdo entrar no o
programa vai manter o ultimo estado, que no caso 0, por 300 segundos.
Me diga o que extamente vc quer fazer que acredito que posso te ajudar.
Se vc quiser mudar o status do que vc est fazendo, antes do tempo que vc est querendo programar,
vc no deve usar delay, vc deve usar uma varivel que vai contar um numero X e ela ser o seu flag,
assim vc pode interromper e alterar o status de alguma sada antes do tempo do delay.
Acontece que o delay em alguns casos no interessante pois ele trava o programa o resto do cdigo
at que o tempo daquela linha onde est o delay estoure.
Ex.
while(1){
PORTB.RB1 = 1 //A saida RB1 ir pra nivel lgico 1
delay_ms(1000) //RB1 permanecer assim por 1s at que o microcontrolador leia a prxima linha
PORTB.RB1 = 0 //Esta linha altera o estado para nivel 0
delay_ms(20000) //A leitura do cdigo ficar parada aqui at que os 20s desse delay estoure, s
depois ele passar pra linha abaixo.
PORTB.RB2 = 1
}
Responder

http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

15/22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC

Anderson Eurico domingo, 13 de outubro de 2013 22:56:00 BRT


Na verdade se a entrada for pra 1(boto pressionado), comea a contar 300s pra acionar a saida,
porem se eu soltar o boto a saida deveria permanecer no mesmo estado.
Responder

Luciano Resende Dias tera-feira, 15 de outubro de 2013 12:07:00


BRT
Ol! parabns pelo tutorial. S tenho uma dvida. Se eu quiser usar um tempo de overflow de 1000us e
um cristal de 4Mhz, qual o prescaler indicado? Pois estou tentando fazer aqui e sempre d um tempo
enorme de contagem.
Responder
Respostas

Tiago Henrique
12:17:00 BRT

tera-feira, 15 de outubro de 2013

Ol! Obrigado!
Voc pode utilizar um prescaler 1:4 e TMR0 = 6
4 / 4MHz = 1us
1us * 4 * (256 - 6) = 1000us

Luciano Resende Dias tera-feira, 15 de outubro de 2013


14:24:00 BRT
Obrigado. O problema que estou tendo que quando mudo o prescaler fica errado. Por
exemplo, 4mhz, prescaler 1:8 e overflow de 1000us. 1us*8*(256 - 131) = 1000us com
TMR0 = 131, mas quando coloco pra rodar o tempo no bate.

Tiago Henrique
14:35:00 BRT

tera-feira, 15 de outubro de 2013

Voce est fazendo assim? Lembre-se de recarregar o TMR0 sempre que houver um
overflow. Se o TMR0 for recarregado com 0, no h necessidade de inseri-lo no cdigo.
void Interrupt()
{
//seu cdigo
TMR0 = 131
TMR0IF_Bit = 0
}
void Main()
{
OPTION_REG = 0b10000010
TMR0 = 131
INTCON.GIE = 1
INTCON.PEIE = 1
INTCON.TMR0IE = 1
}

Luciano Resende Dias sexta-feira, 18 de outubro de 2013


11:03:00 BRT
valew Tiago!! Eu estava carregando o tmr0 fora da rotina de interrupo. Agora t
rodando redondo aqui.

Responder

Sandro Sachser quarta-feira, 16 de outubro de 2013 22:43:00 BRT


Ol Thiago, muito bacana sua explicao sobre o TMR0 mas li as respostas que voc deu aos

http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

16/22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC

outros colegas e no encontrei uma soluo para mim. Estou tentnado implementar um temporizador
com o PIC16F628 de pelo menos duas horas, isso acionado por um LDR numa determinada porta. Pois
bem, a questo do LDR at posso resolver depois mas j li muitos materiais sobre a manipulao do
TMR0 do PIC mas todos acabam falando em acionamento por um segundo de um led, etc. Assim,
gostaria de alguma ajuda com esse clculo para um perodo maior, caso possa faz-lo. Obs.: uso CCS e
minha pequena base de programao C ANSI. Grande abrao e tudo de bom. Sandro
Responder
Respostas

Tiago Henrique
09:28:00 BRT

quinta-feira, 17 de outubro de 2013

#include <16F628A.h>
#device adc=8
#FUSES NOWDT,XT
#use delay(clock=4000000)
int32 time=0
#int_RTCC
void RTCC_isr(void) //1000us
{
time++
if(time == 7200000)
{
output_toggle(pin_b0)
time = 0
}
}
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4)
setup_timer_1(T1_DISABLED)
setup_timer_2(T2_DISABLED,0,1)
enable_interrupts(INT_RTCC)
enable_interrupts(GLOBAL)
set_timer0(6)
set_tris_b(0x00)
time =0
while (TRUE)
{
}
}

Tiago Henrique
09:29:00 BRT

quinta-feira, 17 de outubro de 2013

Calculo:
1us * 4 * (256 - 6) = 1000us
2horas = 120min = 7200 seg == 7200000ms

Sandro Sachser sexta-feira, 18 de outubro de 2013


10:57:00 BRT
Salve Tiago!! Estudo completo, hein? (pelo menos com o setor #### eu devia me virar
sozinho (rss..).
Valeu mesmo, seu algoritmo vou guardar pr sempre porque a explicao perfeita e
servir de base para outros pequenos projetos de final de semana por aqui (ou de um
ano inteiro, kkk). Grande abrao e tudo de bom. Sandro.

Responder

Annimo sexta-feira, 22 de novembro de 2013 11:08:00 BRST


Tiago, preciso de ajuda com o timer0, mas para o pic12F675. Preciso fazer um temporizador que
fique ligado por 168 horas seguidos, e aps este tempo desligar. O programa inicialmente simples, o
problema est na preciso, pois como o tempo longo, o acumulo de pequenos erros na temporizao
acaba atrapalhando o resultado final. Voc pode me ajudar na questo de preciso desse temporizador

http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

17/22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC

? Agradeo se me der uma ajuda.


Responder
Respostas

Tiago Henrique
12:56:00 BRST

sexta-feira, 22 de novembro de 2013

No seu caso poderia utilizar um cristal de 32768Hz.


Irei fazer um post sobre este assunto!!
At mais!!

Annimo domingo, 24 de novembro de 2013 00:24:00 BRST


Valeu Tiago. A resposta veio rpido vai me ajuda muito. Obrigado e parabns pelo
material disponvel no blog.

Responder

Paulo paulo segunda-feira, 2 de dezembro de 2013 22:44:00 BRST


Tiago Voc conhece mesmo o pic e o mickroc.
voc poderia me ajudar a sincronizar com a rede eletrica.
assim um pino fica gerando onda quadrada a 60Hz atraves de um temporizador.
uma chave fica aberta e conecta um pino contador um sinal externo que varia de 57Hz a 63Hz, quando
isso acontece o pino que gera os 60Hz tem que ir de 60Hz suavemente para a frequencia que est
entrando nesse pino contador, caso abra a chave o pino que gera o clock deve voltar suavemente para
60Hz, olha j quebrei a cabea mas complicado. eu programo com o CCS
Responder

Thiago Siqueira tera-feira, 3 de dezembro de 2013 10:53:00 BRST


Por favor, preciso fazer um temporizador com o PIC 18F4520, porm no estou conseguindo.
Preciso selecionar no display LCD, por meio de um boto, a funo TEMPO, que faz a contagem, em
segundos, para o acionamento de um motor. Quando a funo TEMPO selecionada ser necessrio
informar o tempo que o motor ir ser acionado. Por exemplo: Preciso que o motor entre em
funcionamento aps 5 segundos, assim eu selecionaria a funo TEMPO no display LCD e incrementaria
por meio de um boto, at aparecer o nmero 5, dessa forma aps 5 segundos o motor seria acionado.
Muito obrigado
Thiago
Responder

Carlos domingo, 16 de maro de 2014 19:13:00 BRT


Ol Thiago, gostei muito da sua explicao sobre o TMR0, uso o ccs e estou tentando fazer um
temporizador com o PIC16F628a que fique um Led ligado por 6segundos e desligado por 2 horas por
uma determinada porta, sempre assim com loop, mas no encontro nada sobre esse tipo de
temporizador infinito por horas, apenas segundos preciso de ajuda com esse clculo para um perodo
maior, pode me ajudar? fico grato por sua ajuda e parabns pelo blog.
Responder

Annimo tera-feira, 25 de maro de 2014 21:56:00 BRT


Ol Thiago,
Cara, estou com um projeto que que seria mais ou menos assim:
Tenho um dispositivo que faz um movimento e fica parado "x" segundos (regulado em um temporizador
). Aps isso um segundo temporizador faz o mesmo durante "xx" segundos .
Esses dois movimentos desse dispositivo, gerariam "X" + "XX" segundos , que automaticamente me
dariam "Z" quantidades por hora.
Ex: 1segundo + 2 segundos = 60 minutos / 3 segundos = "Z" quantidades por minuto * 60 minutos=
1200 por hora.
No estou conseguindo resolver isso.
Se por possvel me ajudar !!!
Abrao !
Responder

http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

18/22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC

Alex tera-feira, 25 de maro de 2014 22:11:00 BRT


Ol Thiago,
Cara, estou com um projeto com PIC 16f877a que seria mais ou menos assim:
Tenho um dispositivo que faz um movimento e fica parado "x" segundos (regulado em um temporizador
). Aps isso um segundo temporizador faz o mesmo durante "xx" segundos .
Esses dois movimentos desse dispositivo, gerariam "X" + "XX" segundos , que automaticamente me
dariam "Z" quantidades por hora.
Ex: 1segundo + 2 segundos = 60 minutos / 3 segundos = "Z" quantidades por minuto * 60 minutos=
1200 por hora.
No estou conseguindo resolver isso.
Se por possvel me ajudar !!!
Abrao !
Responder

Manoel Antonioli sexta-feira, 9 de maio de 2014 16:57:00 BRT


Ola, Thiago
Estou com um projeto que vai ter varias rotinas no lcd, estou usando um pic 18F452, so que eu acho
que ele nao vai suportar a memoria. o que vc me diz uso uma externa ou tem alguma rotina pra minizar
a memoria.
Responder

Annimo quarta-feira, 14 de maio de 2014 22:24:00 BRT


Ol,Thiago.
Muito boa a sua explicao sobre os timers,mas preciso de sua ajuda.Preciso fazer um contador de
pulsos que conte um determinado numero de pulsos que eu determinarei,por exemplo 10 pulso, sendo
que isso s pode acontecer depois de acionado um boto,isto feito dever acionar duas porta: uma com
200 ms e outra acionada direta.
Responder

Antonio Kayco tera-feira, 27 de maio de 2014 09:55:00 BRT


Como saber o prescaler e como configurar para estourar a cada 1ms
Responder

Annimo domingo, 9 de novembro de 2014 15:40:00 BRST


Ol!
No poderia passar por aqui sem deixar o meu agradecimento e os parabns pelos responsveis por
esse blog, que foi uma ajuda incrvel para minhas dvidas. Infelizmente materiais assim ainda so
escassos na internet.
tima Iniciativa, continuem!
Responder

janssen sexta-feira, 21 de novembro de 2014 20:42:00 BRST


Ol Thiago blz, preciso de uma pequena ajuda com botes, 16 botes que tem a seguinte funo:
cada boto seleciona 1 de cada 3 caracteres do alfabeto e imprime em um lcd 16x2, porem se crio
condies de tempo ou por clicks para cada funo de um boto o ciclo do while() faz com o lcd fique
imprimindo varios dos caracteres e preenchendo todo o lcd sem parar.
exemplo:
Se boto 1 pressionado durante 500ms e solto imprime caracter "A" se 1000ms e solto imprime
caracter "B"
isso por condio de tempo
por clicks seria se boto 1, um click caracter "A" e se dois carater "B"
Poderia me dizer se e possivel eu criar uma rotina em que se o boto pressionado durante um tempo,
ex: 1000ms ele fica selecionando os trs caracteres e assim quando aparecer o caracter que quero
solto o boto e imprime no lcd.
Estou usando o compilador mikroc e o pic16f877, segue 1 ex do cdigo que estou usando para esta
funo.

http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

19/22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC

Ja tentei de varias outras formas mas o lcd imprime sem parar, o objetivo e criar uma interface para
entrada de senhas em um circuito para armar um alarme ou desarmar, o codigo para o alarme ja tenho
em mente mas a dificuldade e no menu, ums dos cdigos que criei faz a funo de selecionar por meio
de condio de tempo um dos caracteres e imprimir no lcd mas no da para calcular o tempo certo que
o boto deve ser pressionado imprimir o caractere escolhido, segue o cdigo do mesmo no 2 ex.
Responder

janssen sexta-feira, 21 de novembro de 2014 20:43:00 BRST


Ex 1:
// LCD module connections
sbit LCD_RS at RB4_bit
sbit LCD_EN at RB5_bit
sbit LCD_D4 at RB0_bit
sbit LCD_D5 at RB1_bit
sbit LCD_D6 at RB2_bit
sbit LCD_D7 at RB3_bit
sbit LCD_RS_Direction at TRISB4_bit
sbit LCD_EN_Direction at TRISB5_bit
sbit LCD_D4_Direction at TRISB0_bit
sbit LCD_D5_Direction at TRISB1_bit
sbit LCD_D6_Direction at TRISB2_bit
sbit LCD_D7_Direction at TRISB3_bit
// End LCD module connections
bit oldstate // Old state flag
char txt1[] = "A"
char txt2[] = "C"
char txt3[] = "D"
char txt4[] = "E"
char txt5[] = "F"
char txt6[] = "G"
char txt7[] = "H"
char txt8[] = "I"
char txt9[] = "J"
char txt10[] = "K"
char txt11[] = "L"
char txt12[] = "M"
char txt13[] = "N"
char txt14[] = "O"
char txt15[] = "P"
char txt16[] = "Q"
char txt17[] = "R"
char txt18[] = "S"
char txt19[] = "T"
char txt20[] = "U"
char txt21[] = "V"
char txt22[] = "W"
char txt23[] = "X"
char txt24[] = "Y"
char txt25[] = "Z"
char txt26[] = "0"
char txt27[] = "1"
char txt28[] = "2"
char txt29[] = "3"
char txt30[] = "4"
char txt31[] = "5"
char txt32[] = "7"
char txt33[] = "8"
char txt34[] = "9"
char txt35[] = "entre com senha"
char txt36[] = "senha correta"
char read [] = "RISEHANDS"
//------------------//
void main(){
ADCON1=0x0F //Configura analgios
ADCON1=0x0F
CMCON|=0x07 //Desliga comparadores

http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

20/22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC

trisa=0
trisb=0
trisc=1
trisd=1
trise=0
porta=0
portb=0
portc=0
portd=0
porte=0
oldstate = 0

Lcd_Init()
Lcd_out(1,1,txt35)
delay_ms(3000)
Lcd_Cmd(_LCD_BLINK_CURSOR_ON)
delay_ms(500)
Lcd_Cmd(_LCD_CLEAR)
Lcd_Cmd(_LCD_RETURN_HOME)
oldstate = 0

while(1){
if (portd.RD0 == 1, // Detect logical one
delay_ms(500),
oldstate == 0){
Lcd_out_CP("A")
}
if (portd.RD0 == 1, // Detect logical one
delay_ms(1000),
oldstate == 0){
Lcd_out_CP("B")
}
Delay_ms(10)
}
}
Responder

janssen sexta-feira, 21 de novembro de 2014 20:45:00 BRST


Ex 2:
while(1){
if (portd.RD0 == (1, 0, 1)){
delay_ms(500) // Detect logical one
Lcd_out_CP("A")
}
if (portd.RD0 == (1, 0, 1)){
delay_ms(1000) // Detect logical one
Lcd_out_CP("B")
}
Delay_ms(10)
}
}
O circuito a seguir:
Responder

Elvyo de Menezes sbado, 20 de dezembro de 2014 00:15:00 BRST


http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

21/22

21/04/2015

Microcontrolandos:UtilizandooTIMER0doPIC
1 * 128 * (256 - 100) = 19968us = 20ms. como que o 19968 igual a 20ms
Responder

Respostas

Tiago Henrique
08:52:00 BRST

sbado, 20 de dezembro de 2014

Nao tem como obter um tempo exatamente igual a 20ms. nico jeito aproximando...

Responder

Annimo quarta-feira, 25 de maro de 2015 22:59:00 BRT


Boa noite, teria como me ajudar nessa questo ?
Exemplo: Quero fazer um led piscar permanecendo aceso durante um segundo e apagado durante um
segundo. No meu sistema embarcado tenho cristal que gera um clock de 1Mhz. Meu timer de 16 bits.
Escolha um valor de pescaler e ache at quanto o timer deve contar para que eu possa criar uma rotina
que o led possa picar da maneira que eu desejo.
Responder

Digiteseucomentrio...

Comentarcomo:

Publicar

ContadoGoogle

Visualizar

Assinar:Postarcomentrios(Atom)

http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html

22/22

Вам также может понравиться