深入浅出 AVR - go-gddq.com · 大量的应用实例,完整的程序代码。 5. ... 深入浅出avr——使用atmega48/88/168 实例2 avr最小系统diy — 5 — 反复检查

Embed Size (px)

Citation preview

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168

    ATmega48/88/168

    AAVVRR

    AVR DIY

    DEMO

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    1.

    2.

    3.

    1.

    2.

    3.

    4.

    5.

    6.

    1.

    2. AVR

    3. C

    4.

    21ICBBS OurAVR

    2007 9 5

    IT IS ONLY A

    DEMO EDITI

    ON

    hpNote---------------------------------- http://www.ouravr.com/bbs/bbs_list.jsp?bbs_id=1038

    http://www.ouravr.com/bbs/ ...

  • IT IS ONLY A

    DEMO EDITI

    ON

    DA

    TASH

    EE

    T

    DA

    TASH

    EE

    T

    Datasheet

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 2 AVR DIY

    1

    AVRDIY

    ATmega48/88/168

    DIY

    100ATmega8

    ATmega48/88/168ATmega8

    [] ATmega48/88/168

    ISP

    RS232I2CE2PROM6

    ATmega48/88/168

    220V9V-12V

    500mA

    150x120mm

    1

    0.1uF 35V11

    0.01uF 16V1

    20pF 16V2

    2

    DA895

    1

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 2 AVR DIY

    2

    1000uF/35V CD11X 1

    470uF/16V CD11X 1

    47uF/16V CD11X 1

    10Ohm w/4 1

    10k w/4 4

    470Ohm w/4 23

    ATmega48V-10PI 1

    L7805CV 1

    AT24C01A-10PU 1

    M74HC04B1R 1CD4069

    MAX202ECPE 1MAX202CPP

    5V 1

    9014C 1

    1N4007 1

    1N4148 1

    8MHz 1

    5mm 1

    1

    5mm LED 21

    5mm LED 1

    5mm LED 1

    LED

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 2 AVR DIY

    3

    100

    DIP-8 1

    DIP-14 1

    DIP-16 1

    2.54mm 4-5

    2.54mm 2

    2.54mm 2

    7805

    ISP

    [] 6

    6

    2.1

    ISP

    2

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 2 AVR DIY

    4

    RS232I2CE2PROM

    [] 2.2

    9~12V5VXS2XS3

    5V

    V1

    V2

    2.3

    2.4

    2.2

    + -

    2.3

    V2

    5V

    V1

    A1

    OUT

    A1

    GND

    DA895

    5mm

    LED

    DA895

    2.1

    RS232

    ISP I2C E2PROM

    3

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 2 AVR DIY

    5

    V2XS2XS3

    5V0.2V

    [ ISP ] ISP

    2.5

    I/O

    2.6 I/OLED

    XS5A/DR23C14C15

    2.4-

    +5V

    GND

    2.6 -

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 2 AVR DIY

    6

    XS5XTAL1XTAL2

    C11C12

    2.7

    2.5

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 2 AVR DIY

    7

    2.8

    2.7 -

    AVCC

    AVCC

    PC5

    PC4

    PC3

    PC2

    PC1

    PC0

    PB5

    PB4

    PB3

    PB2

    PB1

    PC6

    PD0

    PD1

    PD2

    PD3

    PD4

    PB7

    PD5

    PD6

    PD7

    PB0

    PB6

    2.8

    DA895

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 2 AVR DIY

    8

    I/O I/O

    LED Hz

    AVR

    MAX202AT24C01A

    A/DI/O

    PC6 PC6RESET

    2.7 PC6

    PB6XTAL1/ PB7XTAL2 RCXTAL1ATAL2

    I/OPB6PB7

    I/O

    ISP2.9

    2.10STK200/300

    3

    DA895

    RESET

    PC6

    DA895

    2.9 ISP

    5mm

    LED

    DA895

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 2 AVR DIY

    9

    [] 4

    XS61

    2.12

    2.11

    BUZZER

    DA895

    2.12 -

    XS6

    9014C

    DA895

    2.10 ISP -

    +5V

    GND

    GND

    GND

    GND

    MOSIPB3

    RESET

    SCKPB5

    MISOPB4

    ISP

    LED

    ISP

    DA895

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 2 AVR DIY

    10

    XS6

    +5V

    []

    1.7

    2.13 XS9

    XTAL1 2.14

    XS9

    5VGND0V

    [ RS232 ] RS232

    5V10VRS232

    RS232

    74HC04

    3

    3

    GND

    DA895

    2.13

    2.14 -

    XS9

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 2 AVR DIY

    11

    RS-232 Transceivers

    MAX20222

    5VMAX3232223V

    TIINTERSILSIPEXADI DC-DC10V

    MAX202ECPEMAX202CPP

    RS232

    DC-DCMAX2022

    10V 12.16RS232

    PC

    DC-DC

    -

    ESR

    DA895

    ESD

    Human body

    mode

    Machine Mode

    DA895

    2.14 RS232

    2.15

    3

    1~2m

    9 D

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 2 AVR DIY

    12

    5 GND

    2 PC

    TXD

    3 PC

    RXD

    PC 9

    D

    PC

    TXDXS4

    1 RXD XS4 3

    9 D

    1

    2.16

    PC RXD

    GND PC TXD

    RXD

    GND TXD

    2.17 RS232 -

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 2 AVR DIY

    13

    TXDRXD

    MAX202

    XS1013

    [ I2C E2PROM ]

    AT24C01A 16

    24C01

    STK-200/300

    10V

    16

    DA895

    2.18 I2C E2PROM

    2.19 I2C E2PROM -

    I2C

    SDA SCL I2C

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 2 AVR DIY

    14

    [STK-200/300 ] STK-200/300PCSPIAVR

    2.21

    STK200/300

    50x50mm

    0.1uF 35V1

    1N4148 1

    10k w/4 1

    2.20

    4

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 2 AVR DIY

    15

    74HC

    244

    3

    PC

    V1

    R1

    MISO

    CMOS HC,

    TTL LS

    PC

    DA895

    2.21

    STK

    -200

    /300

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 2 AVR DIY

    16

    STK200/300[]

    SN74HC244N 1M74HC244B1R

    DIP-20 1

    DB25

    101.5m

    180.5m

    DB25

    [ STK-200/300 ]

    8DB25

    1 DB25

    2.22 DB25

    5 DB25

    6

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 2 AVR DIY

    17

    ISP10

    [STK-200/300 ] AVR

    test.ctest.hex

    2.23 ISP

    7 ISP

    2.24 ISP

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 2 AVR DIY

    18

    ATmega48CKSEL3..0

    RC

    MCU2.25 FLASHFLASH

    FLASH test.hex

    FF

    2.25

    2.25 MCU

    2.26 FLASH

    0xFF

    0xFF

    DA895

    8

    9

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 2 AVR DIY

    19

    STK200/300ISPXS8

    FUSEISP

    74HC244

    PB6PB7

    ! MCU

    2.27

    DA895

    10

    2.27

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 2 AVR DIY

    20

    PB6PB7

    C11C12

    7805

    ATmega8/48/88/168

    AVR

    2.28

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    MISSION Update

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    1

    !

    MP3

    ATmega48 A/D

    A/D AVR A/D AVR A/D A/D

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    2

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    3

    47 55

    479

    2040

    4060 1050

    45 3

    47A/D A/D

    A/DA/D

    A/DA/DA/D

    4.2 ATmega48/88/168 A/D

    A/D

    ATmega48/88/1686TQFPMLF8

    10A/D

    A/DDatasheet

    10

    11

    60061218

    2430364248546011

    10001020304050607080

    90100A/D

    10

    A/D10

    0x0000b00,0000,00000x3FF0b11,1111,1111

    10240x3FF + 1

    A/D0

    A/D

    60

    A/D

    A/D

    A/D

    A/D

    A/D

    DA895

    Resolution

    DA895

    A/D

    A/D

    ATmega48/88/168

    A/D

    DA895

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    4

    116100

    1110A/D

    A/D

    1LSBLeast Significant Bit

    5V10A/D1LSB

    1LSB = 5V / 0x3FF + 1 = 4.88mV

    A/D

    1LSB1LSB

    A/D1LSB

    A/D

    0.5 LSB

    1LSB

    2 LSB

    1LSB

    13 - 260 s 15 kSPS A/DA/D

    13 - 260 s

    6 2 (TQFPMLF)

    1A/D

    ATmega48/88/1686~8A/D6~8PDIPATmega48/88/1686A/DTQFP

    MLF8A/D DatasheetATmega48/88/168

    ADC0ADC5PC0PC5TQFPMLF

    ADC6ADC7 A/D

    A/D1LSB

    ATmega48/88/168

    DATASHEET

    DA895

    DATASHEET ADC

    .

    DA895

    AVR

    DA895

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    5

    A/DAVR

    A/DA/D

    ADC A/D10

    AVRADCHADCL

    ADCHBits 7..2

    A/D

    A/D 10A/D

    ADCH = 0b0000,0010 ADCL = 0b1010,1100

    ADMUXADLAR1A/D

    A/D ADCH = 0b1010,1011 ADCL = 0b1100,0000

    ADCHADCL6

    2.4.18

    ADCH

    82

    0 - VCC ADC

    7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

    7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

    ADCH ADCL

    10

    ADLAR:0

    ADLAR:1

    ADCHADC

    ADCL ADCH

    ADCL

    8

    2.4.1 AD

    Datasheet

    AD

    ADC

    ADC

    ADC

    ADC

    ADC

    ADCH

    ADCH

    ADC

    ADCH

    ADC

    Datasheet

    ADCL

    ADCH

    ADCH

    ADCL

    8

    AD

    DA895

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    6

    1.1V ADC A/D

    0V

    AVR3AVCCAREF

    1.1V

    A/D

    A/D

    0 - VCC

    ADC A/DCPU

    A/DCPU

    A/D

    CPU

    A/DAVRA/DCPU

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    7

    AVCC1.1V

    AREFAVCC1.1VAREF

    4.4 ATmega48/88/168A/D

    ADCADMUX ADMUX

    DatasheetADC

    ADMUX

    ADCADCSRA /ADCSRB ADCSRAADCSRBA/D

    DatasheetADC

    AADCSRAADCBADCSRB

    ADCADCL /ADCH ADCLADCHA/D

    4.7 A/D

    DIDR0 DIDR0

    4.5 A/D

    PRR PRR

    PRADCA/D

    PRRA/D

    4.5 A/D

    AREF A/DAVCCAREF1.1V

    AREF

    2.4.2 AREF1.1V

    1.1VAREF

    DATASHEET

    ICC

    ADC

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    8

    A/D

    /1k~10k

    CMOS

    DIDR0

    0x00A/D

    DIDR0 ADC3

    DIDR0 | = 0x08; //PC3

    A/DPCB

    1.1VAREF

    0.1uF0.01uF

    AVCCAREFVCC

    LC

    RCVCC2.4.3

    A/DA/D

    A/D

    Datasheet

    2.4.3 A/D

    PC3

    2.4.2 A/D

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    9

    4.6 A/D

    A/DA/D

    CPU

    A/D

    CPUA/D

    ADCCPU

    CPU

    A/D

    CPU

    CPUA/D

    ADCSRA |= 1

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    10

    A/D

    A/D LED

    A/D

    CPU A/D

    1msA/D

    A/DCPUADCCPU

    ADC

    LED

    ADC A/DCPU

    CPU

    A/D

    AVRADCA/DCPU

    4.7 A/D A/DADCH

    ADCLADC

    unsigned int

    AVRA/D ADCLADCH

    ADCHA/D

    ADCH

    adc_l = ADCL; //ADCL,ADCH

    //

    delay_ms(1); //1mS,A/D,

    // ADCH

    //A/D

    adc_h = ADCH; //ADCH,adc_l

    //

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    11

    8

    ADCHADCL ICC AVRC

    ADCHADCLADC

    unsigned int adc_result; //A/D

    adc_result = ADC; //A/D,

    C

    4.8 ADC

    A/D

    ICC

    ADC

    AVRM48Xtal

    speed(MHz)1.00002.4.4 Analog

    ADC2.4.5

    ADC

    Use ADC ADC

    Power off

    ADC enable A/D

    AVR

    ADC

    ICC

    iomXXv.h

    ADCL

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    12

    2.4.4

    2.4.5 ADC

    ICC6.31A

    Internal reference

    Reference

    BUG

    ICC7.0

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    13

    Start conversion

    A/DA/D

    Auto trigger A/DADC

    ADCSRB ADTS2..0Start conversion

    Internal reference ADMUXRESF1..0

    A/DICC6.31A

    Left adjust A/DADMUXADLAR

    8

    Reference A/D

    ICC6.31A

    Trigger source ADCSRB

    ADTS2..0

    A/D

    Auto trigger

    A/D

    Prescale ADCSRAADPS2..0

    16

    Conversion time

    Conversion complete interrupt ADC

    2.4.6 ADC

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    14

    ADCadc_isr()

    ADCSRAADIE

    A/D

    Preview

    A/D

    OK.c ICC6.31AICCAVR

    A/DADCADMUX

    Internal referenceLeft adjustReference

    ADMUX0x00ICC

    ACSR = 0x80;

    ACSR = BIT(ACD);Analog ComparatorDisable

    //ADC initialize

    // Conversion time: 208uS

    void adc_init(void)

    {

    ADCSRA = 0x00; //disable adc

    ADMUX = 0x00; //select adc input 0

    ACSR = 0x80;

    ADCSRB = 0x00;

    ADCSRA = 0x8C;

    }

    DatasheetA/D

    ADMUX = 3; /* AREF,, ADC 3*/

    ADCSRA = 0x84; /*ADC ,,,

    16*/

    ADCSRB = 0x00; /*ACME ,.

    , ADTS */

    DIDR0 = 0x08; /* PC3 */

    ADC #pragma interrupt_handler adc_isr:22

    void adc_isr(void)

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    15

    {

    //conversion complete, read value (int) using...

    // value=ADCL; //Read 8 low bits first (important)

    // value|=(int)ADCH

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    16

    # include macros.h

    .h

    # define INSERT_ADC_ISR_CODE NOP();

    .cADC

    .c

    NOP().h

    NOP()

    A/D

    void adc_isr(void)

    { unsigned int ADCValue = ADC & 0x03FF; //10

    INSERT_ADC_ISR_CODE

    }

    void port_init(void)

    { // A/D

    //

    }

    void device_init(void) //

    {

    CLI();

    port_init();

    adc_init();

    SEI();

    }

    .c.h

    .h

    extern extern void port_init(void); // port_init();

    extern void adc_init(void); // adc_init();

    extern void adc_isr(void); // adc_isr();

    extern device_init(void); // device_init();

    A/D

    A/DSTART_ADC

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    17

    # define START_ADC ADCSRA |= BIT(ADSC); // AD

    A/D

    A/DA/D

    #include

    .hmain().c

    # include HD_Support.h

    HD_Support.hHD_Support.c

    ICCF9

    A/D

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    18

    V % 1.60 100 1.35 75 1.25 50

    1.15 25 0.90 0

    4.11

    A/D

    ADCHADCLA/D

    unsigned int2AVR

    ADCHADCL

    unsigned int voltage;

    2.4.7 GP15AU

    DA895

    ADCH 6

    0

    &0x3FF

    DA895

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    19

    voltage = ADC&0x3FF; //ADCHADCL

    iom48v.hADCADCL

    *.s*C voltageR20R21

    ; voltage -> R20,R21

    voltage = ADC;

    lds R20,120 ;ADCL0x78120---

    lds R21,120+1 ;ADCH0x79121---

    andi R21,3 ;ADCH2

    ADC C

    union simple

    {

    unsigned char a;

    unsigned char b;

    } value;

    ab

    RAM

    b = 0x01;

    a = 0x02;

    abab

    b0x02

    union char_to_int

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    20

    {

    unsigned char ad_result[2];

    unsigned int voltage;

    }voltage_value; ad_result[ ] voltage2.4.8

    ad_result[1]ad_result[0]char_to_int

    voltage

    A/DADCL

    voltage_value .ad_result[0]ADCH

    voltage_value .ad_result[1]ADCH2ADCH

    0x03ADCH&0x03 ADCvoltage_value.voltage

    voltage_value.ad_result[0] = ADCL; //ADC

    voltage_value.ad_result[1] = ADCH&0x03; //ADC

    voltage_value.voltage

    ; voltage_value.ad_result[0] = ADCL; //ADC

    lds R2,120

    std y+0,R2 ; voltage_value.ad_result[1] = ADCH&0x03; //ADC

    lds R24,121

    andi R24,3

    std y+1,R24

    Y

    ADC ADC

    AVR C

    2.4.8 A/D

    ad_result[1] ad_result[0]

    voltage

    char_to_int

    A

    B

    A

    B

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    21

    unsigned int voltage;

    voltage = ADCL;

    voltage |= (unsigned int)ADCH

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    22

    PC

    CPU

    SMCRAVRCPUSMCR

    SLEEPCPU

    DatasheetTable18

    SMCR

    2.4.2 SMCR

    SM2 SM1 SM0 0 0 0 0 0 1 ADC 0 1 0

    0 1 1 1 0 0 1 0 1 1 1 0 Standby 1 1 1

    Standby

    CPU

    CPU

    CPU

    CPU ADC

    A/DCPU

    ADCTWI/2

    PRR CPUSMCR

    SE1SLEEPCPU

    SLEEPSE

    SMCR |= 0x01; //

    asm("SLEEP"); //CPU,ADC

    CPUSE SMCR &= 0xFE; //

    ADCADCSRAADIESEI();

    CPU

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    23

    ADC ADCSRAADSCA/D

    ADCA/D

    ADCSRAADC

    ADCSRA |= 0x8F; //ADC,,,,128

    A/DSLEEP

    4.13 A/D

    A/D

    8

    A/D

    A/D

    A/D

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    24

    FIFO(First In First Out)

    Head

    Tail

    C

    2.3.9

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    25

    []

    [C]

    4.9

    INSERT_ADC_ISR_CODE

    ADCValue

    void Insert_ADC_ISR_Code(unsigned int ADCValue)

    2.4.9

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    26

    # define INSERT_ADC_ISR_CODE Insert_ADC_ISR_Code(ADCValue);

    C

    //

    unsigned int g_wADValue; //

    void Insert_ADC_Isr_Code(unsigned int ADCValue)

    {

    static unsigned int s_wADCBuffer[ADC_BUFF_SIZE];

    static unsigned char s_cBufferCounter = 0;

    static unsigned long s_dTotal = 0;

    //A/D

    s_wADCBuffer[s_cBufferCounter] = ADCValue;

    s_dTotal = s_dTotal + ADCValue;

    s_cBufferCounter++; //

    if (s_cBufferCounter == ADC_BUFF_SIZE)

    { //

    //

    //

    g_wADValue = (unsigned long)s_dTotal / (unsigned

    s_dTotal

    0

    s_dTotal

    static

    If 3

    If 2

    If 1

    If n

    1

    2

    3

    n

    2.4.10

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    27

    long)ADC_BUFF_SIZE;

    s_cBufferCounter = 0;

    s_dTotal = 0;

    }

    } //End Of Insert_ADC_Isr_Code

    []

    8

    12

    n2n

    811

    unsigned int

    2

    ADC_BUFF_SIZE2

    nn

    ADC_BUFF_SIZE //2nn

    # define ADC_BUFF_SIZE_BIT_COUNT 0

    # define ADC_BUFF_SIZE (1 ADC_BUFF_SIZE_BIT_COUNT;

    ADC_BUFF_SIZE64

    s_dTotal

    s_wTotal

    []

    DA895

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    28

    [C]

    //

    unsigned int g_wADValue; //

    void Insert_ADC_Isr_Code(unsigned int ADCValue)

    {

    static unsigned int s_wADCBuffer[ADC_BUFF_SIZE];

    static unsigned char s_cBufferCounter = 0; unsigned long s_dTotal; //

    unsigned char n = 0;

    //A/D

    s_wADCBuffer[s_cBufferCounter] = ADCValue;

    //

    s_dTotal = 0;

    for (n = 0;n < ADC_BUFF_SIZE;n++)

    {

    s_dTotal += s_wADCBuffer[n];

    } //

    g_wADValue = (unsigned long)s_dTotal >>ADC_BUFF_SIZE_BIT_COUNT;

    s_cBufferCounter++; //

    if (s_cBufferCounter == ADC_BUFF_SIZE)

    { //

    s_cBufferCounter = 0;

    }

    } //End Of Insert_ADC_Isr_Code

    []

    +=

    A += 2

    A = A + 2

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    29

    ,

    s_cBufferCounter

    0

    s_wADCBuffer[s_cBufferCounter] = ADCValue;

    s_wADCBuffer[s_cBufferCounter] =0; //(1)

    s_wADCBuffer[s_cBufferCounter] = ADCValue; //(2)

    (1)s_cBufferCounter

    (2)

    s_cBufferCounter

    //

    if (s_cBufferCounter == ADC_BUFF_SIZE)

    { //

    s_cBufferCounter = 0;

    }

    s_dTotal

    static

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    30

    0

    ADC_BUFF_SIZE

    00

    if (s_cBufferCounter == ADC_BUFF_SIZE) {s_cBufferCounter = 0;}

    s_wADCBuffer [0]

    s_wADCBuffer [ADC_BUFF_SIZE-1]

    2.4.11

    if (s_cBufferCounter == ADC_BUFF_SIZE) {s_cBufferCounter = 0;}

    s_wADCBuffer [0] s_wADCBuffer [ADC_BUFF_SIZE-1]

    2.4.12

    s_wADCBuffer [s_cBufferCounter]

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    31

    //

    unsigned int g_wADValue; //

    static unsigned int s_wADCBuffer[ADC_BUFF_SIZE];

    void Insert_ADC_Isr_Code(unsigned int ADCValue)

    {

    static unsigned char s_cBufferCounter = 0; static unsigned long s_dTotal = 0; //

    //

    s_dTotal -= s_wADCBuffer[s_cBufferCounter];

    //A/D

    s_wADCBuffer[s_cBufferCounter] = ADCValue; //

    s_dTotal += ADCValue;

    //

    g_wADValue = (unsigned long)s_dTotal /

    (unsigned long)ADC_BUFF_SIZE;

    s_cBufferCounter++; //

    if (s_cBufferCounter == ADC_BUFF_SIZE)

    { //

    s_cBufferCounter = 0;

    }

    } //End Of Insert_ADC_Isr_Code

    []

    [C]

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    32

    //

    unsigned int g_wADValue; //

    //

    unsigned int ADCompositor(unsigned int *wBuffer)

    { BOOL bIfSwaped = TRUE; // BOOLunsigned char

    unsigned int wTemp = 0;

    unsigned char n = 0;

    while(bIfSwaped) //

    { bIfSwaped = FALSE; //

    for (n = 0;n < ADC_BUFF_SIZE - 1;n++)

    {

    if (wBuffer[n] < wBuffer[n+1])

    { //

    wTemp = wBuffer[n];

    wBuffer[n] = wBuffer[n+1];

    wBuffer[n+1] = wTemp;

    //

    bIfSwaped = TRUE;

    }

    } //End Of For //

    } //End Of While

    return wBuffer[ADC_BUFF_SIZE>>1];

    } //End Of ADCompositor

    void Insert_ADC_Isr_Code(unsigned int ADCValue)

    {

    static unsigned int s_wADCBuffer[ADC_BUFF_SIZE];

    static unsigned char s_cBufferCounter = 0; static unsigned long s_dTotal = 0; //

    //

    s_dTotal -= s_wADCBuffer[s_cBufferCounter];

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    33

    //A/D

    s_wADCBuffer[s_cBufferCounter] = ADCValue;

    //

    g_wADValue = ADCompositor(wADCBuffer);

    s_cBufferCounter++; //

    if (s_cBufferCounter == ADC_BUFF_SIZE)

    { //

    s_cBufferCounter = 0;

    }

    } //End Of Insert_ADC_Isr_Code

    []

    A/D

    []

    0xFF0xFF

    [C] //

    unsigned int g_wADValue; //

    void Insert_ADC_Isr_Code(unsigned int ADCValue)

    {

    if (ADCValue > AD_VALUE_UP_LINE)

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    34

    { //

    ADCValue = AD_VALUE_UP_LINE;

    }

    else if (ADCValue < AD_VALUE_DOWN_LINE)

    { //

    ADCValue = AD_VALUE_DOWN_LINE;

    }

    //

    g_wADValue = ADCValue;

    }

    []

    K

    []

    K

    [C] void Insert_ADC_Isr_Code(unsigned int ADCValue)

    { //

    //0,

    //

    static unsigned int s_wLastADCValue = 0x01FF;

    unsigned int s_nK = Abs(ADCValue s_wLastADCValue);

    if (s_nK > AD_K_LIMIT_LINE)

    { //

    ADCValue = s_wLastADCValue;

    }

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    35

    s_wLastADCValue = ADCValue; //

    g_wADValue = ADCValue;

    } //End Of Insert_ADC_Isr_Code

    []

    []

    1

    [C]

    C

    //

    unsigned int g_wADValue; //

    void Insert_ADC_Isr_Code(unsigned int ADCValue)

    { //

    static unsigned int s_wLastADCValue = 0;

    //1: 3

    g_wADValue = (s_wLastADCValue * 2 + ADCValue * 6)>>3;

    s_wLastADCValue = ADCValue;

    } //End Of Insert_ADC_Isr_Code

    []

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    36

    []

    95.55

    [C]

    []

    /K

    []

    K

    /K

    [C]

    []

    2.4.13

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    37

    []

    [C]

    []

    2

    3.14

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    38

    void Insert_ADC_Isr_Code(unsigned int ADCValue)

    { //

    static BOOL s_bIfVoltageMode = FALSE;

    if (s_bIfVoltageMode) //

    {

    if (ADCValue < ADC_DOWN_LINE)

    { SET_CURRENT_MODEL //

    s_bIfVoltageMode = FALSE; //

    }

    }

    else

    {

    if (ADCValue > ADC_UP_LINE)

    { SET_VOLTAGE_MODEL //

    s_bIfVoltageMode = TRUE; //

    }

    } //End Of Else

    } //End Of Insert_ADC_Isr_Code

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    39

    [] A/D

    MP3

    ADC3PC3

    LEDLED

    A/D

    [] 12.1

    ADC3RP1

    AREFAVCC0.01uF

    AVCCVCC

    RCPB0PB56

    SL_MEGA8

    LEDPB0PB5

    J6LEDx8L8L3J9ADC

    ADC

    DA895

    12

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    40

    ADC35J8REF

    12.1SL_MEGA8

    12.1

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    41

    05V

    PC3

    12.7

    1

    12.2

    33k

    5V

    Rtest1

    2

    PC6

    PD0

    PD1

    PD2

    PD3

    PD4

    PB7

    PD5

    PD6

    PD7

    PB0

    PB6

    12.3

    PC5

    PC4

    PC3

    PC2

    PC1

    PC0

    PB5

    PB4

    PB3

    PB2

    PB1

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    42

    [] 3

    ADC

    12.4~12.6

    4.8 ADC ADC

    3

    Device_INIT

    MCUCR

    DIDR0PRR

    DIDR0

    3

    DA895

    12.4

    0

    ADC

    A/D

    0

    A/D

    12.5

    A/D IfGotADCValue0

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    43

    12

    ADC

    void Insert_Adc_ISR_Code(void)

    { unsigned int ADCValue = ADC; //ADC10

    unsigned char LoopCounter = 0,PORTValue = 0;

    LoopCounter = ADCValue / 170; //

    4 12.6 ADC

    IfGotADCValue

    True

    ADC ADCValue

    170LoopCounter

    LoopCounter > 0 ?

    PORTValue

    LoopCounter 1 1

    PORTValue

    0x00

    LoopCounter 1

    PORTValue

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    44

    while(LoopCounter)

    {

    PORTValue |= 1

  • IT IS ONLY A

    DEMO EDITI

    ON

    Lets go!

    45

    XS2

    XS3 5V

    PC3

    PB

    12.7

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    1

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    2

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    3

    MemorySpace

    MemorySpace

    PointsMemory MemorySpace

    Datasheet

    AVR PC

    Datasheet

    MemorySpace

    C

    sizeof()

    &* &

    unsigned char Number

    (&Number) Number MemorySpace

    & Number MemorySpace

    *&

    * MemroySpace Number

    unsigned char *P = (&Number);

    (*P) Number sizeof()

    C sizeof()

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    4

    unsigned char *pCHAR = NULL; //

    unsigned int *pINT = NULL; //

    unsigned long *pLONG = NULL; //

    sizeof() sizeof(pCHAR) 2

    sizeof(pINT) 2

    sizeof(pLONG) 2

    2

    MemorySpace

    DatasheetAVR8

    64KMemorySpace2

    0~6553464K

    AVR64K2

    32PC4

    4*8=3264PC

    8

    AVR

    unsigned int

    unsigned int

    unsigned int

    unsigned int

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    5

    unsigned char Number = 0;

    unsigned char *p = (&Number);

    sizeof() sizeof(Number) 1

    sizeof(*p) 1

    sizeof(p) 2

    sizeof*

    (*p)Numbersizeof()

    Number

    sizeof()

    unsigned int

    2

    MemroySpace

    unsigned int

    2.3 (void *)

    unsigned

    intunsigned int

    unsigned int0x0048

    MemorySpace

    0x0048

    unsigned int

    ANSI-C

    (void *)

    unsigned char NumberA = 0;

    unsigned int NumberB = 0; void *SuperPoint = NULL; //

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    6

    unsigned char *pCHAR = (&NumberA);

    unsigned int *pINT = (&NumberB);

    SuperPoint = (void *)pCHAR; // pCHAR

    SuperPoint = (void *)pINT; // pINT

    pCHARpINT(void *)

    SuperPoint

    MemorySpaceAddr

    Addr

    unsigned char PointAPointA+1 Addr+1

    unsigned int PointBPointB+1 Addr+2

    unsigned long PointCPointC+1 Addr+4

    pp+1 Addr+sizeof()

    p(void *)p+1

    1MemorySpace1

    1

    Cunsigned intpunsigned

    intp+nn

    p+1

    Addr+2

    (void *)sizeof()

    (void *)

    2

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    7

    2.4

    ((void *)0x004B)

    MemorySpace0x004B

    MemorySpace&

    //&

    void **p = &((void *)0x004B);

    ((unsigned int *)0x004B)

    unsigned int

    ((unsigned long *)0x004B)

    unsigned long

    MemorySpace

    MemorySpace

    & const

    const

    MemorySpace

    const

    = ((unsigned int *)0x004B)

    = (*()) MemorySpace

    (*((unsigned int *)0x004B))unsigned int

    3

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    8

    // unsigned int NumberA

    # define NumberA (*((unsigned int *)0x004B))

    iomXXXv.hICC

    // GPIOR2

    #define GPIOR2 (*(volatile unsigned char *)0x4B)

    = unsigned int + (void *)

    MemorySpace

    unsigned long NumberA = 0;

    unsigned int NumberB = 0;

    //

    # define pNumberA ((unsigned long *)NumberB)

    //

    pNumberA = &NumberA;

    = const +

    const unsigned long *p = NULL;

    2.5

    MemorySpace

    &

    * (TYPE *)

    (TYPE)

    3.2.1

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    9

    = MemorySpace +

    n

    n+2 unsigned int Array[10]Array

    Array[]

    2*10 Array

    20+2

    unsigned int *p = Array; //

    p //

    Array[1] = 100;

    p[1] = 100;

    (*(p+1)) = 100;

    Array p

    p unsigned int

    p+1 p MemorySpace 2

    unsigned int 2 p

    p+1 *

    (*(p+1)) p

    unsigned int Array[1]

    n

    //

    unsigned long *p[10]; //

    10 10 unsigned int

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    10

    Array

    Array 2

    20

    //

    unsigned int (*p)[] = &Array;

    //

    unsigned int (*p)[10] = &Array;

    Array[10]p

    &

    Array

    Arrayp

    &

    *

    (*p)[1] = 100;

    p = &Array(*p) = (*(&Array)) = Array

    Array[1] = 100;

    (*(Array+1)) = 100;

    2

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    11

    2.6

    C

    ArrayA[2]

    unsigned int *ArrayA[2];

    2 unsigned int

    Array[0] Array[1] 2*2 ArrayA

    2 3 unsigned int

    unsigned int ArrayB[3];

    unsigned int ArrayC[3];

    3 unsigned int ArrayB

    ArrayC

    2*3 Array

    # define Array ArrayA

    //

    ArrayA[0] = ArrayB;

    ArrayA[1] = ArrayC;

    Array

    ArrayArrayA[]

    ArrayAArrayA[0]

    ArrayA[]ArrayA[0]

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    12

    ArrayB[]Array

    ArrayA

    ArrayA[0]

    ArrayBArray

    Array[0]ArrayB[] (*(Array+0))ArrayArrayA

    2

    ArrayMemorySpacen

    Array+1n+2

    MemorySpace

    Array+0nArray

    Array[0](*Array)Array[0]

    *Array

    Array+1Array[1]

    &Array[1]Array[1]

    Array+1

    Array[1]+2Array[1]ArrayC[]ArrayC[]unsigned int

    unsigned int12Array[1]Array[1]+2

    ArrayC[]ArrayC[2]

    (Array[1]+2) == (&ArrayC[2]) unsigned int *p = Array[1];

    pArrayCp[2]ArrayC[2]

    pArray[1]p[2]Array[1][2]

    (*(Array+1)) +2Array+1(&Array[1])(*(&Array[1]))Array[1]Array[1]+2

    &ArrayC[2]&Array[1][2](*(Array+1)) +2

    ArrayC[2]

    &Array[1][2]

    *(Array[1]+2)Array[1]+2&Array[1][2]*(Array[1]+2)Array[1][2]

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    13

    *((*(Array+1))+2)Array+1&Array[1]*(Array+1)Array[1]*(Array[1]+2)

    unsigned int

    unsigned int Array

    ArrayAArrayBArrayC

    2

    MemorySpace

    &

    MemorySpace

    MemorySpace sizeof()

    2

    sizeof()

    MemorySpace

    unsigned int Array[10] sizeof(Array)

    2 20 22 &

    &Array Array

    &

    &Array Array

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    14

    &(ArrayA[1]) ArrayC[]

    ArrayA[1] ArrayC[]

    & ArrayC[]

    MemorySpace

    4

    unsigned int

    MemorySpace

    unsigned int Array[2][3]

    p

    unsigned int (*p)[][3] = &Array;

    unsigned int (*p)[2][] = &Array;

    MemorySpace

    sizeof() sizeof()

    //

    unsigned int (*p)[][3] = &Array; printf(%d,sizeof(*p)); //

    //

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    15

    unsigned int (*p)[2][3] = &Array; printf(%d,sizeof(*p)); //

    p

    2.7

    C

    UNKNOW AREA P Addr

    P = Addr

    P P1

    P = &P1

    Addr

    UNKNOW AREA

    P1 = Addr

    P P1

    P = &P1

    P2

    P1 = &P2

    UNKNOW AREA Addr

    P2 = Addr

    3.2.2

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    16

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    17

    unsigned char p

    //

    typedef struct BYTE_DIV8 // 8

    {

    unsigned BIT0:1;

    unsigned BIT1:1;

    unsigned BIT2:1;

    unsigned BIT7:1;

    }BYTE_BIT;

    unsigned char Status = 0;

    (*((BYTE_BIT *)(&Status))).BIT3 = 1; // BIT3

    (*((BYTE_BIT *)(&Status))).BIT6 = 0; // BIT6

    unsigned char Status&

    BYTE_BIT *

    Status

    //

    unsigned char MyZone[10];

    void *p = (void *)MyZone;

    DIY

    //C ICC

    const unsigned int n = 1234;

    unsigned int *p = (unsigned int)&n; (*p) = 4321; // const n

    const

    C

    2.9

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    18

    union

    //

    union Example

    {

    unsigned long dNumber;

    unsigned char Array[4];

    }Data;

    Example unsigned long dNumebr

    unsigned char Array[]

    //

    unsigned long dNumber = 0;

    unsigned char *Array = (unsigned char *)(&dNumber);

    Array

    unsigned long

    //

    dNumber = 0x01020304; // 4 unsigned long

    printf(%d ,Array[0]); // dNumber

    printf(%d ,Array[1]); // dNumber

    printf(%d ,Array[2]); // dNumber

    printf(%d ,Array[3]); // dNumber

    01 02 03 04

    04 02 03 01 DA895

    unsigned long dNumber

    4

    4

    AVR

    4

    2

    4

    8

    sizeof

    Big

    Endian

    Little Endian

    Blefuscu

    big end

    little

    end

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    19

    2.10

    (^_^DEMO^_^)

    2.11 extern

    (^_^DEMO^_^)

    2.12

    //

    unsigned char *Functions(void)

    { unsigned char Number = 0; //

    unsigned char *p = &(Number); //

    return p; //

    }

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    20

    C

    int *p;

    int a;

    a = 100;

    (*p) = a;

    p

    NULL

    XX

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    21

    Process_A(); // A

    break;

    case 1: Process_B(); // B

    break;

    case 2:

    case 3: Process_C(); // C

    break;

    default: Process_Default(); //

    break;

    };

    cCurrentStatus

    switch

    switch

    23

    Process_C

    2.14

    (^_^DEMO^_^)

    2.15 ABC

    ICC ICC C malloc() free()

    C stdlib.h

    ICC

    ICC C stdlib.h

    _NewHeap void _NewHeap(void *start, void *end);

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    22

    extern char _bss_end; _NewHeap(&_bss_end+1, &_bss_end + 201); // 200

    200

    malloc

    _NewHeap

    unsigned char OurArray[100] = {0}; _NewHeap(OurArray,OurArray+100); //

    _NewHeap()

    n n *

    sizeof()

    unsigned int OurArray[100] = {0}; _NewHeap(OurArray,OurArray+100); // 200

    _NewHeap

    free() free

    C free

    ICC ICC7.13A free

    free

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    23

    typedef

    4*10 int

    //

    typedef int ARRAY[4][10];

    //

    ARRAY *pArr = NULL; // NULL

    malloc

    pArr = (ARRAY *)malloc(sizeof(ARRAY)); if (pArr == NULL) //

    { //

    }

    //

    (*pArr)[2][4] = -123; //

    float n

    //

    float *pArr = (float)malloc(sizeof(float) * n); if (pArr == NULL) //

    { //

    }

    pArr

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    24

    //

    pArr[1] = 3.1415926; //

    (^_^DEMO^_^)

    (^_^DEMO^_^)

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    25

    [] C

    AVR

    //

    PORTB |= BIT(PB5); // PB5

    PORTB &= ~BIT(PB6); // PB6

    PORTB ^= BIT(PB7); // PB7

    //

    PB5 = 1; // PB5

    PB6 = 0; // PB6

    PB7 =~PB7; // PB7

    ICC

    C

    []

    AVR SRAM

    SRAM

    SRAM

    = (( *));

    = (*());

    20

    1

    ICC

    1

    1

    SBI

    CBI

    C

    --

    1

    -

    -

    C

    DA859

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    26

    ICC iomXX.h

    /* Port B */

    #define PINB (*(volatile unsigned char *)0x23)

    #define DDRB (*(volatile unsigned char *)0x24)

    #define PORTB (*(volatile unsigned char *)0x25)

    PINBDDRB PORTB unsigned char

    volatile

    20.1

    AVR

    AVR

    AVR

    DDRx

    SRAM PORTx [ BIT0 : BIT7 ]

    PORTx unsigned char (*(unsigned char *)Addr)

    ATMega48

    0 1 2 3 4 5 6 7

    BYTEL BYTEH

    BYTE_BIT (*(BYTE_BIT *)Addr)

    Addr

    BYTE_HBYTE (*(BYTE_HBYTE *)Addr)

    20.1

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    Code Name C

    27

    PORTx

    PINx x ICC iomXX.h

    DDRxPORTx PINx

    &

    iomXX.h A

    G (^_^DEMO^_^)

    (^_^DEMO^_^)

    [] (^_^DEMO^_^)

    [] ATMega48

    UseAVRPortBit.h

    // AVR

    # include # include UseAVRPortBit.h // iomXXX.h

    DDR_PC5 = 0;_PC5 = 1; //PC5

    DDR_PC6 = 1;_PC6 = 0; //PC6

    if (PIN_PC5 == 1) // PC5

    {

    }

    5

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 21

    1

    []

    21

    Snail Tail Queue Head

    Snail Head Queue Tail

    Food (Item)

    Game Field ( Array[x][y] )

    21.1

    # define UP 1

    # define RIGHT 2

    # define DOWN 3

    # define LEFT 4 # define FOOD 255

    1

    2

    3

    4

    0 0 0 0 0 0 0 0 0

    0 0 0 0 2 2 2 0 0

    0 0 0 2 1 0 0 0 0

    0 0 0 1 0 0 0 255 0

    0 0 0 1 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    x Array[y][x]

    y

    21.2

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 21

    2

    0 0 0 0 0 0 0 0 0

    0 0 0 0 2 2 2 0 0

    0 0 0 2 1 0 0 0 0

    0 0 0 1 0 0 0 255 0

    0 0 0 1 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 2 2 2 3 0

    0 0 0 2 1 0 0 0 0

    0 0 0 1 0 0 0 255 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 2 2 2 3 0

    0 0 0 2 1 0 0 3 0

    0 0 0 0 0 0 0 255 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 2 2 2 3 0

    0 0 0 2 1 0 0 3 0

    0 0 0 0 0 0 0 3 0

    0 0 255 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 2 2 2 3 0

    0 0 0 0 1 0 0 3 0

    0 0 0 0 0 0 0 3 0

    0 0 255 0 0 0 0 2 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 2 2 2 3 0

    0 0 0 0 0 0 0 3 0

    0 0 0 0 0 0 0 3 0

    0 0 255 0 0 0 0 2 2

    0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 0 2 2 3 0

    0 0 0 0 0 0 0 3 0

    0 0 0 0 0 0 0 3 0

    2 0 255 0 0 0 0 2 2

    0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 2 3 0

    0 0 0 0 0 0 0 3 0

    0 0 0 0 0 0 0 3 0

    2 2 255 0 0 0 0 2 2

    0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0

    21.3

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 21

    3

    []

    21.4

    +

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 21

    4

    []

    //

    # define GROUND 0x00

    # define UP 0x01

    # define RIGHT 0x02

    # define DOWN 0x03

    # define LEFT 0x04

    # define FOOD 0xff

    # define GAME_FIELD_HEIGHT 7 //

    # define GAME_FIELD_WIDTH 9 //

    //

    # define KEY_NULL 0x00

    # define KEY_UP 0x01

    # define KEY_RIGHT 0x02

    # define KEY_DOWN 0x03

    # define KEY_LEFT 0x04

    # define KEY_PAUSE 0x05

    //

    typedef struct SnakeBody

    {

    unsigned char x;

    unsigned char y;

    }SNAKE_BODY;

    //

    unsigned char Array[GAME_FIELD_HEIGHT][GAME_FIELD_WIDTH] = {0}

    //

    SNAKE_BODY SnakeHead = {0}; //

    SNAKE_BODY SnakeTail = {0}; //

    // 0

    unsigned int GameDelay = 100; //

    unsigned int FoodCounter = 0; //

    unsigned char SnakeGoDirection = RIGHT;

    //

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 21

    5

    //x,y

    extern void Draw_Box(unsigned char x,unsigned char y); //(x,y)

    extern void Clear_Box(unsigned char x,unsigned char y); //,NULL

    extern unsigned char Get_Key_Code(void); //

    extern void Delay_MS(unsigned int DelayTime); // 0-n

    extern unsigned char RND(unsigned char n);

    //

    void Put_New_Food(void)

    { //(x,y)

    do

    {

    x = RND(GAME_FIELD_WIDTH);

    y = RND(GAME_FIELD_WIDTH);

    }

    while(Array[y][x] != GROUND); Array[y][x] = FOOD; //

    Draw_Box(x,y); //

    }

    //

    void Game_INIT(void)

    {

    unsigned char x = 0, y = 0;

    //

    FoodCounter = 0;

    GameDelay = 100;

    SnakeGoDirection = RIGHT;

    //

    for (y = 0;y < GAME_FIELD_HEIGHT;y++)

    {

    for (x = 0;x < GAME_FIELD_WIDTH;x++)

    {

    Array[y][x] = GROUND;

    }

    }

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 21

    6

    //

    SnakeHead.x = 5;

    SnakeHead.y = 3;

    //

    SnakeTail.x = 3;

    SnakeTail.y = 3;

    //

    Array[3][4] = RIGHT; Draw_Box(4,3); //

    Array[3][3] = RIGHT; Draw_Box(3,3); //

    //

    Put_New_Food();

    }

    //

    void Game_Main(void)

    {

    unsigned char x = 0,y = 0;

    unsigned char UserPressKey = KEY_NULL; Game_INIT(); //

    while(1) //

    { //

    x = SnakeHead.x;

    y = SnakeHead.y; //

    if ((Array[y][x] != GROUND) && (Array[y][x] != FOOD))

    { // UFOGameOver

    return ;

    }

    if (Array[y][x] != FOOD)

    { //

    x = SnakeTail.x;

    y = SnakeTail.y; switch (Array[y][x]) //

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 21

    7

    {

    case UP:

    if (y == 0)

    {

    y = GAME_FIELD_HEIGHT;

    }

    y--;

    break;

    case RIGHT:

    x++;

    if (x == GAME_FIELD_WIDTH)

    {

    x = 0;

    }

    break;

    case DOWN:

    y++;

    if (y == GAME_FIELD_HEIGHT)

    {

    y = 0;

    }

    break;

    case LEFT:

    if (x == 0)

    {

    x = GAME_FIELD_WIDTH;

    }

    x--;

    break;

    default:

    break;

    }

    Array[SnakeTail.y][SnakeTail.x] = GROUND; Clear_Box(SnakeTail.x,SnakeTail.y); //

    SnakeTail.x = x;

    SnakeTail.y = y;

    }

    else

    { FoodCounter++; //

    Put_New_Food(); //

    }

    //

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 21

    8

    UserPressKey = Get_Key_Code(); //

    if (UserPressKey != ((SnakeGoDirection -1 + 2) % 4) + 1)

    { //

    switch (UserPressKey)

    {

    case KEY_UP:

    case KEY_DOWN:

    case KEY_RIGHT:

    case KEY_LEFT:

    SnakeGoDirection = UserPressKey;

    break;

    case KEY_PAUSE: //

    while(Get_Key_Code() == KEY_NULL);

    break;

    case KEY_NULL:

    default:

    break;

    }

    }

    //

    x = SnakeHead.x;

    y = SnakeHead.y; switch(SnakeGoDirection) //

    {

    case UP:

    Array[y][x] = UP; Draw_Box(x,y); //

    if (y == 0)

    {

    y = GAME_FIELD_HEIGHT;

    }

    y--; SnakeHead.y = y; //

    break;

    case RIGHT:

    Array[y][x] = RIGHT; Draw_Box(x,y); //

    x++;

    if (x == GAME_FIELD_WIDTH)

    {

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    AVR ATMega48/88/168 21

    9

    x = 0;

    } SnakeHead.x = x; //

    break;

    case DOWN:

    Array[y][x] = DOWN; Draw_Box(x,y); //

    y++;

    if (y == GAME_FIELD_HEIGHT)

    {

    y = 0;

    } SnakeHead.y = y; //

    break;

    case LEFT:

    Array[y][x] = LEFT; Draw_Box(x,y); //

    if (x == 0)

    {

    x = GAME_FIELD_WIDTH;

    }

    x--; SnakeHead.x = x; //

    break;

    }

    // GameDelay

    Delay_MS(GameDelay);

    }

    }

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    1

    ATmega48/88/168

    ATmega48

    51

    DATASHEET ATmega48/88/168

    DATASHEET

    DATASHEET

    C C PC

    C

    C

    C

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    2

  • IT IS ONLY A

    DEMO EDITI

    ON

    3

    DA895

    DA895

    DA895

    74HC595 DATASHEET

    1

    30%

    60%

    90%

    100%

    0%

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    4

    20

    80

    PC

    PC Windows98

    AVR

    20W

    2

    ATmega48/88/168 DATASHEET

    DATASHEET

    PC

    DATASHEET

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    5

    51

    C

    AVR

    C C

    C

    C

    C

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    6

    AVR

    Datasheet

    Datasheet

    C C

    C

    AVR

    AVR

    ICC

    Datasheet

    C

    AVR

    Datasheet AVR

    Datasheet

    51

    51 C

    51

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    7

    C

    Datasheet

    Datasheet

    / ATmega48/88/168

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    de

    21

    ICC

    de

    VB

    PC

    I2C BOOT

    DI YDIY

    DIY

    ByeBye

    IT IS ONLY A

    DEMO EDITI

    ON

  • IT IS ONLY A

    DEMO EDITI

    ON

    ICC BUG

    C

    3

    3

    BOOT

    ICC

    IT IS ONLY A

    DEMO EDITI

    ON

    02 AVRDIY

    12

    .pdf 20

    21

    -10