Ir ao conteúdo
  • Cadastre-se

Timer e ext ao mesmo tempo


avinicius

Posts recomendados

Estou fazendo o seguinte ;

tenho 3 leds

a0

a1

a2

a0 e a1 oscilam em tempos diferentes;quando em (1)

e se eu acionar a int_ext ao mesmo tempo seta dá um toggle em a2, e se eu acionar de novo desliga a2;


#include <16f628a.h>

#FUSES NOWDT //Sem Watch dog, evitando reset
#FUSES INTRC_IO //xtal interno
#FUSES PUT //Tempo de início do PIC
#FUSES NOPROTECT //Codigo sem proteção de leitura, software livre!
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOMCLR //desabilitando reset em 0

#use delay(clock=4000000)
int m,p;

#int_EXT
void ext (void){ //nome da minha interrupção externa (ext)
output_toggle(pin_a2);
}



#int_TIMER1 //Interrupção do Timer1
void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupção.
{

m++;
p++;
if(m == 6)
{
output_toggle(pin_a0);
m=0;
}

if(p == 10)
{
output_toggle(pin_a1);
p=0;
}
set_timer1(3036);
}



void main ()
{
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
enable_interrupts(global); //habilita interrupcão global
enable_interrupts(INT_EXT); //Habilita interrupção externa
enable_interrupts(INT_TIMER1); //Habilita interrupção timer1
set_timer1(3036);

}

Mas o que acontece é o seguinte;

o timer1 não está funcionando, tem algum problema eu trabalhar com um temporizador e uma interrupção externa ao mesmo tempo?

Link para o comentário
Compartilhar em outros sites

avinicius,

o timer não funciona quando a interrupção externa é ativada?

na verdade, não existe problema em utilizar o timer e a int externa ao mesmo tempo... precisa apenas ficar atento as prioridades de execução...

não conheço muito de linguagem C pra PIC, entretanto observei que você tratou o estado dos pinos a0 e a1 dentro da função do timer ...

seria interessante que a mudança de estado desses pinos ficassem dentro da função main, evitando que a função timer tome demasiado tempo para execução e diminuindo as chances de encavalamento com uma outra interrupção qualquer que esteja configurada...

voce pode, por exemplo, deixar dentro da função timer apenas o p++, m++ e o set_timer1(3036)...

os outros dois IFs coloca dentro da função main ...

Link para o comentário
Compartilhar em outros sites

Henrique, boa tarde !

fiz o seguinte >


#include <16f628a.h>

#FUSES NOWDT //Sem Watch dog, evitando reset
#FUSES INTRC_IO //xtal interno
#FUSES PUT //Tempo de início do PIC
#FUSES NOPROTECT //Codigo sem proteção de leitura, software livre!
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOMCLR //desabilitando reset em 0

#use delay(clock=4000000)
int m,p;

#int_EXT
void ext (void){ //nome da minha interrupção externa (ext)
output_toggle(pin_a2);
}



#int_TIMER1 //Interrupção do Timer1
void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupção.
{

m++;
p++;

set_timer1(3036);
}



void main ()
{
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
enable_interrupts(global); //habilita interrupcão global
enable_interrupts(INT_EXT); //Habilita interrupção externa
enable_interrupts(INT_TIMER1); //Habilita interrupção timer1
set_timer1(3036);

if(m == 6)
{
output_toggle(pin_a0);
m=0;
}

if(p == 10)
{
output_toggle(pin_a1);
p=0;
}
}

Eu consegui fazer dar certo sem o timer, porém só com a interrupção externa, mas o problema é que ela interrompe o que está sendo lido na varredura e da um toggle no a2, o ruim é que desse maneira ela toma o tempo deles, eu queria fazer sem tomar tempo, por isso tentei com o timer 1.

mas obrigado!

se tiver dicas

eu agradeço

Falou ;D

CONSEGUI!


#include <16f628a.h>

#FUSES NOWDT //Sem Watch dog, evitando reset
#FUSES INTRC_IO //xtal interno
#FUSES PUT //Tempo de início do PIC
#FUSES NOPROTECT //Codigo sem proteção de leitura, software livre!
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOMCLR //desabilitando reset em 0

#use delay(clock=4000000)
int m,p;

#int_EXT
void ext (void){ //nome da minha interrupção externa (ext)
output_toggle(pin_a2);
}



#int_TIMER1 //Interrupção do Timer1
void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupção.
{
m++;
p++;

if(m == 0)
{
output_toggle(pin_a0);
m=0;
}

if(p == 0)
{
output_toggle(pin_a1);
p=0;
}
set_timer1(3036);
}



void main ()
{
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
enable_interrupts(global); //habilita interrupcão global
enable_interrupts(INT_EXT); //Habilita interrupção externa
enable_interrupts(INT_TIMER1); //Habilita interrupção timer1
set_timer1(3036);

while(1){
output_high(pin_a0);
delay_ms(300);
output_low(pin_a0);
delay_ms(300);

output_high(pin_a1);
delay_ms(300);
output_low(pin_a1);
delay_ms(300);
}

}

Link para o comentário
Compartilhar em outros sites

que bom que conseguiu :D

só tira a função timer do programa que, neste caso, ela só esta ali fazendo volume ... rs

é que o programa era simples, quando for mais complexo, procure utilizar a int timer porque você meio que "amarra" o programa ao utilizar delay...

eu estava procurando alguns tópicos sobre interrupções em PIC e encontrei esse: http://forum.clubedohardware.com.br/usando-interrupcoes-timer/715429

da uma olhada, tem algumas dicas sobre tratamento de interrupções...

Link para o comentário
Compartilhar em outros sites

vou dar uma olhada.

pois é cara!

Funcionou no proteus , mas na prática não!

compilei o .hex

funcionou assim >

os leds a0 e a1 ficaram oscilando como determinei, mas o a2 ele pisca sózinho, acende e apaga.

vou tentar essa dica sua .!

valeu

------------------*

errei na hora de montar.utilizei o port b0 e ext no mesmo pino.

bom montei, certo, funcionou até certo ponto>>>

quando ligo, os leds começam a oscilar, até ai td bém!

1 pulso na ext o led ascende ai beleza;

+1 o led apaga beleza

+1 ele ascende e apaga

+1 ele ascende e apaga

ai volta o ciclo acima;seria um bug do programa isso?

obs:henrique, retirei o timer 1, compilei, ficou pior, pois a ext interrompe o while dos leds, já com o timer é bem menos!

lembrando que nesse caso acima , na parte do botão utilizei um toggle:

olha só:


#int_EXT
void ext (void){ //nome da minha interrupção externa (ext)
output_toggle(pin_a2);
}

Link para o comentário
Compartilhar em outros sites

bom, se voce ta utilizando uma chave na interrupção externa, monta um circuito debounce ...

http://all-electric.com/schematic/debounce.htm

existem ruidos, oscilações nas chaves ...

quanto ao seu código... foi como eu falei, montar laços com delay na função main não é muito legal ... para que a interrupção externa nao afete a oscilação, voce tem que montar com timer ...

revendo seu código, notei tambem que da 1º vez que tu postou ...

nao existia nenhum laço que "travasse" o microcontrolador esperando pelas interrupções de timer e externa...

então o que acontecia: o PIC entrava na função main, executava toda a inicialização e terminava o programa logo em seguida...

provavelmente por isso que da 1º vez que tu montou com timer, nao funcionou...

tenta compilar assim:

#include <16f628a.h>

#FUSES NOWDT //Sem Watch dog, evitando reset

#FUSES INTRC_IO //xtal interno

#FUSES PUT //Tempo de início do PIC

#FUSES NOPROTECT //Codigo sem proteção de leitura, software livre!

#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#FUSES NOCPD //No EE protection

#FUSES NOMCLR //desabilitando reset em 0

#use delay(clock=4000000)

int m,p;

#int_EXT

void ext (void) //nome da minha interrupção externa (ext)

{

output_toggle(pin_a2);

}

#int_TIMER1 //Interrupção do Timer1

void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupção.

{

m++;

p++;

set_timer1(3036);

}

void main ()

{

setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8

enable_interrupts(global); //habilita interrupcão global

enable_interrupts(INT_EXT); //Habilita interrupção externa

enable_interrupts(INT_TIMER1); //Habilita interrupção timer1

set_timer1(3036);

while(1)

{

if(m == 6)

{

output_toggle(pin_a0);

m=0;

}

if(p == 10)

{

output_toggle(pin_a1);

p=0;

}

}

}

Link para o comentário
Compartilhar em outros sites

certo.

tinha pensado nessa de debounce também , mas não sabia que era pelas chaves!

valeu henrique!

henrique,

Não sabia que debounce seriam ruídos da chave, vou trocar ela , e vou compilar esse .hex , ja que retorno, porque quero ver isso funcionando!

valeu pelas dicas!, já que retorno.

;D

retornando. . . .

Não funcionou como o esperado, vou acoplar um c de 10n.

Link para o comentário
Compartilhar em outros sites

como as chaves são elementos eletromecanicos, muitas delas apresentam esse problema ...

acho que é por causa da vibração dos contatos ...

um dip switch de boa qualidade, as vezes funciona...

a solução talvez seja com esse circuito debounce com CI 7414 ...

http://imageshack.us/photo/my-images/692/dbounce4.gif/

só acoplar um capacitor, acho que vai apenas "arredondar" o sinal ...

bom, mas tenta ...

e o código?

funcionou melhor ou nao?

Link para o comentário
Compartilhar em outros sites

BOOAAAAAAAAAAAAA!!!!

VALEU HENRIQUE

ERA UM DEBOUNCE NA CHAVE

ACOPLEI UM Cap CERÂMICO 104;

Deu certo!

caramba, eu pensando que era na programação!

mas não sabia que também usando delay no main prejudicava!

valeu!

só vou agora mudar a vel. dos leds que oscilam mas agora em tempos iguais para ficarem em sincronismo.!

;D

Link para o comentário
Compartilhar em outros sites

Deu certo.!

bom aproveitando o embalo!

você ja tentou gerar uma frequência com o pic de uns 37 mhz?

acho que por pwm seria o caso.

mas. . .

então, há um tempinho atrás tava pensando em fazer isso,ja que estou no embalo com o PIC aqui, gerar uma frequência na saída de 37MHZ, ligar um emissor infravermelho, e através de uma ext, emitiria essa onda, para possíveis acionamentos remotos seria possível?

Link para o comentário
Compartilhar em outros sites

ixii cara, eu não manjo muito de PIC ... mexo com outros microcontroladores, pode ser que eu fale algo errado ... :(

mas é possivel implementar um pwm via software no microcontrolador pra gerar uma frequencia ...

http://forum.clubedohardware.com.br/varias-saidas-pwm/826271?t=826271

para acionamentos remotos muitas pessoas utilizam modulos RF, Zigbee ...

nessa eu nao vou conseguir te ajudar ...

seria o caso de esperar mais opiniões de alguns dos mestres desse forum ...

Link para o comentário
Compartilhar em outros sites

;D

não tem problema !

valeu mesmo pela ajuda.

estou tentando outra,já que em mãos tenho os componentes,placa universal. . . , (uma matriz), não vou sair dela , antes de fazer funcionar, o que é complicado neste caso é o programa , que terei de estudar bastante.

;D

obrigado ;D

bom domingo

Link para o comentário
Compartilhar em outros sites

O PIC pode usar um cristal de até 25Mhz.

Gerar um sinal de 37Mhz na saída é bem difícil né.

Talves você quis dizer 37Khz.....

Que na verdade sao 38Khz a frequencia de uma portadora comumente usada em aplicações de infravermelho.

Falou

éhh isso mesmo.

acabei confundindo.

http://forum.clubedohardware.com.br/showpost.php?p=4847764&postcount=715

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!