회사에서 Arduino를 이용해서 작업을 하다가.

 타이머를 사용하게 되었다.

 

 문제는 이 타이머를 사용하니.

 millis()와  delay()가 제대로 동작안되는 문제점이 생겼었다.

 

 한동안 이유를 못 찾은 상태로 지내다가 modbus_lib을 사용해야되는데.

 modbus_lib에선 millios()을 이용해서 통신되게 되어 있는데.

 

 millis()가 0이 계속 뜨니. 통신이 제대로 동작이 되지 않는다는 점이다.

 

 즉, 윗 문제를 해결해야만했다.

 

 그래서 찾아보니. millis()와 delay()sms Timer0에 영향을 받는다. 라고 설명이 되어 있다.

 이걸 보고, 타이머 2,3을 사용하는 곳에서 실수 한게 있는지 확인 하기 위해서 적용해봤다.

 

 

void setup()
{
TCCR2 = (1<<CS20) | (1<<CS21); // 간격 설정. CS 64 분배율.
TIMSK = (1<<TOIE2); // 오버 플로우 인터럽트 사용.
TCNT2 = 5; // 타이머 딜레이 250으로 동작하도록 설정.
TCCR3A = 0x00; // CTC를 적용하는 세팅.
TCCR3B = (1<<WGM32); // CTC를 적용하기 위한 세팅.
TCNT3 = 0; // 값 표시.
}
void loop()
{
Serial.println(millis(), DEC);
}


 여기서 TIMSK(Timer/Counter Interrupt Mask Register)를 이용해서 Timer2에서 OVF(Over Flow)가 발생할시 처리하게 만드는 것이 설정되었는데.

 

 TIMSK에서 Timer0를 설정한게 아닌. TIMSK를 설정이 잘못됨을 알았다.

 

 즉, Timer0의 설정이 기본적으로 설정되어 있었는데.

 이것을 TIMSK = (1<<TOIE2);를 사용해서 Timer0 세팅이 사라진 것이다.

 

 

void setup()
{
TCCR2 = (1<<CS20) | (1<<CS21); // 간격 설정. CS 64 분배율.
TIMSK = TIMSK | (1<<TOIE2); // 오버 플로우 인터럽트 사용.
TCNT2 = 5; // 타이머 딜레이 250으로 동작하도록 설정.
TCCR3A = 0x00; // CTC를 적용하는 세팅.
TCCR3B = (1<<WGM32); // CTC를 적용하기 위한 세팅.
TCNT3 = 0; // 값 표시.
}
void loop()
{
Serial.println(millis(), DEC);
}

 이렇게 수정하니. Timer0가 제대로 동작되어서 그래서, millis()에서 값이 이상없이 동작됨을 알 수 있었다.

 

 간단한 문제였지만, 제대로 확인 하지 않으면, 못 찾을 만한 것이다.

Posted by JunkMam
,