📄 mcp2510.lis
字号:
006E 26B8 out 0x6,R2
0070 .dbline 110
0070 ; ADMUX = 0x00; //select adc input 0
0070 27B8 out 0x7,R2
0072 .dbline 111
0072 ; ACSR = 0x80;
0072 80E8 ldi R24,128
0074 88B9 out 0x8,R24
0076 .dbline 112
0076 ; ADCSR = 0xE2;
0076 82EE ldi R24,226
0078 86B9 out 0x6,R24
007A .dbline -2
007A L7:
007A .dbline 0 ; func end
007A 0895 ret
007C .dbend
007C .dbfunc e init_devices _init_devices fV
.even
007C _init_devices::
007C .dbline -1
007C .dbline 117
007C ; }
007C ;
007C ; //call this routine to initialize all peripherals
007C ; void init_devices(void)
007C ; {
007C .dbline 119
007C ; //stop errant interrupts until set up
007C ; CLI(); //disable all interrupts
007C F894 cli
007E .dbline 120
007E ; port_init();
007E C0DF xcall _port_init
0080 .dbline 121
0080 ; timer0_init();
0080 CADF xcall _timer0_init
0082 .dbline 122
0082 ; timer1_init();
0082 D3DF xcall _timer1_init
0084 .dbline 123
0084 ; timer2_init();
0084 E4DF xcall _timer2_init
0086 .dbline 124
0086 ; spi_init();
0086 EDDF xcall _spi_init
0088 .dbline 125
0088 ; adc_init();
0088 F1DF xcall _adc_init
008A .dbline 127
008A ;
008A ; MCUCR = 0x00;
008A 2224 clr R2
008C 25BE out 0x35,R2
008E .dbline 128
008E ; GICR = 0x00;
008E 2BBE out 0x3b,R2
0090 .dbline 129
0090 ; TIMSK = 0x02; //timer interrupt sources
0090 82E0 ldi R24,2
0092 89BF out 0x39,R24
0094 .dbline 130
0094 ; SEI(); //re-enable interrupts
0094 7894 sei
0096 .dbline -2
0096 L8:
0096 .dbline 0 ; func end
0096 0895 ret
0098 .dbend
0098 .dbfunc e SPIINT _SPIINT fV
.even
0098 _SPIINT::
0098 .dbline -1
0098 .dbline 136
0098 ; //all peripherals are now initialized
0098 ; }
0098 ;
0098 ;
0098 ; void SPIINT()// SPI中断服务子程序
0098 ; {
0098 .dbline 137
0098 ; SPSR=0x00;
0098 2224 clr R2
009A 2EB8 out 0xe,R2
009C .dbline 138
009C ; a[i++]=SPDR; // 数据暂存a[]中
009C 20900400 lds R2,_i
00A0 30900500 lds R3,_i+1
00A4 C101 movw R24,R2
00A6 0196 adiw R24,1
00A8 90930500 sts _i+1,R25
00AC 80930400 sts _i,R24
00B0 02E0 ldi R16,2
00B2 10E0 ldi R17,0
00B4 9101 movw R18,R2
00B6 0E940000 xcall empy16s
00BA F801 movw R30,R16
00BC 80E0 ldi R24,<_a
00BE 90E0 ldi R25,>_a
00C0 E80F add R30,R24
00C2 F91F adc R31,R25
00C4 2FB0 in R2,0xf
00C6 3324 clr R3
00C8 3182 std z+1,R3
00CA 2082 std z+0,R2
00CC .dbline 139
00CC ; count-=1;
00CC 80910200 lds R24,_count
00D0 90910300 lds R25,_count+1
00D4 0197 sbiw R24,1
00D6 90930300 sts _count+1,R25
00DA 80930200 sts _count,R24
00DE .dbline 140
00DE ; if(count>0) SPDR=a[i];// 未发送完,继续
00DE 2224 clr R2
00E0 2816 cp R2,R24
00E2 3906 cpc R3,R25
00E4 8CF4 brge L10
00E6 .dbline 140
00E6 20910400 lds R18,_i
00EA 30910500 lds R19,_i+1
00EE 02E0 ldi R16,2
00F0 10E0 ldi R17,0
00F2 0E940000 xcall empy16s
00F6 F801 movw R30,R16
00F8 80E0 ldi R24,<_a
00FA 90E0 ldi R25,>_a
00FC E80F add R30,R24
00FE F91F adc R31,R25
0100 2080 ldd R2,z+0
0102 3180 ldd R3,z+1
0104 2FB8 out 0xf,R2
0106 01C0 xjmp L9
0108 L10:
0108 .dbline 141
0108 ; else PORTB|=BIT(PB4);//否则,片选信号置高电平
0108 C49A sbi 0x18,4
010A .dbline 142
010A ; return;
010A .dbline -2
010A L9:
010A .dbline 0 ; func end
010A 0895 ret
010C .dbend
010C .dbfunc e SPIEXCHANGE _SPIEXCHANGE fV
010C ; count -> R20,R21
.even
010C _SPIEXCHANGE::
010C 0E940000 xcall push_gset1
0110 A801 movw R20,R16
0112 .dbline -1
0112 .dbline 148
0112 ; }
0112 ;
0112 ;
0112 ; void SPIEXCHANGE(count)// 启动SPI传送
0112 ; int count;
0112 ; {
0112 .dbline 149
0112 ; if(count>0) { // 有数据可送?
0112 2224 clr R2
0114 3324 clr R3
0116 2416 cp R2,R20
0118 3506 cpc R3,R21
011A E4F4 brge L12
011C .dbline 149
011C .dbline 150
011C ; i=0,i=i++;
011C 30920500 sts _i+1,R3
0120 20920400 sts _i,R2
0124 C101 movw R24,R2
0126 0196 adiw R24,1
0128 90930500 sts _i+1,R25
012C 80930400 sts _i,R24
0130 30920500 sts _i+1,R3
0134 20920400 sts _i,R2
0138 .dbline 151
0138 ; PORTB&=~BIT(PB4); // 片选位置低电平
0138 C498 cbi 0x18,4
013A .dbline 152
013A ; SPDR=a[i]; // 送数
013A 9101 movw R18,R2
013C 02E0 ldi R16,2
013E 10E0 ldi R17,0
0140 0E940000 xcall empy16s
0144 F801 movw R30,R16
0146 80E0 ldi R24,<_a
0148 90E0 ldi R25,>_a
014A E80F add R30,R24
014C F91F adc R31,R25
014E 2080 ldd R2,z+0
0150 3180 ldd R3,z+1
0152 2FB8 out 0xf,R2
0154 .dbline 153
0154 ; }
0154 .dbline 155
0154 ; else
0154 ; ; // 否则,空操作,并返回
0154 .dbline 156
0154 ; return;
0154 .dbline -2
0154 L12:
0154 0E940000 xcall pop_gset1
0158 .dbline 0 ; func end
0158 0895 ret
015A .dbsym r count 20 I
015A .dbend
015A .dbfunc e WAIT_SPI _WAIT_SPI fV
.even
015A _WAIT_SPI::
015A .dbline -1
015A .dbline 160
015A ; }
015A ;
015A ; void WAIT_SPI()// 等待SPI传送完成
015A ; {
015A L16:
015A .dbline 161
015A ; do{
015A .dbline 162
015A ; ;
015A .dbline 163
015A L17:
015A .dbline 163
015A ; }while(count>0); // 当count!=0时,等待 to add "CLRWDT"
015A 2224 clr R2
015C 3324 clr R3
015E 40900200 lds R4,_count
0162 50900300 lds R5,_count+1
0166 2414 cp R2,R4
0168 3504 cpc R3,R5
016A BCF3 brlt L16
016C .dbline 164
016C ; return;
016C .dbline -2
016C L15:
016C .dbline 0 ; func end
016C 0895 ret
016E .dbend
016E .dbfunc e RESET2510 _RESET2510 fV
.even
016E _RESET2510::
016E .dbline -1
016E .dbline 168
016E ; }
016E ;
016E ; void RESET2510()//对MCP2510芯片进行复位
016E ; {
016E .dbline 169
016E ; a[0]=RESET;
016E 80EC ldi R24,192
0170 90E0 ldi R25,0
0172 90930B00 sts _a+1,R25
0176 80930A00 sts _a,R24
017A .dbline 170
017A ; count=1;
017A 81E0 ldi R24,1
017C 90930300 sts _count+1,R25
0180 80930200 sts _count,R24
0184 .dbline 171
0184 ; SPIEXCHANGE(count); // 送复位指令
0184 8C01 movw R16,R24
0186 C2DF xcall _SPIEXCHANGE
0188 .dbline 172
0188 ; WAIT_SPI();
0188 E8DF xcall _WAIT_SPI
018A .dbline 173
018A ; return;
018A .dbline -2
018A L19:
018A .dbline 0 ; func end
018A 0895 ret
018C .dbend
018C .dbfunc e RD2510 _RD2510 fV
018C ; j -> R20,R21
018C ; n -> R22,R23
018C ; adress -> R20,R21
.even
018C _RD2510::
018C 0E940000 xcall push_gset2
0190 B901 movw R22,R18
0192 A801 movw R20,R16
0194 .dbline -1
0194 .dbline 179
0194 ; }
0194 ;
0194 ; void RD2510(adress,n)//从地址
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -