?? car1.lst
字號:
__text_start:
__start:
69 E5CF LDI R28,0x5F
6A E0D4 LDI R29,4
6B BFCD OUT 0x3D,R28
6C BFDE OUT 0x3E,R29
6D 51CE SUBI R28,0x1E
6E 40D0 SBCI R29,0
6F EA0A LDI R16,0xAA
70 8308 STD Y+0,R16
71 2400 CLR R0
72 ECED LDI R30,0xCD
73 E0F0 LDI R31,0
74 E010 LDI R17,0
75 3DE3 CPI R30,0xD3
76 07F1 CPC R31,R17
77 F011 BEQ 0x007A
78 9201 ST R0,Z+
79 CFFB RJMP 0x0075
7A 8300 STD Z+0,R16
7B E6E4 LDI R30,0x64
7C E0F0 LDI R31,0
7D E6A0 LDI R26,0x60
7E E0B0 LDI R27,0
7F E010 LDI R17,0
80 E000 LDI R16,0
81 BF0B OUT 0x3B,R16
82 3DE1 CPI R30,0xD1
83 07F1 CPC R31,R17
84 F021 BEQ 0x0089
85 95C8 LPM
86 9631 ADIW R30,1
87 920D ST R0,X+
88 CFF9 RJMP 0x0082
89 940E 028F CALL _main
_exit:
8B CFFF RJMP _exit
FILE: d:\我的文檔\桌面\小車\car1\car_main.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "delay.h"
(0004) #include "lcd.h"
(0005)
(0006) //調試使用
(0007) uint lcd_i;
(0008) uint lcd_j;
(0009) uint lcd_k;
(0010)
(0011) //尋線使用
(0012) uchar modle_now = 4;
(0013) uchar modle_last = 4;
(0014)
(0015) //計圈數
(0016) #define LENGHT_PER_CIRCLE 18 //單位cm , 每個輪子的圈數
(0017)
(0018) unsigned long int circle = 0; //路程
(0019) uchar circle_n_new = 0; //圈數
(0020) uchar circle_n_old = 0;
(0021) uchar getlinestart = 0; //碰到起跑線
(0022) long int nextint_time = 0; //下次起跑線取值的時間
(0023)
(0024) unsigned long int Light_time = 0; //遇到一圈時,響一下,由此計時
(0025) uchar light_set_flag = 0;
(0026)
(0027)
(0028) #define ON 1
(0029) #define OFF 0
(0030)
(0031) #define PWMA_HIG_VAL 110 //A電機高速時占空比, hight speed 注意,使用的是8位快速模式
(0032) #define PWMB_HIG_VAL 110
(0033) #define PWMA_LOW_VAL 1 //A電機低速時占空比 low speed
(0034) #define PWMB_LOW_VAL 1
(0035)
(0036) #define PWMA_MID_VAL 165//A電機中速時點空比 midlle speed
(0037) #define PWMB_MID_VAL 165
(0038)
(0039) #define PWMB_MAX_VAL 1023 //最大占空比 max speed
(0040) #define PWMB_MAX_VAL 1023
(0041) #define PWMA_MIN_VAL 0 //最小占空比 min speed
(0042) #define PWMB_MIN_VAL 0
(0043)
(0044) void closeJTAG(void)// 1JTAG
(0045) {MCUCSR|=0X80; MCUCSR|=0X80;}
_closeJTAG:
8C B784 IN R24,0x34
8D 6880 ORI R24,0x80
8E BF84 OUT 0x34,R24
8F B784 IN R24,0x34
90 6880 ORI R24,0x80
91 BF84 OUT 0x34,R24
92 9508 RET
(0046)
(0047) /*-------------------------------PWM----------------------------------*/
(0048) void PwmInit (void)
(0049) {
(0050) //T1 for PWM
(0051) DDRD |= ( 1 << PD4 ) | ( 1 << PD5 );
_PwmInit:
93 B381 IN R24,0x11
94 6380 ORI R24,0x30
95 BB81 OUT 0x11,R24
(0052) TCCR1A = ( 1 << WGM11 ) | ( 1 << WGM10 ) | ( 1 << COM1A1 ) | ( 1 << COM1B1 ); //匹配清0,兩路10位相位修正PWM
96 EA83 LDI R24,0xA3
97 BD8F OUT 0x2F,R24
(0053) TCCR1B = ( 0 << CS12 ) | ( 1 << CS11 ) | ( 1 << CS10 ); //預分頻64
98 E083 LDI R24,3
99 BD8E OUT 0x2E,R24
9A 9508 RET
(0054) }
(0055)
(0056) //設置pwm_A的占空比
(0057) void PwmASet(uint P)
(0058) {
(0059) OCR1A = P;
_PwmASet:
P --> R16
9B BD1B OUT 0x2B,R17
9C BD0A OUT 0x2A,R16
9D 9508 RET
(0060) }
(0061)
(0062) //設置pwm_B的占空比
(0063) void PwmBSet(uint P)
(0064) {
(0065) OCR1B = P;
_PwmBSet:
P --> R16
9E BD19 OUT 0x29,R17
9F BD08 OUT 0x28,R16
A0 9508 RET
(0066) }
(0067)
(0068) /*------------------------------------PWM END----------------------------------------*/
(0069)
(0070) /*------------------------------------car active----------------------------------------*/
(0071) //全速向前
(0072) void CarGoAheadFullSpeed (void)
(0073) {
(0074) PwmASet(PWMA_HIG_VAL);
_CarGoAheadFullSpeed:
A1 E60E LDI R16,0x6E
A2 E010 LDI R17,0
A3 DFF7 RCALL _PwmASet
(0075) PwmBSet(PWMB_HIG_VAL);
A4 E60E LDI R16,0x6E
A5 E010 LDI R17,0
A6 DFF7 RCALL _PwmBSet
A7 9508 RET
(0076) }
(0077)
(0078) //中速向前
(0079) void CarGoAheadMidSpeed(void)
(0080) {
(0081) PwmASet(PWMA_MID_VAL);
_CarGoAheadMidSpeed:
A8 EA05 LDI R16,0xA5
A9 E010 LDI R17,0
AA DFF0 RCALL _PwmASet
(0082) PwmBSet(PWMB_MID_VAL);
AB EA05 LDI R16,0xA5
AC E010 LDI R17,0
AD DFF0 RCALL _PwmBSet
AE 9508 RET
(0083) }
(0084)
(0085) //向左
(0086) void CarTurnLeft (void)
(0087) {
(0088) //TCNT1 = 0x3fe;
(0089) PwmASet(PWMA_LOW_VAL);
_CarTurnLeft:
AF E001 LDI R16,1
B0 E010 LDI R17,0
B1 DFE9 RCALL _PwmASet
(0090) PwmBSet(PWMB_HIG_VAL);
B2 E60E LDI R16,0x6E
B3 E010 LDI R17,0
B4 DFE9 RCALL _PwmBSet
B5 9508 RET
(0091) }
(0092)
(0093) //向右
(0094) void CarTurnRight (void)
(0095) {
(0096) //TCNT1 = 0x3fe;
(0097) PwmASet(PWMA_HIG_VAL);
_CarTurnRight:
B6 E60E LDI R16,0x6E
B7 E010 LDI R17,0
B8 DFE2 RCALL _PwmASet
(0098) PwmBSet(PWMB_LOW_VAL);
B9 E001 LDI R16,1
BA E010 LDI R17,0
BB DFE2 RCALL _PwmBSet
BC 9508 RET
(0099) }
(0100)
(0101) //停止
(0102) void CarStop (void)
(0103) {
(0104) //TCNT1 = 0x3fe;
(0105) PwmASet(PWMA_MIN_VAL);
_CarStop:
BD 2700 CLR R16
BE 2711 CLR R17
BF DFDB RCALL _PwmASet
(0106) PwmBSet(PWMB_MIN_VAL);
C0 2700 CLR R16
C1 2711 CLR R17
C2 DFDB RCALL _PwmBSet
C3 9508 RET
(0107) }
(0108)
(0109) //--------------------------------------------聲光報警
(0110) void LightOnOff (uchar onoff)
(0111) {
(0112) DDRC |= (1 << PC0);
_LightOnOff:
onoff --> R16
C4 9AA0 SBI 0x14,0
(0113)
(0114) if (onoff == OFF) {
C5 2300 TST R16
C6 F411 BNE 0x00C9
(0115) PORTC &=~ (1 << PC0);
C7 98A8 CBI 0x15,0
(0116) }
C8 C003 RJMP 0x00CC
(0117)
(0118) else if (onoff == ON) {
C9 3001 CPI R16,1
CA F409 BNE 0x00CC
(0119) PORTC |= (1 << PC0);
CB 9AA8 SBI 0x15,0
(0120) }
CC 9508 RET
(0121) }
(0122)
(0123) /*------------------------------------end car active ----------------------------------------*/
(0124)
(0125) /*------------------------------------TIME ----------------------------------------*/
(0126) uchar T2_int_n = 0; //定時器25ms溢出次數
(0127) unsigned long int T2_1s_set_n = 0; //1s次數
(0128) uchar T2_1s_set = 0;
(0129)
(0130)
(0131) //TIMER2 initialize - prescale:1024
(0132) // WGM: CTC
(0133) // desired value: 25mSec
(0134) // actual value: 25.088mSec (0.4%)
(0135) void timer2_init(void)
(0136) {
(0137) TCCR2 = 0x00; //stop
_timer2_init:
CD 2422 CLR R2
CE BC25 OUT 0x25,R2
(0138) ASSR = 0x00; //set async mode
CF BC22 OUT 0x22,R2
(0139) TCNT2 = 0x3D; //setup
D0 E38D LDI R24,0x3D
D1 BD84 OUT 0x24,R24
(0140) OCR2 = 0xC3;
D2 EC83 LDI R24,0xC3
D3 BD83 OUT 0x23,R24
(0141) TCCR2 = 0x0F; //start
D4 E08F LDI R24,0xF
D5 BD85 OUT 0x25,R24
D6 9508 RET
_timer2_comp_isr:
D7 920A ST R0,-Y
D8 921A ST R1,-Y
D9 922A ST R2,-Y
DA 923A ST R3,-Y
DB 924A ST R4,-Y
DC 925A ST R5,-Y
DD 938A ST R24,-Y
DE 939A ST R25,-Y
DF 93AA ST R26,-Y
E0 93BA ST R27,-Y
E1 B60F IN R0,0x3F
E2 920A ST R0,-Y
(0142) }
(0143)
(0144) #pragma interrupt_handler timer2_comp_isr:iv_TIM2_COMP
(0145) void timer2_comp_isr(void)
(0146) {
(0147) //compare occured TCNT2=OCR2
(0148) //compare occured TCNT0=OCR0
(0149) if((T2_int_n++) == 40) { //25ms溢出, 40次則1s
E3 9020 0072 LDS R2,T2_int_n
E5 2433 CLR R3
E6 2D82 MOV R24,R2
E7 5F8F SUBI R24,0xFF
E8 9380 0072 STS T2_int_n,R24
EA 2D82 MOV R24,R2
EB 3288 CPI R24,0x28
EC F4F1 BNE 0x010B
(0150) T2_1s_set = 1;
ED E081 LDI R24,1
EE 9380 0077 STS T2_1s_set,R24
(0151) T2_1s_set_n ++; //置位1s
F0 E081 LDI R24,1
F1 E090 LDI R25,0
F2 E0A0 LDI R26,0
F3 E0B0 LDI R27,0
F4 9040 0075 LDS R4,T2_1s_set_n+2
F6 9050 0076 LDS R5,T2_1s_set_n+3
F8 9020 0073 LDS R2,T2_1s_set_n
FA 9030 0074 LDS R3,T2_1s_set_n+1
FC 0E28 ADD R2,R24
FD 1E39 ADC R3,R25
FE 1E4A ADC R4,R26
FF 1E5B ADC R5,R27
100 9230 0074 STS T2_1s_set_n+1,R3
102 9220 0073 STS T2_1s_set_n,R2
104 9250 0076 STS T2_1s_set_n+3,R5
106 9240 0075 STS T2_1s_set_n+2,R4
(0152) T2_int_n = 0; //溢出次數清0
108 2422 CLR R2
109 9220 0072 STS T2_int_n,R2
(0153) }
10B 9009 LD R0,Y+
10C BE0F OUT 0x3F,R0
10D 91B9 LD R27,Y+
10E 91A9 LD R26,Y+
10F 9199 LD R25,Y+
110 9189 LD R24,Y+
111 9059 LD R5,Y+
112 9049 LD R4,Y+
113 9039 LD R3,Y+
114 9029 LD R2,Y+
115 9019 LD R1,Y+
116 9009 LD R0,Y+
117 9518 RETI
(0154) }
(0155)
(0156)
(0157) //計時開始停止控制
(0158) void Time2OnOff (uchar onoff)
(0159) {
(0160) if (onoff == ON) {
_Time2OnOff:
onoff --> R16
118 3001 CPI R16,1
119 F421 BNE 0x011E
(0161) TIMSK |= (1 << OCIE2); //開時間中斷
11A B789 IN R24,0x39
11B 6880 ORI R24,0x80
11C BF89 OUT 0x39,R24
(0162) }
11D C005 RJMP 0x0123
(0163)
(0164) else if (onoff == OFF) {
11E 2300 TST R16
11F F419 BNE 0x0123
(0165) TIMSK &=~ (1 << OCIE2); //禁止時間中斷
120 B789 IN R24,0x39
121 778F ANDI R24,0x7F
122 BF89 OUT 0x39,R24
(0166) }
123 9508 RET
(0167) }
(0168)
(0169) //-----------------------T0------------------------------------
(0170) unsigned long int T0_10_n = 0; //處部計數滿10后溢出次數, 周長 = [((10 * T0_10_n) + TCNT0) / 5 ]* LENGHT_PER_CIRCLE
(0171) uchar T0_10_set = 0;
(0172) //TIMER0 initialize - prescale:Falling edge
(0173) // WGM: CTC
(0174) // desired value: 1Hz
(0175) // actual value: Out of range
(0176) void timer0_init(void)
(0177) {
(0178) TCCR0 = 0x00; //stop
_timer0_init:
124 2422 CLR R2
125 BE23 OUT 0x33,R2
(0179) OCR0 = 9 /*INVALID SETTING*/; //set compare
126 E089 LDI R24,0x9
127 BF8C OUT 0x3C,R24
(0180) TCCR0 = 0x0E; //start timer
128 E08E LDI R24,0xE
129 BF83 OUT 0x33,R24
12A 9508 RET
_timer0_comp_isr:
12B 922A ST R2,-Y
12C 923A ST R3,-Y
12D 924A ST R4,-Y
12E 925A ST R5,-Y
12F 928A ST R8,-Y
130 929A ST R9,-Y
131 938A ST R24,-Y
132 939A ST R25,-Y
133 93AA ST R26,-Y
134 93BA ST R27,-Y
135 B62F IN R2,0x3F
136 922A ST R2,-Y
137 92AA ST R10,-Y
138 92BA ST R11,-Y
(0181) }
(0182)
(0183) #pragma interrupt_handler timer0_comp_isr:iv_TIM0_COMP
(0184) void timer0_comp_isr(void)
(0185) {
(0186) //compare occured TCNT0=OCR0
(0187) T0_10_n++;
139 E081 LDI R24,1
13A E090 LDI R25,0
13B E0A0 LDI R26,0
13C E0B0 LDI R27,0
13D 9040 007A LDS R4,T0_10_n+2
13F 9050 007B LDS R5,T0_10_n+3
141 9020 0078 LDS R2,T0_10_n
143 9030 0079 LDS R3,T0_10_n+1
145 0E28 ADD R2,R24
146 1E39 ADC R3,R25
147 1E4A ADC R4,R26
148 1E5B ADC R5,R27
149 9230 0079 STS T0_10_n+1,R3
14B 9220 0078 STS T0_10_n,R2
14D 9250 007B STS T0_10_n+3,R5
14F 9240 007A STS T0_10_n+2,R4
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -