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

📄 m64.lst

📁 数字舵机(1) 数字脉宽检测 数字脉宽检测
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0288) /*void timer1_init(void)
(0289) {
(0290)  TCCR1B = 0x00; //stop
(0291)  TCNT1H = 0xFF; //setup
(0292)  TCNT1L = 0x01;
(0293)  OCR1AH = 0x00;
(0294)  OCR1AL = 0x0f;
(0295)  OCR1BH = 0x00;
(0296)  OCR1BL = 0x0f;
(0297)  OCR1CH = 0x00;
(0298)  OCR1CL = 0x0f;
(0299)  ICR1H  = 0x00;
(0300)  ICR1L  = 0xFF;
(0301)  TCCR1A = 0xA9;
(0302)  TCCR1B = 0x0B; //start Timer
(0303) }*/
(0304) //TIMER1 initialize - prescale:8
(0305) // WGM: 9) PWM phz freq correct, TOP=OCRnA
(0306) // desired value: 40mSec
(0307) // actual value: 40.000mSec (0.0%)
(0308) /*void timer1_init(void)
(0309) {
(0310)  TCCR1B = 0x00; //stop
(0311)  TCNT1H = 0xB1; //setup
(0312)  TCNT1L = 0xE0;
(0313)  OCR1AH = 0x4E;
(0314)  OCR1AL = 0x20;
(0315)  OCR1BH = 0x4E;
(0316)  OCR1BL = 0x20;
(0317)  OCR1CH = 0x4E;
(0318)  OCR1CL = 0x20;
(0319)  ICR1H  = 0x4E;
(0320)  ICR1L  = 0x20;
(0321)  TCCR1A = 0x01;
(0322)  TCCR1B = 0x12; //start Timer
(0323) }*/
(0324) //TIMER1 initialize - prescale:256
(0325) // WGM: 7) PWM 10bit fast, TOP=0x03FF
(0326) // desired value: 40mSec
(0327) // actual value: 32.768mSec (18.1%)
(0328) void timer1_init(void)
(0329) {
(0330)  TCCR1B = 0x00; //stop
_timer1_init:
     4EC 2422      CLR	R2
     4ED BC2E      OUT	0x2E,R2
(0331)  TCNT1H = 0xFC; //setup
     4EE EF8C      LDI	R24,0xFC
     4EF BD8D      OUT	0x2D,R24
(0332)  TCNT1L = 0x01;
     4F0 E081      LDI	R24,1
     4F1 BD8C      OUT	0x2C,R24
(0333)  OCR1AH = 0x03;
     4F2 E083      LDI	R24,3
     4F3 BD8B      OUT	0x2B,R24
(0334)  OCR1AL = 0xFF;
     4F4 EF8F      LDI	R24,0xFF
     4F5 BD8A      OUT	0x2A,R24
(0335)  OCR1BH = 0x03;
     4F6 E083      LDI	R24,3
     4F7 BD89      OUT	0x29,R24
(0336)  OCR1BL = 0xFF;
     4F8 EF8F      LDI	R24,0xFF
     4F9 BD88      OUT	0x28,R24
(0337)  OCR1CH = 0x03;
     4FA E083      LDI	R24,3
     4FB 9380 0079 STS	0x0079,R24
(0338)  OCR1CL = 0xFF;
     4FD EF8F      LDI	R24,0xFF
     4FE 9380 0078 STS	0x0078,R24
(0339)  ICR1H  = 0x03;
     500 E083      LDI	R24,3
     501 BD87      OUT	0x27,R24
(0340)  ICR1L  = 0xFF;
     502 EF8F      LDI	R24,0xFF
     503 BD86      OUT	0x26,R24
(0341)  TCCR1A = 0xAB;
     504 EA8B      LDI	R24,0xAB
     505 BD8F      OUT	0x2F,R24
(0342)  TCCR1B = 0x0C; //start Timer
     506 E08C      LDI	R24,0xC
     507 BD8E      OUT	0x2E,R24
     508 9508      RET
_timer1_capt_isr:
     509 922A      ST	R2,-Y
     50A 923A      ST	R3,-Y
     50B 938A      ST	R24,-Y
     50C B62F      IN	R2,0x3F
     50D 922A      ST	R2,-Y
(0343) }
(0344) 
(0345) #pragma interrupt_handler timer1_capt_isr:iv_TIM1_CAPT
(0346) 
(0347) void timer1_capt_isr(void)
(0348) //ICP输入捕获中断处理程序 
(0349) //SIGNAL(SIG_INPUT_CAPTURE1) 
(0350) { //PORTF=~PORTF;
(0351)         
(0352) 		if(shang_johu)
     50E 9020 012D LDS	R2,shang_johu
     510 2022      TST	R2
     511 F069      BEQ	0x051F
(0353) 		  {
(0354) 		     					//ICR1=0;;	
(0355) 						        temp1 = ICR1;							   
     512 B426      IN	R2,0x26
     513 B437      IN	R3,0x27
     514 9230 0129 STS	temp1+1,R3
     516 9220 0128 STS	temp1,R2
(0356)                                 //TCCR1B |= (1<<ICNC1)|(1<<CS11);//8分频,8M时钟时正好1us                                
(0357) 								TCCR1B &= ~(1<<ICES1); 	
     518 B58E      IN	R24,0x2E
     519 7B8F      ANDI	R24,0xBF
     51A BD8E      OUT	0x2E,R24
(0358) 								shang_johu=0;	
     51B 2422      CLR	R2
     51C 9220 012D STS	shang_johu,R2
(0359) 								
(0360) 		  }
     51E C00F      RJMP	0x052E
(0361) 		else
(0362) 		  {
(0363)                                 temp2 = ICR1; 
     51F B426      IN	R2,0x26
     520 B437      IN	R3,0x27
     521 9230 012B STS	temp2+1,R3
     523 9220 012A STS	temp2,R2
(0364)                                 //TIMSK &= ~((1<<TICIE1)|(1<<TOIE1));//关闭中断使能                                 
(0365)                                 //TCCR1B &= ~((1<<CS12)|(1<<CS11)|(1<<CS10)); 
(0366)                                 //TCNT1 = 0; 
(0367)                                 
(0368) 														 
(0369)                                //temp2 -= temp1; 
(0370) 							  
(0371)    							   //TCCR1B=0x00; 
(0372) 							   TCCR1B |= (1<<ICES1);
     525 B58E      IN	R24,0x2E
     526 6480      ORI	R24,0x40
     527 BD8E      OUT	0x2E,R24
(0373) 							   count1=0;
     528 2422      CLR	R2
     529 9220 012C STS	count1,R2
(0374) 							   shang_johu=1;	 
     52B E081      LDI	R24,1
     52C 9380 012D STS	shang_johu,R24
(0375) 		  }
     52E 9029      LD	R2,Y+
     52F BE2F      OUT	0x3F,R2
     530 9189      LD	R24,Y+
     531 9039      LD	R3,Y+
     532 9029      LD	R2,Y+
     533 9518      RETI
_main:
  n                    --> Y,+2
  i                    --> R12
  n_juli               --> R10
  n_jiaodu             --> R10
  n_sec                --> R10
  pwm_duoji            --> R10
     534 9721      SBIW	R28,1
(0376) //shang_johu=!shang_johu;
(0377) /*
(0378) 		count1++;
(0379)         switch(count1) 
(0380)         { 
(0381)                 case 2://第一次捕获,则开始计数 
(0382)                         {
(0383) 						       ICR1=0;
(0384) 						       temp1 = ICR1;
(0385) 							   
(0386)                                 TCCR1B |= (1<<ICNC1)|(1<<CS11);//8分频,8M时钟时正好1us                                
(0387) 								TCCR1B &= ~(1<<ICES1); 				
(0388) 					   		    
(0389)                         } 
(0390)                         break; 
(0391)                 case 3: //第二次捕获,表示一个周期结束,计数结束 
(0392)                         { 
(0393)                                 temp2 = ICR1; 
(0394)                                 TIMSK &= ~((1<<TICIE1)|(1<<TOIE1));//关闭中断使能                                 
(0395)                                 //TCCR1B &= ~((1<<CS12)|(1<<CS11)|(1<<CS10)); 
(0396)                                 //TCNT1 = 0; 
(0397)                                 
(0398) 														 
(0399)                                //temp2 -= temp1; 
(0400) 							  
(0401)    							   TCCR1B=0x00; 
(0402) 							   TCCR1B |= (1<<ICES1);
(0403) 							   count1=0;
(0404)                         } 
(0405)                         break; 
(0406) 						
(0407)                 default:  ; 
(0408)         } 
(0409) */		 
(0410) } 
(0411) 
(0412) 
(0413) #define PWM_ON    DDRB|=   R_pwm0 | R_pwm1 | L_pwm0 | L_pwm1;
(0414) #define PWM_OFF   DDRB&= ~(R_pwm0 | R_pwm1 | L_pwm0 | L_pwm1);
(0415) main()
(0416) {int n;
(0417) unsigned char n_jiaodu=0,n_juli=0;
     535 24AA      CLR	R10
(0418) unsigned char n_sec=0;
(0419) unsigned int pwm_duoji=0;
     536 24BB      CLR	R11
(0420) 
(0421) 
(0422) unsigned char i=0;
     537 24CC      CLR	R12
(0423) init_devices();
     538 DC7D      RCALL	_init_devices
(0424) timer1_init();timer0_init();
     539 DFB2      RCALL	_timer1_init
     53A DFA7      RCALL	_timer0_init
(0425)  //OCR1AH = 0x00;
(0426) /* OCR1AL = 64;
(0427)  //OCR1BH = 0x00;
(0428)  OCR1BL = 64;
(0429)  //OCR1CH = 0x00;
(0430)  OCR1CL = 64;
(0431)  OCR0=64;*/
(0432) 
(0433)  
(0434) //while(1);
(0435) DDRE|=0x38;//while(1);
     53B B182      IN	R24,0x02
     53C 6388      ORI	R24,0x38
     53D B982      OUT	0x02,R24
(0436) /////////LCD
(0437) 	/* DDRB = 0xBF;    //SI输入,SO,SCK,SS输出
(0438) 	 SPCR = 0x50;  //setup SPI
(0439) 	 SPSR = 0x01;  //setup SPI*/
(0440) /*while(!(UCSR0A&(1<<UDRE0)));
(0441) UDR0='a';while(!(UCSR0A&(1<<UDRE0)));
(0442) UDR0='a';while(!(UCSR0A&(1<<UDRE0)));
(0443) UDR0='a';while(!(UCSR0A&(1<<UDRE0)));
(0444) UDR0='a';*/
(0445) delay_ms(3000);
     53E EB08      LDI	R16,0xB8
     53F E01B      LDI	R17,0xB
     540 940E 0759 CALL	_delay_ms
(0446) number_uart1(1010,1);
     542 E081      LDI	R24,1
     543 8388      STD	Y+0,R24
     544 EF02      LDI	R16,0xF2
     545 E013      LDI	R17,3
     546 E020      LDI	R18,0
     547 E030      LDI	R19,0
     548 DE82      RCALL	_number_uart1
(0447) 			number_uart1(xx,0);
     549 2422      CLR	R2
     54A 8228      STD	Y+0,R2
     54B 9120 0108 LDS	R18,xx+2
     54D 9130 0109 LDS	R19,xx+3
     54F 9100 0106 LDS	R16,xx
     551 9110 0107 LDS	R17,xx+1
     553 DE77      RCALL	_number_uart1
(0448) 			number_uart1(ADCjohu,1);
     554 E081      LDI	R24,1
     555 8388      STD	Y+0,R24
     556 9120 0102 LDS	R18,ADCjohu+2
     558 9130 0103 LDS	R19,ADCjohu+3
     55A 9100 0100 LDS	R16,ADCjohu
     55C 9110 0101 LDS	R17,ADCjohu+1
     55E DE6C      RCALL	_number_uart1
(0449) delay_ms(3000);	
     55F EB08      LDI	R16,0xB8
     560 E01B      LDI	R17,0xB
     561 940E 0759 CALL	_delay_ms
(0450) xx=0;
     563 E040      LDI	R20,0
     564 E050      LDI	R21,0
     565 E060      LDI	R22,0
     566 E070      LDI	R23,0
     567 9350 0107 STS	xx+1,R21
     569 9340 0106 STS	xx,R20
     56B 9370 0109 STS	xx+3,R23
     56D 9360 0108 STS	xx+2,R22
(0451) //LCD_Init();
(0452) //LCD_clear();
(0453) 
(0454) DDRE &= ~0x7c;//if (!(PORTE & STOP))  if (!(PORTE & VOLDOWN))  if (!(PORTE & VOLUP))  if (!(PORTE & NEXTSONG))  if (!(PORTE & PREVSONG))
     56F B182      IN	R24,0x02
     570 7883      ANDI	R24,0x83
     571 B982      OUT	0x02,R24
(0455) PORTE |=0x7c;
     572 B183      IN	R24,0x03
     573 678C      ORI	R24,0x7C
     574 B983      OUT	0x03,R24
(0456) 
(0457) PORTD=0x01;
     575 E081      LDI	R24,1
     576 BB82      OUT	0x12,R24
(0458) //number(0,0,4,-999,1);
(0459) 	     /* OCR1AL = pwm_pingjun;
(0460)  		  OCR1BL = pwm_pingjun;
(0461)  		  OCR1CL = pwm_pingjun;
(0462)  		  OCR0=pwm_pingjun;*/
(0463) 		  
(0464)         PORTD &= ~(1<<PD4); 
     577 9894      CBI	0x12,4
(0465)         DDRD  &= ~(1<<PD4); 
     578 988C      CBI	0x11,4
(0466)         //初始化TC1 
(0467)        /* TCCR1A = 0x00; 
(0468)         TCNT1  = 0x00; 
(0469)         TCCR1B |= (1<<ICES1);//(1<<ICNC1)|打开输入捕捉噪声抑制器 |上升沿触发捕捉,噪声捕捉器需打开,否则会导致上升沿/下降沿捕捉不准确,出来的结果会相差一半 
(0470)         TCCR1B |= (1<<CS11);//8分频,8M时钟时正好1us 
(0471)         SEI(); 
(0472)         TCCR1B &= ~((1<<CS12)|(1<<CS11)|(1<<CS10));*/ 
(0473)         
(0474) 		TCCR1B = 0x00;//停止定时器 
     579 2422      CLR	R2
     57A BC2E      OUT	0x2E,R2
(0475)         TIMSK |= 0x20;//中断允许 
     57B B787      IN	R24,0x37
     57C 6280      ORI	R24,0x20
     57D BF87      OUT	0x37,R24
(0476)         ICR1H  = 0xFF; 
     57E EF8F      LDI	R24,0xFF
     57F BD87      OUT	0x27,R24
(0477)         ICR1L  = 0xFF;//输入捕捉匹配值 
     580 BD86      OUT	0x26,R24
(0478)         TCCR1A = 0x00; 
     581 BC2F      OUT	0x2F,R2
(0479)         TCCR1B = 0x83;//启动定时器 
     582 E883      LDI	R24,0x83
     583 BD8E      OUT	0x2E,R24
(0480) 		TCCR1B |= (1<<ICES1)|(1<<ICNC1)|(1<<CS11);//|(1<<CS10)8分频,8M时钟时正好1us 
     584 B58E      IN	R24,0x2E
     585 6C82      ORI	R24,0xC2
     586 BD8E      OUT	0x2E,R24
(0481) 		TCCR1B |= (1<<ICES1);
     587 B58E      IN	R24,0x2E
     588 6480      ORI	R24,0x40
     589 BD8E      OUT	0x2E,R24
     58A C031      RJMP	0x05BC
(0482) 		//方法一:采用直接测频率的方法,PROTEUS仿真通过 
(0483)         /*while(1) 
(0484)         { 
(0485)                 for(i=0; i<50; i++)delay_ms(10); 
(0486)                 TCNT1 =0; 
(0487)                 TCCR1B = ((1<<CS12)|(1<<CS11)|(1<<CS10)); 
(0488)                 for(i=0; i<100; i++)delay_ms(10);//此处用简单的延时函数,精度有限,更高精度可以用timer来尝试 
(0489)                 TCCR1B &= ~((1<<CS12)|(1<<CS11)|(1<<CS10)); 
(0490)                 //printf("TCNT1=%8u 频率=%8uHz\r\n", TCNT1, TCNT1); 
(0491) 				number_uart1(TCNT1,0);
(0492) 				number_uart1(TCNT1,1);
(0493) 				
(0494)         }*/ 
(0495)          
(0496)         //方法二:采用测量周期的方法 
(0497)         while(1) 
(0498)         { 
(0499)                 count1=1; 
     58B E081      LDI	R24,1
     58C 9380 012C STS	count1,R24
(0500)                 //for(i=0; i<250; i++)
(0501) 				delay_ms(2); 
     58E E002      LDI	R16,2
     58F E010      LDI	R17,0
     590 940E 0759 CALL	_delay_ms
(0502)                 TIMSK |= (1<<TICIE1);//打开输入捕捉器中断使能 
     592 B787      IN	R24,0x37
     593 6280      ORI	R24,0x20
     594 BF87      OUT	0x37,R24
(0503) 	
(0504)                 while(count1);//count1循环,等待捕获中断处理完成, 
     595 9020 012C LDS	R2,count1
     597 2022      TST	R2
     598 F7E1      BNE	0x0595
(0505)                 //printf("temp1:%6u temp2:%6u width:%6lu\r\n", temp1, temp2, (temp2>=temp1)?(temp2-temp1):(65536-temp1+temp2));
(0506) 			    number_uart1(temp1,0);
     599 2422      CLR	R2
     59A 8228      STD	Y+0,R2
     59B 9100 0128 LDS	R16,temp1
     59D 9110 0129 LDS	R17,temp1+1
     59F 2722      CLR	R18
     5A0 2733      CLR	R19
     5A1 DE29      RCALL	_number_uart1
(0507) 				number_uart1(temp2,0);
     5A2 2422      CLR	R2
     5A3 8228      STD	Y+0,R2
     5A4 9100 012A LDS	R16,temp2
     5A6 9110 012B LDS	R17,temp2+1
     5A8 2722      CLR	R18
     5A9 2733      CLR	R19
     5AA DE20      RCALL	_number_uart1
(0508) 				
(0509) 				//if (temp2>temp1)
(0510) 				//    { pwm_duoji=(temp2-temp1); number_uart1(pwm_duoji  ,1   );}
(0511) 				//else 
(0512) 				    { pwm_duoji=(temp1-temp2); number_uart1(pwm_duoji  ,1   );}
     5AB 9020 012A LDS	R2,temp2
     5AD 9030 012B LDS	R3,temp2+1
     5AF 90A0 0128 LDS	R10,temp1
     5B1 90B0 0129 LDS	R11,temp1+1
     5B3 18A2      SUB	R10,R2
     5B4 08B3      SBC	R11,R3
     5B5 E081      LDI	R24,1
     5B6 8388      STD	Y+0,R24
     5B7 0185      MOVW	R16,R10
     5B8 0196      MOVW	R18,R12
     5B9 2722      CLR	R18
     5BA 2733      CLR	R19
     5BB DE0F      RCALL	_number_uart1
     5BC CFCE      RJMP	0x058B
(0513) 				
(0514) 				
(0515)         } 
(0516) 	  
(0517) while(1)
(0518) {
(0519) 		if (!(PINE & NEXTSONG))

⌨️ 快捷键说明

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