질문게시판 > 답변 : atmega128 초보입니다.

TODAY1,108 TOTAL2,585,280
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 질문게시판 | 답변 : atmega128 초보입니다.

페이지 정보

작성자 master 작성일2018-12-01 14:41 조회7,351회 댓글1건

본문

	

 

// DateTime : 2018-12-01 오후 2:45:45
// by Ok-Hyun Park
//
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
//-RGB LCD 제어 PORT&PIN---------------------------------------------------------------
#define RGB_DATA_DDR                              DDRA //-Data Bus제어 Port
#define RGB_DATA_PORT                             PORTA
#define DATA_D4                                   PA0 //-Data Bus PIN
#define DATA_D5                                   PA1
#define DATA_D6                                   PA2
#define DATA_D7                                   PA3
#define RGB_LCD_DDR                               DDRF //-RGB LCD 제어 Port
#define RGB_LCD_PORT                              PORTF
#define RS_BIT                                    PF2 //-Register Select: LOW-Command,HIGH-Data
#define RW_BIT                                    PF3 //-Read/Wite: LOW-Wite        HIGH-Read
#define EN_BIT                                    PF4 //-Enable Pin: LOW-Disable    HIGH-Enable
#define RED_BIT                                   PF5 //-Red Backlight: LOW-Off        HIGH-On
#define GREEN_BIT                                 PF6 //-Green Backight: LOW-Off     HIGH-On
#define BLUE_BIT                                  PF7 //-Blue Backlight: LOW-Off       HIGH-On
//-RBG LCD 제어관련 상수---------------------------------------------------------------
#define ALL_SET                                   0xff //-모든 Pin 1로 셋
#define ALL_CLEAR                                 0x00 //-모든 Pin 0으로 클리어
#define DDRAM_ADDR                                0x80 //-DD(Display Data)RAM 주소
//-RBG LCD 제어관련 명령어--------------------------------------------------------------
#define CMD_CLEAR_DISPLAY                        0x01 //-CLEAR_DISPLAY(0x01)
#define CMD_RETURN_HOME                          0x02 //-RETURN_HOME(0x02)
#define CMD_ENTRYMODE_SET                        0x06 //-ENTRYMODE_SET(0x04)|Left(0x02)|Shift Decrement(0x00)
#define CMD_DISPLAY_CONTROL                      0x0C //-DISPLAY_CONTROL(0x08)|Display On(0x04)|Cursor Off(0x00)|Blink Off(0x00)
#define CMD_CURSOR_SHIFT_RIGHT                   0x1C //-CURSOR_SHIFT(0x10)|Shift Move(0x08)|Move Right(0x04)
#define CMD_FUNCTION_SET                         0x28 //-FUNCTION_SET(0x02)|4BIT(0x00)|2 Line(0x08)|5x8 Dots(0x00)
#define CMD_8BIT_MODE                            0x03 //-FUNCTION_SET(0x02)|8BIT(0x01)
#define CMD_4BIT_MODE                            0x03 //-FUNCTION_SET(0x02)|4BIT(0x00)
#define DDRAM_FS_ADDR                            0x0
#define DDRAM_EF_ADDR                            0x0F
#define DDRAM_SS_ADDR                            0x40
#define DDRAM_SF_ADDR                            0x4F
//
#define LX_LIMIT              100 //-LED Off 되는 한계 값 정의
//-LED 관련
#define DDR_LED               DDRD
#define PORT_LED              PORTD
#define LED_ON                0x00
#define LED_OFF               0xF0
/*-------------------------------------------------------------------------*/
//-Temp관련
#define TEMP_ADDR             72 //-온도센서의 Slave 주소
#define TEMP_ADDR_W           TEMP_ADDR<<1 //-Write 주소
#define TEMP_ADDR_R           (TEMP_ADDR<<1)+1 //_ Read 주소
#define TEMP_REG              0 //_ 온도 데이터 저장 Reg.주소
#define TEMP_LIMIT            25 //_ DC Motor ON 되는 한계 값
//-Clock 제어를 위한 선언
#define CPU_CLOCK             16000000 //_ 16MHz
#define SCL_FREQUENCY         400000 //_ 400KHz
//-DC 모터 제어를 위한 정의
#define DCM_DDR               DDRB // B포트를 모두 출력으로
#define DCM_PORT              PORTB // B포트를 모두 출력으로 8칸이 다 1이 출력된다는거임
#define FORWARD_BIT           0
#define BACKWARD_BIT          1
//-온도값 저장 전역 변수 선언
volatile unsigned int  gTempValue//_ 측정된 온도 값 저장
//-USART 제어를 위한 전역 변수 선언
volatile unsigned int gLightValue//-측정된 조도값 저장
/*=====================================함수 선언=========================================================*/
void RGB_LCD_Init(void);
void RGB_LCD_Enable(void);
void RGB_LCD_Write(unsigned char nValue);
void Set4BitMode(void);
void SendText(unsigned char addrCommand,char*szText);
void SendCommandl(unsigned char command);
void SendData(unsigned char data);
void LCD_Display(void);
void ADC_LED_Init(void);
void ADC_Convert(void);
void LED_OnOff(unsigned char nNum);
//_ Temp&ADC
void TEMP_DC_Init(void);
void TEMP_Read(void);
//_ DC Motor
void Run_DCM(void);
void Stop_DCM(void);
//
void TEMP_DC_Init(void){
  //-DC Motor 초기화
  DCM_DDR|=(1<<FORWARD_BIT)|(1<<BACKWARD_BIT); //-PB0,PB1 비트 Output으로 설정
  DCM_PORT&=~((1<<FORWARD_BIT)|(1<<BACKWARD_BIT)); //-DC모터 구동 정지로 설정
  //-Temp TWI 초기화
  TWSR&=~((1<<TWPS1)|(1<<TWPS0)); //-분주비 설정
  TWBR=(CPU_CLOCK/SCL_FREQUENCY-16)/ 2//-TWI 통신 속도 설정
}
//
void TEMP_Read(void){
  unsigned char     arrTemp[2]; //-읽어온 2byte 데이터 저장
  unsigned int      nTmp//-12bit 온도 값 저장
  float             fCValue//-섭씨로 변환한 값 저장
  //-START condition
  TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
  while(!(TWCR&(1<<TWINT)));
  //-Slave Addr+Read 전송
  TWDR=TEMP_ADDR_R;
  TWCR=(1<<TWINT)|(1<<TWEN);
  while(!(TWCR&(1<<TWINT)));
  //-측정된 온도값 읽기
  for(int i=0i<2i++){ TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN); while(!(TWCR&(1<<TWINT))); arrTemp[i]=TWDR; }
  nTmp=arrTemp[0]<<8nTmp=nTmp|arrTemp[1]; nTmp=nTmp>>4//-측정된 12bit 온도 데이터 계산
  fCValue=(float)nTmp*0.0625;                             //-온도값을 섭씨로 변환->data_value*0.0625--------------
  TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN); _delay_ms(5);     //-STOP condition
  if((int)fCValue>TEMP_LIMIT)Run_DCM(); else Stop_DCM();
  gTempValue=(int)fCValue;                                //-섭씨 온도값 저장
}
//
void Run_DCM(void){                                //-DC Motor 동작
  DCM_PORT&=~((1<<FORWARD_BIT)|(1<<BACKWARD_BIT)); //-정방향으로 회전
  DCM_PORT|=(1<<FORWARD_BIT);
}
//
void Stop_DCM(void){ DCM_PORT=(1<<FORWARD_BIT)|(1<<BACKWARD_BIT); }
/*=LED관련 함수*/
//-LED On/Off
void LED_OnOff(unsigned char nNum){
  if(nNum==LED_ON)PORT_LED=0x00//-4개 LED ON
  else            PORT_LED=0xF0//-4개 LED OFF
}
/*=ADC&Light 관련 함수*/
//-ADC&Light 초기화
void ADC_LED_Init(void){
  //-LED 초기화
  DDR_LED|=0xF0PORT_LED|=0xF0;
  //-ADC0 채널,AREF 기준 전압 및 채널을 선택
  ADMUX=0;
  //-채널,활성화,프리스케일 설정
  ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}
/*==ADC 변환 함수 구현*/
void ADC_Convert(void){
  unsigned int result;
  cli(); //-ADC 변환 중 인터럽트 금지
  ADCSRA|=(1<<ADSC); //-ADC 변환 시작
  while(!(ADCSRA&(1<<ADIF))); //-ADC 변환 완료 신호 대기
  result=ADCL//-변환 결과 저장
  result|=((ADCH&0x03)<<8);
  sei(); //-인터럽트 허용
  if(result>LX_LIMIT)LED_OnOff(LED_OFF); //-CDS Value>50 LED OFF
  else LED_OnOff(LED_ON); //-CDS Value<=50 LED ON
  //-조도값 저장
  gLightValue=result;
}
//
void SendCommand(unsigned char command){ //-RBG_LCD 명령어 전달 함수 구현---------------------------------
  RGB_LCD_PORT&=~((1<<RS_BIT)|(1<<RW_BIT)|(1<<EN_BIT)); //-Command 전송을 위한 RS=0,RW=0,EN=0
  RGB_LCD_Write(command>>4); RGB_LCD_Write(command); //-Data Bus에 CMD 쓰기
}
//
void SendData(unsigned char data){ //-RBG_LCD 데이터 전달 함수 구현---------------------------------
  RGB_LCD_PORT|=(1<<RS_BIT); RGB_LCD_PORT&=~((1<<RS_BIT)|(1<<EN_BIT)); //-Data 전송을 위한 RS=1,RW=0,EN=0
  RGB_LCD_Write(data>>4); RGB_LCD_Write(data);
}
//
void SendText(unsigned char addrCommand,char*szText){ //-RBG_LCD 문자열 출력 함수 구현---------------------------------
  SendCommand(addrCommand); //-DD Ram 주소 전달
  while(*szText!='\0'){ SendData(*szText); szText++; }
}
//
void RGB_LCD_Write(unsigned char nValue){ //-RBG_LCD 명령어/데이터 레지스터 기록 구현---------------------------------
  int nTmp=0;
  RGB_DATA_PORT=0x00;
  for(int nldx=0nldx<4nldx++){ nTmp=(nValue>>nldx)&0x01RGB_DATA_PORT|=(nTmp<<(DATA_D4+nldx)); }
  RGB_LCD_Enable();
}
//
void RGB_LCD_Enable(void){
  RGB_LCD_PORT|=(1<<EN_BIT); _delay_us(1); RGB_LCD_PORT&=~(1<<EN_BIT); _delay_us(100);
}
//
void Set4BitMode(void){ //-RBG_LCD 4bit 인터페이스 설정 구현---------------------------------
  RGB_LCD_PORT&=~((1<<RS_BIT)|(1<<RW_BIT)|(1<<EN_BIT)); //-Command 전송을 위한 RS=0,RW=0,EN=0
  RGB_LCD_Write(CMD_8BIT_MODE); _delay_us(4500);
  RGB_LCD_Write(CMD_8BIT_MODE); _delay_us(4500);
  RGB_LCD_Write(CMD_8BIT_MODE); _delay_us(150);
  RGB_LCD_Write(CMD_4BIT_MODE);
}
//
void RGB_LCD_Init(void){
  RGB_LCD_DDR=((1<<RS_BIT)|(1<<RW_BIT)|(1<<EN_BIT)|(1<<RED_BIT)|(1<<GREEN_BIT)|(1<<BLUE_BIT));
  RGB_LCD_PORT&=~((1<<RS_BIT)|(1<<RW_BIT)|(1<<EN_BIT)|(1<<RED_BIT)|(1<<GREEN_BIT)|(1<<BLUE_BIT));
  RGB_DATA_DDR=ALL_SETRGB_DATA_PORT=ALL_CLEAR//-Data 입력 Pin Output 설정 및 초기화
  Set4BitMode(); //-(2)RGB LCD 인터페이스 설정
  SendCommand(CMD_FUNCTION_SET);    //-(3)RGB LCD 출력을 위한 설정 //-LCD의 행,열,글자 크기 설정
  SendCommand(CMD_DISPLAY_CONTROL); //-디스플레이,커서,문자 깜빡임 On/Off 설정
  SendCommand(CMD_ENTRYMODE_SET);   //-커서 이동 방향,문자 디스플레이 이동 여부 설정
  SendCommand(CMD_CLEAR_DISPLAY);   //-LCD 화연 지우고 커서는 1행 1열 위치,DDRAM AC=0
  RGB_LCD_PORT|=(1<<GREEN_BIT);     //-Green Backlight 켜기
  _delay_us(2000);
}
//
void LCD_Display(void){ //-측정된 온도,조도값 LCD에 출력--------------------------
  char arrTmp[16]="",pTmp[4]="";
  itoa(gTempValue,pTmp,10);  strcat(arrTmp,"T: "); strcat(arrTmp,pTmp); strcat(arrTmp,"C");  //-온도값 문자열로 변환
  itoa(gLightValue,pTmp,10); strcat(arrTmp,"L: "); strcat(arrTmp,pTmp); strcat(arrTmp,"Lx "); //-조도값 문자열로 변환
  SendText(DDRAM_ADDR|DDRAM_FS_ADDR,arrTmp);
}
/*===========================*/
// DESC:(1)일정 온도 이상이 되면 DC모터를 회전시키고 일정 밝기 이하면 LED를 켜준다.
//-(2)RGB_LCD에 현재 온도와 조도를 표시해 준다.
/*===========================*/
/*==Main 함수 구현==============*/
int main(void){
  ADC_LED_Init(); //-Light&LED 초기화
  TEMP_DC_Init(); //-Temp&DC 초기화
  RGB_LCD_Init(); //-RGB_LCD 초기화
  while(1){
    TEMP_Read(); //-온도 측정
    ADC_Convert(); //-조도 측정
    LCD_Display(); //-현재 온도.조도 LCD 출력
    _delay_ms(1000);
  }
  return 0;
}

 

타이핑 오타는 백만개라고 하더라도 자신이 직접 찾아야합니다.

 

 

 

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글 1

조회수 7,351

master님의 댓글

master 작성일

본인 능력으로 오타도 찾지 못할만큼 복잡한 소스라면 이해하는 것도 어려울테니
간단하고 쉬운 예제를 많이 공부한 후에 복잡한 소스를 보시는 것이 힘이 덜 듭니다.

질문게시판HOME > 질문게시판 목록

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은 질문게시판에서만 작성 가능합니다. 스태프 19-01-15 17164
공지 사이트 이용 안내댓글[28] master 17-10-29 33561
질문 아두이노 코딩 에러 질문댓글[1] 이미지새글첨부파일 박무농 23-03-25 28
질문 아두이노를 이용한 타이머, 태양전지 제어댓글[2] 새글 박무농 23-03-25 31
질문 sd카드 이미지 전송댓글[1] 던지기마스터 23-03-24 15
질문 초음파센서를 이용한 모터제어 질문있습니다.댓글[3] 이미지첨부파일 뉴비에오 23-03-24 39
질문 부품 관련 문의댓글[1] 타코 23-03-23 23
질문 모터 작동 시, 일부 모듈이 꺼지는 현상에 대해 질문드립니다. 이미지 그렇찌 23-03-22 34
답변 답변글 답변 : 모터 작동 시, 일부 모듈이 꺼지는 현상에 대해 질문드립니다. 이미지 master 23-03-23 22
질문 ESP로 원격 모터제어를 할 수 있나용?댓글[1] 비차 23-03-22 26
질문 HC06을 마스터로 설정하면 HC06끼리만 통신되나요?댓글[4] 비차 23-03-21 36
질문 아두이노 제어하기댓글[3] 매드닥터 23-03-19 58
질문 atmega128 압력센서 관련 질문입니다댓글[1] 공린이 23-03-19 68
질문 아두이노 스텝모터 각도제어 질문댓글[3] master 23-03-17 68
질문 아두이노와 파이썬(중점좌표) 시리얼 통신 질문드립니다.댓글[1] 이미지첨부파일 아두이노어렵잖아 23-03-16 54
질문 아두이노 3LED 버튼 관련 질문댓글[1] 이츤 23-03-16 52
질문 ATmega328p로 pca9685를 이용하여 서보모터(mg996r, mg90s)를 pwm로 제어 중 떨림댓글[1] 이미지첨부파일 토비 23-03-15 55
질문 hm-10 다중연결 질문있습니다.댓글[1] 첨부파일 뉴비에오 23-03-14 47
질문 while loop 실행 속도댓글[1] 412904 23-03-12 70
질문 AND 연산 질문드립니다.댓글[1] 412904 23-03-11 76
질문 아두이노 테트리스 게임댓글[1] 첨부파일 지욱애 23-03-02 161
질문 아두이노우노 블루투스 2개 연결댓글[1] dsfadfs 23-02-28 122
질문 스텝모터 코딩 질문입니다..댓글[2] 무야더싱 23-02-25 142
질문 아두이노 나노33 IOT 의 BLE 연결 문제 이미지 가루밀 23-02-24 82
질문 220V AC를 직류로 바꾸면 건전지 5V 건전지 55개를 대체할 수 있는건가요?댓글[1] hghh 23-02-22 107
질문 HM-10 모듈 사용하는데 질문있습니다.댓글[2] 뉴비에오 23-02-21 143
질문 아두이노 블루투스 관련 질문입니다. 생물공학도 23-02-21 108
답변 답변글 답변 : 아두이노 블루투스 관련 질문입니다. master 23-02-21 109
질문 자율주행 로봇을 만드는데 질문있습니다.댓글[2] 뉴비에오 23-02-18 178
질문 블루투스에서 아두이노로 신호전달에 대하여(2)댓글[1] 이미지첨부파일 밍경 23-02-14 199
게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기