BASIC4MCU | 질문게시판 | 답변 : atmega128 초음파 센서 신장 측정
페이지 정보
작성자 master 작성일2022-12-12 12:26 조회744회 댓글0건본문
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
//
#define LCD_DB_PORT PORTA // LCD_DATABUS
#define LCD_DB_DDR DDRA
#define LCD_CMD_PORT PORTC // LCD_COMMAND
#define LCD_CMD_DDR DDRC
//
unsigned int default_position=190; // 신장 측정기가 설치될 기준높이
volatile unsigned int distance=0; // 58us 마다 ++증가될 카운터변수
volatile unsigned char togle=0; // PE4 가 반사파로 인해 HIGH 일때 1,반사파가 끝나거나 없을땐 0
char str1[16]; // CLCD 1행의 문자열 배열
char str2[16]; // CLCD 2행의 문자열 배열
//
void pulse(void){ DDRE=0x10; PORTE=0x10; _delay_us(5); PORTE=0x00; DDRE=0x00; } // 5us input trigger
//
void LCD_cmd(unsigned char cmd){
LCD_DB_PORT=cmd; LCD_CMD_PORT=1; _delay_us(1); LCD_CMD_PORT=0; _delay_us(100);
}
//
void LCD_data(unsigned char data){
LCD_DB_PORT=data; LCD_CMD_PORT=3; _delay_us(1); LCD_CMD_PORT=2; _delay_us(100);
}
//
void LCD_print(unsigned char cmd,char *s){ LCD_cmd(cmd); while(*s)LCD_data(*s++); } // LCD 문자출력 함수
//
void LCD_init(void){
LCD_cmd(0x38); // Function set(data length-8bit,2행,5x8dote)
LCD_cmd(0x0C); // Display on/off control(화면출력 ON,커서표시 & 커서깜빡임 OFF)
LCD_cmd(0x06); // Entry mode set(커서 오른쪽 이동,화면이동 OFF)
LCD_cmd(0x01); // Clear display
_delay_ms(2);
}
//
ISR(TIMER0_OVF_vect){ TCNT0=140; distance++; } // 58us
//
ISR(INT0_vect){ // default_position 증가 스위치 인터럽트
_delay_ms(200); // 키 디바운싱을 위한 딜레이
if(default_position>=250)default_position=190; // 250 이상이면 190으로 초기화
else default_position++;
sprintf(str1,"Position: %d cm ",default_position); LCD_print(0x80,str1);
EIFR=0xFF; // External Interrupt Flags clear
}
//
ISR(INT1_vect){ // default_position 감소 스위치 인터럽트
_delay_ms(200); // 키 디바운싱을 위한 딜레이
if(default_position<=50)default_position=190; // 50 이하면 190으로 초기화
else default_position--;
sprintf(str1,"Position: %d cm ",default_position); LCD_print(0x80,str1);
EIFR=0xFF; // External Interrupt Flags clear
}
//
ISR(INT4_vect){ // 에코핀
if(togle==0){ distance=0; EICRB=0x02; TCCR0=0x02; TCNT0=140; TIMSK=0x01; togle=1; } // Rising edge일때
else { TIMSK=0x00; EICRB=0x03; togle=0; } // Falling edge일때
}
//
int main(void){
unsigned int height; // 신장 측정값 변수
PORTD=0x03; // 스위치 연결포트 내부 풀업 설정
LCD_DB_DDR=0xFF; LCD_CMD_DDR=0xFF; _delay_us(50); LCD_init();
LCD_print(0x80," ULTRASONIC "); // 1행 문자열 출력
LCD_print(0xC0," HEIGHT METER "); // 2행 문자열 출력
_delay_ms(3000);
LCD_cmd(0x01); // Clear display
ACSR=0x80;
EICRA=0xAA; EICRB=0x03; EIFR=0xFF; EIMSK=0x13; // INT0,1 & INT4
sei();
while(1){
pulse(); _delay_ms(200);
if(distance<5 || distance>200)continue;
//
height=default_position-distance;
sprintf(str1,"Position: %d cm ",default_position); LCD_print(0x80,str1);
sprintf(str2,"Height: %d cm ",height); LCD_print(0xC0,str2);
}
}
컴파일 오류는 없습니다.
댓글 0
조회수 744등록된 댓글이 없습니다.