BASIC4MCU | 질문게시판 | 답변 : 답변 : atmega128 내부 EEPROM 사용하기
페이지 정보
작성자 master 작성일2020-01-30 15:44 조회14,665회 댓글5건본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2020-01-30 오후 3:46:06// by Ok-Hyun Park//#define F_CPU 16000000L#include <avr/io.h>#include <stdlib.h>#include <stdio.h>#include <stdbool.h>#include <util/delay.h>#include <avr/interrupt.h>#include <avr/eeprom.h>//#define add_A 20#define add_B 50#define add_C 80//int count,d=0;uint16_t a,b,c;//void disp(){char s[20];sprintf(s,"%2d.%d %2d.%d %2d.%d",a/10,a%10,b/10,b%10,c/10,c%10);LCD_goto_XY(0,0); LCD_write_string(" T1 T2 T3 ");LCD_goto_XY(1,0); LCD_write_string(s);}//ISR(TIMER0_OVF_vect){static int sec=99;if((PINE&8)==0){ count=0; sec=0; }//if(++count>=100){ count=0; if(sec<a+b+c)sec++; }//if(d){if (sec<a ){ PORTB=1; }else if(sec<a+b ){ PORTB=2; }else if(sec<a+b+c){ PORTB=4; }else { PORTB=0; }}}//int main(){LCD_init();DDRF=0x01; DDRB=0x07;a=eeprom_read_word((uint16_t*)20);b=eeprom_read_word((uint16_t*)50);c=eeprom_read_word((uint16_t*)80);disp();TCCR0=0x04; TIMSK|=(1<<TOIE0); //분주비 64 설정sei();while(1){if((PINE&1)==0){ if(++d>=4)d=0; disp(); _delay_ms(100); }//if(d==1){if( (PINE&2)==0 ){ a+=5; eeprom_update_word((uint16_t*)add_A,a); if(sec>=a+b+c)sec+=5; }if(((PINE&4)==0)&&a){ a-=5; eeprom_update_word((uint16_t*)add_A,a); }}if(d==2){if( (PINE&2)==0 ){ b+=5; eeprom_update_word((uint16_t*)add_B,b); if(sec>=a+b+c)sec+=5; }if(((PINE&4)==0)&&b){ b-=5; eeprom_update_word((uint16_t*)add_B,b); }}if(d==3){if( (PINE&2)==0 ){ c+=5; eeprom_update_word((uint16_t*)add_C,c); if(sec>=a+b+c)sec+=5; }if(((PINE&4)==0)&&c){ c-=5; eeprom_update_word((uint16_t*)add_C,c); }}//if(d)disp();//_delay_ms(10);}}
댓글 5
조회수 14,665전자학습자님의 댓글
전자학습자 작성일
안녕하세요. 깔끔하게 정리해주셔서 감사드립니다.
어떤식으로 바꾸셨는지 적용해보고 모르는건 검색해보고해서 나름대로
이것저것 또 바꿔보고했습니다. 수정하다가 궁금한것이 생겨서 질문드립니다.
맨처음 뜬 에러는 main함수안에 sec 변수가 선언이안되어이어서 에러가나서
main안에 if(sec>=a+b+c)sec+=5; 는 다 삭제하고 if( ((PINE&2)==0)&&a<=60 )으로해서
타임 하나당 60초를 넘기지못하게하고 static int sec=200 로 넉넉하게 선언해주었습니다.
질문1. if(((PINE&4)==0)&&a>0) 을 if(((PINE&4)==0)&&a) 로 수정하신것은 a가 1이상? 이면 'H'로 인식해서
결국 a>0과 같기때문에 수정해주신건가요?
질문2. sprintf(s,"%2d.%d %2d.%d %2d.%d",a/10,a%10,b/10,b%10,c/10,c%10);
에서 %2d는 2자리수 표시하라는 명령인거같은데 실제로 돌려보면
6400이 넘는 숫자가 나옵니다. 최초에 숫자가 저장되는 위치에 0값이아닌?
64xx.x 이었는데 정확한숫자는 조작하면서 바뀌어버려서 확인을못했습니다.
저 상태에서 버튼으로 감소하거나 증가하면 6200.0 이런식으로 바꾼뒤
전원을 껏다키면 6200으로 나옵니다. 저장하기전 최초에 0으로 만들려면 어떻게 선언해야할까요?
master님의 댓글
master 작성일
if(a){}
조건식에 변수만 있는 경우
a==0 이면 거짓 (이 정도는 아실테고)
0 을 제외한 모든 수는 참 입니다.(음수도 참)
음수든 양수든 값이 있다 없다로 생각하면 됩니다.
//
if(a>0)
여기서 a가 음수도 나온다면
if(a)
이 문장을 사용하지 못합니다만
a가 양수만 사용한다면 if(a>0) 와 if(a) 는 동일합니다.
master님의 댓글
master 작성일
uint16_t a,b,c;
데이터형을 16비트로 선언하지 않고 8비트로 선언한 것은 아닐까요?
아니면 float 실수형으로 선언 했든지..
master님의 댓글
master 작성일
%2d
0~99는 2자리를 확보하면서 출력, 3자리 이상이면 3자리 이상의 숫자를 그대로 출력함
(1자리일 때의 왼쪽) 여백은 ' '(0x20, 스페이스)를 출력함
//
%02d
0~99는 2자리를 확보하면서 출력, 3자리 이상이면 3자리 이상의 숫자를 그대로 출력함
(1자리일 때의 왼쪽) 여백은 '0'(0x30)을 출력함
전자학습자님의 댓글
전자학습자
답변감사드립니다 ^^