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

📄 dtm48-td.lst

📁 M48做的航模用直流电机调速器
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    001B EFCF      LDI	R28,0xFF
    001C E0D2      LDI	R29,2
    001D BFCD      OUT	0x3D,R28
    001E BFDE      OUT	0x3E,R29
    001F 51C0      SUBI	R28,0x10
    0020 40D0      SBCI	R29,0
    0021 EA0A      LDI	R16,0xAA
    0022 8308      STD	Y+0,R16
    0023 2400      CLR	R0
    0024 E0E2      LDI	R30,2
    0025 E0F1      LDI	R31,1
    0026 E011      LDI	R17,1
    0027 30EE      CPI	R30,0xE
    0028 07F1      CPC	R31,R17
    0029 F011      BEQ	0x002C
    002A 9201      ST	R0,Z+
    002B CFFB      RJMP	0x0027
    002C 8300      STD	Z+0,R16
    002D E3E4      LDI	R30,0x34
    002E E0F0      LDI	R31,0
    002F E0A0      LDI	R26,0
    0030 E0B1      LDI	R27,1
    0031 E010      LDI	R17,0
    0032 33E6      CPI	R30,0x36
    0033 07F1      CPC	R31,R17
    0034 F021      BEQ	0x0039
    0035 95C8      LPM
    0036 9631      ADIW	R30,1
    0037 920D      ST	R0,X+
    0038 CFF9      RJMP	0x0032
    0039 D116      RCALL	_main
_exit:
    003A CFFF      RJMP	_exit
FILE: H:\ele\AVR\ICC\diantiao\dtm48-td\dtm48-td.C
(0001) /******************************************/
(0002) /*         燕山大学无线电爱好者协会       */
(0003) /*                电子调速器              */
(0004) /*     作者:张翃鹏     2005-2-27 9:04:40  */
(0005) /*     目标MCU:MEGA8    晶振:INT RC 8MHZ  */
(0006) /******************************************/
(0007) 
(0008) #include <iom48v.h>
(0009) #include <macros.h>
(0010) #include <eeprom.h>
(0011) #define uchar unsigned char
(0012) #define unit unsigned int
(0013) #define ulong unsigned long
(0014) #define xtal 8 
(0015) #define j11 PORTD|=0x02
(0016) #define j10 PORTD&=~0x02
(0017) #define j21 PORTD|=0x10
(0018) #define j20 PORTD&=~0x10
(0019) #define j31 PORTB|=0x40
(0020) #define j30 PORTB&=~0x40
(0021) #define j41 PORTD|=0x40
(0022) #define j40 PORTD&=~0x40
(0023) #define LED1 PORTB|=0x08;
(0024) #define LED0 PORTB&=~0x08;
(0025) 
(0026) 
(0027) int mark=1500;
(0028) unit ai,aa;
(0029) uchar i,j,az,flag,flagh,zb,mid,pwm;
(0030) 
(0031) void port_init(void)
(0032) {
(0033)  PORTB = 0x23;
_port_init:
    003B E283      LDI	R24,0x23
    003C B985      OUT	0x05,R24
(0034)  DDRB  = 0x58;
    003D E588      LDI	R24,0x58
    003E B984      OUT	0x04,R24
(0035)  PORTC = 0x04; //m103 output only
    003F E084      LDI	R24,4
    0040 B988      OUT	0x08,R24
(0036)  DDRC  = 0x38;
    0041 E388      LDI	R24,0x38
    0042 B987      OUT	0x07,R24
(0037)  PORTD = 0x00;
    0043 2422      CLR	R2
    0044 B82B      OUT	0x0B,R2
(0038)  DDRD  = 0x52;
    0045 E582      LDI	R24,0x52
    0046 B98A      OUT	0x0A,R24
    0047 9508      RET
(0039) }
(0040) 
(0041) void timer1_init(void)
(0042) {
(0043)  TCCR1B = 0x00; //stop
_timer1_init:
    0048 2422      CLR	R2
    0049 92200081  STS	0x81,R2
(0044)  TCNT1H = 0x00 /*INVALID SETTING*/; //setup
    004B 92200085  STS	0x85,R2
(0045)  TCNT1L = 0x00 /*INVALID SETTING*/;
    004D 92200084  STS	0x84,R2
(0046)  OCR1AH = 0x00 /*INVALID SETTING*/;
    004F 92200089  STS	0x89,R2
(0047)  OCR1AL = 0x00 /*INVALID SETTING*/;
    0051 92200088  STS	0x88,R2
(0048)  OCR1BH = 0x00 /*INVALID SETTING*/;
    0053 9220008B  STS	0x8B,R2
(0049)  OCR1BL = 0x00 /*INVALID SETTING*/;
    0055 9220008A  STS	0x8A,R2
(0050)  ICR1H  = 0x00 /*INVALID SETTING*/;
    0057 92200087  STS	0x87,R2
(0051)  ICR1L  = 0x00 /*INVALID SETTING*/;
    0059 92200086  STS	0x86,R2
(0052)  TCCR1A = 0x00;
    005B 92200080  STS	0x80,R2
(0053)  TCCR1B = 0x02; //start Timer
    005D E082      LDI	R24,2
    005E 93800081  STS	0x81,R24
    0060 9508      RET
(0054) }
(0055) 
(0056) //TIMER2 initialize - prescale:8
(0057) // WGM: Normal
(0058) // desired value: 255uSec
(0059) // actual value: 255.000uSec (0.0%)
(0060) void timer2_init(void)
(0061) {
(0062)  TCCR2B = 0x00; //stop
_timer2_init:
    0061 2422      CLR	R2
    0062 922000B1  STS	0xB1,R2
(0063)  ASSR  = 0x00; //set async mode
    0064 922000B6  STS	0xB6,R2
(0064)  TCNT2 = 0x01; //setup
    0066 E081      LDI	R24,1
    0067 938000B2  STS	0xB2,R24
(0065)  OCR2A = 0;
    0069 922000B3  STS	0xB3,R2
(0066)  OCR2B = 0x00;
    006B 922000B4  STS	0xB4,R2
(0067)  TCCR2A = 0x00; 
    006D 922000B0  STS	0xB0,R2
(0068)  TCCR2B = 0x02; //start
    006F E082      LDI	R24,2
    0070 938000B1  STS	0xB1,R24
    0072 9508      RET
(0069) }
(0070) void watchdog_init(void)
(0071) {
(0072)  WDR(); //this prevents a timout on enabling
_watchdog_init:
    0073 95A8      WDR
(0073)  WDTCSR = 0x08; //WATCHDOG ENABLED - dont forget to issue WDRs
    0074 E088      LDI	R24,0x8
    0075 93800060  STS	0x60,R24
    0077 9508      RET
(0074) }
(0075) 
(0076) 
(0077) //call this routine to initialize all peripherals
(0078) void init_devices(void)
(0079) {
(0080)  //stop errant interrupts until set up
(0081)  CLI(); //disable all interrupts
_init_devices:
    0078 94F8      BCLR	7
(0082)  port_init();
    0079 DFC1      RCALL	_port_init
(0083)  timer1_init();
    007A DFCD      RCALL	_timer1_init
(0084)  timer2_init();
    007B DFE5      RCALL	_timer2_init
(0085)  watchdog_init();
    007C DFF6      RCALL	_watchdog_init
(0086) 
(0087)  MCUCR = 0x00;
    007D 2422      CLR	R2
    007E BE25      OUT	0x35,R2
(0088)  EICRA = 0x00; //extended ext ints
    007F 92200069  STS	0x69,R2
(0089)  EIMSK = 0x00;
    0081 BA2D      OUT	0x1D,R2
(0090)  
(0091)  TIMSK0 = 0x00; //timer 0 interrupt sources
    0082 9220006E  STS	0x6E,R2
(0092)  TIMSK1 = 0x00; //timer 1 interrupt sources
    0084 9220006F  STS	0x6F,R2
(0093)  TIMSK2 = 0x03; //timer 2 interrupt sources 
    0086 E083      LDI	R24,3
    0087 93800070  STS	0x70,R24
(0094) 
(0095)  PCMSK0 = 0x00; //pin change mask 0 
    0089 9220006B  STS	0x6B,R2
(0096)  PCMSK1 = 0x00; //pin change mask 1 
    008B 9220006C  STS	0x6C,R2
(0097)  PCMSK2 = 0x00; //pin change mask 2
    008D 9220006D  STS	0x6D,R2
(0098)  PCICR = 0x00; //pin change enable 
    008F 92200068  STS	0x68,R2
(0099)  PRR = 0x00; //power controller
    0091 92200064  STS	0x64,R2
(0100)  SEI(); //re-enable interrupts
    0093 9478      BSET	7
    0094 9508      RET
(0101)  //all peripherals are now initialized
(0102) }
(0103) 
(0104) 
(0105) /*		微秒级延时程序	*/	
(0106) void del(int time)
(0107) 	 {     
(0108)   	  do
(0109) 	  	{
(0110) 		 time--;
_del:
  time                 --> R16
    0095 5001      SUBI	R16,1
    0096 4010      SBCI	R17,0
(0111) 		}	
(0112)   	  while (time>1);
    0097 E081      LDI	R24,1
    0098 E090      LDI	R25,0
    0099 1780      CP	R24,R16
    009A 0791      CPC	R25,R17
    009B F3CC      BLT	0x0095
    009C 9508      RET
(0113) 	 }
(0114) 	 
(0115) /*	   毫秒级延时程序   	*/	 
(0116) void delay_1ms(void)
(0117) { unsigned int i1;
(0118)  for(i1=1;i1<(unsigned int)(xtal*143-2);i1++)
_delay_1ms:
  i1                   --> R16
    009D E001      LDI	R16,1
    009E E010      LDI	R17,0
    009F C002      RJMP	0x00A2
    00A0 5F0F      SUBI	R16,0xFF
    00A1 4F1F      SBCI	R17,0xFF
    00A2 3706      CPI	R16,0x76
    00A3 E0E4      LDI	R30,4
    00A4 071E      CPC	R17,R30
    00A5 F3D0      BCS	0x00A0
    00A6 9508      RET
_delay:
  i2                   --> R20
  n                    --> R22
    00A7 D13D      RCALL	push_gset2
    00A8 01B8      MOVW	R22,R16
(0119)     ;
(0120) }
(0121) 
(0122) void delay(unsigned int n)
(0123) {
(0124)  unsigned int i2=0;
    00A9 2744      CLR	R20
    00AA 2755      CLR	R21
    00AB C004      RJMP	0x00B0
(0125)    while(i2<n)
(0126)    {delay_1ms();
    00AC DFF0      RCALL	_delay_1ms
(0127)     i2++; WDR();
    00AD 5F4F      SUBI	R20,0xFF
    00AE 4F5F      SBCI	R21,0xFF
    00AF 95A8      WDR
    00B0 1746      CP	R20,R22
    00B1 0757      CPC	R21,R23
    00B2 F3C8      BCS	0x00AC
    00B3 D127      RCALL	pop_gset2
    00B4 9508      RET
_timer2_compa_isr:
    00B5 938A      ST	R24,-Y
    00B6 B78F      IN	R24,0x3F
    00B7 938A      ST	R24,-Y
(0128)    }
(0129) }
(0130) 
(0131) #pragma interrupt_handler timer2_compa_isr:8
(0132) void timer2_compa_isr(void)
(0133) {
(0134)  //compare occured TCNT2=OCR2a
(0135)  if(zb<255)
    00B8 91800104  LDS	R24,zb
    00BA 3F8F      CPI	R24,0xFF
    00BB F420      BCC	0x00C0
(0136)   {j10;j20; j30;j40;} 
    00BC 9859      CBI	0x0B,1
    00BD 985C      CBI	0x0B,4
    00BE 982E      CBI	0x05,6
    00BF 985E      CBI	0x0B,6
    00C0 9189      LD	R24,Y+
    00C1 BF8F      OUT	0x3F,R24
    00C2 9189      LD	R24,Y+
    00C3 9518      RETI
_timer2_ovf_isr:
    00C4 922A      ST	R2,-Y
    00C5 923A      ST	R3,-Y
    00C6 938A      ST	R24,-Y
    00C7 B62F      IN	R2,0x3F
    00C8 922A      ST	R2,-Y
(0137) }
(0138) 
(0139) #pragma interrupt_handler timer2_ovf_isr:10
(0140) void timer2_ovf_isr(void)
(0141) {
(0142)   if(zb>0)
    00C9 2422      CLR	R2
    00CA 90300104  LDS	R3,zb
    00CC 1423      CP	R2,R3
    00CD F468      BCC	0x00DB
(0143)   {
(0144)   if(flag==1)
    00CE 91800106  LDS	R24,flag
    00D0 3081      CPI	R24,1
    00D1 F419      BNE	0x00D5
(0145)    {j11;j31;}
    00D2 9A59      SBI	0x0B,1
    00D3 9A2E      SBI	0x05,6
    00D4 C006      RJMP	0x00DB
(0146)    else
(0147)   if(flag==0)
    00D5 90200106  LDS	R2,flag
    00D7 2022      TST	R2
    00D8 F411      BNE	0x00DB
(0148)    {j21;j41;}  
    00D9 9A5C      SBI	0x0B,4
    00DA 9A5E      SBI	0x0B,6
(0149)   }
(0150)  TCNT2 = 0x0; //reload counter value
    00DB 2422      CLR	R2
    00DC 922000B2  STS	0xB2,R2
(0151)  OCR2A=zb;
    00DE 90200104  LDS	R2,zb
    00E0 922000B3  STS	0xB3,R2
    00E2 9029      LD	R2,Y+
    00E3 BE2F      OUT	0x3F,R2
    00E4 9189      LD	R24,Y+
    00E5 9039      LD	R3,Y+
    00E6 9029      LD	R2,Y+
    00E7 9518      RETI
_fenc:
  bc                   --> R20
  bb                   --> R16
    00E8 D0FE      RCALL	push_gset1
(0152) }
(0153) 
(0154) 
(0155) unit fenc(int bb)             
(0156) {
(0157)  int bc;        
(0158)  if((bb<mark-700)||(bb>(mark+700))) return(0);              
    00E9 91800100  LDS	R24,mark
    00EB 91900101  LDS	R25,mark+1
    00ED 5B8C      SUBI	R24,0xBC
    00EE 4092      SBCI	R25,2
    00EF 1708      CP	R16,R24
    00F0 0719      CPC	R17,R25
    00F1 F04C      BLT	0x00FB
    00F2 91800100  LDS	R24,mark
    00F4 91900101  LDS	R25,mark+1
    00F6 5484      SUBI	R24,0x44
    00F7 4F9D      SBCI	R25,0xFD
    00F8 1780      CP	R24,R16
    00F9 0791      CPC	R25,R17
    00FA F41C      BGE	0x00FE
    00FB 2700      CLR	R16
    00FC 2711      CLR	R17
    00FD C037      RJMP	0x0135
(0159)  if(mark<bb)  
    00FE 90200100  LDS	R2,mark
    0100 90300101  LDS	R3,mark+1
    0102 1620      CP	R2,R16
    0103 0631      CPC	R3,R17
    0104 F434      BGE	0x010B
(0160)   {
(0161)   flag=1;
    0105 E081      LDI	R24,1
    0106 93800106  STS	flag,R24
(0162)   bc=bb-mark;
    0108 01A8      MOVW	R20,R16
    0109 1942      SUB	R20,R2
    010A 0953      SBC	R21,R3
(0163)   }
(0164)  if(mark>bb)
    010B 90200100  LDS	R2,mark

⌨️ 快捷键说明

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