lunes, 10 de marzo de 2014

INTERRUPCIONES DE PIN CON MICROCONTROLADOR ATMEGA164PA CODEVISION Y PROTEUS

WE UNIT TALENT THEY CREATE THE FUTURE
Un microcontrolador es una herramienta muy poderosa si se la sabe utilizar adecuadamente, un problema en los sistemas electrónicos es al realizar la programación, generalmente al programar todo en un solo bloque el tiempo de reacción es mayor y puede quedarse el sistema en ciclos donde no puede salir, para ellos las subrutinas nos ayudan a solucionar estos problemas, con esto el microcontrolador puede funcionar en diferentes formas haciéndolo más rápido en reacción. Las interrupciones nos ayudan a que haga un salto desde el programa principal a una subrutina programa, se ejecute y nuevamente retome el funcionamiento de programa principal, específicamente vamos a utilizar una interrupción para el apagado y encendido del sistema, ya que es muy necesario al optimizar  recursos.

Las interrupciones de pin en el microcontrolador ATMEGA164PA son tres y están en los pines: INT0 en el pin PD2, INT1 en el pin PD3 e INT2 en el pin PB2, además se las puede configurar para que entren en funcionamiento cuando el pin esté en estado bajo, para cualquier cambio de estado lógico, para flanco de subida y flanco de bajada; para ello se necesita configurar 4 registros EICRA, EIMSK, EIFR y PCICR para mayor información lo pueden revisar en el datasheet del microcontrolador.

Les dejo algunas configuraciones que pueden utilizar:
INT0 LOW LEVEL
EICRA=0x00;
EIMSK=0x01;
EIFR=0x01;
PCICR=0x00;

INT1 ANY CHANGE
EICRA=0x04;
EIMSK=0x02;
EIFR=0x02;
PCICR=0x00;


INT2 RISING EDGE
EICRA=0x30;
EIMSK=0x04;
EIFR=0x04;
PCICR=0x00;

INT0 , INT1 LOW LEVEL
EICRA=0x00;
EIMSK=0x03;
EIFR=0x03;
PCICR=0x00;


/*********************************************************************************************************/



#include <mega164.h>                                      //libreria del microcontrolador

#include <delay.h>                                             //libreria de retardos

int i=0;//  variable local
int j=0;
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
delay_ms(200);                                                 //delay anti robotes
 if(j<7){
 j++;  //j=j+1
 }  
 else
 j=0;
}

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
i=1-i;                                                                  // encedido de sistemas
}


void main(void)
{


// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

PORTA=0x00;
DDRA=0xFF;

PORTB=0x00;
DDRB=0x00;

//interrupciones int0 e int1 low level
EICRA=0x00;
EIMSK=0x03;
EIFR=0x03;
PCICR=0x00;
// Global enable interrupts
#asm("sei")

while (1)
      { 
      if(i==1){
       switch (j) {
    case 1: 
    PORTA=0B00000001;
    break; 
    case 2: 
    PORTA=0B00000011;
    break;
    case 3: 
    PORTA=0B00000111;
    break;    
    case 4: 
    PORTA=0B00001111;
    break;
    case 5: 
    PORTA=0B00011111;
    break;
    case 6: 
    PORTA=0B00111111;
    break; 
    case 7: 
    PORTA=0B01111111;
    break;
    }; 

      }
      else
      PORTA=0X00;
      }
}
/*********************************************************************************************************/
Este programa es un contador con interrupciones, donde con la interrupción se habilita el uso del puerto A y con la otra se hace un conteo, cabe recalcar que en contadores el uso de interrupciones es de mucha ayuda ya que nos permite realizar un conteo más exacto, el delay anti rebotes está muy alto ya que  por software aumenta significativamente.


No olvides visitar nuestro canal en YouTube para que completes tu aprendizaje con los videos tutoriales, aquí les dejo el enlace:

Configuración de interrupciones ATMEGA164PA
Interrupciones por puerto ATMEGA164PA










No hay comentarios:

Publicar un comentario