Página 1 de 1

Interrupção externa - 16F628A - CCS

MensagemEnviado: 26 Mai 2010 00:09
por AlbertPlanck
Seguinte, quero fazer com que meu programa receba uma interrupção pelo pino B0 e que seja tratado através de uma interrupção externa.
Criei um loop infinito no main() com o intuito de eu mesmo mudar o valor do pino B0 e gerar as interrupções para ver se está funcionando
Segue o código:

Imagem

Uso o Compilador CCS
Abraços

MensagemEnviado: 26 Mai 2010 12:35
por AlbertPlanck
ninguém galera?

MensagemEnviado: 26 Mai 2010 12:48
por KrafT
Bom, não se deve usar delay na interrupção...

Mas explica teu problema melhor...

MensagemEnviado: 26 Mai 2010 12:56
por AlbertPlanck
Esse delay eu estou usando só para teste mesmo. Seguinte, no pino RB0 eu devo receber os 5V que virá de um sensor e fazer o tratamento via interrupção externa.
Como não programo muito bem em PIC resolvi fazer esse programa simples para ver se consigo tratar o pino RB0 via interrupção externa.
Então, no main() eu mesmo gero os 5V e 0V no pino RB0 para que simule a interrupção externa que viria do sensor e entre na função interrupcao().
Para saber se está funcionando, na funcao de tratamento da interrupção externa eu apenas acendo e apago um LED, só para saber se está funcionando.
Assim, no problema final, não será necessário acender esse LED, só estou acendendo para ver se ele está entrando na função interrupcao(). Pois deveria entrar não? não é para entrar automaticamente sempre que houve mudança de LOW para HIGH no pino RB0?
Como eu fiz esse circuito no PROTEUS, eu vejo que o valor da entrada muda entre 0V e 5V mas o LED não acende, ou seja, não está entrando na função interrupcao().

Se puderem me ajudar agradeço
abraços

MensagemEnviado: 26 Mai 2010 13:02
por KrafT
Melhor gerar o sinal em outro pino, tipo RA1 e ligar no RB0 com um fio.

MensagemEnviado: 26 Mai 2010 13:12
por AlbertPlanck
como assim?
mas não é o RB0 o único pino do 16f628A que serve para interrupção externa?

MensagemEnviado: 26 Mai 2010 13:38
por KrafT
Acho que voce nao pode gerar e ler o sinal ao mesmo tempo no mesmo pino...

Imagem


E eu falei gerar o sinal em outro pino.

MensagemEnviado: 26 Mai 2010 13:55
por leoabubauru
AlbertPlanck

Se B0 é configurado como interrupção externa ele não pode ser ao mesmo tempo uma saída. Ser interrupção externa já coloca o B0 como input, portanto você não poderá acioná-lo como faz no WHILE(1) já que este tipo de acionamento só é feito com um pino de output.

A sugestão dada pelo KrafT é que você configure um pino como saída e ligue um fio dele ao B0. Depois você aciona este novo pino dentro do WHILE(1).

Assim:

Código: Selecionar todos
#define Pino_Teste pin_a1
.
.
.
Main(void)
   .
   .
   .
   set_trisa(0b00000000); // A0 e A1 como saidas
   .
   .
   .
   While (1)
      {
       delay_ms(400);
       output_high(Pino_Teste);
       delay_ms(400);
       output_low(Pino_Teste);
      }


Outra dica:

Quando postar algo, procure fazê-lo na forma de uma pergunta. Isso facilita nossa compreensão do problema (ver primeira resposta do Kraft). Releia o que você postou no início do tópico e imagine alguém que não conhece seu problema tentando entender sua necessidade... :roll:


No mais, o que pudermos ajudar assim o faremos!


Laercio

MensagemEnviado: 26 Mai 2010 18:35
por AlbertPlanck
Muito obrigado, está resolvido
Me desculpe KrafT se não entendi na primeira vez o que você havia proposto...
No mais, obrigado pela ajuda
abraços

MensagemEnviado: 27 Mai 2010 00:14
por AlbertPlanck
Eu consegui fazer como foi proposto, e gerar a interrupção todas vez que um outro pino gera a saída
Só que agora, como próximo passo, quero que a interrupção seja gerada quando um botão for pressionado.

Imagem


Imagem

Minha nova pergunta é:
Por que quando eu pressiono o botão, a interrupção não é gerada?
Creio que é algo elementar, se alguém puder me dar uma força

MensagemEnviado: 27 Mai 2010 06:02
por KrafT
Bom, ou voce liga o pull-up interno do PORTB e bota a chave a conectar o pino para GND, ou voce esquece o pull-up interno e mantem a tua fonte como está, mas coloca um pull-down externo, por exemplo um resistor de 4k7.

Ou ainda põe uma chave de 2 polos, que alterne o nivel de RB0 ao ser pressionado... Enfim as opções são muitas...

Mas não espere "...a vida te servir felicidade numa bandeja de prata..." (by Bob Esponja)

MensagemEnviado: 02 Jun 2010 18:40
por AlbertPlanck
Muito obrigado
It's working!!