본문 바로가기
임베디드

AVR실습//내부 EEPROM 쓰기

by 꿀꿀이냐옹이 2009. 7. 6.
반응형

#include<avr/io.h>

#include<avr/signal.h>

#include<avr/interrupt.h>

#include<avr/eeprom.h>

 

#define CPU_CLOCK     16000000        

#define TICKS_PER_SEC 1000            

#define PRESCALER     64              

 

volatile unsigned int g_elapsed_time; 

 

void initLED(void);                    

void setTCCR0(void);                  

void initTCNT0(void);                 

void setTIMSK(void);                  

void toggleLED(char *state);         

void sleep(unsigned int elapsed_time);

SIGNAL(SIG_OVERFLOW0);

 

SIGNAL(SIG_OVERFLOW0)

{

           g_elapsed_time++;

 

           TCNT0 = 256 - (CPU_CLOCK / TICKS_PER_SEC / PRESCALER);

}

void sleep(unsigned int elapsed_time)

{

           g_elapsed_time=0;

           while(elapsed_time>g_elapsed_time);

}

void toggleLED(char *state)

{

           *state=~(*state);

           PORTF=*state;

}

void initLED(void)

{

           DDRF=0xFF;

           PORTF=0xFF;

}

 

 

void setTCCR0(void)

{

           TCCR0=(1<<CS02) | (0<<CS01) | (0<<CS00);

}

void initTCNT0(void)

{

           TCNT0 = 256 - (CPU_CLOCK / TICKS_PER_SEC / 64);

 

}

void setTIMSK(void)

{

           TIMSK = (0 << OCIE0) | (1<<TOIE0);

}

 

void eeprom_write(unsigned int uiAddress, unsigned char ucData)

{

//이번의 쓰기가 완료되기를 기다린다

           while(EECR&(1<<EEWE));

 

//주소와 레지스터를 설정한다.

           EEAR= uiAddress;

           EEDR= ucData;

          

//EEMWE 1을 설정한다.

           EECR|= (1<<EEMWE);

          

//EEWE를 설정하여 쓰기 시작한다.

           EECR|= (1<<EEWE);

          

           return;

}

 

unsigned char eeprom_read(unsigned int uiAddress)

{

//이번의 쓰기가 완료되기를  기다린다

           while (EECR &(1<<EEWE));          

 

//주소 레지스터를 설정한다

           EEAR = uiAddress;

 

//EERE를 설정하여 읽기를 시작한다.

           EECR |= (1<<EERE);

          

//데이터 레지스터에서 데이터를 읽는다.

           return EEDR;

          

}

 

 

int main(void)                         //시작

{

 

          

           char k;

           char state=0;

           unsigned char ch=0;

          

           DDRC = 0x00;

           PORTC = 0xFF;

          

           DDRE = 0xFF;

           PORTE = 0xFF;

          

           DDRF = 0xFF;

           PORTF = 0xFF;

          

          

 

           //initLED();                         //LED 초기화

 

           setTCCR0();                        //TCCR0 설정

 

           initTCNT0();                       //TCNT0 초기화

 

           setTIMSK();                        //TIMSK 설정

 

           sei();                             //인터럽트 활성화

 

           k=eeprom_read (30);                                          //이전값 eeprom에 기록된걸 불러옴..

          

           if (k>19) k=0;                                                  //k 19보다 크면 0이다 19보다 작으면 30번지 기억 불러옴

          

           for(unsigned int i=k; ;i++) // 무한루프

           {

                     ch=PINC;

                     if(ch==0b11111110)//1번키를 누르면 EEPROM에기록한다.

                     {

                     //왜냐하며느 새펌웨어 꿉는 순간 EEPROM 이전 기록도 지워진다

                                ch=0;

                                for(unsigned int i=0; i<10; i++) eeprom_write(i,ch++);

                                ch=9;

                                for(unsigned int i=0; i<10; i++) eeprom_write(10+i,ch--);

                     }

                    

                     ch=eeprom_read(i);

                     PORTF = ~ch;

                     PORTE = ch;

                     if (i==19) i=0;

                    

                     eeprom_write(30,ch);      // 주소번지 30

                     

                     /*toggleLED(&state); //LED 반전 */

                     sleep(1000); //1초 대기

           }

 

   return 1;  //종료

}

반응형

댓글