📄 atmega32.lst
字号:
(0167) {
(0168) SPI_DatLen=SPDR;
013D B02F IN R2,0x0F
013E 9220009E STS SPI_DatLen,R2
(0169) SPI_RecvFifo[1]=SPI_DatLen;
0140 9220008C STS SPI_RecvFifo+1,R2
(0170) SPI_Status=0x02;
0142 E082 LDI R24,2
0143 938000A1 STS SPI_Status,R24
(0171) }
0145 C03F RJMP 0x0185
(0172) else if(SPI_Status==0x02)
0146 918000A1 LDS R24,SPI_Status
0148 3082 CPI R24,2
0149 F4C9 BNE 0x0163
(0173) {
(0174) SPI_RecvFifo[SPI_DatConter+2]=SPDR;
014A E88D LDI R24,0x8D
014B E090 LDI R25,0
014C 91E0009D LDS R30,SPI_DatConter
014E 27FF CLR R31
014F 0FE8 ADD R30,R24
0150 1FF9 ADC R31,R25
0151 B02F IN R2,0x0F
0152 8220 STD Z+0,R2
(0175) SPI_DatConter++;
0153 9180009D LDS R24,SPI_DatConter
0155 5F8F SUBI R24,0xFF
0156 9380009D STS SPI_DatConter,R24
(0176) if(SPI_DatConter==SPI_DatLen)
0158 9020009E LDS R2,SPI_DatLen
015A 1582 CP R24,R2
015B F549 BNE 0x0185
(0177) {
(0178) SPI_Status=0x03;
015C E083 LDI R24,3
015D 938000A1 STS SPI_Status,R24
(0179) SPI_DatConter=0;
015F 2422 CLR R2
0160 9220009D STS SPI_DatConter,R2
(0180) }
(0181) }
0162 C022 RJMP 0x0185
(0182) else if(SPI_Status==0x03)
0163 918000A1 LDS R24,SPI_Status
0165 3083 CPI R24,3
0166 F4F1 BNE 0x0185
(0183) {
(0184) SPI_DatEnd=SPDR;
0167 B02F IN R2,0x0F
0168 9220009B STS SPI_DatEnd,R2
(0185) if(SPI_DatEnd!=0x16)
016A 2D82 MOV R24,R2
016B 3186 CPI R24,0x16
016C F031 BEQ 0x0173
(0186) {
(0187) SPI_validFrame=FALSE;
016D 918000A2 LDS R24,bit_flag
016F 7E8F ANDI R24,0xEF
0170 938000A2 STS bit_flag,R24
(0188) }
0172 C012 RJMP 0x0185
(0189) else
(0190) {
(0191) SPI_RecvFifo[SPI_DatLen+2]=SPI_DatEnd;
0173 E88D LDI R24,0x8D
0174 E090 LDI R25,0
0175 91E0009E LDS R30,SPI_DatLen
0177 27FF CLR R31
0178 0FE8 ADD R30,R24
0179 1FF9 ADC R31,R25
017A 9020009B LDS R2,SPI_DatEnd
017C 8220 STD Z+0,R2
(0192) SPI_validFrame=TRUE;
017D 918000A2 LDS R24,bit_flag
017F 6180 ORI R24,0x10
0180 938000A2 STS bit_flag,R24
(0193) SPI_Status=0x00;
0182 2422 CLR R2
0183 922000A1 STS SPI_Status,R2
(0194) }
(0195) }
0185 9029 LD R2,Y+
0186 BE2F OUT 0x3F,R2
0187 91F9 LD R31,Y+
0188 91E9 LD R30,Y+
0189 9199 LD R25,Y+
018A 9189 LD R24,Y+
018B 9029 LD R2,Y+
018C 9518 RETI
_UART_RX_interrupt:
018D 922A ST R2,-Y
018E 938A ST R24,-Y
018F 939A ST R25,-Y
0190 93EA ST R30,-Y
0191 93FA ST R31,-Y
0192 B62F IN R2,0x3F
0193 922A ST R2,-Y
(0196) }
(0197) void UART_RX_interrupt(void)
(0198) {
(0199) if(RS485_validFrame)
0194 918000A2 LDS R24,bit_flag
0196 9586 LSR R24
0197 9586 LSR R24
0198 9586 LSR R24
0199 7081 ANDI R24,1
019A F009 BEQ 0x019C
(0200) {return;}
019B C055 RJMP 0x01F1
(0201) if(RS485_status==0x00)
019C 902000B5 LDS R2,RS485_status
019E 2022 TST R2
019F F471 BNE 0x01AE
(0202) {
(0203) RS485_data=UDR;
01A0 B02C IN R2,0x0C
01A1 922000B4 STS RS485_data,R2
(0204) if(RS485_data!=0x68)
01A3 2D82 MOV R24,R2
01A4 3688 CPI R24,0x68
01A5 F021 BEQ 0x01AA
(0205) {
(0206) RS485_status=0x00;
01A6 2422 CLR R2
01A7 922000B5 STS RS485_status,R2
(0207) }
01A9 C047 RJMP 0x01F1
(0208) else
(0209) {
(0210) RS485_status=0x01;
01AA E081 LDI R24,1
01AB 938000B5 STS RS485_status,R24
(0211) }
(0212) }
01AD C043 RJMP 0x01F1
(0213) else if(RS485_status==0x01)
01AE 918000B5 LDS R24,RS485_status
01B0 3081 CPI R24,1
01B1 F439 BNE 0x01B9
(0214) {
(0215) robotDatLen=UDR;
01B2 B02C IN R2,0x0C
01B3 922000B2 STS robotDatLen,R2
(0216) RS485_status=0x02;
01B5 E082 LDI R24,2
01B6 938000B5 STS RS485_status,R24
(0217) }
01B8 C038 RJMP 0x01F1
(0218) else if(RS485_status==0x02)
01B9 918000B5 LDS R24,RS485_status
01BB 3082 CPI R24,2
01BC F4C9 BNE 0x01D6
(0219) {
(0220) robotDatBuf[robotDatCount]=UDR;
01BD EA88 LDI R24,0xA8
01BE E090 LDI R25,0
01BF 91E000A7 LDS R30,robotDatCount
01C1 27FF CLR R31
01C2 0FE8 ADD R30,R24
01C3 1FF9 ADC R31,R25
01C4 B02C IN R2,0x0C
01C5 8220 STD Z+0,R2
(0221) robotDatCount++;
01C6 918000A7 LDS R24,robotDatCount
01C8 5F8F SUBI R24,0xFF
01C9 938000A7 STS robotDatCount,R24
(0222) if(robotDatCount==robotDatLen)
01CB 902000B2 LDS R2,robotDatLen
01CD 1582 CP R24,R2
01CE F511 BNE 0x01F1
(0223) {
(0224) RS485_status=0x03;
01CF E083 LDI R24,3
01D0 938000B5 STS RS485_status,R24
(0225) robotDatCount=0;
01D2 2422 CLR R2
01D3 922000A7 STS robotDatCount,R2
(0226) }
(0227) }
01D5 C01B RJMP 0x01F1
(0228) else if(RS485_status==0x03)
01D6 918000B5 LDS R24,RS485_status
01D8 3083 CPI R24,3
01D9 F4B9 BNE 0x01F1
(0229) {
(0230) robotDatEnd=UDR;
01DA B02C IN R2,0x0C
01DB 922000A5 STS robotDatEnd,R2
(0231) if(robotDatEnd!=0x16)
01DD 2D82 MOV R24,R2
01DE 3186 CPI R24,0x16
01DF F039 BEQ 0x01E7
(0232) {
(0233) RS485_validFrame=FALSE;
01E0 918000A2 LDS R24,bit_flag
01E2 7F87 ANDI R24,0xF7
01E3 938000A2 STS bit_flag,R24
(0234) PORTC|=0x02;
01E5 9AA9 SBI 0x15,1
(0235) }
01E6 C00A RJMP 0x01F1
(0236) else
(0237) {
(0238) RS485_validFrame=TRUE;
01E7 918000A2 LDS R24,bit_flag
01E9 6088 ORI R24,0x8
01EA 938000A2 STS bit_flag,R24
(0239) RS485_status=0x00;
01EC 2422 CLR R2
01ED 922000B5 STS RS485_status,R2
(0240) PORTC=0x01;
01EF E081 LDI R24,1
01F0 BB85 OUT 0x15,R24
(0241) }
(0242) }
01F1 9029 LD R2,Y+
01F2 BE2F OUT 0x3F,R2
01F3 91F9 LD R31,Y+
01F4 91E9 LD R30,Y+
01F5 9199 LD R25,Y+
01F6 9189 LD R24,Y+
01F7 9029 LD R2,Y+
01F8 9518 RETI
(0243) }
(0244) void Uart_SendByte(void)
(0245) {
(0246) while(!(UCSRA&(1<<UDRE)));
_Uart_SendByte:
01F9 9B5D SBIS 0x0B,5
01FA CFFE RJMP _Uart_SendByte
(0247) UDR=(*Uart_send_ptr);
01FB 91E000A3 LDS R30,Uart_send_ptr
01FD 91F000A4 LDS R31,Uart_send_ptr+1
01FF 8020 LDD R2,Z+0
0200 B82C OUT 0x0C,R2
0201 9508 RET
_Uart_SendPacket:
BufferAddress --> R22
len --> R20
0202 940E052E CALL push_gset2
0204 01B9 MOVW R22,R18
0205 2F40 MOV R20,R16
(0248) }
(0249) void Uart_SendPacket(Uchar len, Uchar *BufferAddress)
(0250) {
(0251) Uart_send_ptr=BufferAddress;
0206 937000A4 STS Uart_send_ptr+1,R23
0208 936000A3 STS Uart_send_ptr,R22
020A C00B RJMP 0x0216
(0252) while(len>0)
(0253) {
(0254) Uart_SendByte();
020B DFED RCALL _Uart_SendByte
(0255) len--;
020C 954A DEC R20
(0256) Uart_send_ptr++;
020D 918000A3 LDS R24,Uart_send_ptr
020F 919000A4 LDS R25,Uart_send_ptr+1
0211 9601 ADIW R24,1
0212 939000A4 STS Uart_send_ptr+1,R25
0214 938000A3 STS Uart_send_ptr,R24
0216 2422 CLR R2
0217 1624 CP R2,R20
0218 F390 BCS 0x020B
0219 940E0525 CALL pop_gset2
021B 9508 RET
(0257) }
(0258) }
(0259)
(0260) void ADC_init(void)
(0261) {
(0262) ADCSRA=0x00;
_ADC_init:
021C 2422 CLR R2
021D B826 OUT 0x06,R2
(0263) ADMUX=0x40;
021E E480 LDI R24,0x40
021F B987 OUT 0x07,R24
(0264) ACSR|=(1<<ACD);
0220 9A47 SBI 0x08,7
(0265) ADCSRA=(1<<ADEN)|0x06;//不使能中断
0221 E886 LDI R24,0x86
0222 B986 OUT 0x06,R24
(0266) SFIOR=0x00;
0223 BE20 OUT 0x30,R2
(0267) PORTA=0x00;
0224 BA2B OUT 0x1B,R2
0225 9508 RET
_Read_Adc:
Msbtemp --> Y+10
Lsbtemp --> Y+0
i --> R16
0226 9764 SBIW R28,0x14
(0268) }
(0269) void Read_Adc(void)
(0270) {
(0271) unsigned char i;
(0272) unsigned char Lsbtemp[10],Msbtemp[10];
(0273)
(0274) Lsb_light=0;
0227 2422 CLR R2
0228 9220006F STS Lsb_light,R2
(0275) Msb_light=0;
022A 92200070 STS Msb_light,R2
(0276) for(i=0;i<1;i++)
022C 2700 CLR R16
022D C013 RJMP 0x0241
(0277) {
(0278) ADCSRA|=(1<<ADSC);
022E 9A36 SBI 0x06,6
(0279) while((ADCSRA&(1<<ADIF))==0);
022F 9B34 SBIS 0x06,4
0230 CFFE RJMP 0x022F
(0280) Lsbtemp[i]=ADCL;
0231 01CE MOVW R24,R28
0232 2FE0 MOV R30,R16
0233 27FF CLR R31
0234 0FE8 ADD R30,R24
0235 1FF9 ADC R31,R25
0236 B024 IN R2,0x04
0237 8220 STD Z+0,R2
(0281) Msbtemp[i]=ADCH;
0238 01CE MOVW R24,R28
0239 960A ADIW R24,0xA
023A 2FE0 MOV R30,R16
023B 27FF CLR R31
023C 0FE8 ADD R30,R24
023D 1FF9 ADC R31,R25
023E B025 IN R2,0x05
023F 8220 STD Z+0,R2
0240 9503 INC R16
0241 3001 CPI R16,1
0242 F358 BCS 0x022E
(0282) }
(0283) for(i=0;i<1;i++)
0243 2700 CLR R16
0244 C018 RJMP 0x025D
(0284) {
(0285) Lsb_light+=Lsbtemp[i];
0245 01CE MOVW R24,R28
0246 2FE0 MOV R30,R16
0247 27FF CLR R31
0248 0FE8 ADD R30,R24
0249 1FF9 ADC R31,R25
024A 8020 LDD R2,Z+0
024B 9030006F LDS R3,Lsb_light
024D 0C32 ADD R3,R2
024E 9230006F STS Lsb_light,R3
(0286) Msb_light+=Msbtemp[i];
0250 01CE MOVW R24,R28
0251 960A ADIW R24,0xA
0252 2FE0 MOV R30,R16
0253 27FF CLR R31
0254 0FE8 ADD R30,R24
0255 1FF9 ADC R31,R25
0256 8020 LDD R2,Z+0
0257 90300070 LDS R3,Msb_light
0259 0C32 ADD R3,R2
025A 92300070 STS Msb_light,R3
025C 9503 INC R16
025D 3001 CPI R16,1
025E F330 BCS 0x0245
(0287) }
(0288) Lsb_light=Lsb_light/1;
025F 9020006F LDS R2,Lsb_light
0261 9220006F STS Lsb_light,R2
(0289) Msb_light=Msb_light/1;
0263 90200070 LDS R2,Msb_light
0265 92200070 STS Msb_light,R2
(0290) voltage_light=Msb_light;
0267 2433 CLR R3
0268 92300072 STS voltage_light+1,R3
026A 92200071 STS voltage_light,R2
(0291) voltage_light=(unsigned int)voltage_light<<8|Lsb_light;
026C 9020006F LDS R2,Lsb_light
026E 90400071 LDS R4,voltage_light
0270 90500072 LDS R5,voltage_light+1
0272 2C34 MOV R3,R4
0273 92300072 STS voltage_light+1,R3
0275 92200071 STS voltage_light,R2
0277 9664 ADIW R28,0x14
0278 9508 RET
_IntVector:
0279 940E0550 CALL push_lset
FILE: E:\PROGRAMS\controller\salvo-M32\salvo\isr.c
(0001) /************************************************************
(0002) Copyright (C) 1995-2002 Pumpkin, Inc. and its
(0003) Licensor(s). Freely distributable.
(0004)
(0005) $Source: C:\\RCS\\d\\salvo\\tut\\tu1\\isr.c,v $
(0006) $Author: aek $
(0007) $Revision: 3.24 $
(0008) $Date: 2004-02-21 17:41:57-08 $
(0009)
(0010) Source for tutorial programs. Contains the interrupt service
(0011) routine and other interrupt-associated code for all of
(0012) the tutorials. Organized by compiler and target (SYS*).
(0013)
(0014) ************************************************************/
(0015)
(0016) #include "isr.h"
(0017) #include <salvo.h>
(0018)
(0019) #if defined(USE_INTERRUPTS)
(0020)
(0021) #if defined(SYSA) || defined(SYSH) || defined(SYSF) \
(0022) || defined(SYSP)
(0023)
(0024) #if defined(SYSA) || defined(SYSH) || defined(SYSF)
(0025) void interrupt IntVector( void )
(0026) #elif defined(SYSP)
(0027) #pragma vector=0x08
(0028) __interrupt void IntVector( void )
(0029) #endif
(0030) {
(0031) if ( T0IE && T0IF ) {
(0032) T0IF = 0;
(0033) TMR0 -= TMR0_RELOAD;
(0034)
(0035) OSTimer();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -