⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 con2.lst

📁 M8制作的舵机控制器
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -