2015-02-15

BUZZER 를 이용해 소리내기

BUZZER 강좌와 관련한 질문 및 답변을 정리한 글입니다.

출처 : cafe.naver.com/laydigital/

안녕하세요 4-1 강좌를 수행후에 연습겸 코드를 수정해보다 이해되지 않는 부분이 있어 질문 드립니다.

연습한 코드는 아래와 같습니다.

#include <avr/io.h>
#define  F_CPU 16000000UL
#include <util/delay.h>

void init_buzzer();
void buzzer();
i
nt main(void)
{   
  init_buzzer();

   while(1)
    {
    buzzer(1000);              //1000Hz
   }
}
void init_buzzer()             //1Hz = (1pulse/1sec)  //pulse (e.g: square wave pulse(=/ constance pulse))
{  
                                     // 500Hz = 500pulse/1sec == 500pulse/ 1000ms = 1pulse / 2ms  t= 1ms
   DDRB = (1<<DDB4);     //1000Hz = 1000pulse /1sec == 1000pulse /1000ms = 1pulse /1ms t= 0.5ms
}

void buzzer(int hz )  
{
  
  float t=0;
  t = (1000/(2*hz));
  PORTB = (1<<PB4);
  _delay_ms(t);
  PORTB = ~(1<<PB4);
  _delay_ms(t);
             
 }

질문 사항은 메인함수의 buzzer(500);에서는 아무 문제없이 buzzer 소리를 들을수있었는데 buzzer(1000);에서는
아무소리도 나지 않습니다. 혹시나 해서 t 변수값에 계산된 값 0.5를 넣어 주면 buzzer 소리는 변화된 소리가 나옵니다.  수식값으로 넣었을때는 왜 아무 소리도 않나는지 이상해서 여쭈어 봅니다. 컴파일에서 아무 에러나 경고 메세지도 나오지 않았고 실행하는데 아무 문제도 없었습니다.
혹시 몰라서 예전에 알려주신데로 toolchain을 변경하여 winavr-로 컴파일 하였지만 실행증상이 동일하여
여쭈어봅니다.



수의 표현 형식이 잘못되어 대입 값이 0변환 되어 대입 된거 같은데 안에 표현된 정수형 상수를 2 를 2.0 이나 2.f 1000을 1000.0, 1000.f으로 표현후에 수식에 대입하니 대입값에 따라 표현값이 float 형으로 변환 되어 들어가는것 같습니당.

혼자 묻고 혼자 답했네요.... 제가 확인한 답이 확실한건가용?


1000 / ( 2 * 1000) 

위의 수식에서 모든 숫자가 int 타입입니다.

그럼 1000/2000 = 0 입니다.
(연산(expression)에서 모든 숫자가 int 이면 결과도 int 이므로)

만약

1000 / (2.0 * hz)
이 수식에는 2.0 이 float 타입으로 인식되고

1000 / 2000.0

분모가 float 타입이 되고 결과도 float 타입이 되어 0.5 가 결과가 됩니다.

No comments:

Post a Comment

Total Pageviews