Академический Документы
Профессиональный Документы
Культура Документы
Microcontrolandos:UtilizandooTIMER0doPIC
ProjetosetutoriaissobreprogramaodePIC,AVReArduno.
Incio
Frum
Doaes
PRAQUEMEST/ESTAVAACOMPANHANDO
ASVIDEOAULAS,ELASESTO...
Excelente
Maisoumenos
Ruim
PrecisamelhorarMUITO...
<<
>>
Votar
Exibirresultados
Votosatomomento:51
Diasrestantesparavotar:62
PESQUISARNESTEBLOG
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
Projeto13:ContadordePulsos
Projeto12:RelgioDigital
1
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
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
Projeto20:Timer
utilizandoo
PIC16F628A
ArduinoComponenteparao
Proteus
1 - Desabilitado;
0 - Habilitado;
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:
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
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
Responder
Tiago Henrique
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
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
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 Henrique
BRT
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
Responder
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
Responder
Tiago Henrique
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
Tiago Henrique
BRT
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!
Tiago Henrique
09:56:00 BRT
Responder
Tiago Henrique
22:33:00 BRT
http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html
10/22
21/04/2015
Microcontrolandos:UtilizandooTIMER0doPIC
default: PORTC = 0 break
}
}
}
}
Responder
Tiago Henrique
BRT
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
Tiago Henrique
16:12:00 BRT
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
Tiago Henrique
20:42:00 BRT
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
Tiago Henrique
16:25:00 BRT
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.
Tiago Henrique
12:07:00 BRT
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
}
}
}
http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html
14/22
21/04/2015
Microcontrolandos:UtilizandooTIMER0doPIC
Responder
http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html
15/22
21/04/2015
Microcontrolandos:UtilizandooTIMER0doPIC
Tiago Henrique
12:17:00 BRT
Ol! Obrigado!
Voc pode utilizar um prescaler 1:4 e TMR0 = 6
4 / 4MHz = 1us
1us * 4 * (256 - 6) = 1000us
Tiago Henrique
14:35:00 BRT
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
}
Responder
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
#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
Calculo:
1us * 4 * (256 - 6) = 1000us
2horas = 120min = 7200 seg == 7200000ms
Responder
http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html
17/22
21/04/2015
Microcontrolandos:UtilizandooTIMER0doPIC
Tiago Henrique
12:56:00 BRST
Responder
http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html
18/22
21/04/2015
Microcontrolandos:UtilizandooTIMER0doPIC
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
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
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
Nao tem como obter um tempo exatamente igual a 20ms. nico jeito aproximando...
Responder
Digiteseucomentrio...
Comentarcomo:
Publicar
ContadoGoogle
Visualizar
Assinar:Postarcomentrios(Atom)
http://microcontrolandos.blogspot.com.br/2012/11/utilizandootimer0dopic.html
22/22