Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
Entre para seguir isso  
avinicius

Ajuda com dicas para interrupção....!!!

Recommended Posts

Alguém pode me dar uma dica de como fazer mais de uma interrupção com o timer? ao mesmo tempo?

Editado por avinicius

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cada timer pode ter apenas uma interrupção.

Falou

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exatamente.

O Timer provoca uma interrupção quando ele estoura.

Mas, é possível, usando apenas um timer, ter várias temporizações.

Vamos supor que você precise de 3 temporizações nos seguintes valores: 1 ms, 5 ms e 10 ms.

Se você configurar o Timer para estourar a cada milissegundo, você já tem a primeira temporização.

Se a cada vez que ele estourar você incrementar uma variável, quando esta variável atingir o valor 5, você tem a segunda temporização e quando ela atingir 10, a terceira.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado.....

Tipo assim, estou treinando timer...só sei fazer apenas 1 estouro.

"mas dessa jogada com a variável é coisa nova pra mim, achei muito interessante"....*)

Não vou pedir que façam para mim.....Vou tentar, em seguida retorno com minhas dúvidas aqui....

Mas, é o seguinte, quero fazer o seguinte programa:

Se , eu precionar B1 apenas uma vez acionará os 3 três leds que começaram a piscar juntos, mas com tempos diferentes um do outro.

LED1 2segundos

LED2 3segundos

LED3 5segundos

Obrigado...mais se quiser dar mais dicas,ficarei grato....

Obrigado pelas respostas >>Mulder_Fox e MatheusLPS...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito q seja C do CCS que o colega esteja acostumado.

Mais tarde volto com um exemplo p você.

EDIT:

Fiz do jeito que você quis, cada led pisca num ritimo diferente determinado pelas variáveis p, q e m. Sendo que o timer1 está configurado para estourar a cada 0.5s, se tivermos por exemplo a variável q igual a 4, se pessaram 2 segundos.

Código feito:

#include <16F877A.h>            //O PIC utilizado, obrigatório!
#FUSES NOWDT //Sem Watch dog, evitando reset
#FUSES XT //Crystal de oscilação igual a 4mhz
#FUSES PUT //Tempo de início do PIC
#FUSES NOPROTECT //Codigo sem proteção de leitura, software livre!
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection


#use delay(clock=4000000)

int m,p,q;

#int_TIMER1 //Interrupção do Timer1
void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupão.
{
q++; //Variável q incrementada a cada estouro do Timer1
p++;
m++;
if (q == 4)
{
output_toggle(PIN_B0);
q=0;
}

if (p == 6)
{
output_toggle(PIN_B1);
p=0;
}

if (m == 10)
{
output_toggle(PIN_B2);
m=0;
}

set_timer1 (3036); //Preload do Timer1
}

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

enable_interrupts(INT_TIMER1); //Habilita interrupção timer1
enable_interrupts(global); //habilita interrupcão global
set_timer1 (3036);

while (TRUE);
}

Falou

Editado por MatheusLPS

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só complementando:

Depois que cada variável atingir o valor esperado, ela tem de ser zerada para que comece uma nova contagem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa muito obrigado....

Entendi...o FUSES...

1-)Mais qual a diferença de usar NODEBUG?pra esse programa.....?seria necessário?

Vamos ver se eu entendi....

Em relação aos 3 Leds,que piscaram em tempos diferentes....>>

A lógica de atribuir uma variável para cada Led, com uma variável INT, entendi também....

Só não consegui interpretar direito a jogada das condições, ".......entendi meio que por cima..."...

E.....

E mais uma pergunta...

Qual foi a lógica de você setar os ports B em nivel baixo?

Seria pela lógica de eu apenas ligar uma vez só....?

Bom....só tenho que agradecer....muito obrigado mesmo....

>> Mulder_Fox e MatheusLPS...vocês realmente querem ajudar....percebo isso...Parabéns para vocês...em querer apenas ajudar o próximo...

=)

Compartilhar este post


Link para o post
Compartilhar em outros sites
Só não consegui interpretar direito a jogada das condições, ".......entendi meio que por cima..."...

Veja q o TIMER1 está configura para estourar a cada 0.5s ou 500ms. Correto?

Se o TIMER1 leva meio segundo para estourar, quer dizer que se ele estourar duas vezes, nós temos 1 segundo, certo? Se ele estourar 4 vezes, nós temos 2 segundos e assim por diante.

Ora, se ele leva 0.5s para estourar, então se ele estourar 10 vezes, quer dizer q se passaram 5 segundos.

Esse que é o lance das condições!

Qual foi a lógica de você setar os ports B em nivel baixo?

Só para garantir que o PORTB está começando em nível baixo e não flutuando....

Esses fuses são fuses "padrões". Se você perceber, tem sempre em todos os meus códigos. É bem genérico. Por isso o NODEBUG está lá.

Falou

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado.....

Mas em relação a você setar o preload do timer1 set_timer1(3036); tem haver de aproveitar todos os 500ms?

Mas se eu quisesse mudar o valor do preescaler alteraria o tempo de estouro dele?

Obrigado...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse valor do preload é exatamente para ele estourar em 0.5s.

SE você mudar o prescaler, muda toda as contas da interrupção e ela estoura com valores diferentes.

Falou

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×