질문게시판 > 오버플로 모드와 CTC 모드에 대한 질문

TODAY2,039 TOTAL943,765
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 질문게시판 | 오버플로 모드와 CTC 모드에 대한 질문

페이지 정보

작성자 barthory 작성일2020-01-15 15:20 조회88회 댓글7건

첨부파일

본문

	

제가 생각하는 CTC 모드 동작 코드는 아래와 같습니다. 

물론 어떤 이유인지 앞선 오버플로 인터럽터 문제 질문과 같이 아두이노 우노 보드에서 정상 동작은 하지 않습니다. 

 

#include <avr/io.h>

#include <avr/interrupt.h>

 

volatile unsigned int tic_time;

 

ISR(TIMER0_COMPA_vect)

{

    tic_time++;

}

 

void Delay_ms (unsigned int msec)

{

    tic_time = 0;

    while (msec > tic_time);

}

 

int main(void)

{

    DDRB = 0xFF;

 

    TCCR0A |= (1 << WGM01);

    TCCR0B |= (1 << CS01) | (1 << CS00);

    TIMSK0 |= (1 << OCIE0A);

    OCR0A = 249;

 

    sei();

 

    for (;;)

    {

        PORTB = 0x01;

        Delay_ms (500);

        PORTB = 0x00;

        Delay_ms (500);

    }

 

    return 1;

}

 

도서에 소개된 아래의 코드를 보면,  CTC 모드를 설정하지 않고 OCR 레지스터에 비교 값만 가지고 

처리하고 있는데 이렇게 처리하는 것이 CTC 모드 설정과 어떻게 다른지 기존 방식만 생각하던터에

혼란 스럽습니다. OCR 레지스터만 활용하는 이런 코딩 방식도 타당한지 궁금합니다. 코드 작성자의

설명을 보면 TCNT가 0으로 초기화 되지 않으니 ISR에서 초기화를 한다고 하는 것을 보면 오버플로

모드를 응용해서 OCR 레지스터만 활용하는 것인데 CTC 모드라고 할 수 없을 것 같은데...

일단 오류없이 정상 동작하니 위에 코드보다 정확하게 동작해서 멘붕 상태입니다. ^^;;

 

#include <avr/io.h>

#include <avr/interrupt.h>

 

volatile int count = 0;

int state = 0;

 

ISR (TIMER0_COMPA_vect)

{

  count++;

  TCNT0 = 0;

}

 

int main(void)

{

  DDRB = 0x01;

  PORTB = 0x00;

 

  TCCR0B |= (1 << CS02) | (1 << CS00);        // 분주비 1024 설정

  OCR0A = 128;

  TIMSK0 |= (1 << OCIE0A);     // 1/16000000*1024 = 0.000064 = 0.064 ms

  sei();

 

  while (1)

  {

    if (count == 64)                    

    {

      count = 0;

      state = !state;

      if (state)   PORTB = 0x01;

      else          PORTB = 0x00;

    }

  }

}

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글 7

조회수 88

master님의 댓글

master 작성일

오버플로우 인터럽트가 정확하지 않다는 얘기는 인터럽트 함수안에서 TCNT 값을 릴로드 하기 때문입니다.
비교매치 인터럽트에서는 릴로드 과정이 필요 없이 하드웨어적으로 세팅되죠

일반모드에서 OCR 레지스터 값을 설정하고 비교매치 인터럽트를 만든 후에 값을 릴로드 하는 것은 오버플로우 인터럽트와 다를 바 없이 오차를 포함하는 방식입니다.

barthory님의 댓글

barthory 작성일

답글 감사합니다.
멍청해서 그런지...궁금증이 해소되지 않았는데요. 몇가지 꼭지의 질문을 딱 한가지로 줄여서 질문드리면 아래의 코드에서 제가 범하고 있는 오류는 무엇일런지요?

#include <avr/io.h>
#include <avr/interrupt.h>

volatile int tic_time;

ISR(TIMER0_OVF_vect)
{
  tic_time++;
  TCNT0 = 6;
}

void Delay_ms (unsigned int msec)
{
  tic_time = 0;
  while (msec > tic_time);
}

int main(void)
{
  DDRB = 0xFF;

  TCCR0B |= (1 << CS01) | (1 << CS00);
  TIMSK0 |= (1 << TOIE0);
  TCNT0 = 6;

  sei();

  for (;;)
  {
    PORTB = 0x03;
    Delay_ms (500);
    PORTB = 0x00;
    Delay_ms (500);
  }

  return 1;
}

master님의 댓글

master 댓글의 댓글 작성일

현재 증상이 무엇인가요?

master님의 댓글

master 작성일

만약 보드가 아닌 시뮬레이션으로 구동 중이라면
시뮬레이션은 아주 느려서 딜레이를 사용하면 날샙니다.
일반적으로 시뮬레이션 할 때는 딜레이를 주석처리해서 딜레이 실행을 하지 않습니다.

barthory님의 댓글

barthory 작성일

해당 코드를 아두이노 우노 보드에 업로드 하면, 처음에 500 ms로 깜박였다가 그 다음 턴에서 500 ms가 아닌 시간으로 깜박입니다. 이것을 무한 반복합니다.

하지만, 앞서 ISR 내에서 오버플로를 카운팅 하는 방식의 코드는 500 ms 정확하게 동작을 하는 것인데, 제가 기존에 알고 있던 문제가 없다고 생각한 코드에서
아두이노 우노 보드를 통해서 실행했을 때 이상 동작을 하고 오동작을 하니 제가 어떤 실수를 범하고 있는지 몰라서요.

master님의 댓글

master 댓글의 댓글 작성일

코드는 정상입니다.
최적화 옵션 말고는 그런 흉악한 짓을 할만한 넘이 없습니다.

barthory님의 댓글

barthory 작성일

코드가 정상이라면 다행입니다. 
제가 알던 범위내에서 이해할 수 없는 또 다른 것이 있는지에 대한 고민이었기 때문에...

바쁘실텐데 시간내주셔서 감사합니다.

질문게시판HOME > 질문게시판 목록

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은 질문게시판에서만 작성 가능합니다. 스태프 19-01-15 1272
공지 사이트 이용 안내댓글[10] master 17-10-29 9758
공지 [무료 공개] 소스코드 하이라이트 v2.0 beta [2013.02.07]댓글[1] 이미지첨부파일 master 18-01-23 3738
질문 적외선 DC모터 제어 새글 아두이노배우기 14:19 8
답변 답변글 답변 : 적외선 DC모터 제어 새글 master 16:34 5
질문 아두이노 IDE (ino파일) 로 업로드 하면 작동되는데 Atmel studio7 (hex 파일) 로 업로드…댓글[1] 새글첨부파일 이츠라 14:12 8
질문 atmega128 while 속 if문 실행 문제 새글 이동욱 20-02-24 12
답변 답변글 답변 : atmega128 while 속 if문 실행 문제 새글 master 20-02-24 12
질문 Limit Sensor 를 이용한 LED의 자동 작동에 대한 코딩 질문입니다. 새글첨부파일 아두이프로 20-02-24 12
답변 답변글 답변 : Limit Sensor 를 이용한 LED의 자동 작동에 대한 코딩 질문입니다.댓글[1] 새글 master 20-02-24 15
질문 HC-11을 이용하여 1:N 통신중입니다.댓글[4] 새글 아두이노배우기 20-02-23 17
질문 스텝모터 정지댓글[2] 아두이노배우기 20-02-23 21
답변 답변글 답변 : 스텝모터 정지댓글[2] master 20-02-23 15
질문 정말 감사합니다. 박취 20-02-19 17
질문 ov9655카메라와 stm32f4 보드를 이용한 영상처리장치 구현 관련하여 문의남깁니다.댓글[7] flap 20-02-19 41
질문 GLCD 텍스트 출력댓글[2] 전자학습자 20-02-17 38
질문 아두이노 HC-11 통신관련입니다. 아두이노배우기 20-02-15 34
답변 답변글 답변 : 아두이노 HC-11 통신관련입니다. master 20-02-16 31
답변 답변글 답변 : 답변 : 아두이노 HC-11 통신관련입니다. 아두이노배우기 20-02-16 20
질문 led 불켜기 마스터 슬레이브댓글[1] 공용 20-02-12 50
답변 답변글 답변 : led 불켜기 마스터 슬레이브 master 20-02-12 36
질문 아두이노 코딩 관련 질문입니다. bbeuniii 20-02-12 29
답변 답변글 답변 : 아두이노 코딩 관련 질문입니다. master 20-02-12 35
질문 uart 관련 질문 (wiegand통신)댓글[9] 첨부파일 jhyun8624 20-02-11 68
질문 회로, 코딩 문제 이미지첨부파일 공기구함 20-02-10 43
답변 답변글 답변 : 회로, 코딩 문제댓글[2] master 20-02-10 47
질문 회로, 코딩문제댓글[2] 이미지첨부파일 공기구함 20-02-10 39
질문 코딩어레이 질문 이미지 master 20-02-07 40
질문 컴파일 오류가나는데, 이유를 모르겠습니다.댓글[5] 창고지기 20-02-06 71
질문 IR센서 2개로 LED, DC모터 제어 (입문자입니다 ㅠㅠ) 창고지기 20-02-05 47
게시물 검색

2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2019
모바일버전으로보기