Borda de subida 12F675

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Borda de subida 12F675

Mensagempor jcts » 28 Dez 2009 09:54

Estou estudando interrupções com o PIC12675 e fiz alguns teste e pesquisas e tive algumas dúvidas e problemas:

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
}
jcts
 
Mensagens: 1
Registrado em: 23 Dez 2009 10:49

Mensagempor Djalma Toledo Rodrigues » 28 Dez 2009 11:34

Normalmente se configura o Pino GP2 como entrada

Mas, se forçar mudança de nível do pino de Saída ocorrerá a Interrupção ver fig.:


<--------------------------->Imagem


DJ
.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor renanwalenczuk » 28 Dez 2009 12:24

Dá uma olhada no help do ccs:

ext_int_edge(0, l_to_h);

Abraço

Renan
"O segredo da criatividade é saber como esconder as fontes."
Albert Einstein
renanwalenczuk
Nibble
 
Mensagens: 69
Registrado em: 17 Nov 2008 14:22
Localização: Canoas - RS

Mensagempor aguivone » 06 Jan 2010 20:54

use :
disable_interrupts(GLOBAL);
para parar as interrupções , depois de tratada use
enable_interrupts(GLOBAL);
para ativar novamente as interrupções

no botao vc colocou um capacitor(100nF) como filtro além do delay no programa (debounce)?

ruidos pode te trazer estados inesperados .
aguivone
Bit
 
Mensagens: 35
Registrado em: 08 Dez 2009 13:12


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x