BASIC4MCU | 질문게시판 | 아두이노 atmega128 코딩 질문
페이지 정보
작성자 master 작성일2018-07-02 10:25 조회9,860회 댓글0건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=2231
본문
스위치로 부저를 작동시키려 하는데 코딩좀 봐주세요 안되가지고;#include
#include
#define F_CPU 16000000UL
#define __DELAY_BACKWARD_COMPATIBLE__
#include
volatile int hz,count;void buzzer(int hz, int count);ISR(INT4_vect)
{
_delay_ms(10);
EIFR |= 1<<4;
}int main()
{
int i;
DDRB = 0x10;
while(1)
{
for(i=0; i<20; i++)
{
buzzer(2093.2,1);
buzzer(2093.2,1);
buzzer(1568,1);
buzzer(1568,1);
buzzer(1760,1);
buzzer(1975.6,1);
buzzer(2093.2,1);
buzzer(1760,1);
buzzer(1568,1);}
_delay_ms(2000);
}
DDRE = 0xef;
EICRB = 0x02;
EIMSK = 0x10;
SREG |= 1<<7;
while(1)
buzzer(hz,count);
}
void buzzer(int hz,int count)
{
int i;
double ms;
ms = 500.0/hz;
for(i=0;i {
PORTB = 0x10; _delay_ms(ms);
PORTB = 0x00; _delay_ms(ms);
}
}//// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-05-31 오후 10:15:35// by Ok-Hyun Park//#include <avr/io.h>#include <avr/interrupt.h>#define F_CPU 16000000UL#define __DELAY_BACKWARD_COMPATIBLE__#include <util/delay.h>volatile int hz,count;//void buzzer(int hz,int count){int i;double ms;ms=1000.0/hz; // 주파수를 주기로 변경(ms단위)ms=ms/2; // HIGH, LOW 시간으로 나누기 위해서 1/2for(i=0;i<count;i++){PORTB=0x10; _delay_ms(ms); //HIGHPORTB=0x00; _delay_ms(ms); //LOW}}//ISR(INT4_vect){_delay_ms(10);EIFR|=1<<4;}//int main(){int i;DDRB=0x10; // 부저핀 출력으로 설정 pinMode와 같음while(1){for(i=0;i<20;i++){buzzer(2093.2,1); // 2093.2Hz, 1회buzzer(2093.2,1);buzzer(1568 ,1); // 1568 Hz, 1회buzzer(1568 ,1);buzzer(1760 ,1); // 1760 Hz, 1회buzzer(1975.6,1); // 1975.6Hz, 1회buzzer(2093.2,1); // 2093.2Hz, 1회buzzer(1760 ,1); // 1760 Hz, 1회buzzer(1568 ,1); // 1568 Hz, 1회}_delay_ms(2000);}//DDRE=0xef; // 없어도 되고, 없는 것이 고장발생이 적음EICRB=0x02; EIMSK=0x10; SREG|=1<<7; // 외부인터럽트4 설정while(1)buzzer(hz,count); // 계속 부저가 울리다가, 인터럽트 누르면 10ms 부저가 안울림}
1568Hz~2093Hz이므로 솔~도 까지의 톤 발생 예제입니다.
//
//ISR(INT4_vect){_delay_ms(10);EIFR|=1<<4;}외부 인터럽트의 딜레이는 10ms로는 표시가 잘 안되고 1000ms 정도 딜레이를 시켜야지 확실히 체크 되겠죠////DDRE=0xef; // 없어도 되고, 없는 것이 고장발생이 적음EICRB=0x02; EIMSK=0x10; SREG|=1<<7; // 외부인터럽트4 설정while(1)buzzer(hz,count); // 계속 부저가 울리다가, 인터럽트 누르면 10ms 부저가 안울림제일 아래의 3라인은 무한루프문 괄호밖의 내용이라서 실행되지 않습니다.따라서 외부 인터럽트 함수도 필요 없습니다.게다가 뭘하려고 작성한 것인지도 모르겠습니다.(중요하지 않음)//buzzer(2093.2,1); // 2093.2Hz, 1회buzzer(2093.2,1);buzzer(1568 ,1); // 1568 Hz, 1회buzzer(1568 ,1);buzzer(1760 ,1); // 1760 Hz, 1회buzzer(1975.6,1); // 1975.6Hz, 1회buzzer(2093.2,1); // 2093.2Hz, 1회buzzer(1760 ,1); // 1760 Hz, 1회buzzer(1568 ,1); // 1568 Hz, 1회주파수의 역수는 주기입니다.어떤음은 2번 출력하고 어떤음은 1번 출력하고 있습니다.예를들면 위에 2음은 2번씩 출력해서 4분음표이고, 아래는 1번씩 출력해서 8분음표다..라는 식인거죠그런데주파수가 높은음은 조금 빨리 끝나고, 주파수가 낮은 음은 조금 길어집니다.(주기가 차이나므로)정밀하지 않은 간단한 연습용 예제입니다.
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-05-31 오후 10:27:09// by Ok-Hyun Park//#include <avr/io.h>#define F_CPU 16000000UL#define __DELAY_BACKWARD_COMPATIBLE__#include <util/delay.h>//void buzzer(int hz,int count){int i;double ms;ms=1000.0/hz; // 주파수를 주기로 변경(ms단위)ms=ms/2; // HIGH, LOW 시간으로 나누기 위해서 1/2for(i=0;i<count;i++){PORTB=0x10; _delay_ms(ms); //HIGHPORTB=0x00; _delay_ms(ms); //LOW}}//int main(){int i;DDRB=0x10; // 부저핀 출력으로 설정 pinMode와 같음while(1){for(i=0;i<20;i++){buzzer(2093,2); // 2093.2Hz, 2회buzzer(1568,2); // 1568 Hz, 2회buzzer(1760,1); // 1760 Hz, 1회buzzer(1976,1); // 1975.6Hz, 1회buzzer(2093,1); // 2093.2Hz, 1회buzzer(1760,1); // 1760 Hz, 1회buzzer(1568,1); // 1568 Hz, 1회}_delay_ms(2000);}}
댓글 0
조회수 9,860등록된 댓글이 없습니다.