BASIC4MCU | 질문게시판 | Atmega128 블루투스 오류 질문
페이지 정보
작성자 yhj2644 작성일2022-05-26 01:35 조회568회 댓글0건본문
기존에 아트메가를 통해 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;
unsigned int now_pind0 = 1;
unsigned int old_pind1 = 0;
unsigned int now_pind1 = 1;
unsigned int old_pind2 = 0;
unsigned int 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 init()
{
DDRA=0xff; // 출력핀 설정
UCSR0A=0x00;
UCSR0B=0x98;
UCSR0C=0x06;
UBRR0H=0;
UBRR0L=103; // 8MHz : 51
}
void KEY_SCAN(void)
{
now_pind0 = !(~PIND & 0x01); //PD0: 스위치 누르면 now_pin=1
now_pind1 = !(~PIND & 0x02); //PD0: 스위치 누르면 now_pin=0
now_pind2 = !(~PIND & 0x04); //PD2
init();
if(old_pind0 ==1 && now_pind0 ==0)
{
Freq -= 1e3; //1k씩 주파수 감소
top = 16e6/(2*1*Freq);
TCCR3A = 0x2D;
TCCR3B = 0x11;
OCR3A = top;
OCR3B = (top/2);
OCR3C = (top/2);
}
else if(old_pind1 ==1 && 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 == 1 && now_pind2 ==0)
{
if(LED_Flag == 0) //PWM On
{
PORTB = 0x01;
Freq = 210000;
top=16e6/(2*1*Freq);
TCCR3A = 0x2D;
TCCR3B = 0x11;
LED_Flag = 1;
}
else //PWM off (LED_Flag = 1)
{
PORTB = 0x00;
top=0;
TCCR3A = 0x00;
TCCR3B = 0x00;
LED_Flag = 0;
}
OCR3A = top;
OCR3B = (top/2);
OCR3C = (top/2);
}
old_pind0 = !(~PIND & 0x01);
old_pind1 = !(~PIND & 0x02);
old_pind2 = !(~PIND & 0x04);
if (flag == 'G')
{
if(LED_Flag ==0)
{
PORTB = 0x01;
Freq = 210000;
top=16e6/(2*1*Freq);
TCCR3A = 0x2D;
TCCR3B = 0x11;
LED_Flag = 1;
OCR3A = top;
OCR3B = (top/2);
OCR3C = (top/2);
}
}
else if (flag == 'Q')
{
if(LED_Flag ==1)
{
PORTB = 0x00;
top=0;
TCCR3A = 0x00;
TCCR3B = 0x00;
LED_Flag = 0;
OCR3A = top;
OCR3B = (top/2);
OCR3C = (top/2);
}
}
}
SIGNAL(SIG_OVERFLOW2)
{
TCNT2 = AUTO_REROAD2; //1m마다 오버플로우 발생
if(KEY_CNT++==50) // 50m 때마다 실행.
{
KEY_CNT=0; // 키 스캔 카운터 초기화
KEY_SCAN(); // 키 스캔 함수 실행
}
}
int main(void)
{
DDRD = 0x00; //스위치 이므로 입력으로 설정 D포트 입력설정
DDRB = 0xFF; // PWM핀으로 출력으로 설정
PORTB = 0x00; // 초기값 0
PORTD = 0x00;
DDRE = 0x30; //4,5포트 출력
TIMSK = 0x40;
TCCR2 = 0x03; //Normal 모드 , 분주비 : 1/1024 --->64분주비??
TCNT2 = AUTO_REROAD2;
sei();
while(1);
}
댓글 0
조회수 568등록된 댓글이 없습니다.