아트메가/ATMEGA32U4 Breakout

ATMEGA32U4 breakout-보드 사용하기 7편(External Interrupt)

원원 2024. 4. 28. 00:33

안녕하세요. 오늘은 기존의 프로젝트에서 External Interrupt를 사용해보겠습니다.

ATMEGA32u4에는 5개의 외부인터럽트가 있습니다.
기존의 프로젝트에서는 PD0~PD3을 이미 다른기능으로 사용중이고 PE6은 사용하지않고있으므로 PE6을 외부인터럽트로 사용하겠습니다.


초기세팅을 Falling edge로 했고 Port의 상태는 HIGH로 해놨습니다.
EICRB 레지스터로 외부인터럽트 발생조건을 바꿀때 EIMSK를 disable해놔야 예상치못한 인터럽트가 안뜬다고해서 EICRB레지스터를 설정할때는 EIMSK를 disable 상태로 했습니다. 

또한 cli로 인터럽트발생조건(low/both/falling/rising)을 바꿀수있게해서 디버깅할때 조건을 바꿀수있게 했습니다.

#include "int.h"
#include "cli.h"

void intInit()
{
    DDRE &= ~0x40; // PE6
    PORTE |= 0x40;
    EIMSK &= ~(1<<INT6);
    EICRB = (1<<ISC61) | (0<<ISC60); // Falling edge
    /*
        ISC61 ISC60 Description
        0     0     low level
        0     1     both edge
        1     0     falling edge
        1     1     rising edge
    */
    EIMSK |= (1<<INT6);
}

ISR(INT6_vect)
{
    cliPrintf("\nINT6 Interrupt \n");
}

void cliint(cli_args_t *args)
{
    bool ret = false;
    int    argc = args->argc;
    char **argv = args->argv;
    char *pre_char = NULL;
    if(argc != 0)
    {
        pre_char = (char *)argv[0];
    }
    
    if(argc == 1 )
    {
        if(strcasecmp(pre_char, "rising") == 0)
        {
            PORTE &= ~0x40;
            EIMSK &= ~(1<<INT6);
            EICRB = (1<<ISC61) | (1<<ISC60);
            EIMSK |= (1<<INT6);
        }
        else if(strcasecmp(pre_char,"falling") == 0)
        {
            PORTE |= 0x40;
            EIMSK &= ~(1<<INT6);
            EICRB = (1<<ISC61) | (0<<ISC60);
            EIMSK |= (1<<INT6);
        }
        else if(strcasecmp(pre_char,"both") == 0)
        {
            PORTE |= 0x40;
            EIMSK &= ~(1<<INT6);
            EICRB = (0<<ISC61) | (1<<ISC60);
            EIMSK |= (1<<INT6);
        }
        else if(strcasecmp(pre_char,"low") == 0)
        {
            PORTE |= 0x40;
            EIMSK &= ~(1<<INT6);
            EICRB = (0<<ISC61) | (0<<ISC60);
            EIMSK |= (1<<INT6);
        }
        ret = true;
    }



    if(ret == false)
    {
        cliPrintf("------------------- \n");
        cliPrintf("only change INT6(PE6).. default is falling edge \n" );
        cliPrintf("int low \n" );
        cliPrintf("int both \n" );
        cliPrintf("int rising \n" );
        cliPrintf("int falling \n" );
        cliPrintf("------------------- \n");
    }
}

 

소스코드(Commits: ADD int)
https://github.com/yhunterr/ATMEGA32u4/commits/main/