본문 바로가기
임베디드

AVR 실습 내부 EEPROM 쓰기

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

[요구사항]
LED와 KEY를 사용한다
각 LED는 이웃한 각KEY버튼과 짝이 된다.
각 KEY를 누르면 LED가 토글된다.
현재의 상태를 매번 EEPROM에 기억시킨다.
DK-128의 전원을 껏다가 켰을때, 이전의 LED상태를
그대로 표시 하여야 된다..

<코딩>

#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;

volatile unsigned int j=0;

 

void initLED(void);    

void setTCCR0(void);    

void initTCNT0(void);   

void setTIMSK(void);

void sleep(unsigned int sec);

void toggleLED(char a,char b);

void eeprom_write(unsigned int uiAddress, unsigned char ucData);    

unsigned char eeprom_read(unsigned int uiAddress);

SIGNAL(SIG_OVERFLOW0);             // timer0의 오버플로우함수,매크로

 

volatile unsigned int tic_time;    // 시간 변수

volatile unsigned int time=0;

 

 

int main(void)

{

           DDRC = 0x00;                   // key

           PORTC = 0xFF;

 

           unsigned char ch=0;

          

           initLED();       // LED초기화

           setTCCR0();    // TCCR0 설정

           initTCNT0();    // TCNT0 초기화

           setTIMSK();    // TIMSK 설정

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

 

           for(;;)

           {   

                     ch = ~PINC;

                     PORTF = eeprom_read(j);

 

                     if(ch!=0)

                     {

                                toggleLED(ch,PORTF);

                                eeprom_write(j,PORTF); 

                                sleep(300);

                     } 

           }

 

 return 1;  

}

 

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 a,char b)  //토글

{

           PORTF = (a^b);

}

void initLED(void)  // LED 초기화

{

           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;

          

}

 

반응형

댓글