View
234
Download
3
Category
Preview:
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
Recommended