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

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

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


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

페이지 정보

작성자 barthory 작성일2020-01-15 15:20 조회22,330회 댓글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

조회수 22,330

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 9689
공지 사이트 이용 안내댓글[24] master 17-10-29 29811
질문 적외선 거리 센서로 블루투스 알람 설정 코딩... 새글 ededed 22:56 7
질문 아두이노 api 질문댓글[1] 새글첨부파일 리니어 19:19 16
질문 atmega128 키패드 입력 오류에 대하여 질문 있습니다.댓글[2] 새글 마프하나 16:07 38
질문 초음파센싱을 통한 리니어벨트 (스텝모터사용) 조건문댓글[1] 새글 아두이노대학 15:01 17
질문 아트메가128/ srf05 초음파센서를 이용한 타이머 인터럽트 질문입니다 새글 아트메가넘어려워 14:10 20
답변 답변글 답변 : 아트메가128/ srf05 초음파센서를 이용한 타이머 인터럽트 질문입니다 새글 master 14:56 16
질문 atmega128에서 스위치1개는LED, 스위치 1개는 세그먼트의 동작하게 하려는데.. 새글 aasdw 06:28 34
답변 답변글 답변 : atmega128에서 스위치1개는LED, 스위치 1개는 세그먼트의 동작하게 하려는데..댓글[1] 새글 master 14:09 24
질문 Atmega128 블루투스 오류 질문 새글 yhj2644 01:35 25
답변 답변글 답변 : Atmega128 블루투스 오류 질문 새글 master 13:51 20
질문 아두이노 간단한 프로그램 새글 행복지수업 22-05-25 26
답변 답변글 답변 : 아두이노 간단한 프로그램 새글 master 12:06 15
질문 atmega128 타이머 작성시 키패트 입력으로 인터럽트 사용에 대하여 질문이 있습니다.댓글[1] 이미지새글 마프하나 22-05-25 37
질문 로드셀 무게 센서 질문드립니다.댓글[2] 새글 제비고기 22-05-25 37
질문 adc, uart dma댓글[3] 새글첨부파일 hiㅡO3O 22-05-25 27
질문 ADC,uart DMA댓글[1] 이미지새글첨부파일 hiㅡO3O 22-05-25 26
질문 아두이노 스텝모터 리미트 문의드립니다.댓글[4] 이미지첨부파일 스트렌져 22-05-24 41
질문 진동센서와 서보모터 연결 코드 질문입니다!댓글[1] 제리 22-05-24 29
질문 atmega128 GPS,블루투스 질문드립니다.댓글[1] 코딩초보1 22-05-24 37
질문 서보모터 제어에 관하여 궁금합니다댓글[3] 이미지첨부파일 오소로롯 22-05-24 58
질문 atmega 128 타이머 작성 중 질문 드립니다.댓글[8] 이미지 마프하나 22-05-23 79
질문 아두이노와 휴대폰을 HC-06으로 연결시켜서 블루투스연결이 끊기면 부저에서 소리가 나게 할려하는데 어떻게 해…댓글[1] 졸작부수다 22-05-23 240
답변 답변글 답변 : 아두이노와 휴대폰을 HC-06으로 연결시켜서 블루투스연결이 끊기면 부저에서 소리가 나게 할려하는데 … master 22-05-24 32
질문 보드레이트 질문댓글[1] 죠르디 22-05-23 34
질문 atmega 128 블루투스 질문 입니다댓글[1] yhj2644 22-05-23 56
질문 아트메가 공부중에 질문있습니다..댓글[1] suid82 22-05-23 43
질문 Atmega128 UART통신 echo 반복 질문댓글[2] ming2ming 22-05-23 66
질문 아두이노의 지속 시간에 대해 질문합니다. merry 22-05-23 56
게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
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 ⓒ 2020
모바일버전으로보기