BASIC4MCU | 질문게시판 | 수동부저와 uart통신 알수없는 오류때매 미치겟습니다
페이지 정보
작성자 안녕요들 작성일2019-12-27 19:53 조회4,183회 댓글0건본문
/*
센서는 ATmega에서 나오는 VCC와 GND핀과 연결해야함
센서 한개 고장...
*/
#define F_CPU 16000000UL
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
#define SIG0 PINA2
#define SIG1 PINA4
#define SIG2 PINA6
// 부저 SIG = PB4 //
#define DO 0
#define RE 1
#define MI 2
#define FA 3
#define SOL 4
#define RA 5
#define SI 6
#define DDO 7
#define EOS -1 // End Of Song 표시
#define ON 0
#define OFF 1
volatile unsigned char flag;
// for bluetooth
volatile int state, tone;
volatile int i=0;
char f_table[8] = {
17, 43, 66, 77, 97, 114, 117, 137
}
;
// 도레미파솔라시도 에 해당하는 TCNT0 값을 미리 계산해 놓은 값
int song[] = {
SOL, MI, MI, SOL, MI, DO, RE, MI, RE, DO, MI, SOL, DDO, SOL, DDO, SOL, DDO, SOL, MI, SOL, RE, FA, MI, RE, DO, EOS
}
;
// 산토끼
ISR(TIMER0_OVF_vect) // Timer/Counter0 오버플루우 인터럽트
{
TCNT0 = f_table[tone];
if (state == OFF) {
PORTB |= 1 << 4;
// 버저 포트 ON
state = ON;
} else {
PORTB &= ~(1 << 4);
// 버저 포트 OFF
state = OFF;
}
}
void san_to_ki() {
DDRB = 0x10;
// 버저 연결 포트(Port B의 4번 비트) 출력으로 설정
TCCR0 = 0x03;
// 프리스케일러 32분주
TIMSK = 0x01;
// 오버플로우 인터럽트 활성화, 즉, TOIE0 비트 세트
sei();
// 전역인터럽트 활성화
TCNT0 = f_table[song[i]];
// TCNT0 초기화
do {
tone = song[i++];
// 노래 음계
_delay_ms(300);
// 한 계명당 지속 시간
}
while(tone != EOS);
// 노래 마지막 음인지 검사
}
void uart_init() {
UCSR0A=0x00;
// ...
UCSR0B=0x18;
// RXEN, TXEN
UCSR0C=0x06;
// 8Bit
UBRR0H=0;
// 9600
UBRR0L=103;
// 9600
sei();
}
void uart_send(char data) {
while(!(UCSR0A & (1<<UDRE0)));
UDR0 = data;
}
char uart_receive(void) {
while(!(UCSR0A & 0x80));
//수신완료 flag 비트가 1되면 정지
return UDR0;
//UART0번 사용
}
int main(void) {
uart_init();
DDRA = 0<<SIG0 | 0<<SIG1 | 0<<SIG2; // 센서 IN
PORTA = 0<<SIG0 | 0<<SIG1 | 0<<SIG2; // 센서 IN
char sensor;
while (1)
{
sensor = (PINA & 0b01010100);
switch(sensor)
{
case 0b01010100:
_delay_ms(2000);
//san_to_ki();
uart_send('d');
break;
case 0b00010100:
_delay_ms(2000);
uart_send('c');
break;
case 0b00000100:
_delay_ms(2000);
uart_send('b');
break;
case 0b00000000:
_delay_ms(2000);
uart_send('a');
break;
default:
_delay_ms(2000);
uart_send('e');
}
}
}
센서를 감지해서 의도한대로 a b c d 를 hc-05 블루투스로 휴대폰울 받는거는 성공하였습니다.
그런데 부저로 계이름 출력해서 함수로 만들어서 넣고 실행하면 계이름 출력하고 멈추고 거기서 더 이상 진행이 되지않습니다.
case 0b00000100:
_delay_ms(2000);
여기에 san_to_ki(); 를 넣으면 b 를 안보냅니다 ㅠㅠuart_send('b');
break;san_to_ki 함수를 정의를 해놓고 사용은 안하면 정상 작동은 합니다.
도대체 뭐가 문제인지 모르겠습니다,,,
댓글 0
조회수 4,183등록된 댓글이 없습니다.