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

📄 motor_salve.lst

📁 用ICC编写的程序包括SPI
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    002D E5CF      LDI	R28,0x5F
    002E E0D4      LDI	R29,4
    002F BFCD      OUT	0x3D,R28
    0030 BFDE      OUT	0x3E,R29
    0031 51C0      SUBI	R28,0x10
    0032 40D0      SBCI	R29,0
    0033 EA0A      LDI	R16,0xAA
    0034 8308      STD	Y+0,R16
    0035 2400      CLR	R0
    0036 E6E6      LDI	R30,0x66
    0037 E0F0      LDI	R31,0
    0038 E010      LDI	R17,0
    0039 37E2      CPI	R30,0x72
    003A 07F1      CPC	R31,R17
    003B F011      BEQ	0x003E
    003C 9201      ST	R0,Z+
    003D CFFB      RJMP	0x0039
    003E 8300      STD	Z+0,R16
    003F E5E4      LDI	R30,0x54
    0040 E0F0      LDI	R31,0
    0041 E6A0      LDI	R26,0x60
    0042 E0B0      LDI	R27,0
    0043 E010      LDI	R17,0
    0044 35EA      CPI	R30,0x5A
    0045 07F1      CPC	R31,R17
    0046 F021      BEQ	0x004B
    0047 95C8      LPM
    0048 9631      ADIW	R30,1
    0049 920D      ST	R0,X+
    004A CFF9      RJMP	0x0044
    004B 940E0068  CALL	_main
_exit:
    004D CFFF      RJMP	_exit
FILE: F:\IccAvr_Pro\Motor_salve.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) 
(0004) #include "qep.h"
(0005) #include "SPI_slave.h"
(0006) #include "pwm.h"
(0007) 
(0008) 
(0009) extern unsigned char SPI_rx_buff[SPI_size];  
(0010) extern unsigned char SPI_tx_buff[SPI_size];  
(0011) extern unsigned char rx_index;  
(0012) extern unsigned char tx_index,SPI_tx_flag;
(0013) extern int	qep_cnt[QEP_size];
(0014) extern unsigned char pwm_value[2];
(0015) extern unsigned char pwm_flag;
(0016) 
(0017) 
(0018) void port_init(void)
(0019) {
(0020)  PORTA = 0xFF;
_port_init:
    004E EF8F      LDI	R24,0xFF
    004F BB8B      OUT	0x1B,R24
(0021)  DDRA  = 0x00;
    0050 2422      CLR	R2
    0051 BA2A      OUT	0x1A,R2
(0022)  PORTB = 0xFF;
    0052 BB88      OUT	0x18,R24
(0023)  DDRB  = 0x00;
    0053 BA27      OUT	0x17,R2
(0024)  PORTC = 0x00; 
    0054 BA25      OUT	0x15,R2
(0025)  DDRC  = 0x00;
    0055 BA24      OUT	0x14,R2
(0026)  PORTD = 0x00;
    0056 BA22      OUT	0x12,R2
(0027)  DDRD  = 0x30;
    0057 E380      LDI	R24,0x30
    0058 BB81      OUT	0x11,R24
    0059 9508      RET
(0028) } 
(0029) 
(0030) //call this routine to initialize all peripherals
(0031) void init_devices(void)
(0032) {
(0033)  //stop errant interrupts until set up
(0034)  CLI(); //disable all interrupts
_init_devices:
    005A 94F8      BCLR	7
(0035)  port_init();
    005B DFF2      RCALL	_port_init
(0036)  pwm_init();
    005C 940E00BE  CALL	_pwm_init
(0037)  spi_init();
    005E 940E01AD  CALL	_spi_init
(0038) 
(0039)  MCUCR = 0x0A;
    0060 E08A      LDI	R24,0xA
    0061 BF85      OUT	0x35,R24
(0040)  GICR  = 0xC0;
    0062 EC80      LDI	R24,0xC0
    0063 BF8B      OUT	0x3B,R24
(0041)  TIMSK = 0x00; //timer interrupt sources
    0064 2422      CLR	R2
    0065 BE29      OUT	0x39,R2
(0042)  SEI(); //re-enable interrupts
    0066 9478      BSET	7
    0067 9508      RET
(0043)  //all peripherals are now initialized
(0044)  }
(0045) void main(void)  
(0046) {   
(0047)   init_devices();
_main:
    0068 DFF1      RCALL	_init_devices
    0069 C009      RJMP	0x0073
(0048)   
(0049)   while(1)
(0050)  {
(0051)  if(pwm_flag)
    006A 90200066  LDS	R2,pwm_flag
    006C 2022      TST	R2
    006D F029      BEQ	0x0073
(0052)   {
(0053)   pwm_change();
    006E 940E00D4  CALL	_pwm_change
(0054)   pwm_flag=0;
    0070 2422      CLR	R2
    0071 92200066  STS	pwm_flag,R2
    0073 CFF6      RJMP	0x006A
    0074 9508      RET
_int0_isr:
    0075 938A      ST	R24,-Y
    0076 939A      ST	R25,-Y
    0077 B78F      IN	R24,0x3F
    0078 938A      ST	R24,-Y
FILE: F:\IccAvr_Pro\qep.c
(0001) #include "qep.h"
(0002) int	qep_cnt[QEP_size]={0x0000,0x0000};
(0003) #pragma interrupt_handler int0_isr:2
(0004) void int0_isr(void)
(0005) {
(0006)  //external interupt on INT0
(0007)  if(PINC&BIT(QEP_B1))
    0079 B383      IN	R24,0x13
    007A 7081      ANDI	R24,1
    007B F051      BEQ	0x0086
(0008)  	qep_cnt[0]--;
    007C 91800060  LDS	R24,qep_cnt
    007E 91900061  LDS	R25,qep_cnt+1
    0080 9701      SBIW	R24,1
    0081 93900061  STS	qep_cnt+1,R25
    0083 93800060  STS	qep_cnt,R24
    0085 C009      RJMP	0x008F
(0009)  else
(0010)  	qep_cnt[0]++;
    0086 91800060  LDS	R24,qep_cnt
    0088 91900061  LDS	R25,qep_cnt+1
    008A 9601      ADIW	R24,1
    008B 93900061  STS	qep_cnt+1,R25
    008D 93800060  STS	qep_cnt,R24
    008F 9189      LD	R24,Y+
    0090 BF8F      OUT	0x3F,R24
    0091 9199      LD	R25,Y+
    0092 9189      LD	R24,Y+
    0093 9518      RETI
_int1_isr:
    0094 938A      ST	R24,-Y
    0095 939A      ST	R25,-Y
    0096 B78F      IN	R24,0x3F
    0097 938A      ST	R24,-Y
(0011) }
(0012) #pragma interrupt_handler int1_isr:3
(0013) void int1_isr(void)
(0014) {
(0015)  //external interupt on INT1
(0016)   if(PINC&BIT(QEP_B2))
    0098 B383      IN	R24,0x13
    0099 7082      ANDI	R24,2
    009A F051      BEQ	0x00A5
(0017)  	qep_cnt[1]--;
    009B 91800062  LDS	R24,qep_cnt+2
    009D 91900063  LDS	R25,qep_cnt+3
    009F 9701      SBIW	R24,1
    00A0 93900063  STS	qep_cnt+3,R25
    00A2 93800062  STS	qep_cnt+2,R24
    00A4 C009      RJMP	0x00AE
(0018)  else
(0019)  	qep_cnt[1]++;
    00A5 91800062  LDS	R24,qep_cnt+2
    00A7 91900063  LDS	R25,qep_cnt+3
    00A9 9601      ADIW	R24,1
    00AA 93900063  STS	qep_cnt+3,R25
    00AC 93800062  STS	qep_cnt+2,R24
    00AE 9189      LD	R24,Y+
    00AF BF8F      OUT	0x3F,R24
    00B0 9199      LD	R25,Y+
    00B1 9189      LD	R24,Y+
    00B2 9518      RETI
(0020) }
(0021) void qep_set(void)
(0022) {
(0023)   qep_cnt[0]=0;
_qep_set:
    00B3 2422      CLR	R2
    00B4 2433      CLR	R3
    00B5 92300061  STS	qep_cnt+1,R3
    00B7 92200060  STS	qep_cnt,R2
(0024)   qep_cnt[1]=0;
    00B9 92300063  STS	qep_cnt+3,R3
    00BB 92200062  STS	qep_cnt+2,R2
    00BD 9508      RET
FILE: F:\IccAvr_Pro\pwm.c
(0001) 
(0002) #include "pwm.h"
(0003) 
(0004) 
(0005) unsigned char pwm_value[2]={0x7f,0x7f};
(0006) unsigned char pwm_flag;
(0007) //TIMER1 initialize - prescale:1
(0008) // WGM: 8) PWM phz freq correct, TOP=ICRn
(0009) // desired value: 14.4KHz
(0010) // actual value: 14.456KHz (0.4%)
(0011) void pwm_init(void)
(0012) {
(0013)  DDRD|=BIT(OC1B)|BIT(OC1A);
_pwm_init:
    00BE B381      IN	R24,0x11
    00BF 6380      ORI	R24,0x30
    00C0 BB81      OUT	0x11,R24
(0014)  //PORTD|=BIT(OC1B)|BIT(OC1A);
(0015)  TCCR1B = 0x00; //stop
    00C1 2422      CLR	R2
    00C2 BC2E      OUT	0x2E,R2
(0016)  TCNT1H = 0x00; //setup
    00C3 BC2D      OUT	0x2D,R2
(0017)  TCNT1L = 0x00;
    00C4 BC2C      OUT	0x2C,R2
(0018)  OCR1AH = 0x00;
    00C5 BC2B      OUT	0x2B,R2
(0019)  OCR1AL = 0x7F;
    00C6 E78F      LDI	R24,0x7F
    00C7 BD8A      OUT	0x2A,R24
(0020)  OCR1BH = 0x00;
    00C8 BC29      OUT	0x29,R2
(0021)  OCR1BL = 0x7F;
    00C9 BD88      OUT	0x28,R24
(0022)  ICR1H  = 0x00;
    00CA BC27      OUT	0x27,R2
(0023)  ICR1L  = 0xFF;
    00CB EF8F      LDI	R24,0xFF
    00CC BD86      OUT	0x26,R24
(0024)  TCCR1A = 0xA0;
    00CD EA80      LDI	R24,0xA0
    00CE BD8F      OUT	0x2F,R24
(0025)  TCCR1B = 0x11; //start Timer
    00CF E181      LDI	R24,0x11
    00D0 BD8E      OUT	0x2E,R24
(0026)  pwm_flag=0;
    00D1 92200066  STS	pwm_flag,R2
    00D3 9508      RET
(0027) }
(0028) 
(0029) void pwm_change(void)
(0030) { 
(0031)    if(pwm_value[0]<3)
_pwm_change:
    00D4 91800064  LDS	R24,pwm_value
    00D6 3083      CPI	R24,3
    00D7 F418      BCC	0x00DB
(0032)       pwm_value[0]=3;
    00D8 E083      LDI	R24,3
    00D9 93800064  STS	pwm_value,R24
(0033)    if(pwm_value[0]>253)
    00DB EF8D      LDI	R24,0xFD
    00DC 90200064  LDS	R2,pwm_value
    00DE 1582      CP	R24,R2
    00DF F410      BCC	0x00E2
(0034)       pwm_value[0]=253;
    00E0 93800064  STS	pwm_value,R24
(0035)    OCR1AH=0x00;
    00E2 2422      CLR	R2
    00E3 BC2B      OUT	0x2B,R2
(0036)    OCR1AL=pwm_value[0];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -