ABOV 8051 계열의 MCU 들에 사용 하던 OCD-I/II 의 프로그램이 업그레이드 되었다.

 

가격대비 성능이 좋은 ABOV MCU의 유일한 단점이었던 디버깅의 불편함이

 

이번 업그레이드로 대폭 사라졌다.

 

그동안 가장 문제가 배열이나 구조체 디버거가 안되어서 트릭을 써서 확인해야 했고

 

자체 지원하는 디버거 프로그램이 무거워서 가끔 PC가 버벅거리는 문제도 있었다.

 

이번에 업그레이드 되면서 Keil plug-in 을 지원하는데

 

이로 인해 이런 문제가 한번에 해결되었다. KEIL 컴파일러에서 바로 하면 된다.

 

http://www.abov.co.kr/en/index.php?Depth1=5&Depth2=2&Depth3=2

 

 

Description

On-chip debugger program is for 8-bit MCUs what has a OCD1 and OCD2 block inside. This is a debugging software and support ABOV's M8051 series MCUs.

In order to use this software, OCD1/2 interface H/W is required. OCD2 uses two channel to download user's code, reads and modifies the internal memory and SFR(Special Function Register). So it can work even the MCU is attached on the target system. Besides, it can be run at MCU's maximum speed in OCD mode.

Features

  • Supported M8051 core products.
  • MCU emulation control via 2-pin OCD interface. Two pins interface OCD clock and data.
  • Compact size and Cost effective emulator.
  • Emulation and debugging on the target system directly.
  • OCD2 used as an ISP (In System Programming) and real-time emulation.
  • OCD1 is used to debug 'MC93/95/96' products and OCD2 is used to debug 'MC97', MC93F5516, OCD1 supporting products.
  • Setup file includes KEIL plug-in debugger library. Please see details in OCD User guide.

 

Downloads
Title File Name Type Language Version Issue Date Size Down
OCD S/W 32bit (include KEIL plug-in) Setup32_OCD2_debugger_V2.014.exe English 2.014 2014-08-12 6.28MB
OCD S/W 64bit (include KEIL plug-in) Setup64_OCD2_debugger_V2.014.exe English 2.014 2014-08-12 6.33MB
OCD User Guide ENG_DBG_OCD1-2_userGuide_V1.02.pdf English 1.02 2014-07-29 4.02MB
OCD User Guide CHN_DBG_OCD1-2_userGuide_V1.02.pdf Chinese 1.02 2014-07-29 4.05MB

 

 

'공부 > 8051' 카테고리의 다른 글

ABOV 8051 On-Chip Debugger  (0) 2014.06.19
ABOV MC9x Code Generator  (0) 2014.06.19
8051 레지스터 자료  (0) 2012.11.15
[ADUC831] ADUC831 간단 매뉴얼 6  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 5  (0) 2012.11.12

 

Abov에서 만들어진 8051은 On-chip 디버거가 가능하다.

OCD1과 OCD2라는 전동 디버거 장비와 전용 프로그램을 사용 하면 된다.

On-Chip Debugger

Description

On-chip debugger program is for 8-bit MCUs what has a OCD1 and OCD2 block inside. This is a debugging software and support ABOV's M8051 series MCUs.

In order to use this software, OCD1/2 interface H/W is required. OCD2 uses two channel to download user's code, reads and modifies the internal memory and SFR(Special Function Register). So it can work even the MCU is attached on the target system. Besides, it can be run at MCU's maximum speed in OCD mode.

Features

  • Supported M8051 core products.
  • MCU emulation control via 2-pin OCD interface. Two pins interface OCD clock and data.
  • Compact size and Cost effective emulator.
  • Emulation and debugging on the target system directly.
  • OCD2 used as an ISP (In System Programming) and real-time emulation.
  • OCD1 is used to debug 'MC93/95/96' products and OCD2 is used to debug 'MC97', MC93F5516, OCD1 supporting products.

Downloads

Title

File Name

Type

Language

Version

Issue Date

Size

Down

OCD Software for 32-bit

Setup32_OCD2_debugger_V2.012.exe

English

2.012

2014-03-18

5.09MB

OCD Software for 64-bit

Setup64_OCD2_debugger_V2.012.exe

English

2.012

2014-03-18

5.11MB

OCD User Guide

GUIDE_OCD_V1.00_EN.pdf

English

1.00

2013-08-27

3.81MB

OCD User Guide

GUIDE_OCD_V1.00_CH.pdf

Chinese

1.00

2013-08-27

3.86MB

 

소스레벨 디버깅과 변수의 값을 확인/수정 등을 할 수 있다.

OCD2의 경우 동작중에 실시간 변수값 확인도 가능 하다.

상당히 저가인 MCU 가격을 생각하면 참 쓸만한 기능이다.

 

하지만 배열 변수의 경우 읽을 수 없는 단점이 있다.

 

'공부 > 8051' 카테고리의 다른 글

ABOV 디버거의 Keil plug-in  (0) 2014.09.01
ABOV MC9x Code Generator  (0) 2014.06.19
8051 레지스터 자료  (0) 2012.11.15
[ADUC831] ADUC831 간단 매뉴얼 6  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 5  (0) 2012.11.12

 

국내 IC 제어 업체 인 ABOV 에서 자사 8051 MCU 중 일부에 대한 Code Generator 를 공급한다.

ABOV 8051 MCU별로 레지스터 및 인터럽트 번지등이 약간씩 달라서 사용할 때 찾아 봐야 할것이 많은데

약간 부족하긴 해도 나름 쓸만 하다.

 

http://www.abov.co.kr/en/index.php?Depth1=5&Depth2=1&Depth3=1

 

VPE (MC9x Code Generator)

Description

VPE (Visual Programming Environment) is a code generation program for ABOV's M8051 series microcontrollers. VPE help user to generate C-based frame source program and offers very easy and comfortable user interface. The device which is supported by VPE will be expanded and updated continuously.

Features

  • Supports MC9X products
  • Easy and comfortable user interface
  • Automatically Generating C-based Code

Downloads

Title

File Name

Type

Language

Version

Issue Date

Size

Down

VPE Software V1.013

Setup_VPE_1.013.exe

 

English

1.013

2014-05-30

6.4MB

VPE User Guide V1.00

GUIDE_VPE_V1.00_EN.pdf

English

1.00

2013-08-09

1.28MB

VPE User Guide V1.00

GUIDE_VPE_V1.00_CH.pdf

Chinese

1.00

2013-08-28

1.33MB

Related Products

MC95FG208, MC95FG308, MC96F6332, MC96F6432, MC96F6632, MC96F6832, MC96F7416A, MC96F7616A, MC96F7616T, MC96F7816, MC96F8208S, MC96F8216, MC96F8316, MC97F1316, MC97F1216, MC97F1215, MC97F1204, MC97F1104, MC97F2464, MC97F2664, MC96F6408A, MC96F6508A, MC96FC664A, MC96FC864A, MC96F4548, MC96FM204, MC96FM214, MC95FG0128, MC95FG8128, MC95FG6128, MC96FB504, MC96F7864, MC96F7664

 

인스톨 하면 사용 하고자 하는 MCU와 프로젝트 명을 입력 하고 New project 를 선택 해서 신규 생성하던가

 

기존에 만들어진 프로젝트를 읽어 들이는 Load a project 를 선택 하면 된다.

 

소스 파일과 (디렉토리별) Device의 pin map 그리고 각종기능을 설정하는 창으로 되어 있으며

자신이 사용하고자 하는 기능을 설정 한 후 저장 버튼 처럼 생긴 버튼을 누르면 해당 프로잭트 소스가

생성 된다.

 

아쉬운 점은 코드 생성시 예제 소스 처럼 레지스터를 bit 형태로 표시해 주지 않고 상수 값으로 넣는 것

Define 에 대한 주석을 달아주는 기능이 들어 갔으면 한다.

 

그래도 이 정도 라도 만들어준 ABOV에 박수를 보낸다.

'공부 > 8051' 카테고리의 다른 글

ABOV 디버거의 Keil plug-in  (0) 2014.09.01
ABOV 8051 On-Chip Debugger  (0) 2014.06.19
8051 레지스터 자료  (0) 2012.11.15
[ADUC831] ADUC831 간단 매뉴얼 6  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 5  (0) 2012.11.12

8051 레지스터 자료 입니다.

 

어디서 받았는지 기억이 없습니다.

 

이 자료 만드신분에게 감사 드립니다.

 

 

8051레지스터.pdf

'공부 > 8051' 카테고리의 다른 글

ABOV 8051 On-Chip Debugger  (0) 2014.06.19
ABOV MC9x Code Generator  (0) 2014.06.19
[ADUC831] ADUC831 간단 매뉴얼 6  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 5  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 4  (0) 2012.11.12

 

SPI의 사용

 

1    SPI의 기본사항

DATA를 시리얼 형태로 통신하는 방법은 많이 있다. 그 중 주변소자와 통신하는데 사용하는 대표적인 방식으로는 I2C,SPI 등을 말할 수 있으며 이번 장은 그 중 ADUC831에서 SPI MASTER 기능은 어떻게 사용하는지 설명 하려 한다.

 

2    SPI의 관련 레지스터

 

ADUC831 SPICON define

BIT7 

ISPI

1:SPI 인터럽트 동작조건 SPIDAT 전송이 완료되면 발생된다. 사용자의 프로그램에 의해 지워야 한다.

BIT6 

WCOL

1:SPI 전송을 위해 SPIDAT 잘못되면 발생된다.

사용자의 프로그램에 의해 지워야 한다.

BIT5 

SPE

1: SPI 사용 enable 설정

BIT4 

SPIM

SPI master/slave 모드 설정

1: master mode , 0:slave mode 

BIT3 

CPOL

Clock 이 발생하지 않을 때 핀의 상태를 나타낸다.

1: high 상태로 유지 , 0: low 상태로 유지

BIT2 

CPHA

DATA가 어떤 클럭에 동기 되는지 설정한다.

1: SCLOCK leading edge에 동기

2: SCLOCK trailing edge에 동기

BIT1 

SPR1

SPI bit 유지 시간을 설정 한다.(SPR1 SPR0 Selected Bit Rate)

00: fCORE/2,     01: fCORE/4,    10: fCORE/8,     11: fCORE/16

BIT0 

SPR0

 

 

3    SPI의 사용을 위한 CHIP 선정

 

SPI Master 활용예를 설명 들이겠습니다. 이를 위해 선정한 CHIP AD5232 2개의 저항을 가지고 있는 Digital Potentiometer 입니다. 내부에 EEPROM(EEMEM) 가지고 있으며 이와 연결된 가변저항 조정 레지스터(RDAC) 있으며 , 기타 콘트롤 부분이 있습니다. 자세한 사항은 관련 매뉴얼을 참고해주시면 감사하겠습니다.

 

EEMEM 비활성 메모리이기 때문에 이곳에 값을 저장해 두면 파워온 자동으로 RDAC 조정하여 저항을 조절하게 됩니다. 그러므로 초기값 설정을 원한다면 EEMEM 사용하면 됩니다. RDAC 값의 조정에 따라 아래의 그래프와 같이 저항성분이 변하게 되어 있습니다.

 

 

SPI 통신 파형은 가지 방식을 지원 합니다. 그러므로 좀더 사용이 편리합니다.

 

기본회로는 아래와 같습니다. 정확한 회로 해석은 ADUC831 AD5232 매뉴얼을 참고해 주시기 바랍니다.

 

회로는 A-GND , B-GND 가지 저항값을 조절하는 회로이다. P1.0 Chip select 용이며 SCLOCK MOSI ADUC831 원래 기능을 활용합니다.

 

4    AD5232 제어 명령

 

AD5232 COMMAND define

상위 8BIT

하위 8BIT

(DATA)

내용

상위 4BIT

(COMMAND) 

하위 4BIT

(ADDRESS) 

0000

xxxx

xxxxxxxx

NOP

0001

000'A0'

xxxxxxxx

EEMEM(A0)의값->RDAC(A0), 실행 후 nop 실행, power up후 실행     

0010

000'A0'

xxxxxxxx

RDAC(A0)의값->EEMEM(A0)

0011

<<ADDR>>

D7 - D0

DATA의값->EEMEM(ADDR)

0100

000'A0'

xxxxxxxx

RDAC(A0)의값을6db감소,ZERO에서 멈춤

0101

xxxx

xxxxxxxx

모든RDAC의값을6db감소,ZERO에서 멈춤

0110

000'A0'

xxxxxxxx

RDAC(A0)의값을'1'감소,ZERO에서 멈춤

1000

0000

xxxxxxxx

기존의 EEMEM값을 RDAC에 다시 넣기(RESET)

1001

<<ADDR>>

xxxxxxxx

EEMEM<<ADDR> 의 값을 0으로 설정

1010

000'A0'

xxxxxxxx

RDAC(A0)의값을0으로 설정

1011

000'A0'

D7 - D0

DATA의 값->RDAC(A0)

1100

000'A0'

xxxxxxxx

RDAC(A0)의 값을6db추가

1101

xxxx

xxxxxxxx

모든RDAC의 값을6db추가

1110

000'A0'

xxxxxxxx

RDAC(A0)의 값을'1'추가

1111

xxxx

xxxxxxxx

모든RDAC의 값을'1'추가

참고사항

<<ADDR>> 는 아래와 같다.

0000:RDAC1의EEMEM,0001:RDAC2의EEMEM,0010:USER1의EEMEM.....

1111:USER14의EEMEM

 

ZERO값은 50옴 저항 값을 가진다.

 

개인적으로 실험해본 결과 위의 명령 중 가장 적절하게 사용하는 방법은 DATA의 값->RDAC(A0) 을 하는 것이며, 만약 EEMEM에 저장하고자 한다면, DATA의 값->RDAC(A0) 을 한후에 RDAC(A0)의값->EEMEM(A0) 을 하는 것을 추천합니다.

다음 부분에서 실제로 사용한 예를 보여 드리겠습니다.

 

 

5    SPI를 사용한 AD5232 제어 SOURCE

 

Source SPI를 초기화 한다.

void openSPI()
{
    SPICON = 0x33;
}

 

Source AD5232의 RDAC조절하여 저항값을 조정한다.

void ad5232_ch_rdac_set(unsigned char sele, unsigned char ch, unsigned char dat)    
{                                            
    unsigned char ddllyy =0;
    unsigned char chip_sel =0;
    unsigned char chip_data =0;
    unsigned int sel =0;

    sel = ad5232_table[sele];
    chip_sel = HIGH_BYTE(sel);
    chip_data = LOW_BYTE(sel);

    ad5232_cs[chip_sel] = chip_data;

//ext_dvr_update1( (0xB0|ch) , dat );

    //txDat = (0xB0|ch);
    ISPI = 0;                     // Clear ISPI bit
    SPIDAT = (0xB0|ch);
    while(!ISPI);                 // Wait until tx complete

    //txDat = dat;
    ISPI = 0;                     // Clear ISPI bit
    SPIDAT = dat;
    while(!ISPI);                 // Wait until tx complete


    //ad5232_cs[chip_sel] = 0;
    //for(ddllyy =0; ddllyy <=1; ddllyy++);
    //ad5232_cs[chip_sel] = chip_data;
    //for(ddllyy =0; ddllyy <=1; ddllyy++);
    //ad5232_cs[chip_sel] = 0;

    ad5232_cs[chip_sel] = 0;
    //ad5232_cs[chip_sel] = chip_data;
    //ad5232_cs[chip_sel] = chip_data;
    ad5232_cs[chip_sel] = chip_data;
    ad5232_cs[chip_sel] = 0;

}

 

Source AD5232의 RDAC의 값을 EEMEM에 저장한다.

void ad5232_rdac_eemem_mov(unsigned char sele, unsigned char ch)    
{                                            
    unsigned char chip_sel =0;
    unsigned char chip_data =0;
    unsigned int sel =0;

    sel = ad5232_table[sele];
    chip_sel = HIGH_BYTE(sel);
    chip_data = LOW_BYTE(sel);

    ad5232_cs[chip_sel] = chip_data;

    ISPI = 0;                     // Clear ISPI bit
    SPIDAT = (0x20|ch);
    while(!ISPI);                 // Wait until tx complete

    ISPI = 0;                     // Clear ISPI bit
    //SPIDAT = dat;
    SPIDAT = 0;
    while(!ISPI);                 // Wait until tx complete


    ad5232_cs[chip_sel] = 0;
    ad5232_cs[chip_sel] = chip_data;
    ad5232_cs[chip_sel] = chip_data;
    ad5232_cs[chip_sel] = chip_data;
    ad5232_cs[chip_sel] = 0;

}

 

'공부 > 8051' 카테고리의 다른 글

ABOV MC9x Code Generator  (0) 2014.06.19
8051 레지스터 자료  (0) 2012.11.15
[ADUC831] ADUC831 간단 매뉴얼 5  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 4  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 3  (0) 2012.11.12

ADC의 사용

 

1    ADC의 기본사항

 

ADUC831은 ADUC812에 비해 ADC기능이 추가 수정되었다. 예를 들어 ADC의 오차를 잡아 주기 위한 Calibration, ADC on/off, 내 외부 레퍼런스의 사용자에 의한 선정 등등.. 그럼 관련 레지스터를 다시 설명 아래에서 다시 설명 드리겠습니다.

 

 

2    ADC의 관련 레지스터

 

ADUC831 ADCCON1 define

BIT7 

MDI 

1:ADC 동작 , 0: ADC 동작정지

BIT6 

EXT_REF 

1:External REF , 0: Internal REF

BIT5 

CK1 

converting clock divider ratio (CK1,CK0 값에따라 adc clk = mclk/x 설정)

x값은-> 00 : 16 ,01 : 2 ,10 : 4 , 11 : 8

BIT4 

CK0 

BIT3 

AQ1 

ADC clk 몇변만에값을추출할것인가? (AQ1,AQ0)

00: 1 ,01: 2 ,10: 3 ,11: 4

BIT2 

AQ0 

BIT1 

TC2 

동작 시작울 timer2 오버플로우 발생으로 한다

BIT0 

EXC 

동작 시작을 외부 convst pin low 되면 한다

 

ADUC831 ADCCON2 define

BIT7 

ADCI

adc 인터럽트발생 bit

BIT6 

DMA

DMA 동작설정

BIT5 

CCONV

continuous conversion 로설정(연속적동작)

BIT4 

SCONV

single conversion으로 설정

BIT3 

CS3

컨버팅체널설정

0000: ch1 ,0001: ch2 ,0010: ch3 ,0011: ch4 ,0100: ch5 ,

0101: ch6 ,0110: ch7 ,0111: ch8 ,1000: 온도 , 1001: DAC1 ,

1010: DAC2 ,1011: AGND, 1100: Vref ,1111: DMA STOP

BIT2 

CS2

BIT1 

CS1

BIT0 

CS0

         :        

ADUC831 ADCCON3 define

BIT7 

BUSY

The ADC Busy Status Bit( 1 = busy)

BIT6 

GNCLD

Gain Calibration Disable Bit ( 1 = Disable)

BIT5 

AVGS1

Averages Selection(평균값 설정)

00 : 15 , 01 : 1, 10 : 31 ,11 : 63

BIT4 

AVGS0

BIT3 

CS3

사용안함

BIT2 

CS2

사용안함

BIT1 

TYPICAL

Calibration Type Select

1 :Gain Calibration(full-scale) , 0: Offset Calibration (zero-scale)

BIT0 

CSCALS0

Start Calibration Cycle( 1 시작 종료시 자동clear)

 

3    ADC의 관련 SOURCE

 

Source ADC오차를 잡아 주기 위해 Calibration 을 실행한다.


void ADC_Calibration()    // open adc
전에사용, only aduc83
{
    ADCCON1 = 0x8C;

    //To calibrate device offset:
    ADCCON2 = 0x0B;             //00001011 -> select internal AGND
    ADCCON3 = 0x25;             //select offset calibration
    while((ADCCON3&0x01));      //
완료확인

    //To calibrate device gain:
    ADCCON2 = 0x0C;             //00001011 -> select internal VREF
    ADCCON3 = 0x27;             //select offset calibration
    while((ADCCON3&0x01));      //
완료확인
}

 

Source ADC초기화를 실행한다.


void OpenADC(int ms) /* LAUNCH ADC CONVERSIONS */ // --> adc
{
    _xuint TM;

EADC = 0; // disable adc -in sfr
    if(ms ==0)        // convst pin ADC on/off .
    {
         ADCCON1 = 0xA1    ;        //1,0,1,0,0,0,1,0
    }
    else
    { //
타이머 인터럽트 활용
         ADCCON1 = 0xA2    ;        //1,0,1,0,0,0,1,0

     TM = 0x10000 - (_uint)((ms * 1000.0) / (OSC_DIVIDE/(OSC/1000000.0)));
     TH2 = HIGH_BYTE(TM); //define.h ((char)(n>>8))
     TL2 = LOW_BYTE(TM); //fefine.h ((char)(n & 0xff))

     RCAP2L = TL2 ; // timer2

     RCAP2H = TH2 ; // - in sfr

     TR2 = 1;             //T2CON = 0x04 ; // run Timer2
    }

ADCCON2 = 0x00 ; // sellect chan = chanal 0
EADC = 1; //enable ADC interrupt -in sfr
}

 

Source ADC값 처리한다..

xdata unsigned int ADC_BUFF[3];

void adc_int() interrupt 6
{
    int add_DA_M;        
    int add_DA_R;
    unsigned char ch_chk;

    if( (ADCCON3 & 0x80) == 0x80 ) return;     //adconverting..
진행중인지 확인

    add_DA_M = (((ADCDATAH & 0x0F) <<8 ) | ADCDATAL);
    ch_chk = (ADCDATAH >> 4) & 0x0F; //
체널만 읽어들인다.
    
    add_DA_R = (int)((0.61*ADMULTIPLE)*add_DA_M) ; // Calculation

 

    switch(ch_chk)
    {
    case 0: ADC_BUFF[0] = add_DA_R;
                 break;
    case 1: ADC_BUFF[1] = add_DA_R;
                 break;
    case 2: ADC_BUFF[2] = add_DA_R;
             break;
        default:
     break;
}

ch_chk++;
if(ch_chk >= ADC_MAX_CH)
{
ch_chk =0;
}

ADCCON2 = ch_chk;     //체널변경

 

 

4    ADC의 관련 기타사항

 

회로 구성 시 주의 해야 할 사항이 있습니다. 노이즈 제거를 위해 다음 그림과 같이 구성하는 것을 추천하며 OPAMP를 연결하기 어렵다면 저항과 케페시터는 꼭 사용하는 것을 추천합니다.

 

레퍼런스 내부 선택 회로

 

'공부 > 8051' 카테고리의 다른 글

8051 레지스터 자료  (0) 2012.11.15
[ADUC831] ADUC831 간단 매뉴얼 6  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 4  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 3  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 2  (0) 2012.11.12

 

내부 XRAM과 스텍 포인트 이동

  1. 내부 XRAM 사용

ADUC831은 8052의 기본 RAM 공간외에 외부 메모리처럼 사용 가능한 XRAM이라는 것을 가지고 있다 이를 사용하기 위해서는 레지스터를 설정해 주어야 한다. 레지스터는 CFG831로 이중 BIT0를 설정하여 사용할 수 있다.

주의할것응 CFG831 비트단위 설정이 된다.

Source 사용예

 

    CFG831 |= 0x01;         

 

  1. 스텍 포인터의 이동

ADUC831은 스택은 8052의 기본 RAM 공간에서만 사용 하는 것과는 달리 XRAM도 스택영역으로 사용이 가능하다. 그 외 기능은 ADUC812와 같이 데이터 메모리 공간을 0xFFFFFF 까지 확장할 수 있습니다. 2개의 DPTR의 사용은 ADUC831을 지원하는 컴파일러에서 설정하여 사용하시면 됩니다. 또한 주의할 것은 CFG831 비트단위 설정이 된다는 것입니다. 외에 CFG831 매뉴얼을 참고해 주세요

 

Source 사용예

 

    CFG831 |= 0x10;         

 

'공부 > 8051' 카테고리의 다른 글

[ADUC831] ADUC831 간단 매뉴얼 6  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 5  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 3  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 2  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 1  (0) 2012.11.12

 

EEPROM

 

1    EEPROM 기본사항

 

ADUC831은 Flash/EE data memory 라고 하는 EEPROM을 4Kbyte를 가지고 있습니다. 그 처리방법은 ADUC812와 같습니다. 자세한 내용은 매뉴얼을 참고해 주시기 바랍니다. 본 문서에서는 www.keil.com 에서 제공하고 있는 관련 소스를 소개해 드리고 싶습니다. 사용하기에 편리하게 되어 있습니다.

 

2    EEPROM 사용(SOURCE)

 

Define 

#define ADI_EE_READ_PAGE 1
#define ADI_EE_WRITE_PAGE 2
#define ADI_EE_ERASE_PAGE 5
#define ADI_EE_ERASE_ALL 6
//#define ADI_EEMEM_SIZE 640UL //audc812
#define ADI_EEMEM_SIZE 4096UL //audc831

 

char flash_erase_all (void);

unsigned long flash_size (void);

unsigned long flash_read (
void *buffer, /* Buffer to fill */
unsigned long len, /* Bytes to read */
unsigned long address); /* FLASH address to read from */

unsigned long flash_write (
const void *buffer, /* Buffer to save */
unsigned long len, /* Buffer length */
unsigned long address); /* FLASH address to write to */

 

Source #1 플레쉬 전체영역 삭제

char flash_erase_all (void)
{
    ECON = ADI_EE_ERASE_ALL;
    return (0);
}

 

Source #2 플레쉬 전체 사이즈 확인

unsigned long flash_size (void)
{
    return (ADI_EEMEM_SIZE);
}

 

Source #3 플레쉬 에서 DATA 읽기

unsigned long flash_read ( void *buffer, unsigned long len, unsigned long address) /* Buffer to fill, Bytes to ,FLASH address to read from */
{
    unsigned char *s = buffer;
    unsigned long i;
    unsigned int addr;
    
    if (address >= ADI_EEMEM_SIZE) return (0UL);    
    addr = (unsigned int) address;    


    EADRL = addr >> 2;
    ECON = ADI_EE_READ_PAGE;

    for (i = 0; i < len; i++)
    {
         switch (addr & 0x03)
         {
             case 0: s[i] = EDATA1; break;
             case 1: s[i] = EDATA2; break;
             case 2: s[i] = EDATA3; break;
             case 3: s[i] = EDATA4; break;
         }

         if (++addr >= ADI_EEMEM_SIZE) break;

         if ((addr & 0x03) == 0)
         {
             EADRL = addr >> 2;
             ECON = ADI_EE_READ_PAGE;
         }
}
return (i);
}

 

 

 

Source #4 플레쉬 에서 DATA 쓰기

unsigned long flash_write ( const void *buffer, unsigned long len, unsigned long address)/*Buffer to save,Buffer length,FLASH address to write to */
{
    const unsigned char *s = buffer;
    unsigned int i;
    unsigned int addr;

    if (address >= ADI_EEMEM_SIZE)      return (0UL);
    addr = (unsigned int) address;
    for (i = 0; i < len; i++)
     {
     if ((i == 0) || (addr & 0x03) == 0)    //read page
     {
     EADRL = addr >> 2;
     ECON = ADI_EE_READ_PAGE;
     }
    //Update the data.
     switch ((addr++) & 0x03)     //data Àоî¿À±â
     {
     case 0: EDATA1 = s[i];
     break;
     case 1: EDATA2 = s[i];
     break;
     case 2: EDATA3 = s[i];
     break;
     case 3: EDATA4 = s[i];
     WRITE_EEPROM:
     ECON = ADI_EE_ERASE_PAGE;
     ECON = ADI_EE_WRITE_PAGE;
     break;
     }
    //Update the address.
     if (addr >= ADI_EEMEM_SIZE)
     break;
     }
    //Write the final page IFF address is not at the start of a new page.
    
if (addr & 0x03)
     {
         addr = ADI_EEMEM_SIZE;
         goto WRITE_EEPROM;
     }

    return (i);
}

 

Source #5 사용예

    unsigned char buf;

 

//내부flash 메모리에저장 Comm0.RxBuff[1]에 들어있는 값을 Flash/EEPROM 번지로 하고

// buf의 값을 저장한다. 1로 설정되어 1byte 저장된다.

 

    buf = Comm0.RxBuff[1] - 0x20;

    flash_write(&buf, 1, (unsigned long)Comm0.RxBuff[1]);        

 

//일정범위(system_set 사이즈) 만큼 DATA를 읽어 온다.

    flash_read (&system_set, sizeof(system_set), 0);

 

//일정주소에서 data를 한바이트 읽어 온다.

flash_read( &buf, 1, (unsigned long)Comm0.RxBuff[1]);

 

 

 

'공부 > 8051' 카테고리의 다른 글

[ADUC831] ADUC831 간단 매뉴얼 5  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 4  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 2  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 1  (0) 2012.11.12
[ADUC812] ADUC812 설명 8  (0) 2012.11.10

+ Recent posts