#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; //종료
}
'임베디드' 카테고리의 다른 글
AVR실습 윈도우 기반의 직렬통신(Read) (0) | 2009.07.14 |
---|---|
AVR실습 윈도우 기반의 직렬통신(Write) (0) | 2009.07.14 |
AVR실습 직렬통신 (0) | 2009.07.14 |
AVR실습 외부 EEPROM쓰기 (0) | 2009.07.08 |
AVR 실습 내부 EEPROM 쓰기 (0) | 2009.07.07 |
댓글