Ir ao conteúdo
  • Cadastre-se

C interrupção por mudança de estado - pic16f877a


Posts recomendados

Boa tarde a todos,

 

Estou meio que desesperado com meu projeto, e já quebrei a cabeça inúmeras vezes para chegar num código final, porém sem exito.

 

Estou desenvolvendo uma solenoide, que precisa ser atuada através de uma mudança de estado de uma porta RB do PIC16F877A.

 

Ou seja, se a porta em qeustão (RB5) passar de alimentada para não alimentada, a porta RC4 de saída precisa ser acionada, por 2 segundos, e ser desligada em seguinte.

 

Parece ser algo simples diante do mundo de programação, mas mesmo asssim estou quebrando a cabeça de uma forma pela falta de entendimento na área.

 

Se for de ajuda, segue o código feito no mikroC:

 

void main()
{
       CMCON        =   0x07;   // Desabilita Comparadores;
       RBIE_bit     =   0x01;   // Habilita a interrupção por mudança do PORTB <7:4>
       RBIF_bit     =   0x00;   // Força a flag de sinalização a zero
       GIE_bit      =   0x01;   // Habilita a interrupção global
       
       TRISB        =   0xFF;   // PORTB configurado como entrada digital
       TRISC        =   0xEF;   // Apenas usaremos RC4 como saída digital
       
       RC4_bit      =   0x00;   // Inicia a saída em nível baixo

}

void interrupt ()
{
   if(RBIE_bit){                                 // Caso haja mudança de 1 para 0, ou de 0 para 1 (especificamente na porta RB5 de entrada)

       RC4_bit      =   0x01;               // Saida a ser acionada
       delay_ms(2000);
       RC4_bit      =   0x00;               // Saida a ser desligada

}
}

 

 

Preciso que esse ciclo de acionamento, se repita infinitamente...

 

 

Conto com a ajuda urgentemente de vocês, e agradeço desde ja.

 

 

Att, Otavio.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Amigo, não faço parte desta 'galera' mas aproveitando que não bebi o suficiente ainda....

É bem fácil mesmo e você está no caminho certo mas... o que deu errado?

Dica

apague o flag no começo da interrupt pois não lembro se o hw faz
 

void interrupt ()
{
   if(RBIE_bit){   

RBIF_bit     =   0x00;

...

Publique o esquema...

Ah sim... pros amigos que tentaram ajudar, agradecemos mas parece que eles têm pouco contato com mc's. Publique no forum 'microcontroladores'

e

for(;;) 

é a lesma lerda que

while(1)

abç

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Resolvi passar pra ver se deste algum retorno e... decepção. Pelo jeito teu desespero não é tão grande. Mas pra não ficar em branco, descobri uma falhinha nossa...

Em 05/10/2018 às 18:08, Isadora Ferraz disse:

if(RBIE_bit){ RBIF_bit = 0x00;

de fato o bit que deve ser avaliado é o RBIF mesmo.

if(RBIF_bit){ RBIF_bit = 0x00;...

boa sorte

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

@Isadora Ferraz  Boa tarde Isadora,

 

ahahaha agradeço muito pelo seu retorno, e sim, meu desespero é grande, do tamanho do universo.

 

Confesso que não me atentei ao seu retorno aqui, por justamente estava tendo problemas para logar no forum (acredite se quiser)..

 

Vou testar tais dicas, e comento aqui o andamento...

 

No mais, só agradeço pela sua disponibilidade!

 

Valeu.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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!