BASIC4MCU | 질문게시판 | 안녕하세요 코딩을 하였는데 블루투스 기능을 추가하고싶은데 답변 해 주실분 부탁드립니다
페이지 정보
작성자 도리비 작성일2018-12-09 13:18 조회3,834회 댓글0건본문
기본지식이 많이 부족합니다 ㅠㅠ
아래에 키측정 장치 코딩에 블루투스로 스위치 버튼 누르는 것만 작동시키고 싶습니다 블루투스 모듈은 현재 장착중 입니다
어떻게 하면 좋을지 알려주시면 감사하겠습니다 부탁드립니다사용중 모듈은 JMOD-128-01 입니다 블루투스 모듈은 JMOD-BT-1 입니다
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#include <avr/interrupt.h>
#define SOUND_VELOCITY 340UL // 소리속도(m/sec)
#define TRIG 6 // 거리센서 Trigger 신호(출력)
#define ECHO 7 // 거리센서 Echo 신호 (입력)
#define INT4 4 // switch interrupt (bit4, 입력)
#define STATE_0 0
#define STATE_1 1
#define STATE_2 2
#define STATE_3 3
#define GO 1
#define STOP 0
#define NULL 0x00
int distance_1st, distance_2nd, height; //1,2차 거리 측정값과 키 계산값
unsigned char state = STATE_0;
unsigned char Go_Stop = STOP;
// CLCD Command & Data
#define BIT4_LINE2_DOT58 0x28 // 4 Bit Mode, 2 Lines, 5x8 Dot
#define DISPON_CUROFF_BLKOFF 0x0C // Display On,Cursor Off, Blink Off
#define DISPOFF_CUROFF_BLKOFF 0x08 // Display Off,Cursor Off, Blink Off
#define INC_NOSHIFT 0x06 // Entry Mode, Cursor Increment,
// Display No Shift
#define DISPCLEAR 0x01 // Display Clear, Address 0
// Position, Cursor 0
#define CUR1LINE 0x80 // Cursor Position Line 1 First
#define CUR2LINE 0xC0 // Cursor Position Line 2 First
#define CURHOME 0x02 // Cursor Home
#define E_BIT 0x04 // Enable Bit #
#define RW_BIT 0x03 // Read Write Bit #
#define RS_BIT 0x02 // Register Select Bit #
void CLCD_cmd(char); // 명령어 전송함수
void CLCD_data(char); // 데이터 Write 함수
void CLCD_puts(char *); // 문자열 처리 함수
void display_fnd(unsigned int value); // FND Display 함수
void init_interrupt(); // Interrupt 처리함수
char If_Ready[] = "If Ready"; // 측정시작 프롬프트(1열)
char Press_Switch[] = "Press Switch!"; // 측정시작 프롬프트(2열)
char First[] = "First : "; // 첫번째 측정(머리에서 천장까지)
char Second[] = "Second : "; // 두번째 측정(바닥에서 천장까지)
char Height[] = "Height : "; // 높이계산 및 Display
char CLCD_NUM[] = "000.0"; // 초기값 = 000.0
char Error[] = "Error !"; // 키가 음수인 경우 에러 디스플레이
void putchar1(char c)
{
char c;
int main(void)
{
DDRA = ((DDRA | (1<<TRIG)) & ~(1<<ECHO));
// 초음파거리센서 TRIG(bit6, 출력 ), ECHO(bit7, 입력)
DDRC = 0xff; // CLCD PORT(data & command)
DDRD = 0xff; // CLCD PORT(control 출력 : RS=bit2, RW=bit3 , E=bit4)
DDRE = 0x00; // SW1이 연결된 포트 E는 입력으로 선언
init_interrupt(); // 인터럽트 초기화
init_CLCD(); // CLCD초기화
while(1)
; // 초기화 후에는 모든 일을 인터럽트에서 처리
}
void init_interrupt() // Interrupt 초기화
{
EICRB = 0x02; // INT4 트리거 모드는 하강 에지(Fallin Edge)
EIMSK = 0x10; // INT4 인터럽트 활성화
SREG |= 0x80; // SREG의 (interupt Enable) 비트(bit) '1' 로셋
}
void init_CLCD() //LCD 초기화
{
_delay_ms(50); //전원 인가 후 CLCD 셋업 시간
PORTC = 0x00; //데이터 clear
CLCD_cmd(BIT4_LINE2_DOT58); // 4 Bit Mode, 2 Lines, 5x8 Dot
CLCD_cmd(DISPON_CUROFF_BLKOFF); // Display On, Cursor Off, Blink Off
CLCD_cmd(INC_NOSHIFT); // Entry Mode, Cursor Increment,
// Display No Shift
CLCD_cmd(DISPCLEAR); // Display Clear, Address 0
_delay_ms(2); // 디스플레이 클리어 실행 시간동안 대기
}
ISR (INT4_vect) // INT4 인터럽트 발생시
{
int distance_1st, distance_2nd, height, number;
_delay_ms(100); // 스위치 바운스 시간동안 기다림
EIFR |=1<<4; // 그사이 스위치 바운스에 의해 생긴
// 인터럽트는 무효화 -Debouncing
if ((PINE &=0x10) != 0x00) // 스위치가 ON 상태인지 확인
return; // 아니면 노이즈 입력으로 여기고 그냥 return
switch (state) {
case STATE_0: //스위치를 1번째 누른것 확인
CLCD_cmd(DISPCLEAR);
CLCD_cmd(CUR1LINE);
CLCD_puts(If_Ready); // Display "if Ready"1열
CLCD_cmd(CUR2LINE);
CLCD_puts(Press_Switch); // Display "Press Switch!"(2열)
state = STATE_1;
break;
case STATE_1: // 스위치를 2번째 누른것 확인1/AR2 T
CLCD_cmd(DISPCLEAR);
CLCD_cmd(CUR1LINE);
CLCD_puts(First); // Display "First :"
distance_1st = read_distance();
CLCD_num_display(distance_1st);
state = STATE_2;
break;
case STATE_2: //스위치를 3번째 누른 것 확인
CLCD_cmd(CUR2LINE);
CLCD_puts(Second); // Display "Second :"
distance_2nd = read_distance();
CLCD_num_display(distance_2nd);
state = STATE_3;
break;
case STATE_3: //스위치를 4번째 누른 것 확인
CLCD_cmd(DISPCLEAR);
CLCD_cmd(CUR1LINE);
CLCD_puts(Height); // Display Height
height = distance_2nd - distance_1st;
if (height < 0 ) CLCD_puts(Error);
else CLCD_num_display(height);
state = STATE_0;
break;
}
}
int read_distance()
{
unsigned int distance = 0;
TCCR1B = 0x03; // Timer/Counter 클록 4us
PORTA &= ~(1<<TRIG); // Trig=LOW
_delay_us(10);
PORTA |= (1<<TRIG); // Trig=HIGH
_delay_us(10);
PORTA &= ~ (1<<TRIG); // Trig = LOW
while(!(PINA & (1<<ECHO))) //wait until Echo = HIGH
;
TCNT1 = 0x0000; // Timer/Countert 값초기화 =(0)
while (PINA & (1<<(ECHO)))
;
TCCR1B = 0x00; // Timer/Countert 클록정지
distance = (unsigned int)(SOUND_VELOCITY* (TCNT1* 4 / 2)/ 1000);
// 거리 = 속도 * 시간 (TCNT1 * 4)는 왕복 시간 ,거리단위는mm
return(distance);
}
void CLCD_puts(char *ptr)
{
while(*ptr != NULL) //문자열 마지막이 NILL 인지 검사
CLCD_data(*ptr++); // 마지막이 아니면 1문자 디스플레이
}
void CLCD_num_display(int num)
{
CLCD_NUM[0] = (num/1000)%10 + 0x30;
CLCD_NUM[1] = (num/100)%10+ 0x30;
CLCD_NUM[2] = (num/10)%10 + 0x30;
CLCD_NUM[3] = '.';
CLCD_NUM[4] = (num/1)%10 + 0x30;
CLCD_NUM[5] = NULL;
CLCD_puts(CLCD_NUM);
}
void CLCD_data(char data)
{
PORTD = 0x04; //0b0000100, E(bit4)=0, R/W(bit3)=0,
//RS(bit2)=1, Write 사이클, 데이터모드
_delay_us(1); //Setup Time
PORTD = 0x14; // 0b00010100, E(bit4)=1, R/W(bit3)=0,
//RS(bit2)=1 Enable
PORTC = data & 0xf0; // upper 4bit
PORTD = 0x04; // 0b0000100, E(bit4)=0, R/W(bit3)=0,
//RS(bit2)=1 , Write 사이클 ,데이터 모드
_delay_us(2); //Hold & Setup Time
PORTD = 0x14; //0b00010100, E(bit4)=1, R/W(bit3)=0,
// RS(bit2)=1 Enable
PORTC = (data << 4) & 0xf0; // lower 4bit
PORTD = 0x04; // 0b00000100, E(bit4)=0, R/W(bit3)=0,
//RS(bit2)=1 사이클 종료
_delay_ms(1); //Hold Time & Execution Time
}
void CLCD_cmd(char cmd)
{
PORTD = 0x00; //0b0000000, E(bit4)=0, R/W(bit3)=0,
//RS(bit2)=0, Write 사이클 , 명령어 모드
_delay_us(1); // Setup Time
PORTD = 0x10; //0b00010000, E(bit4)=1, R/W(bit3)=0.
// RS(bit2)=0 Enable
PORTC = cmd & 0xf0; // upper 4bit 전송
PORTD = 0x00; // 0b0000000, E(bit4)=O, R/W(bit3)=0
// RS(bit2)=0 Write 사이클 , 명령어 모드
_delay_us(2); // Hold & Setup Time
PORTD = 0x10; // 0b00010000, E(bit4)=1, R/W(bit3)=0.
// RS(bit2)=0 Enable
PORTC = (cmd<< 4) & 0xf0; // lower 4bit 전송
PORTD = 0x04; // 0b00000100, E(bit4)=0, R/W(bit3)=0,
//RS(bit2)=0 사이클 종료
_delay_ms(1); //Hold Time & Execution Time
}
}
댓글 0
조회수 3,834등록된 댓글이 없습니다.