Ir ao conteúdo
  • Cadastre-se

Como gerar interrupção externa com pic e CCS


diego.maga

Posts recomendados

Vantagem nenhuma. O exemplo foi confeccionado como no post original, pedia-se interrupção pelo PortB.. só isso.

Mas você pode programar uma interrupção que é ativa apenas em 1 pino. O pino CCP1 no 16f628A é um exemplo.

No caso de interrupçoes por botão, elas sao uteis quando você tem muitos delays em sua rotina, ou um codigo muito extenso. Aí você não precisa colocar testes de botões durante todo o programa.

Apenas programar 1 interrupçao para o aperto do botao e incrementar uma variável qualquer.

O método mais usado para teste de botao é esse aqui:

if (input(PIN_C2)                //Um exemplo, o botao estará nesse pino
{
delay_ms (75); //debouncing do botao
faça alguma coisa aqui; //seu código
}

você pode também usar o canal ADC para detectar vários botões. você poe 1 botão, e para cada botão adicional você adiciona um resistor e lê cada queda de tensão com o ADC. Ai vai saber qual botão está sendo apertado. Com essa tecnica você gasta um pino só. No entanto precisa de um PIC que tenha ADC, que no caso do 16F628A, não possui.

Se estiver com duvidas, pergunte.

Falou

Link para o comentário
Compartilhar em outros sites

Bom dia pessoal, esse tópico foi bem construtivo , fiz até um outro programinha para bricar com o INT_EXT, e INT_EXT1,com as interrupções.

#include<18f442.h> ////////////////////////////////////////////

//////////////////////////////////////////////////////////////////

#FUSES NOPROTECT //dispositivo sem proteção ////

#FUSES XT //crystal=<4MHZ ////

#FUSES NOLVP //não programado em nível baixo ////

#FUSES NOWDT //sem relógio cão de guarda ////

//////////////////////////////////////////////////////////////////

#use delay(clock=4000000) //////////////////////////////////////

//////////////////////////////////////////////////////////////////

#int_ext

void pisca_led ()

{

delay_ms(1000);

output_high(pin_a0);

delay_ms(1000);

output_low(pin_a0);

delay_ms(1000);

}

#int_ext1

void display_1234 ()

{

output_c(1);

delay_ms(100);

output_c(2);

delay_ms(100);

output_c(3);

delay_ms(100);

output_c(4);

delay_ms(100);

}

void main(){

enable_interrupts(INT_EXT); //só um pino causará interrupção RB0

enable_interrupts(INT_EXT1); //só um pino causará interrupção RB1

enable_interrupts(GLOBAL); //habilitando todas as interrupções

while(1);

}

Quando uma interrupção ocorre no pino RB0,"INT_EXT"realiza a interrupção pisca_led .

Quando ocorre uma interrupção no pino RB1,"INT_EXT1" realiza a interrupção display_1234,onde liguei nos ports C0 á C3 um display BCD de 7 segmentos, onde me mostra no display uma contagem de 1 a 4.

Link para o comentário
Compartilhar em outros sites

Você pode selecionar a borda que causará a interrupção.

com a função:

"ext_int_edge(L_TO_H);//interrupção na borda de subida > Low to high"

"ext_int_edge(H_TO_L);//interrupção na borda de descida > High to low"

Não tenho certeza se é assim que escreve a função, mas qualquer coisa procura no help do CCS.

Link para o comentário
Compartilhar em outros sites

Qual seria uma aplicação de uma interrupção???

Fiz alguns testes,utilizei,mais seriam utilizados para que?por exemplo?

Imagine que seu programa esta controlando uma valvula de segurança de uma máquina por exemplo e seu programa esta presso em uma rotina de tempo, ou seja somente depois de um certo tempo, você poderá desligar essa valvula.Com a interrupção ,como o proprio nome diz, ela para o programa imediatamente e guarda a linha em que parou na pilha e executa imediatamente a programação que esta dentro da interrupção, exemplo é de um botão de emergencia,apertou tem que desligar.Ao retornar da interrupção ela vai até a pilha e volta daonde parou.

Você pode selecionar a borda que causará a interrupção.

com a função:

"ext_int_edge(L_TO_H);//interrupção na borda de subida > Low to high"

"ext_int_edge(H_TO_L);//interrupção na borda de descida > High to low"

Não tenho certeza se é assim que escreve a função, mas qualquer coisa procura no help do CCS.

Não consegui realizar a interrupção com a escolha da borda de subida ou descida.O código é esse mesmo.Com esse exemplo em que o matheus postou ai funciona a interrupção,porém tanto na subida como na descida o programa executa a função de interrupção.

Link para o comentário
Compartilhar em outros sites

A função está certa sim cara.

Código:


#include <16F628A.h>

#FUSES XT
#FUSES PUT
#FUSES BROWNOUT

#use delay(clock=4000000)

#define seleciona pin_b2
#define led pin_a0

#int_EXT
void EXT_isr(void)
{
output_toggle(led);
}

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

output_high(led);

while(true)
{
if(input(seleciona))//se o pino b2 estiver em alto é interrupção em low to high
ext_int_edge(L_TO_H);

else
ext_int_edge(H_TO_L);//se em baixo é interrupção em high to low
}
}

Circuito usado para simular:

imagemmgy.png

Uploaded with ImageShack.us

Link para o comentário
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

Ola test man, eu postei um outro topico aqui e ainda não obtive resposta,será que você pode me ajudar o topico é o seguinte

http://forum.clubedohardware.com.br/projeto-frequencimetro-digital/884678

Ola Matheus, eu postei um outro topico aqui e ainda não obtive resposta,será que você pode me ajudar o topico é o seguinte

http://forum.clubedohardware.com.br/projeto-frequencimetro-digital/884678

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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