📄 hwg.lss
字号:
1836: 94 e0 ldi r25, 0x04 ; 4
1838: 0e 94 ed 0d call 0x1bda <bufferGetFromFront>
183c: 0e 94 bf 0b call 0x177e <uartSendByte>
1840: 08 95 ret
00001842 <uartSendBuffer>:
}
// transmit nBytes from buffer out the uart
u08 uartSendBuffer(char *buffer, u16 nBytes)
{
1842: df 92 push r13
1844: ef 92 push r14
1846: ff 92 push r15
1848: 0f 93 push r16
184a: 1f 93 push r17
184c: cf 93 push r28
184e: df 93 push r29
1850: ec 01 movw r28, r24
register u08 first;
register u16 i;
// check if there's space (and that we have any bytes to send at all)
if((uartTxBuffer.datalength + nBytes < uartTxBuffer.size) && nBytes)
1852: 80 91 26 04 lds r24, 0x0426
1856: 90 91 27 04 lds r25, 0x0427
185a: 86 0f add r24, r22
185c: 97 1f adc r25, r23
185e: 20 91 24 04 lds r18, 0x0424
1862: 30 91 25 04 lds r19, 0x0425
1866: 82 17 cp r24, r18
1868: 93 07 cpc r25, r19
186a: f8 f4 brcc .+62 ; 0x18aa <uartSendBuffer+0x68>
186c: 61 15 cp r22, r1
186e: 71 05 cpc r23, r1
1870: e1 f0 breq .+56 ; 0x18aa <uartSendBuffer+0x68>
{
// grab first character
first = *buffer++;
1872: d9 90 ld r13, Y+
// copy user buffer to uart transmit buffer
for(i = 0; i < nBytes-1; i++)
1874: 00 e0 ldi r16, 0x00 ; 0
1876: 10 e0 ldi r17, 0x00 ; 0
1878: 7b 01 movw r14, r22
187a: 08 94 sec
187c: e1 08 sbc r14, r1
187e: f1 08 sbc r15, r1
1880: 0e 15 cp r16, r14
1882: 1f 05 cpc r17, r15
1884: 48 f4 brcc .+18 ; 0x1898 <uartSendBuffer+0x56>
{
// put data bytes at end of buffer
bufferAddToEnd(&uartTxBuffer, *buffer++);
1886: 89 91 ld r24, Y+
1888: 68 2f mov r22, r24
188a: 82 e2 ldi r24, 0x22 ; 34
188c: 94 e0 ldi r25, 0x04 ; 4
188e: 0e 94 46 0e call 0x1c8c <bufferAddToEnd>
1892: 0f 5f subi r16, 0xFF ; 255
1894: 1f 4f sbci r17, 0xFF ; 255
1896: f4 cf rjmp .-24 ; 0x1880 <uartSendBuffer+0x3e>
}
// send the first byte to get things going by interrupts
uartBufferedTx = TRUE;
1898: 8f ef ldi r24, 0xFF ; 255
189a: 80 93 21 04 sts 0x0421, r24
uartSendByte(first);
189e: 8d 2d mov r24, r13
18a0: 0e 94 bf 0b call 0x177e <uartSendByte>
// return success
return TRUE;
18a4: 8f ef ldi r24, 0xFF ; 255
18a6: 90 e0 ldi r25, 0x00 ; 0
18a8: 02 c0 rjmp .+4 ; 0x18ae <uartSendBuffer+0x6c>
}
else
{
// return failure
return FALSE;
18aa: 80 e0 ldi r24, 0x00 ; 0
18ac: 90 e0 ldi r25, 0x00 ; 0
18ae: df 91 pop r29
18b0: cf 91 pop r28
18b2: 1f 91 pop r17
18b4: 0f 91 pop r16
18b6: ff 90 pop r15
18b8: ef 90 pop r14
18ba: df 90 pop r13
18bc: 08 95 ret
000018be <__vector_15>:
}
}
// UART Transmit Complete Interrupt Handler
UART_INTERRUPT_HANDLER(SIG_UART_TRANS)
{
18be: 1f 92 push r1
18c0: 0f 92 push r0
18c2: 0f b6 in r0, 0x3f ; 63
18c4: 0f 92 push r0
18c6: 11 24 eor r1, r1
18c8: 8f 93 push r24
// check if buffered tx is enabled
/* if(uartBufferedTx)
{
// check if there's data left in the buffer
if(uartTxBuffer.datalength)
{
// send byte from top of buffer
outb(UDR, bufferGetFromFront(&uartTxBuffer));
}
else
{
// no data left
uartBufferedTx = FALSE;
// return to ready state
uartReadyTx = TRUE;
}
}
else
{*/
// we're using single-byte tx mode
// indicate transmit complete, back to ready
uartReadyTx = TRUE;
18ca: 8f ef ldi r24, 0xFF ; 255
18cc: 80 93 18 04 sts 0x0418, r24
18d0: 8f 91 pop r24
18d2: 0f 90 pop r0
18d4: 0f be out 0x3f, r0 ; 63
18d6: 0f 90 pop r0
18d8: 1f 90 pop r1
18da: 18 95 reti
000018dc <__vector_13>:
// }
}
/*
// UART Receive Complete Interrupt Handler
UART_INTERRUPT_HANDLER(SIG_UART_RECV)
{
u08 c;
// get received char
c = inb(UDR);
// if there's a user function to handle this receive event
if(UartRxFunc)
{
// call it and pass the received data
UartRxFunc(c);
}
else
{
// otherwise do default processing
// put received char in buffer
// check if there's space
if( !bufferAddToEnd(&uartRxBuffer, c) )
{
// no space in buffer
// count overflow
uartRxOverflow++;
}
}
}
*/
// UART Receive Complete Interrupt Handler
UART_INTERRUPT_HANDLER(SIG_UART_RECV)
{
18dc: 1f 92 push r1
18de: 0f 92 push r0
18e0: 0f b6 in r0, 0x3f ; 63
18e2: 0f 92 push r0
18e4: 11 24 eor r1, r1
18e6: 2f 93 push r18
18e8: 3f 93 push r19
18ea: 4f 93 push r20
18ec: 5f 93 push r21
18ee: 6f 93 push r22
18f0: 7f 93 push r23
18f2: 8f 93 push r24
18f4: 9f 93 push r25
18f6: af 93 push r26
18f8: bf 93 push r27
18fa: cf 93 push r28
18fc: ef 93 push r30
18fe: ff 93 push r31
u08 c;
// get received char
c = inb(UDR);
1900: cc b1 in r28, 0x0c ; 12
// put received char in buffer
// check if there's space
if( !bufferAddToEnd(&uartRxBuffer, c) )
1902: 6c 2f mov r22, r28
1904: 89 e1 ldi r24, 0x19 ; 25
1906: 94 e0 ldi r25, 0x04 ; 4
1908: 0e 94 46 0e call 0x1c8c <bufferAddToEnd>
190c: 88 23 and r24, r24
190e: 49 f4 brne .+18 ; 0x1922 <__vector_13+0x46>
{
// no space in buffer
// count overflow
uartRxOverflow++;
1910: 80 91 2a 04 lds r24, 0x042A
1914: 90 91 2b 04 lds r25, 0x042B
1918: 01 96 adiw r24, 0x01 ; 1
191a: 90 93 2b 04 sts 0x042B, r25
191e: 80 93 2a 04 sts 0x042A, r24
}
// if there's a user function to handle this receive event
if(UartRxFunc)
1922: 80 91 8e 02 lds r24, 0x028E
1926: 90 91 8f 02 lds r25, 0x028F
192a: 89 2b or r24, r25
192c: 31 f0 breq .+12 ; 0x193a <__vector_13+0x5e>
{
// call it and pass the received data
UartRxFunc(c);
192e: e0 91 8e 02 lds r30, 0x028E
1932: f0 91 8f 02 lds r31, 0x028F
1936: 8c 2f mov r24, r28
1938: 09 95 icall
193a: ff 91 pop r31
193c: ef 91 pop r30
193e: cf 91 pop r28
1940: bf 91 pop r27
1942: af 91 pop r26
1944: 9f 91 pop r25
1946: 8f 91 pop r24
1948: 7f 91 pop r23
194a: 6f 91 pop r22
194c: 5f 91 pop r21
194e: 4f 91 pop r20
1950: 3f 91 pop r19
1952: 2f 91 pop r18
1954: 0f 90 pop r0
1956: 0f be out 0x3f, r0 ; 63
1958: 0f 90 pop r0
195a: 1f 90 pop r1
195c: 18 95 reti
0000195e <a2dSetPrescaler>:
// configure A2D converter clock division (prescaling)
void a2dSetPrescaler(unsigned char prescale)
{
outb(ADCSRA, ((inb(ADCSRA) & ~ADC_PRESCALE_MASK) | prescale));
195e: 96 b1 in r25, 0x06 ; 6
1960: 98 7f andi r25, 0xF8 ; 248
1962: 98 2b or r25, r24
1964: 96 b9 out 0x06, r25 ; 6
1966: 08 95 ret
00001968 <a2dSetReference>:
}
// configure A2D converter voltage reference
void a2dSetReference(unsigned char ref)
{
outb(ADMUX, ((inb(ADMUX) & ~ADC_REFERENCE_MASK) | (ref<<6)));
1968: 27 b1 in r18, 0x07 ; 7
196a: 2f 73 andi r18, 0x3F ; 63
196c: 99 27 eor r25, r25
196e: 36 e0 ldi r19, 0x06 ; 6
1970: 88 0f add r24, r24
1972: 99 1f adc r25, r25
1974: 3a 95 dec r19
1976: e1 f7 brne .-8 ; 0x1970 <a2dSetReference+0x8>
1978: 28 2b or r18, r24
197a: 27 b9 out 0x07, r18 ; 7
197c: 08 95 ret
0000197e <a2dInit>:
197e: 37 9a sbi 0x06, 7 ; 6
1980: 35 9a sbi 0x06, 5 ; 6
1982: 86 e0 ldi r24, 0x06 ; 6
1984: 0e 94 af 0c call 0x195e <a2dSetPrescaler>
1988: 80 e0 ldi r24, 0x00 ; 0
198a: 0e 94 b4 0c call 0x1968 <a2dSetReference>
198e: 10 92 2c 04 sts 0x042C, r1
1992: 08 95 ret
00001994 <a2dOff>:
1994: 37 98 cbi 0x06, 7 ; 6
1996: 08 95 ret
00001998 <a2dSetChannel>:
}
// sets the a2d input channel
void a2dSetChannel(unsigned char ch)
{
outb(ADMUX, (inb(ADMUX) & ~ADC_MUX_MASK) | (ch & ADC_MUX_MASK)); // set channel
1998: 97 b1 in r25, 0x07 ; 7
199a: 90 7e andi r25, 0xE0 ; 224
199c: 8f 71 andi r24, 0x1F ; 31
199e: 98 2b or r25, r24
19a0: 97 b9 out 0x07, r25 ; 7
19a2: 08 95 ret
000019a4 <a2dStartConvert>:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -