📄 con2.lst
字号:
__text_start:
__start:
0015 E5CF LDI R28,0x5F
0016 E0D4 LDI R29,4
0017 BFCD OUT 0x3D,R28
0018 BFDE OUT 0x3E,R29
0019 51C0 SUBI R28,0x10
001A 40D0 SBCI R29,0
001B EA0A LDI R16,0xAA
001C 8308 STD Y+0,R16
001D 2400 CLR R0
001E E6E4 LDI R30,0x64
001F E0F0 LDI R31,0
0020 E010 LDI R17,0
0021 36E4 CPI R30,0x64
0022 07F1 CPC R31,R17
0023 F011 BEQ 0x0026
0024 9201 ST R0,Z+
0025 CFFB RJMP 0x0021
0026 8300 STD Z+0,R16
0027 E2E6 LDI R30,0x26
0028 E0F0 LDI R31,0
0029 E6A0 LDI R26,0x60
002A E0B0 LDI R27,0
002B E010 LDI R17,0
002C 32EA CPI R30,0x2A
002D 07F1 CPC R31,R17
002E F021 BEQ 0x0033
002F 95C8 LPM
0030 9631 ADIW R30,1
0031 920D ST R0,X+
0032 CFF9 RJMP 0x002C
0033 D0C3 RCALL _main
_exit:
0034 CFFF RJMP _exit
FILE: D:\AVR程序\舵机控制2\scon2.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003)
(0004) #define Uchar unsigned char
(0005) #define Uint unsigned int
(0006)
(0007)
(0008) #define nop() asm("nop")
(0009) #define _nop_() asm("nop")
(0010)
(0011)
(0012)
(0013) #define PB PORTB
(0014) #define PC PORTC
(0015) #define PD PORTD
(0016)
(0017)
(0018)
(0019) #define Forward0 PB|=0x01; PB&=~0x02;
(0020) #define Backward0 PB|=0x02; PB&=~0x01;
(0021) #define Stop0 PB|=0x03;
(0022)
(0023) #define Forward1 PC|=0x10; PC&=~0x20;
(0024) #define Backward1 PC|=0x20; PC&=~0x10;
(0025) #define Stop1 PC|=0x30;
(0026)
(0027)
(0028) #define IN0 PIND&0x04
(0029) #define IN1 PIND&0x08
(0030) #define OF2 TIFR&0x40
(0031) #define COF2 TIFR|=0x40
(0032)
(0033) //原理;外部上升中断-定时器开-0。4毫秒后比较中断-清零定时器-外部下降中断-读出计数器-PWM输出
(0034)
(0035) Uint time1=127,time2=127;//定时器数据
(0036)
(0037)
(0038)
(0039) void Delay (Uint time)
(0040) {
_Delay:
time --> R16
0035 C002 RJMP 0x0038
(0041) while(time)
(0042) {
(0043) time--;
0036 5001 SUBI R16,1
0037 4010 SBCI R17,0
0038 3000 CPI R16,0
0039 0701 CPC R16,R17
003A F7D9 BNE 0x0036
003B 9508 RET
(0044) }
(0045) }
(0046)
(0047)
(0048)
(0049) void port_init(void)
(0050) {
(0051) PORTB = 0x00;
_port_init:
003C 2422 CLR R2
003D BA28 OUT 0x18,R2
(0052) DDRB = 0x0F;
003E E08F LDI R24,0xF
003F BB87 OUT 0x17,R24
(0053) PORTC = 0x00; //m103 output only
0040 BA25 OUT 0x15,R2
(0054) DDRC = 0x30;
0041 E380 LDI R24,0x30
0042 BB84 OUT 0x14,R24
(0055) PORTD = 0x00;
0043 BA22 OUT 0x12,R2
(0056) DDRD = 0x00;
0044 BA21 OUT 0x11,R2
0045 9508 RET
(0057) }
(0058)
(0059)
(0060)
(0061)
(0062) //TIMER1 initialize - prescale:8
(0063) // WGM: 0) Normal, TOP=0xFFFF
(0064) // desired value: 1Hz
(0065) // actual value: Out of range
(0066) void timer1_init(void)
(0067) {
(0068) TCCR1B = 0x00; //stop
_timer1_init:
0046 2422 CLR R2
0047 BC2E OUT 0x2E,R2
(0069) TCNT1 = 0x00 /*INVALID SETTING*/; //setup
0048 2433 CLR R3
0049 BC3D OUT 0x2D,R3
004A BC2C OUT 0x2C,R2
(0070) OCR1A = 100;
004B E684 LDI R24,0x64
004C E090 LDI R25,0
004D BD9B OUT 0x2B,R25
004E BD8A OUT 0x2A,R24
(0071) OCR1B = 0x00 /*INVALID SETTING*/;
004F BC39 OUT 0x29,R3
0050 BC28 OUT 0x28,R2
(0072) ICR1 = 0x00 /*INVALID SETTING*/;
0051 BC37 OUT 0x27,R3
0052 BC26 OUT 0x26,R2
(0073) TCCR1A = 0x00;
0053 BC2F OUT 0x2F,R2
0054 9508 RET
(0074) // TCCR1B = 0x03; //start Timer
(0075) }
(0076)
(0077)
(0078)
(0079) //TIMER2 initialize - prescale:8
(0080) // WGM: Normal
(0081) // desired value: 1Hz
(0082) // actual value: Out of range
(0083) void timer2_init(void)
(0084) {
(0085) TCCR2 = 0x00; //stop
_timer2_init:
0055 2422 CLR R2
0056 BC25 OUT 0x25,R2
(0086) ASSR = 0x00; //set async mode
0057 BC22 OUT 0x22,R2
(0087) TCNT2 = 0x00 /*INVALID SETTING*/; //setup
0058 BC24 OUT 0x24,R2
(0088) OCR2 = 100;
0059 E684 LDI R24,0x64
005A BD83 OUT 0x23,R24
005B 9508 RET
(0089) //TCCR2 = 0x03; //start
(0090) }
(0091)
(0092)
(0093)
(0094) //ADC initialize
(0095) // Conversion time: 104uS
(0096) void adc_init(void)
(0097) {
(0098) ADCSR = 0x00; //disable adc
_adc_init:
005C 2422 CLR R2
005D B826 OUT 0x06,R2
(0099) ADMUX = 0x00; //select adc input 0
005E B827 OUT 0x07,R2
(0100) ACSR = 0x80;
005F E880 LDI R24,0x80
0060 B988 OUT 0x08,R24
(0101) ADCSR = 0x86;
0061 E886 LDI R24,0x86
0062 B986 OUT 0x06,R24
0063 9508 RET
_int0_isr:
0064 D1DE RCALL 0x0243
(0102) }
(0103)
(0104) #pragma interrupt_handler int0_isr:2
(0105) void int0_isr(void)
(0106) {
(0107) //external interupt on INT0
(0108) switch(IN0)
0065 7004 ANDI R16,4
0066 7010 ANDI R17,0
0067 3000 CPI R16,0
0068 0701 CPC R16,R17
0069 F049 BEQ 0x0073
006A 3000 CPI R16,0
006B E0E0 LDI R30,0
006C 071E CPC R17,R30
006D F0DC BLT 0x0089
006E 3004 CPI R16,4
006F E0E0 LDI R30,0
0070 071E CPC R17,R30
0071 F0A9 BEQ 0x0087
0072 C016 RJMP 0x0089
(0109) {
(0110) case 0://下降触发
(0111) TCCR1B = 0x00; //stop
0073 2422 CLR R2
0074 BC2E OUT 0x2E,R2
(0112) time1=TCNT1&0x01ff;
0075 B58C IN R24,0x2C
0076 B59D IN R25,0x2D
0077 7091 ANDI R25,1
0078 D1E5 RCALL 0x025E
(0113) time1-=40;
0079 9788 SBIW R24,0x28
007A D1E3 RCALL 0x025E
(0114) if(time1>250)time1=250;
007B EF8A LDI R24,0xFA
007C E090 LDI R25,0
007D D1E5 RCALL 0x0263
007E 1582 CP R24,R2
007F 0593 CPC R25,R3
0080 F408 BCC 0x0082
0081 D1DC RCALL 0x025E
(0115) TCNT1=0;
0082 2422 CLR R2
0083 2433 CLR R3
0084 BC3D OUT 0x2D,R3
0085 BC2C OUT 0x2C,R2
(0116) break;
0086 C002 RJMP 0x0089
(0117) case 0x04://上升触发
(0118) TCCR1B = 0x03; //start Timer
0087 E083 LDI R24,3
0088 BD8E OUT 0x2E,R24
(0119) }
0089 9029 LD R2,Y+
008A BE2F OUT 0x3F,R2
008B 91E9 LD R30,Y+
008C 9199 LD R25,Y+
008D 9189 LD R24,Y+
008E 9119 LD R17,Y+
008F 9109 LD R16,Y+
0090 9039 LD R3,Y+
0091 9029 LD R2,Y+
0092 9518 RETI
_int1_isr:
0093 D1AF RCALL 0x0243
(0120) }
(0121)
(0122) #pragma interrupt_handler int1_isr:3
(0123) void int1_isr(void)
(0124) {
(0125) //external interupt on INT1
(0126) switch(IN1)
0094 7008 ANDI R16,0x8
0095 7010 ANDI R17,0
0096 3000 CPI R16,0
0097 0701 CPC R16,R17
0098 F049 BEQ 0x00A2
0099 3000 CPI R16,0
009A E0E0 LDI R30,0
009B 071E CPC R17,R30
009C F14C BLT 0x00C6
009D 3008 CPI R16,0x8
009E E0E0 LDI R30,0
009F 071E CPC R17,R30
00A0 F119 BEQ 0x00C4
00A1 C024 RJMP 0x00C6
(0127) {
(0128) case 0://下降触发
(0129) TCCR2 = 0x00; //stop
00A2 2422 CLR R2
00A3 BC25 OUT 0x25,R2
(0130) if(OF2){time2=TCNT2+0xff;COF2;}//定时器2扩展使用
00A4 B628 IN R2,0x38
00A5 FE26 SBRS R2,6
00A6 C009 RJMP 0x00B0
00A7 B584 IN R24,0x24
00A8 2799 CLR R25
00A9 5081 SUBI R24,1
00AA 4F9F SBCI R25,0xFF
00AB D1AD RCALL 0x0259
00AC B788 IN R24,0x38
00AD 6480 ORI R24,0x40
00AE BF88 OUT 0x38,R24
00AF C006 RJMP 0x00B6
(0131) else
(0132) time2=TCNT2;
00B0 B424 IN R2,0x24
00B1 2433 CLR R3
00B2 92300063 STS time2+1,R3
00B4 92200062 STS time2,R2
(0133) time2-=100;
00B6 D19D RCALL 0x0254
00B7 5684 SUBI R24,0x64
00B8 4090 SBCI R25,0
00B9 D19F RCALL 0x0259
(0134) if(time2>250)time2=250;
00BA EF8A LDI R24,0xFA
00BB E090 LDI R25,0
00BC D1B0 RCALL 0x026D
00BD 1582 CP R24,R2
00BE 0593 CPC R25,R3
00BF F408 BCC 0x00C1
00C0 D198 RCALL 0x0259
(0135) TCNT2=0;
00C1 2422 CLR R2
00C2 BC24 OUT 0x24,R2
(0136)
(0137) break;
00C3 C002 RJMP 0x00C6
(0138) case 0x08://上升触发
(0139) TCCR2 = 0x03; //start
00C4 E083 LDI R24,3
00C5 BD85 OUT 0x25,R24
(0140) }
00C6 9029 LD R2,Y+
00C7 BE2F OUT 0x3F,R2
00C8 91E9 LD R30,Y+
00C9 9199 LD R25,Y+
00CA 9189 LD R24,Y+
00CB 9119 LD R17,Y+
00CC 9109 LD R16,Y+
00CD 9039 LD R3,Y+
00CE 9029 LD R2,Y+
00CF 9518 RETI
(0141)
(0142) }
(0143)
(0144) //call this routine to initialize all peripherals
(0145) void init_devices(void)
(0146) {
(0147) //stop errant interrupts until set up
(0148) CLI(); //disable all interrupts
_init_devices:
00D0 94F8 BCLR 7
(0149) port_init();
00D1 DF6A RCALL _port_init
(0150) timer1_init();
00D2 DF73 RCALL _timer1_init
(0151) timer2_init();
00D3 DF81 RCALL _timer2_init
(0152) adc_init();
00D4 DF87 RCALL _adc_init
(0153)
(0154) MCUCR = 0x05;
00D5 E085 LDI R24,5
00D6 BF85 OUT 0x35,R24
(0155) GICR = 0xC0;
00D7 EC80 LDI R24,0xC0
00D8 BF8B OUT 0x3B,R24
(0156) TIMSK = 0x00; //timer interrupt sources
00D9 2422 CLR R2
00DA BE29 OUT 0x39,R2
(0157) SEI(); //re-enable interrupts
00DB 9478 BSET 7
00DC 9508 RET
_ReadADC:
int2 --> R20
int1 --> R22
channel --> R16
00DD D147 RCALL push_gset2
(0158) //all peripherals are now initialized
(0159) }
(0160)
(0161)
(0162)
(0163)
(0164)
(0165) Uint ReadADC (Uchar channel)
(0166) {
(0167) Uint int1,int2;
(0168) ADMUX&=~0x1F;
00DE B187 IN R24,0x07
00DF 7E80 ANDI R24,0xE0
00E0 B987 OUT 0x07,R24
(0169) ADMUX|=channel;
00E1 B027 IN R2,0x07
00E2 2A20 OR R2,R16
00E3 B827 OUT 0x07,R2
(0170) ADCSRA|=0x40;
00E4 9A36 SBI 0x06,6
(0171) while(~ADCSRA&0x10){}
00E5 B026 IN R2,0x06
00E6 2433 CLR R3
00E7 9420 COM R2
00E8 9430 COM R3
00E9 FC24 SBRC R2,4
00EA CFFA RJMP 0x00E5
(0172) ADCSRA|=0x10;
00EB 9A34 SBI 0x06,4
(0173) int2=ADCL;
00EC B144 IN R20,0x04
00ED 2755 CLR R21
(0174) int1=ADCH;
00EE B165 IN R22,0x05
00EF 2777 CLR R23
(0175) int1<<=8;
00F0 2F76 MOV R23,R22
00F1 2766 CLR R22
(0176) return (int1+int2);
00F2 018B MOVW R16,R22
00F3 0F04 ADD R16,R20
00F4 1F15 ADC R17,R21
00F5 D127 RCALL pop_gset2
00F6 9508 RET
_main:
stopt1 --> Y+2
stopt0 --> Y+0
barke1 --> R20
barke0 --> R22
dst1 --> R10
dst0 --> R12
action1 --> R14
action0 --> Y+20
temp1 --> Y+18
temp0 --> Y+16
adc1 --> Y+14
adc0 --> Y+12
pos1 --> Y+10
pos0 --> Y+8
00F7 9765 SBIW R28,0x15
(0177) }
(0178)
(0179)
(0180)
(0181)
(0182)
(0183) main()
(0184) {
(0185) Uchar dst0,dst1;//距离定点的数值
(0186) Uint stopt0,stopt1;//刹车时间
(0187) Uint adc0,adc1;//舵机电位
(0188) Uint pos0,pos1;//舵机电位
(0189) Uint temp0,temp1;//舵机电位
(0190) Uchar barke0,barke1;//强力刹车,由全速运行转换到爬行需要强力刹车即长时间反向制动
(0191) Uchar action0,action1;//电机动作
(0192)
(0193) init_devices();
00F8 DFD7 RCALL _init_devices
00F9 C120 RJMP 0x021A
(0194)
(0195)
(0196) while(1)
(0197) {
(0198) adc0=ReadADC (0);
00FA 2700 CLR R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -