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

📄 50%wave.lis

📁 利用Atmega16单片机的定时器T0设计的方波发生器
💻 LIS
字号:
                        .module _50%Wave.c
                        .area text(rom, con, rel)
 0000                   .dbfile C:\DOCUME~1\hb\MYDOCU~1\喷吗机--2代\单片机程序\定时器(方波输出)\50%Wave.c
 0000                   .dbfunc e port_init _port_init fV
                        .even
 0000           _port_init::
 0000                   .dbline -1
 0000                   .dbline 12
 0000           ; //ICC-AVR application builder : 2006-12-9 10:11:46
 0000           ; // Target : M8
 0000           ; // Crystal: 4.0000Mhz
 0000           ; 
 0000           ; #include <iom8v.h>
 0000           ; #include <macros.h>
 0000           ; long Ddummy;
 0000           ; char Settings_PerDotGroupNum,Settings_PrintPhase;
 0000           ; char DAOutPutNow;
 0000           ; 
 0000           ; void port_init(void)
 0000           ; {
 0000                   .dbline 13
 0000           ;  PORTB = 0; //0xFF;
 0000 2224              clr R2
 0002 28BA              out 0x18,R2
 0004                   .dbline 14
 0004           ;  DDRB  = 0xFF; //0x08;
 0004 8FEF              ldi R24,255
 0006 87BB              out 0x17,R24
 0008                   .dbline 15
 0008           ;  PORTC = 0x7F; //m103 output only
 0008 8FE7              ldi R24,127
 000A 85BB              out 0x15,R24
 000C                   .dbline 16
 000C           ;  DDRC  = 0x00;
 000C 24BA              out 0x14,R2
 000E                   .dbline 17
 000E           ;  PORTD = 0xFF;
 000E 8FEF              ldi R24,255
 0010 82BB              out 0x12,R24
 0012                   .dbline 18
 0012           ;  DDRD  = 0x00;
 0012 21BA              out 0x11,R2
 0014                   .dbline -2
 0014                   .dbline 19
 0014           ; }
 0014           L1:
 0014                   .dbline 0 ; func end
 0014 0895              ret
 0016                   .dbend
 0016                   .dbfunc e timer2_init _timer2_init fV
                        .even
 0016           _timer2_init::
 0016                   .dbline -1
 0016                   .dbline 26
 0016           ; 
 0016           ; //TIMER2 initialisation - prescale:1
 0016           ; // WGM: CTC
 0016           ; // desired value: 62.5KHz
 0016           ; // actual value:  63.39KHz (3.1%)
 0016           ; void timer2_init(void)
 0016           ; {
 0016                   .dbline 27
 0016           ;  TCCR2 = 0x00; //stop
 0016 2224              clr R2
 0018 25BC              out 0x25,R2
 001A                   .dbline 28
 001A           ;  ASSR  = 0x00; //set async mode
 001A 22BC              out 0x22,R2
 001C                   .dbline 29
 001C           ;  TCNT2 = 0x00; //setup
 001C 24BC              out 0x24,R2
 001E                   .dbline 30
 001E           ;  OCR2  = 0x20; //计数上限值
 001E 80E2              ldi R24,32
 0020 83BD              out 0x23,R24
 0022                   .dbline 31
 0022           ;  TCCR2 = 0x19; //0x11:一般模式, 0x19:比较模式,计数比较成功后PB3电平取反 
 0022 89E1              ldi R24,25
 0024 85BD              out 0x25,R24
 0026                   .dbline -2
 0026                   .dbline 32
 0026           ; }
 0026           L2:
 0026                   .dbline 0 ; func end
 0026 0895              ret
 0028                   .dbend
                        .area vector(rom, abs)
                        .org 6
 0006 14C0              rjmp _timer2_comp_isr
                        .area text(rom, con, rel)
 0028                   .dbfile C:\DOCUME~1\hb\MYDOCU~1\喷吗机--2代\单片机程序\定时器(方波输出)\50%Wave.c
 0028                   .dbfunc e timer2_comp_isr _timer2_comp_isr fV
                        .even
 0028           _timer2_comp_isr::
 0028 2A92              st -y,R2
 002A 3A92              st -y,R3
 002C 4A92              st -y,R4
 002E 5A92              st -y,R5
 0030 6A92              st -y,R6
 0032 7A92              st -y,R7
 0034 8A92              st -y,R8
 0036 9A92              st -y,R9
 0038 8A93              st -y,R24
 003A 9A93              st -y,R25
 003C AA93              st -y,R26
 003E BA93              st -y,R27
 0040 EA93              st -y,R30
 0042 2FB6              in R2,0x3f
 0044 2A92              st -y,R2
 0046 00D0              rcall push_gset2
 0048                   .dbline -1
 0048                   .dbline 36
 0048           ; 
 0048           ; #pragma interrupt_handler timer2_comp_isr:4
 0048           ; void timer2_comp_isr(void)  //compare occured TCNT2=OCR2
 0048           ; {
 0048                   .dbline 37
 0048           ;     Ddummy++;
 0048 41E0              ldi R20,1
 004A 50E0              ldi R21,0
 004C 60E0              ldi R22,0
 004E 70E0              ldi R23,0
 0050 40900500          lds R4,_Ddummy+2
 0054 50900600          lds R5,_Ddummy+2+1
 0058 20900300          lds R2,_Ddummy
 005C 30900400          lds R3,_Ddummy+1
 0060 240E              add R2,R20
 0062 351E              adc R3,R21
 0064 461E              adc R4,R22
 0066 571E              adc R5,R23
 0068 30920400          sts _Ddummy+1,R3
 006C 20920300          sts _Ddummy,R2
 0070 50920600          sts _Ddummy+2+1,R5
 0074 40920500          sts _Ddummy+2,R4
 0078                   .dbline 38
 0078           ;     if(Ddummy==1) PORTB = PORTB & (~1);   //PB0脚置低电平
 0078 41E0              ldi R20,1
 007A 50E0              ldi R21,0
 007C 60E0              ldi R22,0
 007E 70E0              ldi R23,0
 0080 2416              cp R2,R20
 0082 3506              cpc R3,R21
 0084 4606              cpc R4,R22
 0086 5706              cpc R5,R23
 0088 09F4              brne L4
 008A                   .dbline 38
 008A C098              cbi 0x18,0
 008C           L4:
 008C                   .dbline 39
 008C 20900200          lds R2,_Settings_PerDotGroupNum
 0090 3324              clr R3
 0092 4424              clr R4
 0094 5524              clr R5
 0096 80900500          lds R8,_Ddummy+2
 009A 90900600          lds R9,_Ddummy+2+1
 009E 60900300          lds R6,_Ddummy
 00A2 70900400          lds R7,_Ddummy+1
 00A6 6214              cp R6,R2
 00A8 7304              cpc R7,R3
 00AA 8404              cpc R8,R4
 00AC 9504              cpc R9,R5
 00AE 84F0              brlt L6
 00B0                   .dbline 39
 00B0                   .dbline 40
 00B0 40E0              ldi R20,0
 00B2 50E0              ldi R21,0
 00B4 60E0              ldi R22,0
 00B6 70E0              ldi R23,0
 00B8 50930400          sts _Ddummy+1,R21
 00BC 40930300          sts _Ddummy,R20
 00C0 70930600          sts _Ddummy+2+1,R23
 00C4 60930500          sts _Ddummy+2,R22
 00C8                   .dbline 41
 00C8 88B3              in R24,0x18
 00CA 8E7F              andi R24,254
 00CC 8F5F              subi R24,255    ; addi 1
 00CE 88BB              out 0x18,R24
 00D0                   .dbline 42
 00D0           L6:
 00D0                   .dbline -2
 00D0                   .dbline 43
 00D0           ;       if(Ddummy >=Settings_PerDotGroupNum){
 00D0           ;          Ddummy =0; //恢复计数初值
 00D0           ;        PORTB = (PORTB & (~1)) + 1;   //PB0脚置高电平
 00D0           ;       }  
 00D0           ; }
 00D0           L3:
 00D0 00D0              rcall pop_gset2
 00D2 2990              ld R2,y+
 00D4 2FBE              out 0x3f,R2
 00D6 E991              ld R30,y+
 00D8 B991              ld R27,y+
 00DA A991              ld R26,y+
 00DC 9991              ld R25,y+
 00DE 8991              ld R24,y+
 00E0 9990              ld R9,y+
 00E2 8990              ld R8,y+
 00E4 7990              ld R7,y+
 00E6 6990              ld R6,y+
 00E8 5990              ld R5,y+
 00EA 4990              ld R4,y+
 00EC 3990              ld R3,y+
 00EE 2990              ld R2,y+
 00F0                   .dbline 0 ; func end
 00F0 1895              reti
 00F2                   .dbend
 00F2                   .dbfunc e init_devices _init_devices fV
                        .even
 00F2           _init_devices::
 00F2                   .dbline -1
 00F2                   .dbline 59
 00F2           ; 
 00F2           ; /*
 00F2           ; #pragma interrupt_handler timer2_ovf_isr:5
 00F2           ; void timer2_ovf_isr(void)   //在比较模式下计数溢出中断不会发生
 00F2           ; {
 00F2           ;   TCNT2 = 0xF0;    //计数初值
 00F2           ;   if(PORTB & 2){   //PB1脚是高电平,改变PB1脚的电平使其形成振荡
 00F2           ;      PORTB -= 2;   //则将PB1脚电平变低
 00F2           ;      return;
 00F2           ;   }
 00F2           ;   PORTB += 2;      //如果PB1脚电平是低,则加2使其变高
 00F2           ; }
 00F2           ; */
 00F2           ; 
 00F2           ; void init_devices(void)  //call this routine to initialise all peripherals
 00F2           ; {
 00F2                   .dbline 61
 00F2           ;  //stop errant interrupts until set up
 00F2           ;  CLI(); //disable all interrupts
 00F2 F894              cli
 00F4                   .dbline 62
 00F4           ;  port_init();
 00F4 85DF              rcall _port_init
 00F6                   .dbline 63
 00F6           ;  timer2_init();
 00F6 8FDF              rcall _timer2_init
 00F8                   .dbline 65
 00F8           ; 
 00F8           ;  MCUCR = 0x00;
 00F8 2224              clr R2
 00FA 25BE              out 0x35,R2
 00FC                   .dbline 66
 00FC           ;  GICR  = 0x00;
 00FC 2BBE              out 0x3b,R2
 00FE                   .dbline 67
 00FE           ;  TIMSK = 0x80; //timer interrupt sources
 00FE 80E8              ldi R24,128
 0100 89BF              out 0x39,R24
 0102                   .dbline 68
 0102           ;  SEI(); //re-enable interrupts
 0102 7894              sei
 0104                   .dbline -2
 0104                   .dbline 70
 0104           ;  //all peripherals are now initialised
 0104           ; }
 0104           L8:
 0104                   .dbline 0 ; func end
 0104 0895              ret
 0106                   .dbend
 0106                   .dbfunc e main _main fV
                        .even
 0106           _main::
 0106                   .dbline -1
 0106                   .dbline 73
 0106           ; 
 0106           ; void main()
 0106           ; {
 0106                   .dbline 74
 0106           ;      init_devices();
 0106 F5DF              rcall _init_devices
 0108                   .dbline 75
 0108           ;        DAOutPutNow = 0;
 0108 2224              clr R2
 010A 20920000          sts _DAOutPutNow,R2
 010E                   .dbline 76
 010E           ;        Ddummy = 0;                     //临时变量,赋初值
 010E 40E0              ldi R20,0
 0110 50E0              ldi R21,0
 0112 60E0              ldi R22,0
 0114 70E0              ldi R23,0
 0116 50930400          sts _Ddummy+1,R21
 011A 40930300          sts _Ddummy,R20
 011E 70930600          sts _Ddummy+2+1,R23
 0122 60930500          sts _Ddummy+2,R22
 0126                   .dbline 77
 0126           ;        Settings_PerDotGroupNum =10;    //每10个墨滴选一个进行打印
 0126 8AE0              ldi R24,10
 0128 80930200          sts _Settings_PerDotGroupNum,R24
 012C                   .dbline 78
 012C           ;        Settings_PrintPhase =10;        
 012C 80930100          sts _Settings_PrintPhase,R24
 0130                   .dbline -2
 0130                   .dbline 79
 0130           ; }
 0130           L9:
 0130                   .dbline 0 ; func end
 0130 0895              ret
 0132                   .dbend
                        .area bss(ram, con, rel)
 0000                   .dbfile C:\DOCUME~1\hb\MYDOCU~1\喷吗机--2代\单片机程序\定时器(方波输出)\50%Wave.c
 0000           _DAOutPutNow::
 0000                   .blkb 1
 0001                   .dbsym e DAOutPutNow _DAOutPutNow c
 0001           _Settings_PrintPhase::
 0001                   .blkb 1
 0002                   .dbsym e Settings_PrintPhase _Settings_PrintPhase c
 0002           _Settings_PerDotGroupNum::
 0002                   .blkb 1
 0003                   .dbsym e Settings_PerDotGroupNum _Settings_PerDotGroupNum c
 0003           _Ddummy::
 0003                   .blkb 4
 0007                   .dbsym e Ddummy _Ddummy L

⌨️ 快捷键说明

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