?? 02.lst
字號:
__start:
__text_start:
003A E5CF LDI R28,0x5F
003B E0D4 LDI R29,4
003C BFCD OUT 0x3D,R28
003D BFDE OUT 0x3E,R29
003E 51C0 SUBI R28,0x10
003F 40D0 SBCI R29,0
0040 EA0A LDI R16,0xAA
0041 8308 STD Y+0,R16
0042 2400 CLR R0
0043 E6E0 LDI R30,0x60
0044 E0F0 LDI R31,0
0045 E010 LDI R17,0
0046 36E1 CPI R30,0x61
0047 07F1 CPC R31,R17
0048 F011 BEQ 0x004B
0049 9201 ST R0,Z+
004A CFFB RJMP 0x0046
004B 8300 STD Z+0,R16
004C E7E4 LDI R30,0x74
004D E0F0 LDI R31,0
004E E6A0 LDI R26,0x60
004F E0B0 LDI R27,0
0050 E010 LDI R17,0
0051 37E4 CPI R30,0x74
0052 07F1 CPC R31,R17
0053 F021 BEQ 0x0058
0054 95C8 LPM
0055 9631 ADIW R30,1
0056 920D ST R0,X+
0057 CFF9 RJMP 0x0051
0058 940E00A0 CALL _main
_exit:
005A CFFF RJMP _exit
_Delay100us:
i --> R20
n --> R16
005B 940E01A6 CALL push_gset1
FILE: C:\DOCUME~1\Administrator\桌面\小車尋跡\unit.c
(0001) #include "config.h"
(0002) /***************************************************************************
(0003) 延時公式
(0004)
(0005) */
(0006) void Delay100us(uint8 n)
(0007) {
(0008) uint8 i; //4clock
(0009) for(i=147;n!=0;n--)
005D E943 LDI R20,0x93
005E C006 RJMP 0x0065
(0010) while(--i); //5 * i clock
005F 2F84 MOV R24,R20
0060 5081 SUBI R24,1
0061 2F48 MOV R20,R24
0062 2388 TST R24
0063 F7D9 BNE 0x005F
0064 950A DEC R16
0065 2300 TST R16
0066 F7C1 BNE 0x005F
0067 940E01A9 CALL pop_gset1
0069 9508 RET
_Delay1ms:
n --> R20
006A 940E01A6 CALL push_gset1
006C 01A8 MOVW R20,R16
(0011) }
(0012) void Delay1ms(uint16 n)
(0013) {
(0014) for (;n!=0;n--){
006D C004 RJMP 0x0072
(0015) Delay100us(10);
006E E00A LDI R16,0xA
006F DFEB RCALL _Delay100us
0070 5041 SUBI R20,1
0071 4050 SBCI R21,0
0072 3040 CPI R20,0
0073 0745 CPC R20,R21
0074 F7C9 BNE 0x006E
0075 940E01A9 CALL pop_gset1
0077 9508 RET
_Delay1s:
n --> R20
0078 940E01A6 CALL push_gset1
007A 01A8 MOVW R20,R16
(0016) }
(0017) }
(0018) void Delay1s(uint16 n)
(0019) {
(0020) n=n*40;
007B E208 LDI R16,0x28
007C E010 LDI R17,0
007D 019A MOVW R18,R20
007E 940E018E CALL empy16s
0080 01A8 MOVW R20,R16
(0021) for (;n!=0;n--){
0081 C004 RJMP 0x0086
(0022) Delay100us(250);
0082 EF0A LDI R16,0xFA
0083 DFD7 RCALL _Delay100us
0084 5041 SUBI R20,1
0085 4050 SBCI R21,0
0086 3040 CPI R20,0
0087 0745 CPC R20,R21
0088 F7C9 BNE 0x0082
0089 940E01A9 CALL pop_gset1
008B 9508 RET
_timer0_ovf_isr:
008C 938A ST R24,-Y
008D B78F IN R24,0x3F
008E 938A ST R24,-Y
FILE: C:\DOCUME~1\Administrator\桌面\小車尋跡\interupts.c
(0001) /*******************************************************************************
(0002) ** 文件名:interupts.c 中斷處理函數
(0003) *******************************************************************************/
(0004) #include "config.h"
(0005)
(0006) #pragma interrupt_handler timer0_ovf_isr:10
(0007) void timer0_ovf_isr(void)
(0008) {
(0009) TCNT0 = 0x01; //reload counter value
008F E081 LDI R24,1
0090 BF82 OUT 0x32,R24
0091 9189 LD R24,Y+
0092 BF8F OUT 0x3F,R24
0093 9189 LD R24,Y+
0094 9518 RETI
(0010) }
(0011)
(0012) #pragma interrupt_handler timer0_comp_isr:20
(0013) void timer0_comp_isr(void)
(0014) {
_timer0_comp_isr:
0095 9518 RETI
_timer2_ovf_isr:
0096 938A ST R24,-Y
0097 B78F IN R24,0x3F
0098 938A ST R24,-Y
(0015) //compare occured TCNT0=OCR0
(0016) }
(0017)
(0018) #pragma interrupt_handler timer2_ovf_isr:6
(0019) void timer2_ovf_isr(void)
(0020) {
(0021) TCNT2 = 0x01; //reload counter value
0099 E081 LDI R24,1
009A BD84 OUT 0x24,R24
009B 9189 LD R24,Y+
009C BF8F OUT 0x3F,R24
009D 9189 LD R24,Y+
009E 9518 RETI
(0022) }
(0023)
(0024) /******************************************************************************/
(0025) // T2 控制PWM輸出
(0026) // timer2_comp_isr不需要用,但是必須允許中斷,在中斷時有信號輸出變化
(0027) /******************************************************************************/
(0028)
(0029) #pragma interrupt_handler timer2_comp_isr:8
(0030) void timer2_comp_isr(void)
(0031) {
_timer2_comp_isr:
009F 9518 RETI
FILE: C:\DOCUME~1\Administrator\桌面\小車尋跡\main.c
(0001) /*******************************************************************************
(0002) ** 文件名:main.c 工程主文件
(0003) *******************************************************************************/
(0004) #include "config.h"
(0005)
(0006) volatile uint8 flag; //小車狀態
(0007) //0未偏 1左偏 2右偏 3前出線 4后出線 5脫軌
(0008) /*void main(void)
(0009) {
(0010) init_devices();
(0011) straight();
(0012)
(0013) flag_test(); //測試小車狀態
(0014) while(1) //沒有脫軌
(0015) {
(0016) flag_test();
(0017) switch(flag)
(0018) {
(0019) case 0: //正常情況將速度設成相等
(0020) motor_right_speed_set(0xFE);
(0021) motor_left_speed_set(0xFE);
(0022) break;
(0023) case 1:
(0024) mic_turn_right();
(0025) break;
(0026) case 2:
(0027) mic_turn_left();
(0028) break;
(0029) case 3:
(0030) break;
(0031) case 4:
(0032) break;
(0033) case 5:
(0034) stop();
(0035) break;
(0036) default:
(0037) break;
(0038) }
(0039) }
(0040) }/end main*/
(0041)
(0042) // moto test *****************************************************************
(0043)
(0044) void main(void)
(0045) {
(0046) init_devices();
_main:
00A0 940E0180 CALL _init_devices
00A2 C009 RJMP 0x00AC
(0047) while(1)
(0048) {
(0049) //motor_left_forward(0xa0);
(0050) //Delay1ms(100);
(0051) motor_right_forward(0xa0);
00A3 EA00 LDI R16,0xA0
00A4 940E00D0 CALL _motor_right_forward
(0052)
(0053) //straight();
(0054) //Delay1ms(100);
(0055) //turn_left();
(0056) //Delay1ms(100);
(0057) //turn_right();
(0058) //Delay1ms(100);
(0059)
(0060) //straight_back();
(0061) //Delay1ms(500);
(0062) //mic_turn_left();
(0063) //Delay1ms(100);
(0064)
(0065) //mic_turn_right();
(0066) //Delay1ms(100);
(0067) stop();
00A6 940E0109 CALL _stop
(0068) Delay1ms(500);
00A8 EF04 LDI R16,0xF4
00A9 E011 LDI R17,1
00AA 940E006A CALL _Delay1ms
00AC CFF6 RJMP 0x00A3
00AD 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\小車尋跡\motor.c
(0001) /****************************************************************
(0002) ** 文件名:motor.c 電機驅動函數
(0003) ****************************************************************/
(0004) #include "config.h"
(0005) /*#define T0_EN TIMSK |= (1<<OCIE0)|(1<<TOIE0)
(0006) #define T0_UEN TIMSK &=~ (1<<OCIE0)|(1<<TOIE0)
(0007) #define T0_start TCCR0 |= (1<<WGM00)|(1<<WGM01)|(1<<COM01)|0x04;
(0008) //0x04 0100B 代表256預分頻
(0009) #define T0_stop TCCR0 = 0x00
(0010)
(0011) #define T2_EN TIMSK |= (1<<OCIE2)|(1<<TOIE2)
(0012) #define T2_UEN TIMSK &=~ (1<<OCIE2)|(1<<TOIE2)
(0013) #define T2_start TCCR2 = (1<<WGM20)|(1<<WGM21)|(1<<COM21)|0x06
(0014) #define T2_stop TCCR2 = 0x00
(0015)
(0016)
(0017)
(0018) /************************左電機動作*****************************/
(0019) //左電機前進
(0020) void motor_left_forward(uint8 speed)
(0021) {
(0022) motol_uen1;
_motor_left_forward:
speed --> R16
00AE 98C1 CBI 0x18,1
(0023) motol_en2;
00AF 9AC2 SBI 0x18,2
(0024) if(speed!=0) //加入調速指令
00B0 2300 TST R16
00B1 F009 BEQ 0x00B3
(0025) {
(0026) OCR0=speed;
00B2 BF0C OUT 0x3C,R16
(0027) }
(0028) T0_EN;
00B3 B789 IN R24,0x39
00B4 6083 ORI R24,3
00B5 BF89 OUT 0x39,R24
00B6 9508 RET
(0029) }
(0030) //左電機后退
(0031) void motor_left_backward(uint8 speed)
(0032) {
(0033) motol_en1;
_motor_left_backward:
speed --> R16
00B7 9AC1 SBI 0x18,1
(0034) motol_uen2;
00B8 98C2 CBI 0x18,2
(0035) if(speed!=0) //加入調速指令
00B9 2300 TST R16
00BA F009 BEQ 0x00BC
(0036) {
(0037) OCR0=speed;
00BB BF0C OUT 0x3C,R16
(0038) }
(0039) T0_EN;
00BC B789 IN R24,0x39
00BD 6083 ORI R24,3
00BE BF89 OUT 0x39,R24
00BF 9508 RET
(0040) }
(0041) //左電機速度設定
(0042) void motor_left_speed_set(uint8 speed)
(0043) {
(0044) if(speed!=0)
_motor_left_speed_set:
speed --> R16
00C0 2300 TST R16
00C1 F009 BEQ 0x00C3
(0045) {
(0046) OCR0=speed;
00C2 BF0C OUT 0x3C,R16
(0047) }
00C3 9508 RET
(0048) }
(0049) //左電機滑行
(0050) void motor_left_stop(void)
(0051) {
(0052) motol_uen1;
_motor_left_stop:
00C4 98C1 CBI 0x18,1
(0053) motol_uen2;
00C5 98C2 CBI 0x18,2
(0054) T0_UEN;
00C6 B789 IN R24,0x39
00C7 7F8D ANDI R24,0xFD
00C8 BF89 OUT 0x39,R24
00C9 9508 RET
(0055) }
(0056) //左電機急停
(0057) void motor_left_quick_stop(void)
(0058) {
(0059) motol_en1;
_motor_left_quick_stop:
00CA 9AC1 SBI 0x18,1
(0060) motol_en2;
00CB 9AC2 SBI 0x18,2
(0061) T0_UEN;
00CC B789 IN R24,0x39
00CD 7F8D ANDI R24,0xFD
00CE BF89 OUT 0x39,R24
00CF 9508 RET
(0062) }
(0063)
(0064) /*************************右電機動作*****************************/
(0065) //右電機前進
(0066) void motor_right_forward(uint8 speed)
(0067) {
(0068) motor_en1;
_motor_right_forward:
speed --> R16
00D0 9AC4 SBI 0x18,4
(0069) motor_uen2;
00D1 98C5 CBI 0x18,5
(0070) if(speed!=0) //加入調速指令
00D2 2300 TST R16
00D3 F021 BEQ 0x00D8
(0071) {
(0072) OCR2=speed;
00D4 BD03 OUT 0x23,R16
(0073) while(ASSR&(1<<TCR2UB)==1) ; //異步操作需要等待 OCR2寫入完畢
00D5 B422 IN R2,0x22
00D6 FC20 SBRC R2,0
00D7 CFFD RJMP 0x00D5
(0074) }
00D8 9508 RET
(0075) //T2_EN;
(0076) }
(0077) //右電機后退
(0078) void motor_right_backward(uint8 speed)
(0079) {
(0080) motor_uen1;
_motor_right_backward:
speed --> R16
00D9 98C4 CBI 0x18,4
(0081) motor_en2;
00DA 9AC5 SBI 0x18,5
(0082) if(speed!=0) //加入調速指令
00DB 2300 TST R16
00DC F021 BEQ 0x00E1
(0083) {
(0084) OCR2=speed;
00DD BD03 OUT 0x23,R16
(0085) while(ASSR&(1<<TCR2UB)==1) ; //異步操作需要等待 OCR2寫入完畢
00DE B422 IN R2,0x22
00DF FC20 SBRC R2,0
00E0 CFFD RJMP 0x00DE
(0086) }
00E1 9508 RET
(0087) //T2_EN;
(0088) }
(0089) //右電機速度設定
(0090) void motor_right_speed_set(uint8 speed)
(0091) {
(0092) if(speed!=0)
_motor_right_speed_set:
speed --> R16
00E2 2300 TST R16
00E3 F021 BEQ 0x00E8
(0093) {
(0094) OCR0=speed;
00E4 BF0C OUT 0x3C,R16
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -