BASIC4MCU | 질문게시판 | Atmega128, 블루투스 문제
페이지 정보
작성자 donggle 작성일2022-12-02 13:00 조회3,085회 댓글0건본문
휴대폰에서 bluetooth terminal HC-05앱을 통해 1~8 값을 입력하면
연결된 버저에서 각 숫자에 해당하는 "도" "레" "미" "파" "솔" "라" "시" "도" 를 출력 하려고합니다
1초간격을 두어 음계를 전송하면 문제가 없으나
buzzer()함수를 실행하는 동안에 외부에서 연속해서 데이터가 입력되면 그 데이터는 실행되지 않고 없어집니다
예를 들어 buzzer(hertz[0], loop[0]); 를 실행하면 1초 동안 '도' 음을 생성하게 되는데, 그동안 데이터 '레', '미', '파'가 연속해서 들어오면 '레'와 '미'는 overwrite 되어 없어지는 현상이 나타납니다.
이현상을 어떻게 해결해야 할지 여쭤봅니다.
#include <avr/io.h> #define F_CPU 16000000UL #define __DELAY_BACKWARD_COMPATIBLE__ // Atmel Studio 7을 사용하는 경우에 필요 #include <util/delay.h> void putchar1(char c) // 1 문자를 송신(Transmit)하는 함수 { while(!(UCSR1A & (1<<UDRE1))) // UDRE1 : UCSR1A 5번 비트, ; // 즉,1을 5번 왼쪽으로 shift한 값이므로 0x20과 & UDR1 = c; // 1 문자 전송, 송신 데이터를 UDR1에 넣음 } char getchar1() // 1 문자를 수신(receive)하는 함수 { while (!(UCSR1A &(1<<RXC0))) ; return(UDR1); // 1 문자 수신, UDR1에서 수신 데이터를 가져옴 } void buzzer(int hz, int count) // hz의 주파수를 갖는 펄스를 count 개수만큼 생성 { int i, ms, us ; ms = 1000/(2*hz); // 1개 펄스의 ON 또는 OFF의 ms 단위 us = (1000.0/(2*hz) - 1000/(2*hz)) * 1000; // 1개 펄스의 ON 또는 OFF의 us 단위 for(i=0; i<count; i++) { PORTE |= 1 << 4; // buzzer ON _delay_ms(ms); // (ms)ms동안 delay _delay_us(us); // (us)us 동안 delay PORTE &= ~(1 << 4); // buzzer OFF _delay_ms(ms); // (ms)ms 동안 delay _delay_us(us); // (us)us 동안 delay } } void init_uart1() // UART1 초기화 함수 { UCSR1B = 0x18; // 송신 Transmit(TX), Receive(RX) Enable UCSR1C = 0x06; // UART Mode, 8Bit Data, No Parity, 1 Stop Bit UBRR1H = 0; // Baudrate 세팅 UBRR1L = 103; // 16Mhz, 115200 baud (주의 :초기 셋팅 값 확인) } int main() { char c; DDRE = 0x10; // 경고음(버저) 포트 = PE4 init_uart1(); // UART1 초기화 int hertz[] = {1047, 1175, 1319, 1397, 1568, 1760, 1976, 2093}; // 도~도 주파수, 반올림하여 정수 표시 int loop[] = {1047, 1175, 1319, 1397, 1568, 1760, 1976, 2093}; // 1초간 실행 횟수 while(1) // 명령을 받아서 실행 { c = getchar1(); // 입력된 문자를 스마트폰으로부터 받아서 putchar1(c); // echo back 후 switch(c) // 명령의 종류에 따라 아래를 실행 { case '1' : buzzer(hertz[0],loop[0]); break; case '2' : buzzer(hertz[1],loop[1]); break; case '3' : buzzer(hertz[2],loop[2]); break; case '4' : buzzer(hertz[3],loop[3]); break; case '5' : buzzer(hertz[4],loop[4]); break; case '6' : buzzer(hertz[5],loop[5]); break; case '7' : buzzer(hertz[6],loop[6]); break; case '8' : buzzer(hertz[7],loop[7]); break; default : break; } } }
댓글 0
조회수 3,085등록된 댓글이 없습니다.