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
  • Autor do tópico
  • 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
  • Autor do tópico
  • 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
  • Autor do tópico
  • 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

    ×