Did you know that you can navigate the posts by swiping left and right?

reset 도입

28 Feb 2018 . category: tech . Comments
#mechatronics #atmega128 #code

reset을 위해 워치독 타이머를 사용했는데 워치독 타이머는 CPU가 정상적으로 동작하는지의 여부를 점검하며, 이상동작을 검출한 경우 이상의 발생을 CPU에 알려주고 직접 CPU를 리셋시킨다.

워치독 타이머는 워치독 타이머 제어 레지스터 WDTCR에 의해 제어됩니다. 각 비트중

 Bit 4  WDCE(Watchdog Change Enable) : 워치독 변경 인에이블 비트로  비트는 WDE 비트를 클리어    되어져야 한다. 한번  되면 하드웨어적으로 4클럭사이클 후에 자동 클리어 된다.

 Bit 3  WDE(Watchdog Enable) : 워치독 인에이블 비트로 WDE  되면 워치독 타이머의 기능이 인에이블되며, WDE 클리어되면 워치독 타이머 기능은 금지된다.

keypad 코드에 넣어준 코드를 보면 마지막 모터로 다시 잠그고 리셋을 시켜주고 check4함수에서 정해준 비밀번호 배열값이 같지 않을 경우 리셋이되도록 코드를 넣어주었다. 리셋함수와 check4함수만 가져와보면

void reset(void)
{
    tim0_cnt= 0;
    mot_pos = 0;
    change = 0;  
    TIMSK = 0x40;
    TCCR2 = 0x02;
    TCNT2 = 238;
    SREG = 0x80;
    
    tim0_cnt = 0;
    PORTC = 0xFF;
    
    while(1)
    {
        if(tim0_cnt >= 2000)
        {
            tim0_cnt = 0;
            PORTC = 0xFF;
            change++;
            if(change == 100)
            {
                change = 0;
                Motor_off;
                WDTCR = 0x18;  // WDTCE = 1, WDE = 1
                WDTCR = 0x0E;  // WDE = 1, 프리스케일 = 1024 : 1.0s
                #asm ("wdr")   //워치독 타이머 리셋(wdr 명령 사용)
            }
        }
        if(tim0_cnt >= rc_time[1])
        {
            PORTC = 0x0;  
        }
    }
}
void check4(void)
{
    if(str2[3] == str1[3])
    {
        lcd_clear();
        lcd_gotoxy(0,y);
        lcd_putsf("correct"); 
        motor_on();
        delay_ms(100);
    }
    else if(str2[3] == str3[0])
    {
        lcd_clear();
        x = 0;
        z = 0; 
        WDTCR = 0x18; // WDTCE = 1, WDE =1
        WDTCR = 0x0E; // WDE = 1,  프리스케일 = 1024 : 1.0s
        #asm ("wdr")  // 워치독 타이머 리셋(wdr 명령 사용)
    }   
}

이런식으로 코드를 넣어주었고 마지막 reset 함수에서는 리셋이 작 작동이 되는데 비밀번호 4자리가 틀렸을 경우(check4 함수)에는 아직 제대로 리셋이 되지 않아 다시 수정하거나 프리스케일을 좀 더 적게 해서 넣어보고 점검해야할 것 같다.

코드는 알기쉽게 배우는 avr atmega128에서 가져와 적었습니다.


Me

github를 이용해 만들어본 블로그입니다.