Microprocessor/ATMEGA 128

์•„ํŠธ๋ฉ”๊ฐ€128 (EEPROM์ œ์–ด) [20120530]

Dexter_- 2016. 9. 30. 09:14
728x90
๋ฐ˜์‘ํ˜•

 

 

 

๐Ÿ˜„ ์•ˆ๋…•ํ•˜์„ธ์š” Dexter ์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ์•„ํŠธ๋ฉ”๊ฐ€128 ๋ฐ์ดํ„ฐ๋ฉ”๋ชจ๋ฆฌ์ธ EEPROM ์—๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ  ์‹ค์Šต๊นŒ์ง€ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ณธ๋ฌธ PDF์ž๋ฃŒ๋Š” ์ฒจ๋ถ€ํŒŒ์ผ์— ์žˆ์Šต๋‹ˆ๋‹ค.

 

7์žฅ ๋‚ด๋ถ€ EEPROM ์“ฐ๊ธฐ.pdf
๋‹ค์šด๋กœ๋“œ

 

 

Atmega128 EEPROM ์ œ์–ด

  • EEPROM : 4KB = 2^2 x 1k x 1byte(์ฃผ์†Œ ํ•˜๋‚˜๋‹น 1byte)

= 2^2 x 2^10 x 1byte
= 2^12 x 1byte
= ์ฃผ์†Œ๋Š” 4096๊ฐœ (0 ํฌํ•จ)

EEPROM = DATA Memory์ด๋‹ค.

 

  • EECR(์ปจํŠธ๋กค ๋ ˆ์ง€์Šคํ„ฐ) : 8bit

 

  • EERE : ์‚ฌ์šฉ ๋ช…๋ น
  • EEWE : ์“ฐ๊ธฐ ๋ช…๋ น(์“ฐ๊ธฐ ์™„๋ฃŒํ›„ 0์œผ๋กœ ์„ธํŒ…๋˜์–ด ์žˆ์–ด์•ผํ•จ)
  • EEMWE : ์“ฐ๊ธฐ์ž‘์—…์ „์˜ ๋ช…๋ น(1์„๋„ฃ์–ด์ค„๊ฒƒ)
  • EEAR(Adderss) : ์ƒ์œ„ 4byte๋งŒ ์‚ฌ์šฉ
    • ํ•˜์œ„ 0 ~ 11 ์ฃผ์†Œ ๊นŒ์ง€ 4096๊ฐœ

 

 

  • EEDR(DATA ๋ ˆ์ง€์Šคํ„ฐ) 

 

 

๐ŸŽฏ EECR (Control Register)

 

 

๐ŸŽฏ EEAR (Address Register)

 

 

๐ŸŽฏ EEDR (Data Register)

 

 

๐ŸŽฏ ํ•œ ๋ฐ”์ดํŠธ ์“ฐ๊ธฐ/์ฝ๊ธฐ ์ ˆ์ฐจ

 

 

๐ŸŽฏ EEPROM ๊ด€๋ จ ํ•จ์ˆ˜

 

 

 

Ex) 1๋ฒˆ ํ‚ค ๋ˆ„๋ฅด๋ฉด EEPROM์— ๋ฐ์ดํ„ฐ ๊ธฐ๋ก, 8๋ฒˆ ํ‚ค ๋ˆ„๋ฅด๋ฉด clear ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ

#include <L.h>
#define	KEY_IN PINC
#define 	FND_DDR DDRE
#define 	FND_OUT PORTE

int main() 
{
	unsigned char ch = 0;

	init_FND();
	initTC0_overflow();
	init_switch();

	for (unsigned int i=0; ; i++) {
		ch = KEY_IN;

        if (ch == 0b11111110) {		// 1๋ฒˆ์Šค์œ„์น˜๋ฅผ๋ˆ„๋ฅด๋ฉดEEPROM์—๋Œ€์ดํ„ฐ๊ธฐ๋ก   
            ch = 0;
            
            for (unsigned int a = 0; a<10; a++) {
                eeprom_write(a, ch++);
            }

            ch = 9;

            for (unsigned int b = 0; b<10; b++) {
                eeprom_write(10+b, ch--);
            }
        }

        if (ch == 0b01111111) {		// 8๋ฒˆ์Šค์œ„์น˜๋ฅผ๋ˆ„๋ฅด๋ฉดEEPROM๋ฐ์ดํ„ฐ์ดˆ๊ธฐํ™”
            ch = 0;              

            for (unsigned int c = 0; c<20; c++) {
                eeprom_write(c, ch);
            }
        }   

        ch = eeprom_read(i);   

        FND_OUT = ch;    // ์ฝ์–ด์˜จ๋ฐ์ดํ„ฐ๋ฅผFND์—์ถœ๋ ฅ          

        if (i == 19) {
            i = 0;
        }

        sleep(200);
    }

    return 1;
}

 

๊ฒฐ๊ณผ : ๋™์˜์ƒ ์ฐธ๊ณ 

 

 

์˜ˆ์ œ) ์‹ค์Šต ๋ฌธ์ œ

 

๐Ÿ’ก ์š”๊ตฌ์‚ฌํ•ญ

  1. LED ์™€ KEY ์‚ฌ์šฉ
  2. ๊ฐ LED๋Š” ์ด์›ƒํ•œ ๊ฐ KEY๋ฒ„ํŠผ๊ณผ ์ง์ด ๋œ๋‹ค.
  3. KEY๋ฅผ ๋ˆ„๋ฅด๋ฉด LED๋Š” ์ด์ „์ƒํƒœ ์œ ์ง€ํ•˜๋ฉด์„œ ํ•ด๋‹น LED๊ฐ€ ON๋จ
  4. ํ˜„์žฌ์˜ ์ƒํƒœ๋ฅผ ๋งค๋ฒˆ EEPROM์— ๊ธฐ์–ต์‹œํ‚จ๋‹ค.
  5. DK-128์˜ ์ „์›์„ ๊ป๋‹ค๊ฐ€ ์ผฏ์„ ๋•Œ, ์ด์ „์˜ LED ์ƒํƒœ๋ฅผ ๊ทธ๋Œ€๋กœ ํ‘œ์‹œํ•œ๋‹ค.
#include <L.h>
#define KEY_IN			PINC
#define FND_DDR		DDRF
#define FND_OUT		PORTF   

int main(void)
{
    unsigned char ch = 0;
    unsigned char sh = 0xFF;
    unsigned char le = 0xFF;   

    init_LED();
    init_TC0();
    init_switch();   

    for (unsigned int i=0;;i++) {
        sh = KEY_IN;
        le = FND_OUT & sh;   

        for (unsigned int a = 0; a<9; a++) {
			FND_OUT = le;                
            if (le != 0xFF) {
            	eeprom_write(a,le);
            }
        }            

        ch = eeprom_read(i);
        FND_OUT = ch;       

        if (FND_OUT == 0x00) {
			FND_OUT = 0xFF;
        }

        if (i >= 8) {
            i= 0;
        }

        sleep(200);
    }

    return 1;
}

 

 

ํ—ค๋”ํŒŒ์ผ์€ ์œ„ ์†Œ์Šค๋„ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

[ header ํŒŒ์ผ ] ↓

#define DDRE	*((volatile unsigned char *)0x22)
#define PORTE	*((volatile unsigned char *)0x23) 
#define PINC	*((volatile unsigned char *)0x33)
#define DDRC	*((volatile unsigned char *)0x34)
#define PORTC	*((volatile unsigned char *)0x35)  
#define PINF	*((volatile unsigned char *)0x20)
#define DDRF	*((volatile unsigned char *)0x61)
#define PORTF	*((volatile unsigned char *)0x62)
#define PIND	*((volatile unsigned char *)0x30)
#define DDRD	*((volatile unsigned char *)0x31)   
#define TCCR0	*((volatile unsigned char *)0x53)
#define TCNT0	*((volatile unsigned char *)0x52)
#define TIMSK	*((volatile unsigned char *)0x57)
#define SREG	*((volatile unsigned char *)0x5F)
#define EEDR	*((volatile unsigned char *)0x3D)
#define EEARH	*((volatile unsigned int *)0x3F)
#define EEARL	*((volatile unsigned int *)0x3E)
#define EECR	*((volatile unsigned char *)0x3C)   
#define EEAR	*((volatile unsigned int *)0x3E) 
#define EERE	0    
#define EEWE	1
#define EEMWE	2 

#define TOIE0			0
#define CPU_CLOCK		16000000
#define TICKS_PER_SEC	1000
#define PRESCALER    	64   

/* delay */    
volatile unsigned int g_elapsed_time;   

void sleep(unsigned int elapsed_time)
{
    g_elapsed_time = 0;
    for (;g_elapsed_time<elapsed_time;);
} 

void __vector_16 (void) __attribute__ ((signal, used, externally_visible));
void __vector_16 (void)
{
    TCNT0 = 6;
    ++g_elapsed_time;
}

/* ์Šค์œ„์น˜ */
void init_switch(void)
{
    DDRC = 0x00;
}

/* LED ์ดˆ๊ธฐํ™” */
void init_LED(void) 
{
    DDRF = 0xFF;
    PORTF = 0xFF;
}

/* FND ์ดˆ๊ธฐํ™” */  
void init_FND(void)
{
    DDRE = 0xFF;
    PORTE = 0xFF;
}

/* ์ ์™ธ์„ ์„ผ์„œ */
void init_URS(void)
{
    DDRD = 0x00;
}

/* Timer/counter Control regi์ดˆ๊ธฐํ™” */
void init_TC0(void)
{
    TCCR0 = 0x04;
    TCNT0 = 6;
    TIMSK = TIMSK | (1<<TOIE0);

    /*์ „์ฒด์ธํ„ฐ๋ŸฝํŠธํ™œ์„ฑํ™”*/
    SREG = SREG | (1<<7);
}

/* eeprom Write */
void eeprom_write(unsigned int uiAddress, unsigned char ucData);
void eeprom_write(unsigned int uiAddress, unsigned char ucData)
{
    while (EECR&(1<<EEWE));
    EEAR = uiAddress;
    EEDR = ucData;
    EECR |= (1<<EEMWE);
    EECR |= (1<<EEWE);

    return ;
}

/* eeprom Read */
unsigned char eeprom_read(unsigned int uiAddress);
unsigned char eeprom_read(unsigned int uiAddress)
{
    while(EECR&(1<<EEWE));   

    EEAR = uiAddress;
    EECR |= (1<<EERE);   

    return EEDR;
}

 

๊ฒฐ๊ณผ : ๋™์˜์ƒ ์ฐธ๊ณ 

 

 

๊ถ๊ธˆํ•˜์‹  ์ ์€ ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”. ๐Ÿ˜„ ์˜ค๋Š˜๋„ ์ข‹์€ ํ•˜๋ฃจ ๋˜์„ธ์š”.

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•