질문게시판 > Atmega 코드 좀 봐주세요.

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

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


BASIC4MCU | 질문게시판 | Atmega 코드 좀 봐주세요.

페이지 정보

작성자 chelsea 작성일2022-07-04 10:48 조회393회 댓글1건

첨부파일

본문

	

안녕하세요...

다음과 같이 동작 Fllow에 맞춰 코드을 작성해보았는데 현재 모듈이 없어 확인이 어렵습니다.

모듈이 오기 전 작성한 코드에 오류가 있는지 확인하고 싶은데 조언 부탁드립니다.

 

1. PD7이 Low일 때 온도와 관계없이 팬 동작 x

2. PD7 High가 입력되면

3. 온도에 따라 팬이 동작(25도 미만이면 duty60%, 25도~27도 이면 duty 78%,27도 이상이면 100%)

4. PD7 High 입력 후 6초 이전까지 PD3,PD5 Low PD6 High

4. 6초 이후 PD3,PD5 High PD6 Low(PD7이 Low될 때까지 유지)

5. flowrate가 0이면 PD1 High, Flowrate가 0이 아니면 PD1 Low (PD7이 High 일때)

 

첨부된 파일은 온도테이블입니다.

 

 

*LCD 출력

1열 Water : 값 표시

2열 temp : 값 표시

 

//Atmega8

 

#include <avr/io.h>

#include <avr/interrupt.h>

#define F_CPU 16000000UL

#include <util/delay.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

//

#define LCD_RS          0x10  // PC4

#define LCD_EN          0x20  // PC5

#define LCD_DIR          DDRC

#define LCD_PORT        PORTC

//

#define LCD_Clear        0x01

#define LCD_Cursor      0x03    //function set:4bit data, 2line display, 5*8 dots

#define LCD_Function_Set 0x28

#define LCD_On          0x0E    //0000    11(set display)1(cursor)0(blink)

#define LCD_Entry        0x06    //Cursor increased, no shift

#define input 0x80 //HP Connector input

//

volatile float calibrationfactor=98,flowrate=0,cal=0;

volatile int pulsecount=0,millisec=0,val=0;

volatile char sec=0;

volatile long R=0;

volatile double Thermister=0;

//

 

void init_port()

{

DDRB = 0x04;

PORTB = 0x00;

DDRD = 0x8B;

PORTD = 0x40;

}

void Write_Command_LCD(char Command){

LCD_PORT=(Command >> 4)|LCD_EN; _delay_us(1); LCD_PORT&=~LCD_EN; _delay_us(1);

LCD_PORT=(Command&0x0F)|LCD_EN; _delay_us(1); LCD_PORT&=~LCD_EN; _delay_ms(2);

}

//

void PutsChar_LCD(int data){

LCD_PORT=(data >> 4)|LCD_RS|LCD_EN; _delay_us(1); LCD_PORT&=~LCD_EN; _delay_us(1);

LCD_PORT=(data&0x0F)|LCD_RS|LCD_EN; _delay_us(1); LCD_PORT&=~LCD_EN; _delay_us(40);

}

//

void String_LCD(char *s){ while(*s)PutsChar_LCD(*s++); }

//

void LCD_Init(void){

LCD_DIR=0xFF;

LCD_PORT=0x00;

_delay_ms(50);

Write_Command_LCD(LCD_Function_Set);

Write_Command_LCD(LCD_On);

Write_Command_LCD(LCD_Clear);

Write_Command_LCD(LCD_Entry);

Write_Command_LCD(0x02); //Return Home

}

 

 

void Cooler()

{

if(Thermister<=25)

{

OCR1B=128;

_delay_ms(300);

}

else if(25<Thermister&&Thermister<27)

{

OCR1B=200;

_delay_ms(300);

}

else if(Thermister>=27)

{

OCR1B=255;

_delay_ms(300);

}

}

 

void ADC_Init()

{

ADCSRA = 0x=87; //Enable ADC, fr/128

ADCSRA |= (1<<ADSC);

while ((ADCSRA &(1<<ADIF))==0); //monitor end of conversion interrupt flag

ADCSRA |=(1<<ADIF); //set the ADIF bit of ADCSRA register

return(ADCW);

}

 

int ADC()

{

ADMUX = 0x46;

}

 

void getTemp()

{

val = ADC(); //store adc value on val register

R=10000*(1023/val-1.0); //calculate the resistance

Thermister = log(R); //calculate natural of resistance

Thermister = 1/(0.8483323763e-03 + (2.581286591e-04 * Thermister) + (1.641220112e-07 * Thermister * Thermister * Thermister)) ; //A=0.8483323763e-03, B=2.581286591e-04, C=1.641220112e-07

Thermister = Thermister - 273.15; //covert kelvin to C

return Thermister;

}

//

void init_timer0()

{

TCCR0 = (1<<CS02); //분주비 256

TCTN0 = 6; //TNCT0의 초기값 6

TIMSK = (1<<TOIE0); //타이머 인터럽트 enable

}

void init_timer1()

{

//set mode: Mode 06 (8Bit Fast PWM)

//f_pwm = f_clk/ N * (1+Top) = 16,000,000Hz / 64 * (1+255) = 976.5625Hz      

//( N :Pre-scale factor = 64)

TCCR1A|=(1<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(0<<WGM11)|(1<<WGM10); 

TCCR1B=(0<<WGM13)|(1<<WGM12)|(0<<CS12)|(1<<CS11)|(1<<CS10);

TIMSK=(1<<OCIE1A);

/*TCCR0A=(1<<WGM01); TIMSK0|=(1<<OCIE0A); TCCR0B|=(1<<CS02)|(1<<CS00); OCR0A=0x07;*/

}

//

ISR(TIMER0_COMPA_vect) //1ms

{

if(PIND & input == 1){

Cooler(); // Hand piece 연결되면 High 입력

if(++millisec>=1000){ //1sec

millisec=0; 

if(sec<6){

if(++sec>=6)PORTD=0x28; //6sec (PD6)Off,(PD5)on,(PD3)On

}

cal=pulsecount/calibrationfactor; //L/min

flowrate=cal*60; //L/hour

if(flowrate==0){

PORTD|= 0x02; //PD1 High Output(Water flow signal)

}

else PORTD&=~0x02; //PD1 Low Output

pulsecount=0;

}

}

}

ISR(TIMER1_COMPA_vect)

{

}

//

ISR(INT0_vect){ pulsecount++; }

//

 

int main(void){

char water[20]={0};

char Tbuf[20]={0};

double temp;

init_port();

init_timer0();

init_timer1();

MCUCR|=(0<<ISC00)|(1<<ISC01); //The falling edge of INT0 generates an interrupt request.

GICR|=(1<<INT0); //INT0 Enable

sei();

LCD_Init();

ADC_Init();

while(1){

temp=getTemp();

sprintf(water,"WATER:%0.1f L/H",flowrate);

Write_Command_LCD(0x80);

String_LCD(water);

_delay_ms(100);

sprintf(Tbuf,"temp:%0.1f  C ",temp);

Write_Command_LCD(0xc0);

String_LCD(Tbuf);

_delay_ms(100);

}

}

 

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

댓글 1

조회수 393

master님의 댓글

master 작성일

동작 시켜보고 문제가 발생하고, 본인 능력으로 해결이 안될 때 질문을 해주세요
동작 전 코드 체크는 스스로 하시고요
조언을 드리자면
알고리즘을 잘 작성하면
코드는 알고리즘 대로 타이핑하면 그만입니다.
언어의 문법은 쉽게 숙련이 되지만 알고리즘은 좀 더 어렵습니다.
시간에 여유가 있으면 알고리즘부터 잘 작성하고, 알고리즘대로 코드를 작성했는지 체크하세요

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

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은 질문게시판에서만 작성 가능합니다. 스태프 19-01-15 11769
공지 사이트 이용 안내댓글[25] master 17-10-29 31107
질문 PIC 블루투스 연결댓글[18] 새글 픽공부 22-08-09 22
질문 PIC18F452 블루투스 연결댓글[4] 새글 마이컴 22-08-08 22
질문 아두이노 코드 해석을 못하겠습니다...댓글[2] 새글 김가헌 22-08-08 27
질문 아두이노 코드를 avr로 변환해 주세요 ...ㅠ댓글[3] 새글 옹냥냥 22-08-08 22
질문 아두이노 녹음-스피커모듈 관련 질문있습니다 ㅠㅠ댓글[2] 새글 방귀뿡뿡 22-08-08 18
질문 Serial EEPROM 실수값 저장..댓글[2] 이미지첨부파일 광이 22-08-07 19
질문 STM32 Live Expression 값들이 깜빡이는 현상댓글[3] 둠둠 22-08-05 66
질문 아두이노 ESP32 wifi module댓글[1] Yoon 22-08-03 125
질문 atmega128과 dht11, lcd를 연결했는데 0도라고 뜹니다.댓글[1] 고양이33 22-08-02 281
질문 ATMEGA 128 코드를 합치려고 하는데 어렵네요댓글[2] 고양이33 22-08-02 178
질문 서보모터 제어에 대해 질문있습니다.댓글[2] 첨부파일 뉴비에오 22-07-30 124
질문 적외선 통신 알려주실분있나요 ㅠㅠ댓글[1] hkjsj10 22-07-30 131
질문 아두이노 관련 궁금합니다.댓글[1] 뱝뱝 22-07-28 131
질문 아두이노 우노 MCP4725댓글[3] 이미지 opqr 22-07-27 270
질문 레오나르도 인체감지센서 알림 안옴 면지지 22-07-24 187
답변 답변글 답변 : 레오나르도 인체감지센서 알림 안옴 master 22-07-25 130
질문 Uno에서 엔코더값 놓치는 이유가 뭘까요...댓글[3] MAKTUB 22-07-24 140
질문 아두이노 압력센서 연동 질문댓글[4] dbice 22-07-23 222
질문 아두이노 버튼 누르기 문의댓글[1] 김형근 22-07-23 165
질문 HM10 다중페어링댓글[1] ㅎㅋㅎㅋㅎ 22-07-22 190
질문 모터드라이브 선정댓글[6] 이미지 조숩인 22-07-22 262
질문 ad9850 sin파 2댓글[6] 이미지첨부파일 opqr 22-07-21 209
질문 ad9850 sin파 합성댓글[7] 첨부파일 opqr 22-07-20 263
질문 특정값이 n초이상,n번 이상 연속될경우를 감지하는 함수가 있나요댓글[4] 우수 22-07-17 288
질문 delay를 millis함수로 바꾸는데 질문있습니다.댓글[12] 첨부파일 뉴비에오 22-07-16 649
질문 피에조 부저로 맬로디 만들기인대 코딩 까지 했는데 아두이노 가 동작을 안해요.댓글[2] 이미지첨부파일 mingu123 22-07-15 1623
질문 블루투스와 안드로이드 연동관련 질문입니다! ㅎㅇㅎㅇ 22-07-14 410
질문 아두이노간 블루투스 통신에 대해서 질문있습니다 첨부파일 뉴비에오 22-07-13 173
게시물 검색

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
모바일버전으로보기