출처 : 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