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

Como gerar interrupção externa com pic e CCS

Recommended Posts

ola alguem sabe como configurar o pic para tratar interrupção externa RB4 a RB7.Exemplo bem simples led e botão

Compartilhar este post


Link para o post
Compartilhar em outros sites


#include <16F628A.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, BROWNOUT, MCLR, NOLVP, NOCPD
#use delay(clock=4000000)

#use fast_io(B)
#byte portb=0x06
#bit led=portb.0

#int_RB
void RB_isr(void)
{
led=!led;
}

void main()
{
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);

set_tris_b(0b11110000);
portb=0x00;
led=1;

while(true)
{
}
}

pbchange.png

Uploaded with ImageShack.us

Editado por test man*~

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Fiquei com uma duvida na explicação da seguinte linha

    void RB_isr(void)

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    void RB_isr(void) é apenas o nome da interrupção, você pode trocar para por exemplo: void trata_interrupcao(void)

    Falou

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Qual a função de:

    #use fast_io(B) //utilizando uma saída mais rápida de i/o nos ports B

    #byte portb=0x06 //atribuiu um dado para o port B

    #bit led=portb.0

    #int_RB

    nesse programa?

    estou correto?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    #use fast_io(B) passa o controle dos i/o ports para o usuário.

    #byte portb=0x06 //endereça o portb (0x06 é tirado do data sheet).

    #bit led=portb.0 //Nomeia o bit 0 do portb (RB0) como led.

    #int RB //A função que vem abaixo dessa linha, será o que será feito quando a interrupção ocorrer.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Amigo, no proteus , o programa apresenta erro em relação ao TRISB,

    Então para funcionar troque set_tris_b por output_b ok, e mantenha (0b1111000);

    ficará assim:

    #include <16F628A.h>

    #FUSES NOWDT, XT, PUT, NOPROTECT, BROWNOUT, MCLR, NOLVP, NOCPD

    #use delay(clock=4000000)

    #use fast_io(B)

    #byte portb=0x06

    #bit led=portb.0

    #int_RB

    void RB_isr(void)

    {

    led=!led;

    }

    void main()

    {

    enable_interrupts(INT_RB);

    enable_interrupts(GLOBAL);

    output_b(0b11110000);

    portb=0x00;

    led=1;

    while(true)

    {

    }

    }

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Obrigado pela explicação,test man*~, em relação,a imagem do ISIS que você postou, por que você colocou, nos ports B4,B5,B6 e B7 aquele negócio em azul? para que serve?, e aquele interrogação no port da interrupção, seria para mostrar o funcionamento?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Apresenta erro mesmo, mas se você gravar o PIC e testar na vida real funcina que é uma beleza.

    As coisas azuis se chamam logicstate, servem para simular uma mudança nos pinos de interrupção (RB4 a RB7), e o outro chama-se logicprobe server para verificar o estado do pino 0 ou 1.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    set_tris_b(0b11110000); // Define a direção dos pinos 1-entrada 0-saída.

    Se você usar o output_high(); output_low(); output_float();

    você não precisa usar #use fast_io() #byte portx=0xXX e nem o set_tris_x(0xXX);


    #include <16F628A.h>
    #FUSES NOWDT, XT, PUT, NOPROTECT, BROWNOUT, MCLR, NOLVP, NOCPD
    #use delay(clock=4000000)

    #define led PIN_B0

    #int_RB
    void RB_isr(void)
    {
    output_toggle(led);
    }

    void main()
    {
    enable_interrupts(INT_RB);
    enable_interrupts(GLOBAL);

    output_high(led);

    while(true)
    {
    }
    }

    Editado por test man*~

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • set_tris_b(0b11110000); // Define a direção dos pinos 1-entrada 0-saída.

    Se você usar o output_high(); output_low(); output_float();

    você não usar #use fast_io() #byte portx=0xXX e nem o set_tris_x(0xXX);


    #include <16F628A.h>
    #FUSES NOWDT, XT, PUT, NOPROTECT, BROWNOUT, MCLR, NOLVP, NOCPD
    #use delay(clock=4000000)

    #define led PIN_B0

    #int_RB
    void RB_isr(void)
    {
    output_toggle(led);
    }

    void main()
    {
    enable_interrupts(INT_RB);
    enable_interrupts(GLOBAL);

    output_high(led);

    while(true)
    {
    }
    }

    Eu só não entendi em qual pino eu ligaria um botão pra gerar a interrupção usando o codigo acima.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Se você colocar um botao nos pinos B4 a B7, a interrupção acontece toda vez q passa de 0V para 5V.

    Lembre-se de montar o botão corretamente.

    Exemplo:

    semttulozko.png

    Falou

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    set_tris_b(0b11110000); // Define a direção dos pinos 1-entrada 0-saída.

    Se você usar o output_high(); output_low(); output_float();

    você não precisa usar #use fast_io() #byte portx=0xXX e nem o set_tris_x(0xXX);


    #include <16F628A.h>
    #FUSES NOWDT, XT, PUT, NOPROTECT, BROWNOUT, MCLR, NOLVP, NOCPD
    #use delay(clock=4000000)

    #define led PIN_B0

    #int_RB
    void RB_isr(void)
    {
    output_toggle(led);
    }

    void main()
    {
    enable_interrupts(INT_RB);
    enable_interrupts(GLOBAL);

    output_high(led);

    while(true)
    {
    }
    }

    Acho que agora entendi, então eu estava confundindo a função de output_a,com set_tris_a:

    Ou seja :

    set_tris_x(0b0000000);//define os ports que serão utilizados como entrada ou saída.

    output_x(0b0000000);//seta os ports

    hmm..dessa eu não sabia, obrigado

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Se você colocar um botao nos pinos B4 a B7, a interrupção acontece toda vez q passa de 0V para 5V.

    Lembre-se de montar o botão corretamente.

    Exemplo:

    semttulozko.png

    Falou

    Então, quando:

    set_tris_b(0b11110000);

    Quando seto os devidos ports em 1, eles são definidos como pinos de entrada, e 0 em saída.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    portb=0x00; quer dizer que você está pondo todo o portB em nível baixo no início do programa.

    Falou

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Fiz o seguinte agora:

    #include <16F628A.h>

    #use delay(clock=4000000)

    #FUSES NOWDT, XT,PUT,NOPROTECT,BROWNOUT,MCLR,LVP,NOCPD

    #use fast_io(b)//passa o controle dos i/o ports para o usuário.

    #byte portb=0x06//endereça o portb (0x06 é tirado do data sheet).

    #bit led=portb.0//Nomeia o bit 0 do portb (RB0) como led.

    #int_RB//A função que vem abaixo dessa linha, será o que será feito quando a interrupção ocorrer.

    void ascende_apaga()

    {

    output_high(led);

    delay_ms(1000);

    output_low(led);

    delay_ms(1000);

    }

    void main()

    {

    enable_interrupts(INT_RB);

    enable_interrupts(GLOBAL);

    output_b(0b10000000);

    portb=0x00;

    led=1;

    while(1)

    {

    }

    }

    http://img254.imageshack.us/img254/1690/setg.png

    Só fiz o seguinte, mudei o nome da interrupção,e alterei os pinos de entrada, defini 1 só , como sendo o B7, onde coloquei um Botão, segundo na programação, quando a interrupção for interrompida por nível lógico 1 na entrada B7,o programa deveria ascender e apagar o led ligado ao port B0 que está definido como saída, alguém sabe onde pode estar o erro?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • #include <16F628A.h>

    #FUSES NOWDT, XT, PUT, NOPROTECT, BROWNOUT, MCLR, NOLVP, NOCPD

    #use delay(clock=4000000)

    #define led PIN_A0

    #int_RB

    void RB_isr(void)

    {

    output_low(led);

    }

    void main()

    {

    enable_interrupts(INT_RB);

    enable_interrupts(GLOBAL);

    while(true)

    {

    }

    }

    Gostaria de fazer a interrupção seguindo o modelo.Esta faltando a definição das entradas dos port,porém não sei como definir a entrada do botão.Fiz a mesma coisa do led #define botao pin_bo porém não funcionou.

    Gostaria de saber se tem como fazer isso sem usar as funções use fast io

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Eu não sei mexer direito com o timer,mas eu acho, que como se torna deinterrupção o programa exige o fast io, ou eu posso estar enganado.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Testado e funcionando:

    Circuito:

    semttuloqs.png

    Codigo:

    #include <16f628A.h>

    #FUSES NOWDT //No Watch Dog Timer
    #FUSES XT //Crystal osc <= 4mhz
    #FUSES PUT //Power Up Timer
    #FUSES NOPROTECT //Code not protected from reading
    #FUSES BROWNOUT //Reset when brownout detected
    #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    #FUSES NOCPD //No EE protection

    #use delay(clock=4000000)

    #define frame_time 1000

    #INT_RB
    void trata_interupcao()
    {
    output_high (PIN_B0);
    delay_ms (frame_time);
    output_low (PIN_B0);
    delay_ms (frame_time);
    output_high (PIN_B0);
    delay_ms (frame_time);
    output_low (PIN_B0);
    delay_ms (frame_time);
    }

    void main ()
    {
    enable_interrupts (INT_RB);
    enable_interrupts (GLOBAL);

    while(1);
    }

    Falou

    Editado por MatheusLPS

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Certo, funcionando corretamente matheus, porém tenho mais uma duvida a interrupção externa é nos pinos RB4 a RB7, tem como associar um botão para cada interrupçao.Exemplo bt 1 gera uma interrupção, bt 2 outra interrupção e assim ´por diante.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Não. A INT_RB funciona em todo o PORTB. Se você colocar mais botões, irao causa a mesma interrupção.

    você pode no caso, colocar vários botões e fazer a interrupção na marra.

    Tipo, você poe no seu programa se o botao for apertdado, uma variavel qualquer terá o valor igual a 2 por exemplo. Aí você poe um swich para cada caso da sua variavel. Criando uma esécie de menu.

    Falou

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Não. A INT_RB funciona em todo o PORTB. Se você colocar mais botões, irao causa a mesma interrupção.

    você pode no caso, colocar vários botões e fazer a interrupção na marra.

    Tipo, você poe no seu programa se o botao for apertdado, uma variavel qualquer terá o valor igual a 2 por exemplo. Aí você poe um swich para cada caso da sua variavel. Criando uma esécie de menu.

    Falou

    qual a vantagem de trabalhar com essa interrupção tendo quase todo portb que ira causar a mesma interrupção

    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






    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

    ×