BASIC4MCU | 질문게시판 | 답변 : 아트메가128>이해를 할려려고 더 열심히 보니깐 헷갈립니다.!
페이지 정보
작성자 master 작성일2019-11-07 20:23 조회4,030회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=10587
본문
어떻게 보면 간단해 보이는것데..하나씩 하나씩 보면서 갈려고 하니깐 헷갈려요...ㅠㅠC언어 포인트를 더 공부를 해야 하나요 ㅠㅠ제가 이해한대로 작동순서를 적었습니다..잘못된 부분있으면 지적 부탁 드려요//#include <avr/io.h>#define F_CPU 16000000UL#define__DELAY_BACKWARD_COMPATIBLE__#define<util/delay.h>void buzzer(int hz,int count);//int main(){---①int i;DDRB=0x10;while(1){for(i=0; i<20; i++){buzzer(480,12);buzzer(320,18);}_delay_ms(2000);}}//void buzzer(int hz,int conut){ ---②int i,ms,us;ms=500/hz;us=500%hz;for(i=0; i<count; i++){PORTB=0x10; _delay_ms(ms); _delay_us(us);PORTB=0x00; _delay_ms(ms); _delay_us(us);}}//1.메인에있는 포트 B랑 while문이 먼저 작동한다.2.while문에 있는 for문을 돌린다.3.i=0일떄 void buzzer(int hz,int conut)--②main에 있는 buzzer(480,12)값을 아래 처럼 넣어서 계산한다.PORTB=0x10; _delay_ms(ms); _delay_us(us);PORTB=0x10; _delay_ms(ms=500/hz)=(ms=500/480); _delay_us(us=500%12);(ms=500/480)=1.0416666666 이 숫자를 주파수로 변환PORTB=0x00; _delay_ms(ms); _delay_us(us);PORTB=0x00; _delay_ms(ms=500/hz)=(ms=500/320); _delay_us(us=500%18);계산되어 나온 값을 buzzer로 발생 한다.
얼추 맞습니다.
ms=500/hz;us=500%hz;1000 이 아니고 500 으로 나눈 이유는for()문 안에 같은 코드가 2개 있기 때문입니다.
PORTB=0x10; _delay_ms(ms); _delay_us(us);PORTB=0x00; _delay_ms(ms); _delay_us(us);
void _delay_us(double __us){
util/delay.h 헤더파일 안의 us 함수 선언인데 인수가 double 형입니다.
유효자리는 작지만 상당히 큰 값을 처리할 수 있습니다.
1000Hz 의 주기는 1ms=1000us
100Hz 의 주기는 10ms=10000us
주파수를 us 단위로 값을 만든다면
1000000/Hz 이므로
//#include <avr/io.h>#define F_CPU 16000000UL#define __DELAY_BACKWARD_COMPATIBLE__#define<util/delay.h>//void buzzer(int hz,int conut){int i; double us;us=1000000/hz;for(i=0; i<count; i++){ PORTB^=0x10; _delay_us(us); }}//int main(){int i;DDRB=0x10;while(1){for(i=0;i<20;i++){buzzer(480,12);buzzer(320,18);}_delay_ms(2000);}}이 코드로 돌려보면서 같은 소리가 나는지 체크 해보세요
댓글 1
조회수 4,030세계제일초보님의 댓글
세계제일초보 작성일감사합니다 !!!! 좋은거 배워가네요 !! 선생님