📄 avrsms_com.s90
字号:
CFI Block cfiBlock2 Using cfiCommon0
CFI Function COM_rx_on
// 70 {
// 71 UCSR0B |= ( 1 << RXCIE0 ); // Enable RX interrupt
SBI 0x0A, 0x07
// 72 }
RET
CFI EndBlock cfiBlock2
// 73
// 74
RSEG CODE:CODE:NOROOT(1)
// 75 void COM_rx_off( void )
COM_rx_off:
CFI Block cfiBlock3 Using cfiCommon0
CFI Function COM_rx_off
// 76 {
// 77 UCSR0B &= ~( 1 << RXCIE0 ); // Disable RX interrupt
CBI 0x0A, 0x07
// 78 }
RET
CFI EndBlock cfiBlock3
// 79
// 80
RSEG CODE:CODE:NOROOT(1)
// 81 void COM_setSearchString( unsigned char Response )
COM_setSearchString:
CFI Block cfiBlock4 Using cfiCommon0
CFI Function COM_setSearchString
// 82 {
// 83 UCSR0B &= ~( 1 << RXCIE0 ); // Disable RX interrupt
CBI 0x0A, 0x07
// 84 searchFor = searchStrings[Response]; //Set desired search dtring
MOV R18, R16
LDI R19, 0
LSL R18
ROL R19
MOVW R31:R30, R19:R18
SUBI R30, LOW((-(searchStrings) & 0xFFFF))
SBCI R31, (-(searchStrings) & 0xFFFF) >> 8
LD R18, Z
LDD R19, Z+1
LDI R30, LOW(searchFor)
LDI R31, (searchFor) >> 8
ST Z, R18
STD Z+1, R19
// 85 searchStr = Response; //Used in rx_isr
STS ??searchStr, R16
// 86 rx_i = 0;
LDI R16, 0
LDI R17, 0
LDI R30, LOW(??rx_i)
LDI R31, (??rx_i) >> 8
ST Z, R16
STD Z+1, R17
// 87 }
RET
CFI EndBlock cfiBlock4
// 88
// 89
// 90 // Interrupt handler
// 91
// 92 /*! \brief USART Receive interrupt service routine
// 93 *
// 94 */
// 95 /*
// 96 #pragma vector=USART0_RXC_vect
// 97 __interrupt void USART0_RX_interrupt( void )
// 98 {
// 99 unsigned char data; //Local variable
// 100
// 101 data = UDR0; //Always read something
// 102
// 103 rx_buffer[ rx_wr_i++ ] = data; //Store new data
// 104 rx_buffer[ rx_wr_i ] = '\0'; //Always terminate string!
// 105
// 106 if( rx_wr_i > RX_BUFFER_MASK ) //Check for overflow
// 107 {
// 108 rx_wr_i = 0; //Reset write index
// 109 rx_overflow = 1; //Set flag high
// 110 UCSR0B &= ~( 1 << RXCIE0 ); // Disable RX interrupt
// 111 }
// 112
// 113 if( searchFor[rx_i] == data ) //Test response match
// 114 {
// 115 rx_i++;
// 116
// 117 if( !searchFor[rx_i] ) //End of new_message string...received new message!
// 118 {
// 119 rx_i = 0;
// 120 rx_ack = 1; //Set new message flag
// 121 UCSR0B &= ~( 1 << RXCIE0 ); // Disable RX interrupt
// 122 }
// 123 }
// 124 else
// 125 {
// 126 rx_i = 0; //Not valid search pattern...start again.
// 127 }
// 128 }//end rx-isr
// 129 */
// 130 #pragma vector=USART0_RXC_vect
RSEG CODE:CODE:NOROOT(1)
// 131 __interrupt void USART0_RX_interrupt( void )
USART0_RX_interrupt:
CFI Block cfiBlock5 Using cfiCommon1
CFI Function USART0_RX_interrupt
// 132 {
ST -Y, R27
CFI R27 Frame(CFA_Y, -1)
CFI CFA_Y Y+1
ST -Y, R26
CFI R26 Frame(CFA_Y, -2)
CFI CFA_Y Y+2
ST -Y, R31
CFI R31 Frame(CFA_Y, -3)
CFI CFA_Y Y+3
ST -Y, R30
CFI R30 Frame(CFA_Y, -4)
CFI CFA_Y Y+4
ST -Y, R21
CFI R21 Frame(CFA_Y, -5)
CFI CFA_Y Y+5
ST -Y, R20
CFI R20 Frame(CFA_Y, -6)
CFI CFA_Y Y+6
ST -Y, R19
CFI R19 Frame(CFA_Y, -7)
CFI CFA_Y Y+7
ST -Y, R18
CFI R18 Frame(CFA_Y, -8)
CFI CFA_Y Y+8
ST -Y, R17
CFI R17 Frame(CFA_Y, -9)
CFI CFA_Y Y+9
ST -Y, R16
CFI R16 Frame(CFA_Y, -10)
CFI CFA_Y Y+10
IN R20, 0x3F
IN R21, 0x3B
// 133 unsigned char data; //Local variable
// 134
// 135 data = UDR0; //Always read something
IN R18, 0x0C
// 136
// 137 rx_buffer[ rx_wr_i++ ] = data; //Store new data
LDI R30, LOW(??rx_wr_i)
LDI R31, (??rx_wr_i) >> 8
LD R16, Z
LDD R17, Z+1
MOVW R31:R30, R17:R16
SUBI R30, LOW((-(??rx_buffer) & 0xFFFF))
SBCI R31, (-(??rx_buffer) & 0xFFFF) >> 8
ST Z, R18
LDI R30, LOW(??rx_wr_i)
LDI R31, (??rx_wr_i) >> 8
LD R16, Z
LDD R17, Z+1
SUBI R16, 255
SBCI R17, 255
ST Z, R16
STD Z+1, R17
// 138 //rx_buffer[ rx_wr_i ] = '\0'; //Always terminate string!
// 139
// 140 if( rx_wr_i > RX_BUFFER_MASK ) //Check for overflow
LDI R30, LOW(??rx_wr_i)
LDI R31, (??rx_wr_i) >> 8
LD R16, Z
LDD R17, Z+1
CPI R16, 255
LDI R19, 0
CPC R17, R19
BRLT ??USART0_RX_interrupt_0
// 141 {
// 142 rx_wr_i = 0; //Reset write index
LDI R16, 0
LDI R17, 0
LDI R30, LOW(??rx_wr_i)
LDI R31, (??rx_wr_i) >> 8
ST Z, R16
STD Z+1, R17
// 143 rx_overflow = 1; //Set flag high
LDI R16, 1
LDI R17, 0
LDI R30, LOW(rx_overflow)
LDI R31, (rx_overflow) >> 8
ST Z, R16
STD Z+1, R17
// 144 UCSR0B &= ~( 1 << RXCIE0 ); // Disable RX interrupt
CBI 0x0A, 0x07
// 145 }
// 146
// 147 if( searchFor[rx_i] == data ) //Test response match
??USART0_RX_interrupt_0:
LDI R26, LOW(searchFor)
LDI R27, (searchFor) >> 8
LD R30, X+
LD R31, X
LDI R26, LOW(??rx_i)
LDI R27, (??rx_i) >> 8
LD R16, X+
LD R17, X
ADD R30, R16
ADC R31, R17
LPM R16, Z
CP R16, R18
BRNE ??USART0_RX_interrupt_1
// 148 {
// 149 rx_i++;
LDI R30, LOW(??rx_i)
LDI R31, (??rx_i) >> 8
LD R16, Z
LDD R17, Z+1
SUBI R16, 255
SBCI R17, 255
ST Z, R16
STD Z+1, R17
// 150
// 151 if( !searchFor[rx_i] ) //End of new_message string...received new message!
LDI R26, LOW(searchFor)
LDI R27, (searchFor) >> 8
LD R30, X+
LD R31, X
LDI R26, LOW(??rx_i)
LDI R27, (??rx_i) >> 8
LD R16, X+
LD R17, X
ADD R30, R16
ADC R31, R17
LPM R16, Z
TST R16
BRNE ??USART0_RX_interrupt_2
// 152 {
// 153 rx_i = 0;
LDI R16, 0
LDI R17, 0
LDI R30, LOW(??rx_i)
LDI R31, (??rx_i) >> 8
ST Z, R16
STD Z+1, R17
// 154
// 155 if( searchStr == 1 ) //+CMTI:
LDS R16, ??searchStr
CPI R16, 1
BRNE ??USART0_RX_interrupt_3
// 156 {
// 157 searchFor = searchStrings[3]; //Wait for
LDI R30, LOW(searchStrings)
LDI R31, (searchStrings) >> 8
LDD R16, Z+6
LDD R17, Z+7
LDI R30, LOW(searchFor)
LDI R31, (searchFor) >> 8
ST Z, R16
STD Z+1, R17
// 158 searchStr = 3;
LDI R16, 3
STS ??searchStr, R16
RJMP ??USART0_RX_interrupt_2
// 159 }
// 160
// 161 else //Normal acknowledgement
// 162 {
// 163 rx_ack = 1; //Set new message flag
??USART0_RX_interrupt_3:
LDI R16, 1
LDI R17, 0
LDI R30, LOW(rx_ack)
LDI R31, (rx_ack) >> 8
ST Z, R16
STD Z+1, R17
// 164 UCSR0B &= ~( 1 << RXCIE0 ); // Disable RX interrupt
CBI 0x0A, 0x07
RJMP ??USART0_RX_interrupt_2
// 165 }
// 166 }
// 167 }
// 168 else
// 169 {
// 170 rx_i = 0; //Not valid search pattern...start again.
??USART0_RX_interrupt_1:
LDI R16, 0
LDI R17, 0
LDI R30, LOW(??rx_i)
LDI R31, (??rx_i) >> 8
ST Z, R16
STD Z+1, R17
// 171 }
// 172 }//end rx-isr
??USART0_RX_interrupt_2:
OUT 0x3B, R21
OUT 0x3F, R20
LD R16, Y+
CFI R16 SameValue
CFI CFA_Y Y+9
LD R17, Y+
CFI R17 SameValue
CFI CFA_Y Y+8
LD R18, Y+
CFI R18 SameValue
CFI CFA_Y Y+7
LD R19, Y+
CFI R19 SameValue
CFI CFA_Y Y+6
LD R20, Y+
CFI R20 SameValue
CFI CFA_Y Y+5
LD R21, Y+
CFI R21 SameValue
CFI CFA_Y Y+4
LD R30, Y+
CFI R30 SameValue
CFI CFA_Y Y+3
LD R31, Y+
CFI R31 SameValue
CFI CFA_Y Y+2
LD R26, Y+
CFI R26 SameValue
CFI CFA_Y Y+1
LD R27, Y+
CFI R27 SameValue
CFI CFA_Y Y+0
RETI
CFI EndBlock cfiBlock5
// 173
// 174
// 175 /*! \brief Adapted putchar method...we dont need interrup driven tx-isr.
// 176 *
// 177 * Adpation of normal ansi c putchar() method
// 178 *
// 179 * \param input Character data we wish to send
// 180 *
// 181 * \retval void
// 182 *
// 183 */
RSEG CODE:CODE:NOROOT(1)
// 184 int COM_putchar( unsigned char data )
COM_putchar:
CFI Block cfiBlock6 Using cfiCommon0
CFI Function COM_putchar
// 185 {
// 186 static unsigned int i;
// 187
// 188 for( i = 0; !( UCSR0A & ( 1 << UDRE0 ) ); i++ ) // Wait for empty transmit buffer
LDI R18, 0
LDI R19, 0
LDI R30, LOW(??i)
LDI R31, (??i) >> 8
ST Z, R18
STD Z+1, R19
RJMP ??COM_putchar_0
??COM_putchar_1:
LDI R30, LOW(??i)
LDI R31, (??i) >> 8
LD R18, Z
LDD R19, Z+1
SUBI R18, 255
SBCI R19, 255
ST Z, R18
STD Z+1, R19
??COM_putchar_0:
SBIC 0x0B, 0x05
RJMP ??COM_putchar_2
// 189 {
// 190 if( i > RX_WAIT ) //How long one should wait
LDI R30, LOW(??i)
LDI R31, (??i) >> 8
LD R18, Z
LDD R19, Z+1
CPI R18, 233
LDI R17, 253
CPC R19, R17
BRCS ??COM_putchar_1
// 191 {
// 192 return -1; //Give feedback to function caller
LDI R16, 255
LDI R17, 255
RET
// 193 }
// 194 }
// 195
// 196 UDR0 = data; // Start transmittion
??COM_putchar_2:
OUT 0x0C, R16
// 197
// 198 return (int)data;
LDI R17, 0
RET
CFI EndBlock cfiBlock6
// 199 }//end COM_putchar
RSEG NEAR_Z:DATA:NOROOT(0)
REQUIRE `?<Segment init: NEAR_Z>`
??i:
DS 2
// 200
// 201
// 202
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -