Ir ao conteúdo
  • Cadastre-se

PIC CCS set_time1(0); o que faz esse comando?


burn/omegafire

Posts recomendados

Diretamente do manual do compilador:

SET_RTCC( )

SET_TIMER0( )

SET_TIMER1( )

SET_TIMER2( )

SET_TIMER3( )

SET_TIMER4( )

SET_TIMER5( )

--------------------------------------------------------------------------------

Syntax:

set_timer0(value) or set_rtcc (value)

Function:

Sets the count value of a real time clock/counter. RTCC and Timer0 are the same. All timers count up. When a timer reaches the maximum value it will flip over to 0 and continue counting (254, 255, 0, 1, 2...)

Examples:

// 20 mhz clock, no prescaler, set timer 0

// to overflow in 35us

set_timer0(81); // 256-(.000035/(4/20000000))

Ou seja, você utiliza um valor dentro do parântese para antecipar o estouro do timer.

Veja mais exemplo:

Qual a diferença entre:TIMER0,TIMER1,TIMER2,TIMER3,TIMER4?

Falou

Link para o comentário
Compartilhar em outros sites

Diretamente do manual do compilador:

SET_RTCC( )

SET_TIMER0( )

SET_TIMER1( )

SET_TIMER2( )

SET_TIMER3( )

SET_TIMER4( )

SET_TIMER5( )

--------------------------------------------------------------------------------

Syntax:

set_timer0(value) or set_rtcc (value)

Function:

Sets the count value of a real time clock/counter. RTCC and Timer0 are the same. All timers count up. When a timer reaches the maximum value it will flip over to 0 and continue counting (254, 255, 0, 1, 2...)

Examples:

// 20 mhz clock, no prescaler, set timer 0

// to overflow in 35us

set_timer0(81); // 256-(.000035/(4/20000000))

Ou seja, você utiliza um valor dentro do parântese para antecipar o estouro do timer.

Veja mais exemplo:

Qual a diferença entre:TIMER0,TIMER1,TIMER2,TIMER3,TIMER4?

Falou

Entendi, meu problema foi o inglês mesmo que eu não entendi, mas acho que hoje não é o meu dia de programar porque nem o mais simples eu consegui fazer.

Tentei habilitar a interrupção pelo timer2 para fazer um programa, mas toda vez que deixo ela habilitada o meu programa nem começa. Cheguei a ponto de faze-lo minimo pra ver onde estava o erro e mesmo assim continuo no vacuo

#include <sensor de distancia4.h>


#define LCD_ENABLE_PIN PIN_B0
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#define LCD_DATA4 PIN_B3
#define LCD_DATA5 PIN_B4
#define LCD_DATA6 PIN_B5
#define LCD_DATA7 PIN_B6
#include <lcd.c>

int16 tempo=0;
int16 contador=0;
long distancia=0;

#int_TIMER2
void TIMER2_isr(void)
{

}


void main()
{
lcd_init();
setup_timer_2(T2_DIV_BY_1,0,1);
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
printf(lcd_putc,"\a hello!");
}

Qual é a minha burrada dessa vez que estou parado nisso mais de duas horas e não consigo achar? Se eu desabilito o timer2 o hello aparece no LCD, mas com ele habilitado nada feito.

Obrigado pela ajuda e desculpe-me pelo trabalho.

Abs.

Link para o comentário
Compartilhar em outros sites

Qual o conteúdo do arquivo sensor de distancia4.h?

Nesse está os fuses, a velocidade do clock e o principal, o PIC utilizado.

Acredito que como a interrupção está acontecendo muito rápido, não sobra tempo para escrever no LCD.

O que você precisa fazer na interrupção em espaços de tempo tão curtos?

Falou

Link para o comentário
Compartilhar em outros sites

Opa Matheus, obrigado pela ajuda como sempre.

Ai vai o conteudo do .h


#include <16F628A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES MCLR //Master Clear pin enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(int=4000000)

Explico a minha ideia.

O programa que estou tentando fazer é para um sensor de distancia ultrassônico. A ideia é com o timer2 contar quantos us depois de acionado o Trig o som leva para ir e para voltar e acionar o Echo.

Aqui vai o esboço do que imaginei que seria o programa original.



#include <16F628A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES MCLR //Master Clear pin enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(int=4000000)

#include <sensor de distancia3.h>

#include <lcd.c>
#define LCD_ENABLE_PIN PIN_B0
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#define LCD_DATA4 PIN_B3
#define LCD_DATA5 PIN_B4
#define LCD_DATA6 PIN_B5
#define LCD_DATA7 PIN_B6


#define trig pin_A0
#define echo pin_A1

int16 contador;
int16 time2;
float distance;



#int_TIMER2
void TIMER2_isr(void)
{
time2++;

}

void main()
{
lcd_init();

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);

enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
printf(lcd_putc,"\a hello!");
delay_ms(1000)

while(true){
delay_ms(1000);
output_high(trig);
delay_us(10);
output_low(trig);
setup_timer_2(T2_DIV_BY_1,0,1); //Liga o timer2

while(!input(echo)){/*contador=get_timer2(); printf(lcd_putc,"\a %lu",contador);*/} //A ideia é não fazer nada enquanto o pulso não volta, colocar um timer out depois.
while(input(echo)){setup_timer_2(T2_DISABLED,0,1);} // Desliga o timer2 quando o pulso voltar.
//340m/s 340.000mm/1.000.000us --> 0,34mm/ms --> 1mm/3ms ou seja 1mm a cada 3 ms
distance=0.33*time2; //distancia = velocidade x tempo
printf(lcd_putc,"\a %f",distance);
time2=0;

}

}

Eu já li o seu post de uns 8 meses atrás onde você ajudou um colega a fazer um programa com a mesma finalidade, mas eu decidi fazer o meu próprio com a finalidade de testar o meu conhecimento, e nessa, fiquei entalado.

Abração!

Link para o comentário
Compartilhar em outros sites

A ideia é com o timer2 contar quantos us depois de acionado o Trig o som leva para ir e para voltar e acionar o Echo.

Desse modo ocorreria constantemente uma interrupção! Não daria tempo de voltar para o programa principal e ocorreria multiplos estouros dentro da própria rotina de interrupção!

Acho que ficaria mais inteligente usar o timer1 como um contador e usar a interrupção externa (Pino RB0) para interromper o programa quando receber um pulso quando o sinal chegou, calcular a distância e zerar o contador do timer1, assim você fica com uma resolução de 65536 us, pemitindo um longo alcance com uma boa precisão (se ocorrer um estouro no timer1 a distância está fora de alcance).

Link para o comentário
Compartilhar em outros sites

Dei uma olhada no tópico que você mencionou: [Resolvido] PIC16F628A e sensor ultrasonico de distancia

Lá pelo post nº 11 a coisa começa a dar certo....

Veja que no seu código você habilita o timeo, o timer1 e o timer 2...

Como você está utilizando somente o timer2, nao precisa dos outros.

Para essa aplicação você não precisa da interrupção como você utiliza.

Como no meu código, você pode pegar o tempo diretamente como comando:

get_timer2();

A ideia é a mesma do outro tópico.

Mas veja q nesse código que postei do outro tópico, a única funçao do PIC é pegar o tempo, s você precisa q ela faça mais coisas, aí sim terá que sar a interrupçao.

EDIT:

O comentário acima também é muito válido.

Falou

Link para o comentário
Compartilhar em outros sites

Acho que usar a ideia do timer 1 com a interrupção externa é boa realmente mas o negócio é que a contagem é muito rápida e no clock que eu estou usando ela demora apenas uns 13us para contar. Em 13us o som anda uns 4,3 metros e dividindo isso pela metade já que o som tem que ir e voltar, eu ganharia uma distancia máxima medida de 2,1 metros. Se o timer estourar antes do som voltar e eu não fazer a contagem de quantas vezes ele estourou não serei apto a detectar distancias maiores.

Vou continuar pensando aqui pra ver onde chego depois volto pra postar as idéias e problemas.

Abração ai e obrigado pela ajuda.

Link para o comentário
Compartilhar em outros sites

Uai....Mas cocês se esqueceu de utilizar o prescaler. Considerando um cristal de 4Mhz,

Só você trocar o T1_DIV_BY_1 por:

T1_DIV_BY_1: 0,065536 segundos para estourar: [1/{(4Mhz/4)/1}]*65536}

T1_DIV_BY_2: 0,131072 segundos para estourar: [1/{(4Mhz/4)/2}]*65536}

T1_DIV_BY_4: 0,262144 segundos para estourar: [1/{(4Mhz/4)/4}]*65536}

T1_DIV_BY_8: 0,524288 segundos para estourar: [1/{(4Mhz/4)/8}]*65536}

Dessa forma, o timer 1 demorará mais tempo para estourar.

No caso do timer 2, você pode usar:

T2_DIV_BY_1: 0,000255 segundos para estourar :[1/{(4Mhz/4)/1}]*255}

T2_DIV_BY_4: 0,00102 segundos para estourar :[1/{(4Mhz/4)/4}]*255}

T2_DIV_BY_16: 0,00408 segundos para estourar :[1/{(4Mhz/4)/16}]*255}

A ideia é a mesma.

Falou

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!