terça-feira, 10 de julho de 2012

Usando interrupções externas do ATMEGA328P:

           O grande diferencial deste exemplo é que aqui vou demonstrar como usar as interrupções externas de modo que vocês possam usar todas( 23 interrupções no total),tempos atrás postei aqui como usar as interrupções INT0 e INT1 para o ATMEGA8 mas é se você precisar de mais interrupções como fazer ?.Para responder a essa pergunta monte o seguinte circuito na proto-o-board("coloque um led em qualquer pino do PORTB") ou no simulador virtual :


           E agora vamos ao código fonte :

//************************************************************************
//                             usando interrupção externa
//  Version    : 1.0
//  microcontrolador : AVR ATMega328P
//  Autor        : Aguivone
//  descrição  : usando interrupção externa int8 pra usar as outras interrupções é do mesmo modo
//                                                    pino C0(int8)
//  data : 10/07/2012.
//
//************************************************************************
#define F_CPU 16000000UL  // 1 MHz deve vir antes das interrupçoes
#include <avr/io.h>
#include <avr/interrupt.h>

/*
ISR(PCINT0_vect) //interrupçoes e 0 a 7
  {
  PORTB = ~PORTB;
  }*/

ISR(PCINT1_vect) //interrupçoes e 8 a 14
  {
  PORTB = ~PORTB;//neste exemplo vamos usar a interrupção no pino C0(int8)
  }
/*
ISR(PCINT2_vect) //interrupçoes e 16 a 23
  {
  PORTB = ~PORTB;
  }*/

/////////////////////////////////////////////////Funções usadas/////////////////////////////////////////////
void inicializa_interrupcoes(void)
{

  // PCICR = 0X01;//habilita interrupções de 0 a 7 
    PCICR = 0X02;//habilita interrupções de 8 a 14 //no exemplo vou usar  a interrup~ção 8
//   PCICR = 0X04;//habilita interrupções de 16 a 23 ,depende do modelo do microcontrolador

//   pode ainda fazer conbinaçõe pra usar todas as interrupçoes simultâneas

    //PCMSK0 = 0X00//aqui coloca qual pino vai gerar a interrupçoes,pode se usar mais de um.  
      PCMSK1 = 0X01;//selecionei somente o pino de interrupção 8 (PC0)
    //PCMSK2 = 0X00//aqui coloca qual pino vai gerar a interrupçoes,pode se usar mais de um. 
   sei(); //habilita interrupções
}

//////////////////////////////////////////////função principal///////////////////////////////////////////
int main(void)
{
           DDRC = 0xFE;  //inicializa portd
           PORTC = 0;
           DDRB = 0xFF;  //inicializa portd
           PORTB = 0; 
           inicializa_interrupcoes();
           for(;;)
            {
             //faz nada!
            }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////


 contribua com o blog postando seus exemplos aqui também

3 comentários :

  1. Prezado, muito bom o artigo. Teria como disponibilizar este codigo para o arduino. Preciso utilizar 3 interrupções apenas do Atmega 328p. Só para acordar e executar o programa e voltar a dormir.Obrigado

    ResponderExcluir
  2. Prezado, muito bom o artigo. Teria como disponibilizar este codigo para o arduino. Preciso utilizar 3 interrupções apenas do Atmega 328p. Só para acordar e executar o programa e voltar a dormir.Obrigado

    ResponderExcluir
  3. Olá Ney, não utilizo o Arduino somente o "AVR STUDIO" ele é gratuito vc pode baixar e compilar o código e então fazer as alterações que precisar, não uso o Arduino pois com ele vc grava apenas um tipo especifico de microcontrolador e o código não pode ser protegido contra leitura do chip.

    ResponderExcluir

olá,digite aqui seu comentário!