BASIC4MCU | 질문게시판 | 답변 : Atmega128 블루투스 오류 질문
페이지 정보
작성자 master 작성일2022-05-26 13:51 조회676회 댓글2건본문
아트메가를 통해 PWM파형을 만들고
스위치 3개를 이용해 하나는 on/off ,
나머지 두 개는 주파수를 변경하는 코딩에
블루투스를 이용해 스위치 on/off를 제어하려고 하였는데
블루투스 기능이 가능해지자 스위치가 동작하지 않는데
//
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
//
volatile unsigned char flag;
unsigned char top;
unsigned int old_pind0=0,now_pind0=1;
unsigned int old_pind1=0,now_pind1=1;
unsigned int old_pind2=0,now_pind2=1;
unsigned int LED_Flag=0;
double Freq;
unsigned int KEY_CNT=0 ;
#define Array_EA sizeof(SineTable)/sizeof(SineTable[0])//배열개수 계산
#define SYS_CLK 16e6 // 클럭 주파수
#define FRESCALE 128 // 분주비
#define EIGHT_BIT 0x100 //(256)
#define TIME_GAP2 1e-3 // 1(ms)
#define AUTO_REROAD2 EIGHT_BIT-TIME_GAP2 * SYS_CLK/FRESCALE // 1m 마다 오버플로우 발생
//
ISR(USART0_RX_vect){
flag=UDR0;
}
//
void KEY_SCAN(void){
now_pind0=PIND&1; //PD0 스위치 누르면 now_pin=0
now_pind1=PIND&2; //PD0
now_pind2=PIND&4; //PD2
//
DDRA=0xff; // 출력핀 설정
UCSR0B=0x98; UBRR0L=103; // 8MHz : 51
//
if(old_pind0 && now_pind0==0){
Freq-=1e3; top=16e6/(2*1*Freq); //1k씩 주파수 감소
TCCR3A=0x2D; TCCR3B=0x11; OCR3A=top; OCR3B=(top/2); OCR3C=(top/2);
}
else if(old_pind1 && now_pind1==0){
Freq+=1e3;
top=16e6/(2*1*Freq); // 1k씩 주파수 증가
TCCR3A=0x2D; TCCR3B=0x11; OCR3A=top; OCR3B=(top/2); OCR3C=(top/2);
}
else if(old_pind2 && now_pind2==0){
if(LED_Flag==0){ LED_Flag=1; //PWM On
PORTB=0x01; Freq=210000; top=16e6/(2*1*Freq);
TCCR3A=0x2D; TCCR3B=0x11; OCR3A=top; OCR3B=(top/2); OCR3C=(top/2);
}
else{ LED_Flag=0; //PWM off(LED_Flag=1)
PORTB=0x00; top=0;
TCCR3A=0x00; TCCR3B=0x00; OCR3A=top; OCR3B=(top/2); OCR3C=(top/2);
}
}
//
old_pind0=now_pind0; old_pind1=now_pind1; old_pind2=now_pind2;
//
if(flag=='G'){ flag=0;
if(LED_Flag==0){ LED_Flag=1;
PORTB=0x01; Freq=210000; top=16e6/(2*1*Freq);
TCCR3A=0x2D; TCCR3B=0x11; OCR3A=top; OCR3B=(top/2); OCR3C=(top/2);
}
}
else if(flag=='Q'){ flag=0;
if(LED_Flag){ LED_Flag=0;
PORTB=0x00; top=0;
TCCR3A=0x00; TCCR3B=0x00; OCR3A=top; OCR3B=(top/2); OCR3C=(top/2);
}
}
}
//
SIGNAL(SIG_OVERFLOW2){
TCNT2=AUTO_REROAD2; // 1m마다 오버플로우 발생
if(KEY_CNT++==50){ KEY_CNT=0; KEY_SCAN(); } // 50m 때마다 실행.// 키 스캔 카운터 초기화
}
//
int main(void){
DDRA=0xff; // 출력핀 설정
UCSR0B=0x98; UBRR0L=103; // 8MHz : 51
//DDRD=0x00; //스위치 입력
DDRB=0xFF; // PWM핀으로 출력으로 설정
DDRE=0x30; //4,5포트 출력
TCCR2=0x03; TCNT2=AUTO_REROAD2; TIMSK=0x40;
sei();
while(1);
}
적색코드 flag=0;를 추가해서
UART 전송 시 1회만 실행 하도록 변경했습니다.
댓글 2
조회수 676yhj2644님의 댓글
yhj2644 작성일
정말 감사합니다. 말씀해주신 부분 추가하니 스위치와 블루투스 모두 정상적으로 작동합니다.
근데 아트메가와 연결된 HC-06(slave)과 아두이노 우노에 연결된 HC-05(master)를 이용해 아두이노에서 "G", "Q"를 출력하여 아트메가를 제어하려고 하였는데 입력이 제대로 전달되지 않습니다. (블루투스 모듈 두개는 AT+BIND명령어를 통해 연결하였고 불빛이 들어오는 것을 통해 서로 연결된 것을 확인하였습니다.)
혹시 아트메가로 보낼 때 다른 형식으로 보내야 하는 건가요??
--------------------------------------------------------------------------------------
<아두이노 코딩>
#include <SoftwareSerial.h>
int Tx=2;
int Rx=3;
SoftwareSerial mySerial(Tx, Rx);
String str="";
void setup() {
Serial. begin(9600);
mySerial.begin(38400);
}
void loop() {
Serial.println("Q");
mySerial.print("Q");
delay(3000);
}
master님의 댓글
master 작성일
void loop() {
Serial.println("Q"); mySerial.print("Q"); delay(3000);
}
Q만 보내서는 동작 확인이 안되겠죠
void loop() {
Serial.println("G"); mySerial.print("G"); delay(1000);
Serial.println("Q"); mySerial.print("Q"); delay(1000);
}