Dúvida:
Ao trabalhar com interrupções, pensei a priori, que a porta deveria estar setada em TRISA como entrada para que funcionasse. Até aí tudo bem, quando setei GPIO2 como input a interrupção funcionou. Então fiz outro teste, setei GPIO2 como output, e para minha surpresa ao colocar um sinal em GPIO eis que a interrupção funciona. Daí veio a questão, a interrupção independe de como a porta é setada ?
Obs.: os teste foram feitos com borda de subida (low to high)
Quando mando um sinal (+5v através de uma chave NA) a interrupção funciona, no entanto percebi qua ao soltar a chave a interrupção ocorre novamente, ou seja, está funcionando como se a propriedade de interrup on chage estivesse habilitada, o que não está. O código abaixo é o que estou usando, gostaria que me reportassem onde está o erro.
Obrigado.
- Código: Selecionar todos
#include <12F675.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC //Internal RC Osc GPIO.4
#FUSES NOCPD //No EE protection
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOPUT //No Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES BANDGAP_HIGH
#use delay(clock=4000000)
#use fast_io(a)
void funcao();
int var = 0;
#int_ext
void evento()
{
delay_ms(500);
clear_interrupt(INT_EXT);
//desabilito as interrupções, pois se o botão continuar precionado
//não irá gerar mais interupções. Por exemplo, se for precionado e assim o mantiver
// a variável irá ser incrementada mais de uma vez, por isso desabilito a interrpção.
disable_interrupts(INT_EXT);
//se é a primeira interrupção
if(var == 0)
{
var=1;
}
//casso já tenha ocorrido uma interrupção
else
{
var+=1;
}
}//void evento()
void main()
{
//seta todas as portas como saídas, exceto GPIO3
//76543210
set_tris_a(0b00001000);
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC);
setup_vref(FALSE);
//Interrupção por borda de subida
ext_int_edge(0,L_TO_H);
//Habilita as interrupções
enable_interrupts(GLOBAL);
//Habilita interrupção externa, GPIO2
enable_interrupts(INT_EXT);
clear_interrupt(INT_EXT);
//garante que var seja realmente 0;
if(var != 0)
var = 0;
while(true)
{
while(var > 0){
//Caso a interrupção tenha ocorrido a variável global var terá um valor maior que 0.
//Como as interrupções são desativadas dentro da função de interrupção é preciso habilita-la novamente,
//visto que durante este while, pode haver outra interrupção, e assim var terá que ser
//incrementada novamente
ext_int_edge(L_TO_H);
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
clear_interrupt(INT_EXT);
//chama a função
funcao();
}//while(var > 0)
//enquanto não houver uma interrupção um led ligado a GPIO0
//fica piscando em um intervalo de 1s
output_a(0b00000001);
delay_ms(500);
output_a(0x00);
delay_ms(500);
}//while(true)
}//main
void funcao()
{
//pisca dois leds, um conectado á GPIO1 e o outro à GPIO0
output_a(0b00000011);
delay_ms(2000);
output_a(0x00);
delay_ms(2000);
var--; //decrementa a variável global var
}