질문게시판 > 답변 : avreeprom 질문입니다

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

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


BASIC4MCU | 질문게시판 | 답변 : avreeprom 질문입니다

페이지 정보

작성자 master 작성일2018-10-16 17:34 조회2,115회 댓글6건

본문

	

 

// DateTime : 2018-10-16 오후 5:34:51
// by Ok-Hyun Park
#define EE_ADR 0x0000
//-----------------------------------------------------------------------------------
//                            Atmaga 64 EEPROM read_write
//-----------------------------------------------------------------------------------
void uc_eeprom_write(uint addr,uchar data){
  //CLRWDT();
  while(EECR.1);
  EEAR=EE_ADR+addr;
  EEDR=data;
  SREG.7=0//INTERRUPT DISABLE
  EECR.2=1;
  EECR.1=1;
  SREG.7=1//INTERRUPT ENABLE
}
//
void ui_eeprom_write(uint add1,uint add2,uint k){
  uc_eeprom_write(add1,k&0xff); // k 하위바이트
  uc_eeprom_write(add2,k>>8);   // k 상위바이트
}
//
uchar uc_eeprom_read(uint addr){
  //CLRWDT();
  while(EECR.1);
  EEAR=addr+EE_ADR;
  EECR.0=1;
  NOP(); NOP(); NOP(); NOP();
  return EEDR;
}
//
uint ui_eeprom_read(uint add1,uint add2){
  uchar i,juint k;
  j=uc_eeprom_read(add1); // 하위바이트
  i=uc_eeprom_read(add2); // 상위바이트
  k=(i<<8)|j;
  return k;
}
//----------------------------------------------------------------------------
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
#define NOP()    #asm("nop")
#define CLRWDT() #asm("wdr")
bit     flag;
//-------------------------------------------------------------
//                    display_key 관련
//-------------------------------------------------------------
//-------------------------------------------------------------
//                    save,load 관련
//-------------------------------------------------------------
bit   lode_eeprom_on=0;
bit   lode_time_on=0;
bit   save_eeprom_on=0;
bit   save_time_on=0;
uchar realy_num_on;
bit   eeprom_save_on;
bit   eeprom_lode_on;

 

코드비젼 소스인데 어째서 eeprom 함수를 사용하고 있을까요?

코드비젼은 위처럼 어렵게 함수를 사용하지 않아도 됩니다.

작성시기가 아주 오래된 소스코드인가봅니다.

 

 

 

// DateTime : 2018-10-16 오후 5:42:48
// by Ok-Hyun Park
//----------------------------------------------------------------------------
typedef unsigned char U08;
typedef unsigned int  U16;
typedef unsigned long U32;
//-------------------------------------------------------------
bit flag;
U08 realy_num_on;
eeprom U08 EE_realy_num_on// eeprom
//
void main(){
  realy_num_on=EE_realy_num_on// eeprom to sram
  if(realy_num_on==0xFF)realy_num_on=EE_realy_num_on=0// 변수 범위를 벗어나면 초기화
  while(1){
    if(eeprom_save_flag){ eeprom_save_flag=0EE_realy_num_on=realy_num_on; } // sram to eeprom
  }
}

 

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

댓글 6

조회수 2,115

김광영님의 댓글

김광영 작성일

제가 코딩을 제대로 다시 공부 시작한건 군제대후 1년정도 입니다.
메인에서는 파워서플라이가 제대로 작동하는지 확인하는 프로그램과 추가적으로 위의 헤더파일을 사용하는
파워서플라이가 두개의 파워서플라이를 연결해서 한쪽만 먼저 작동하고 작동하는 서플라이가 이상이나 문제가 이상이나 문제가 생기면 남은 하나의 서플라이가 작동하는 원리로 코딩을 했다는데 이걸 전달해 주기위해서 저런 코딩을 사용한거 같습니다. 위에 코드는 최초 2007년에 만들었고 2016년도에 수정을 한번 한거라고 되있습니다. 위에 함수를 사용하지않고 쉽게 서로 연결하여 주고 받을수 있는 함수가 있을까요?
있다면 어떻게 사용을 해야될까요?? 추가적으로 보드는  atmega8을 사용중입니다!!

master님의 댓글

master 댓글의 댓글 작성일

코드비젼에서는 함수를 사용하지 않습니다.
sram 변수와 동일하게 사용하면 되고
변수 앞에 eeprom만 붙이면 됩니다.
//
그외 주의사항은 함수를 사용하는 것과 동일합니다.
예를들면
eeprom 변수는 초기값을 설정하지 않는다
횟수제한이 있으므로 꼭 필요한 경우에만 저장한다

김광영님의 댓글

김광영 작성일

그렇군요.. 그냥 제가 사용하던 프로그램과 달라서 더욱 어렵게 느껴지는거 같습니다. 비슷하지만 달라서 그런가봐요. 제가 코드비전에 대해서 공부를 더해봐야 될거 같습니다. 위 파일이 현장실습 갔을때 주신 파일인데 외부로 유출해도 된다고 하셨지만 여기에 그냥 올리기에는 뭔가 안될거같아서 그러는데 혹시 개인적으로 메인 함수 부분에 대해서 설명해주실수 있을까요??? 옛날 코드라고 말씀하셔서 그런지 비슷한 항목을 검색해봐도 나오지 않습니다...ㅠㅠ

master님의 댓글

master 댓글의 댓글 작성일

전문가에게 의뢰해서 소스코드를 변경하는 것은 수십만원~수백만원 이상의 고액을 지불해야합니다.
공짜로 도움을 받을 수 있다면 유출해도 된다는데 뭐가 문제일까요?
//
사이트에 굉장히 많은 자료가 있습니다.
eeprom에 관한 글도 있으니 찾아보시고요 (두어번 적은 것 같습니다.)
자료가 너무 많아서 저도 위치를 다 기억하지 못합니다.
AVR 자료실에 있을 것도 같고
다른 강좌에 있을 것도 같습니다.

김광영님의 댓글

김광영 댓글의 댓글 작성일

넵 감사합니다

율이님의 댓글

율이 댓글의 댓글 작성일

안녕하십니까 eeprom에 대해여 찾아보고 공부하였는데
시스템이 돌아가는지 이해가 안됩니다,,, 전체 코딩을 올립니다
하나하나 주석을 넣고 있는데 eeprom이 초기화를 해선 안된다는 건 알았는데 이다음 내용이 뭔질 모르니 자세히 무슨 핀의 값을 저장하고 내보내고 다시 저장하는지 모르겠습니다.


Program type        : Application 
Memory model        : Small
External SRAM size  : 0
Data Stack size    : 256

 수정 사항  2016.12.31

 TIMER INTERR 0  Routine

*****************************************************/
/*
080709 : 입력 접점이 붙었을때부터 10초 딜레이
*/
#include <mega8.h>                  //아트메가8 사용을 위한 헤더파일
#include <variable.h>             
#include <avreeprom.h>            //통신을 위함 헤더파일

#define led_ac PORTC.0    // 교류입력에 대한 출력 포트
#define led_m1_error PORTC.1
#define led_equality PORTC.2
#define led_no_equality PORTC.3

#define out_m1_play     PORTC.4
#define out_r1_play     PORTC.5


#define in_m2_play      PINB.1
#define in_m2_fail  PINB.0
#define in_ac PIND.7  // 교류입력연결 확인 변수
#define in_equality  PIND.6

#define in_auto PIND.5
#define in_play PINB.7
#define in_m1_fail  PINB.6

#define ON     0          //변수 값 지정
#define OFF    1

#define RUN    1
#define STOP    0

#define FAIL    0
#define normal 1

unsigned int  delay_time;

unsigned char  Cnt_1ms =0;              //시간 측정을 위한 변수 선언
unsigned char  Cnt_10ms =0;

unsigned char  Time0_Value = 131;          //타이머 관련 변수(1초를 만들기위한 값)
unsigned char  out_r1_play_Cnt = 0;
//unsigned char  Timer0_Status = 0;

void init_set(void)
{
PORTB=0x00;      //입출력 및 초기값 설정
DDRB=0x00;
PORTC=0x00;
DDRC=0xff;
PORTD=0x00;
DDRD=0x00;


    TIMSK=0x01;
TCCR0=0x04;        //NEW 0X04 64K  //old 32clk(0x3)
    TCNT0=0xff;
//  SREG =0X80;

TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00 ;
ICR1L=0x00 ;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
 //==========================================================
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00 ;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00 ;


//  INT0: Off
//  INT1: Off
    MCUCR=0x00;


    ACSR=0x80 ;
    SFIOR=0x00;


    #pragma optsize-
    WDTCR = 0b00011000;     //WATCHDOG setting
    WDTCR = 0b00001111;

//  WDTCR=0x1F;
//  WDTCR=0x0F;
    #ifdef _OPTIMIZE_SIZE_
    #pragma optsize+
    #endif
}

//==========================================================
//              타이머 0 오버플로우 인터럽트 함수
//        Timer 0 overflow interrupt service routine
//==========================================================

interrupt [TIM0_OVF] void timer0_ovf_isr(void)    // 수정 한부분  2016.12.31 파형을 통해서 주기를 계산하여 타이머 만들기
{
// TCNT0=0x82;

    TCNT0 = Time0_Value;
  flag = 1;
    Cnt_1ms++  ;        //증가


    if(Cnt_1ms >= 10)
    {

    Cnt_1ms = 0;          //초기화
    Cnt_10ms++ ;          //증가

    }
    if(Cnt_10ms >= 10)
    {
        if(out_r1_play == OFF)
        {
            if(in_m2_play == STOP)
                  out_r1_play_Cnt++;
            else  out_r1_play_Cnt = 0;
        }
    Cnt_1ms  = 0;        //초기화
    Cnt_10ms = 0;

//  Timer0_Status  = ~Timer0_Status ;      //LED ON OFF BIT
    }

// 16M에 128분주 1ms는 TCNT0 = 131;이다
// count가 증가하면 펄스는 줄어든다
// 1msec = (CLK 16000000/분주 128)*0.001 = 125 = 256 - 125 = 131

}

void main(void)          ///풀업저항 사용
{
init_set();

out_r1_play = uc_eeprom_read(10);
out_m1_play = uc_eeprom_read(11);

#asm("sei")
    SREG |= 0b10000000;  //INTERRUPT ENABLE
while(1)
    {
/*
        if(Timer0_Status==0)
            Port = 0x00;
        else Port = 0x00;
*/
#asm("wdr")
if(flag)
        {
flag = 0;

if(in_m1_fail == FAIL)
            {
led_m1_error = 1;
}
else led_m1_error = 0;

if(in_equality)          // 균등시 1 부동시 0
            {
led_equality = 1;
led_no_equality = 0;
}
else
            {
led_equality = 0;
led_no_equality = 1;
}
if(out_r1_play == OFF)
            {
led_m1_error = 0;
led_equality = 0;
led_no_equality = 0;
}


if(in_play == STOP)            // 작동 정지시
            {
delay_time = 1500;

if(eeprom_save_on == 1)
                {
eeprom_save_on = 0;
uc_eeprom_write(10,out_r1_play);
uc_eeprom_write(11,out_m1_play);
}
eeprom_lode_on = 1;

out_r1_play = OFF;
out_m1_play = OFF;
}
else
            { // 작동중
if(in_auto == 0) // 오토모드일때
                {
eeprom_save_on = 1;

if(in_m1_fail == FAIL)
                    {
// if(out_r1_play != ON && in_m2_play == RUN)
//                      {
out_m1_play = OFF;
// }
// out_r1_play = OFF;
/* if(in_m1_fail == FAIL)
                        {
if(delay_time != 0)
                            {
delay_time--;
}
}
if(in_m2_play == normal)
                        {
delay_time = 0;
}
if(delay_time == 0)
                        {
out_r1_play = OFF;
out_m1_play = OFF;
}
*/
                    }
else
                    {
out_m1_play = ON;
// delay_time = 1500;
// out_r1_play = ON;
// out_m1_play = ON;
}
                    //-----------------------------------------------------------  // 수정 한부분  2016.12.31
                    if(out_r1_play == OFF)
                    {
                        if((out_r1_play_Cnt >= 7 )&&(in_m2_play == STOP))        //  10=1sec , 20=2sec  30=3sec
                        {
    out_r1_play = ON;
                        out_r1_play_Cnt = 0x00;
    }
                        else out_r1_play = OFF;
                    }

                  //-----------------------------------------------------------
if(in_m2_fail == normal)
                    {
out_r1_play = OFF;
}

                }
else
                {
/* if(eeprom_lode_on == 1)
                    {
eeprom_lode_on = 0;
out_r1_play = uc_eeprom_read(10);
out_m1_play = uc_eeprom_read(11);
}
if(eeprom_save_on == 1)
                    {
eeprom_save_on = 0;
uc_eeprom_write(10,out_r1_play);
uc_eeprom_write(11,out_m1_play);
}
}
                */
out_r1_play = ON;
out_m1_play = ON;
}
}
}  //if
  } // while
}  //main

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

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
게시물 검색

Privacy Policy
MCU BASIC ⓒ 2017
모바일버전으로보기