📄 uart.lst
字号:
(0183) void adc_init(void)
(0184) {
(0185) ADCSR = 0x00; //disable adc
_adc_init:
0087 2422 CLR R2
0088 B826 OUT 0x06,R2
(0186) ADMUX = 0x00; //select adc input 0
0089 B827 OUT 0x07,R2
(0187) ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);//Aref端口电压为参考电压,ADC使能,开启,64分频
008A EC8E LDI R24,0xCE
008B B986 OUT 0x06,R24
(0188)
(0189) }
008C 9508 RET
_adc_isr:
008D 922A ST R2,-Y
008E 923A ST R3,-Y
008F 938A ST R24,-Y
0090 939A ST R25,-Y
0091 93EA ST R30,-Y
0092 93FA ST R31,-Y
0093 B62F IN R2,0x3F
0094 922A ST R2,-Y
(0190)
(0191) #pragma interrupt_handler adc_isr:15
(0192) void adc_isr(void)
(0193) {
(0194)
(0195) //conversion complete, read value (int) using...
(0196) tdata[j]=ADC>>2;
0095 E684 LDI R24,0x64
0096 E090 LDI R25,0
0097 91E00060 LDS R30,0x60
0099 27FF CLR R31
009A 0FE8 ADD R30,R24
009B 1FF9 ADC R31,R25
009C B024 IN R2,0x04
009D B035 IN R3,0x05
009E 9436 LSR R3
009F 9427 ROR R2
00A0 9436 LSR R3
00A1 9427 ROR R2
00A2 8220 STD Z+0,R2
(0197) j++; //取字节的前八位
00A3 91800060 LDS R24,0x60
00A5 5F8F SUBI R24,0xFF
00A6 93800060 STS 0x60,R24
(0198)
(0199) // value=ADCL; //Read 8 low bits first (important)
(0200) ADCSRA=(1<<ADSC);//启动下一次转换
00A8 E480 LDI R24,0x40
00A9 B986 OUT 0x06,R24
(0201)
(0202) // value|=(int)ADCH << 8; //read 2 high bits and shift into top byte
(0203) }
00AA 9029 LD R2,Y+
00AB BE2F OUT 0x3F,R2
00AC 91F9 LD R31,Y+
00AD 91E9 LD R30,Y+
00AE 9199 LD R25,Y+
00AF 9189 LD R24,Y+
00B0 9039 LD R3,Y+
00B1 9029 LD R2,Y+
00B2 9518 RETI
(0204)
(0205) /////********************************初始化***********************************************
(0206) void init_device()
(0207) {
(0208) CLI();
_init_device:
00B3 94F8 BCLR 7
(0209) //stop errant interrupts until set up
(0210) CLI(); //disable all interrupts
00B4 94F8 BCLR 7
(0211) PORTA = 0xFF;
00B5 EF8F LDI R24,0xFF
00B6 BB8B OUT 0x1B,R24
(0212) DDRA = 0x00;
00B7 2422 CLR R2
00B8 BA2A OUT 0x1A,R2
(0213)
(0214) PORTB = 0xFF;
00B9 BB88 OUT 0x18,R24
(0215) DDRB = 0x10; //定义PB.5为输出,其余B口为输入
00BA E180 LDI R24,0x10
00BB BB87 OUT 0x17,R24
(0216)
(0217) PORTC = 0xFF;
00BC EF8F LDI R24,0xFF
00BD BB85 OUT 0x15,R24
(0218) DDRC = 0x00;
00BE BA24 OUT 0x14,R2
(0219)
(0220) PORTD = 0xFF;
00BF BB82 OUT 0x12,R24
(0221) DDRD = 0x00;
00C0 BA21 OUT 0x11,R2
(0222)
(0223) //看门狗设置// prescale: 2048K cycles
(0224) asm("WDR"); //启动看门狗定时器,看门狗定时器间隔1.9s
00C1 95A8 WDR
(0225) WDTCR = 0x0f;
00C2 E08F LDI R24,0xF
00C3 BD81 OUT 0x21,R24
(0226)
(0227) //TIMER0 initialisation - prescale:64
(0228) // desired value: 1mSec
(0229) // actual value: 1.000mSec (0.0%)
(0230)
(0231) TCCR0 = 0x00; //stop
00C4 BE23 OUT 0x33,R2
(0232) TCNT0 = 0x83; //set count
00C5 E883 LDI R24,0x83
00C6 BF82 OUT 0x32,R24
(0233) //TCCR0 = 0x03; //start timer
(0234)
(0235) //uart0_init(12);//波特率是19200?????
(0236)
(0237) USART_Init();
00C7 DFA6 RCALL _USART_Init
(0238) SPI_MasterInit();
00C8 DFB5 RCALL _SPI_MasterInit
(0239) adc_init();
00C9 DFBD RCALL _adc_init
(0240)
(0241) MCUCR = 0x00;
00CA 2422 CLR R2
00CB BE25 OUT 0x35,R2
(0242) GIMSK = 0x00;
00CC BE2B OUT 0x3B,R2
(0243) TIMSK = 0x01;
00CD E081 LDI R24,1
00CE BF89 OUT 0x39,R24
(0244) SEI(); //re-enable interrupts
00CF 9478 BSET 7
(0245) //all peripherals are now initialised
(0246) }
00D0 9508 RET
(0247)
(0248)
(0249)
(0250) //系统每50s检测一次状态,向上位机发送一次命令;喂看门狗;更新显示《***上位机只负责接收,错误帧丢弃,不重发***》
(0251) void main()
(0252) {
(0253) init_device();
_main:
sum --> R20
pos --> R22
00D1 DFE1 RCALL _init_device
00D2 C146 RJMP 0x0219
(0254)
(0255) while(1)
(0256) {
(0257) uchar pos=0,sum=0;
00D3 2766 CLR R22
00D4 2744 CLR R20
(0258)
(0259) WDR();
00D5 95A8 WDR
(0260)
(0261) PORTB |= BIT(PORTB5);//PB5端口置1,
00D6 9AC5 SBI 0x18,5
(0262) delay1(1000);
00D7 EE08 LDI R16,0xE8
00D8 E013 LDI R17,3
00D9 DF51 RCALL _delay1
(0263) //UCR=0x38;//发送使能
(0264)
(0265)
(0266) ////************************************每50S向上位机发送一次数据***************************************************************////
(0267)
(0268) //通过各个开关的开合方式来确定各字节值
(0269)
(0270)
(0271) /*
(0272) a.ARM&0x01= (PINC&0x10);//ARM1:腕顺
(0273) a.ARM&0x02= (PINC&0x20);//ARM2:腕逆
(0274) a.ARM&0x04= (PINC&0x40);//ARM3:手开
(0275) a.ARM&0x08= (PINC&0x80);//ARM4:手合
(0276) a.ARM&0x10= (PINC&0x01);//ARM5:大臂上
(0277) a.ARM&0x20= (PINC&0x02);//ARM6:大臂下
(0278) a.ARM&0x40= (PINC&0x04);//ARM7:小臂上
(0279) a.ARM&0x80= (PINC&0x08);//ARM8:小臂下
(0280) */
(0281) //数字量辅值
(0282)
(0283) if(PINC&0X10)//开关开状态
00DA 9B9C SBIS 0x13,4
00DB C006 RJMP 0x00E2
(0284) tdata[0]|=0X01;
00DC 91800064 LDS R24,_tdata
00DE 6081 ORI R24,1
00DF 93800064 STS _tdata,R24
00E1 C005 RJMP 0x00E7
(0285) else //开关合状态
(0286) tdata[0]&=~0x01;
00E2 91800064 LDS R24,_tdata
00E4 7F8E ANDI R24,0xFE
00E5 93800064 STS _tdata,R24
(0287)
(0288) if(PINC&0X20)
00E7 9B9D SBIS 0x13,5
00E8 C006 RJMP 0x00EF
(0289) tdata[0]|=0X02;
00E9 91800064 LDS R24,_tdata
00EB 6082 ORI R24,2
00EC 93800064 STS _tdata,R24
00EE C005 RJMP 0x00F4
(0290) else
(0291) tdata[0]&=~0x02;
00EF 91800064 LDS R24,_tdata
00F1 7F8D ANDI R24,0xFD
00F2 93800064 STS _tdata,R24
(0292)
(0293) if(PINC&0X40)
00F4 9B9E SBIS 0x13,6
00F5 C006 RJMP 0x00FC
(0294) tdata[0]|=0X04;
00F6 91800064 LDS R24,_tdata
00F8 6084 ORI R24,4
00F9 93800064 STS _tdata,R24
00FB C005 RJMP 0x0101
(0295) else
(0296) tdata[0]&=~0x04;
00FC 91800064 LDS R24,_tdata
00FE 7F8B ANDI R24,0xFB
00FF 93800064 STS _tdata,R24
(0297)
(0298) if(PINC&0X80)
0101 9B9F SBIS 0x13,7
0102 C006 RJMP 0x0109
(0299) tdata[0]|=0X08;
0103 91800064 LDS R24,_tdata
0105 6088 ORI R24,0x8
0106 93800064 STS _tdata,R24
0108 C005 RJMP 0x010E
(0300) else
(0301) tdata[0]&=~0x08;
0109 91800064 LDS R24,_tdata
010B 7F87 ANDI R24,0xF7
010C 93800064 STS _tdata,R24
(0302)
(0303) if(PINC&0X01)
010E 9B98 SBIS 0x13,0
010F C006 RJMP 0x0116
(0304) tdata[0]|=0X10;
0110 91800064 LDS R24,_tdata
0112 6180 ORI R24,0x10
0113 93800064 STS _tdata,R24
0115 C005 RJMP 0x011B
(0305) else
(0306) tdata[0]&=~0x10;
0116 91800064 LDS R24,_tdata
0118 7E8F ANDI R24,0xEF
0119 93800064 STS _tdata,R24
(0307)
(0308) if(PINC&0X02)
011B 9B99 SBIS 0x13,1
011C C006 RJMP 0x0123
(0309) tdata[0]|=0X20;
011D 91800064 LDS R24,_tdata
011F 6280 ORI R24,0x20
0120 93800064 STS _tdata,R24
0122 C005 RJMP 0x0128
(0310) else
(0311) tdata[0]&=~0x20;
0123 91800064 LDS R24,_tdata
0125 7D8F ANDI R24,0xDF
0126 93800064 STS _tdata,R24
(0312)
(0313) if(PINC&0X04)
0128 9B9A SBIS 0x13,2
0129 C006 RJMP 0x0130
(0314) tdata[0]|=0X40;
012A 91800064 LDS R24,_tdata
012C 6480 ORI R24,0x40
012D 93800064 STS _tdata,R24
012F C005 RJMP 0x0135
(0315) else
(0316) tdata[0]&=~0x40;
0130 91800064 LDS R24,_tdata
0132 7B8F ANDI R24,0xBF
0133 93800064 STS _tdata,R24
(0317)
(0318) if(PINC&0X08)
0135 9B9B SBIS 0x13,3
0136 C006 RJMP 0x013D
(0319) tdata[0]|=0X80;
0137 91800064 LDS R24,_tdata
0139 6880 ORI R24,0x80
013A 93800064 STS _tdata,R24
013C C005 RJMP 0x0142
(0320) else
(0321) tdata[0]&=~0x80;
013D 91800064 LDS R24,_tdata
013F 778F ANDI R24,0x7F
0140 93800064 STS _tdata,R24
(0322)
(0323)
(0324) /*
(0325) a.ROBOT&0x01 =(PIND&0x40);//ROBOT1:前摆上6
(0326) a.ROBOT&0x02 =(PIND&0x80);//ROBOT2:前摆下7
(0327) a.ROBOT&0x04 =(PIND&0x10);//ROBOT3:后摆上4
(0328) a.ROBOT&0x08 =(PIND&0x20);//ROBOT4:后摆下5
(0329) //a.ROBOT&0x10 =
(0330) //a.ROBOT&0x20 =
(0331) a.ROBOT&0x40 =(PINA&0x80);//ROBOT7:正常方式(1:正常;0:轮方式)7
(0332) a.ROBOT&0x80 =(PINB&0x01);//ROBOT8:车行走使能0 */
(0333)
(0334) if(PIND&0X40)//开关开状态
0142 9B86 SBIS 0x10,6
0143 C006 RJMP 0x014A
(0335) tdata[1]|=0X01;
0144 91800065 LDS R24,_tdata+1
0146 6081 ORI R24,1
0147 93800065 STS _tdata+1,R24
0149 C005 RJMP 0x014F
(0336) else //开关合状态
(0337) tdata[1]&=~0x01;
014A 91800065 LDS R24,_tdata+1
014C 7F8E ANDI R24,0xFE
014D 93800065 STS _tdata+1,R24
(0338)
(0339) if(PIND&0X80)
014F 9B87 SBIS 0x10,7
0150 C006 RJMP 0x0157
(0340) tdata[1]|=0X02;
0151 91800065 LDS R24,_tdata+1
0153 6082 ORI R24,2
0154 93800065 STS _tdata+1,R24
0156 C005 RJMP 0x015C
(0341) else
(0342) tdata[1]&=~0x02;
0157 91800065 LDS R24,_tdata+1
0159 7F8D ANDI R24,0xFD
015A 93800065 STS _tdata+1,R24
(0343)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -