Configuração do Timer0, Timer1 e Timer2 no 877

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Configuração do Timer0, Timer1 e Timer2 no 877

Mensagempor srspinho » 01 Ago 2007 15:42

Olá Pessoal,

Bem, eu estou usando um PIC 16F877 @ 10 Mhz configurado da seguinte forma :

o Timer0 está configurado para gerar uma interrupção a cada 250 ms

o Timer1 está configurado para contar eventos externos - Pulsos de um sensor hall

O Timer2 não está sendo usado para nada

Quando termina os 250 ms, eu conto quantos pulsos foram "lidos" pelo Timer1 e faço o cálculo de velocidade e distância percorrida.

Eu estou usando PicBasicPro, mas a minha dúvida é geral .

Tem como, usando corretamente os register bits do 877, configurar da seguinte forma :

1) Timer0 conta os eventos externos
2) Timer1 usado para o CCP1
3) Timer2 usado para gerar as interrupções a cada 250 ms ?

isso é posível ?

é que eu gostaria de poder ler também o tempo de abertura do bico de injeção para poder calcular o consumo instantâneo do carro.

Como configurar os register bits sempre me deu uma tremenda dor de cabeça, e nem sempre funciona direito...

Obrigado a todos.

Sérgio
srspinho
Bit
 
Mensagens: 43
Registrado em: 17 Nov 2006 06:31

Mensagempor tcpipchip » 01 Ago 2007 17:12

Sim, é possivel
TCPIPCHIP

PS: Por que nao usar PULSIN?
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor MOR_AL » 01 Ago 2007 19:28

Olá srspinho.

Me explica como você está conseguindo uma interrupção no TIMER0 a cada 250ms com um cristal de 10MHz. :?:

Eu só conseguiria 26,2ms. Veja as minhas contas:

1 - Tclock = 4 / Fosc = 4 / 10.000.000 = 0,4us
2 - Prescaler: 1:256
3 - TMR0 = 0, Estoura com 256 contagens.

Tmáximo = Tclock * 256 * 256 = 0,4us * 256 * 256 = 26,2144ms

MOR_AL
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor srspinho » 01 Ago 2007 20:44

Olá Moral,

abaixo está o código que eu postei no site do Picbasicpro

a versão abaixo é para 4 Mhz

Os comentários e os nomes das variáveis estão em inglês pois o site é em inglês.


Define LCD_DREG PORTA
Define LCD_DBIT 0
Define LCD_RSREG PORTB
Define LCD_RSBIT 4
Define LCD_EREG PORTB
Define LCD_EBIT 5

REM Variables
TMR0_POSTCOUNT1 var WORD ' POSTSCALER COUNTERS
COUNT_RESULT var WORD ' THE RESULT OF THE COUNT
REFRESHED var BIT ' FLAG TO SAY COUNT REFRESHED

'-------------------------'
ON INTERRUPT GOTO PULSE_COUNT ' DEFINE WHERE TO JUMP TO ON AN INTERRUPT
'-------------------------'

GOTO INITIALIZE ' JUMP ALL INT CODE

'----- INTERRUPT CODE -------------------
Disable
PULSE_COUNT:
TMR0 = TMR0 + 7 ' RELOAD THE TIMER
TMR0_POSTCOUNT1 = TMR0_POSTCOUNT1 - 1
IF TMR0_POSTCOUNT1 = 0 THEN
TMR0_POSTCOUNT1 = 500 ' 1/4 sec (may need some adjust)
T1CON.0 = 0 ' TURN OFF THE TMR1
COUNT_RESULT.lowbyte = TMR1L ' GET THE COUNT
COUNT_RESULT.Highbyte = TMR1H ' GET THE COUNT
TMR1L = 0
TMR1H = 0
T1CON.0 = 1
REFRESHED = 1 ' SET FLAG TO SAY COUNT READ
ENDIF
INTCON.2 = 0 ' CLEAR INTTERUPT FLAG
Resume
enable ' RELOAD THE SYSTEM VARS
'------ END OF INTERRUPTS CODE ----------

'------ INTIALIzE ALL REGS --------------
INITIALIZE:

TMR0_POSTCOUNT1 = 500 ' INITIALZE THE POST SCALERS
OPTION_REG.0 = 0 ' SET THE PRESCALER TO 1:1
OPTION_REG.1 = 0
OPTION_REG.2 = 0
OPTION_REG.5 = 0 ' TMR0 CLOCK FROM MAIN OSC
OPTION_REG.3 = 0 ' IN THIS INSTANCE PRESCALER IS ASSINED TO TMR0
INTCON.2 = 0 ' CLEAR INTERRUPT FLAG
T1CON = %00000110
T1CON.0 = 1 ' TURN TIMER 1 ON
TMR0 = 7 ' LOAD THE TIMER
INTCON.5 = 1 ' ENABLE TMR0 INTERRUPTS
REFRESHED = 0 ' DONT MAKE FIRST READ UNTIL MAIN INT HAS OCCURED
INTCON.7 = 1 ' START THE WHOLE THING RUNNING
COUNT_RESULT = 0
pause 500
lcdout $FE,1



'------ MAIN CODE BELOW HERE -------------

LOOP:
IF REFRESHED = 1 THEN
lcdout $fe,1,$fe,2, "Freq = ", dec (COUNT_RESULT * 4) ' Show results in pulses / Sec
REFRESHED = 0 ' PREVENT A RE-READ UNTIL NEXT MAIN INTERRUPT
ENDIF
GOTO LOOP

END



O que eu gostaria de saber é como usar o timer2 no lugar do timer0, colocar o timer0 para contar os pulsos e usar o Timer1 para o CCP1

Por estar usando interrupções e não poder perder pulsos, eu não posso usar o pulsin.

é isso...
srspinho
Bit
 
Mensagens: 43
Registrado em: 17 Nov 2006 06:31

Mensagempor MOR_AL » 03 Ago 2007 08:10

Olá srspinho.

Não tenho maiores conhecimentos desta linguagem, mas pelo que pude deduzir, você está usando uma variável para extender o seu período gerado pelo timer0. Parece que é a TMR0_POSTCOUNT1.

Com relação às suas outras perguntas.

Os timers sempre contam tempo, ou melhor pulsos, tanto internos como externos. O fabricante acrescenta alguns circuitos para que, além de contar, apresentem uma aplicação mais específica, para facilitar a nossa vida e eles venderem mais.

O que normalmente se faz é utilizar as facilidades extras nos timers para resolver os nossos problemas. Com isso, pode-se dizer que cada timer tem um grupo PREFERENCIAL de aplicações.

Em princípio você poderia fazer o que deseja com estes timers, mas quanto a ser o mais apropriado é que fica a dúvida. Leia sobre maiores detalhes sobre os timers no manual do PIC16F877, que você encontrará suas respostas.

Lamento não ter sido mais direto. Não por falta de vontade e sim por minhas limitações.

MOR_AL
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor srspinho » 03 Ago 2007 09:05

Obrigado MOR_AL !

Você tem razão com relação aos timers.

Eu estava lendo o datasheet do 877 e vi que o Timer0 pode contar eventos externos : Tanto borda de subida, quanto de descida. Este último seria o melhor para mim.

Um outro colega postou uma dúvida no PicBasic Forum sobre esse mesmo assunto, do qual nós estávamos conversando a algum tempo.

Um usuário do forum, que havia desenvolvido um sistema para tratamento de interrupções muito legal, deu ajuda enorme para ele, e parece que resolveu o problema.

Eu imprimi todo o post (enorme...) e vou estudar no final de semana para tentar implementar !

De qualquer forma, MUITO obrigado pela ajuda !

Abraço.

Sérgio
srspinho
Bit
 
Mensagens: 43
Registrado em: 17 Nov 2006 06:31


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x