📄 hwg.lss
字号:
}
// start a conversion on the current a2d input channel
void a2dStartConvert(void)
{
// sbi(ADCSRA, ADIF); // clear hardware "conversion complete" flag
sbi(ADCSRA, ADEN);
19a4: 37 9a sbi 0x06, 7 ; 6
19a6: 08 95 ret
000019a8 <a2dIsComplete>:
// sbi(ADCSRA, ADSC); // start conversion
}
// return TRUE if conversion is complete
u08 a2dIsComplete(void)
{
return bit_is_set(ADCSRA, ADSC);
19a8: 86 b1 in r24, 0x06 ; 6
19aa: 99 27 eor r25, r25
}
19ac: 80 74 andi r24, 0x40 ; 64
19ae: 90 70 andi r25, 0x00 ; 0
19b0: 08 95 ret
000019b2 <a2dConvert10bit>:
// Perform a 10-bit conversion
// starts conversion, waits until conversion is done, and returns result
unsigned short a2dConvert10bit(void)
{
u16 Timeout_loop = 0;//超时记数
19b2: 80 e0 ldi r24, 0x00 ; 0
19b4: 90 e0 ldi r25, 0x00 ; 0
// a2dCompleteFlag = FALSE; // clear conversion complete flag
// outb(ADMUX, (inb(ADMUX) & ~ADC_MUX_MASK) | (ch & ADC_MUX_MASK)); // set channel
// sbi(ADCSRA, ADIF); // clear hardware "conversion complete" flag
sbi(ADCSRA, ADSC); // start conversion
19b6: 36 9a sbi 0x06, 6 ; 6
//while(!a2dCompleteFlag); // wait until conversion complete
//while( bit_is_clear(ADCSR, ADIF) ); // wait until conversion complete
while( bit_is_set(ADCSRA, ADSC) && (++Timeout_loop !=0));// wait until conversion complete
19b8: 36 9b sbis 0x06, 6 ; 6
19ba: 02 c0 rjmp .+4 ; 0x19c0 <a2dConvert10bit+0xe>
19bc: 01 96 adiw r24, 0x01 ; 1
19be: e1 f7 brne .-8 ; 0x19b8 <a2dConvert10bit+0x6>
// CAUTION: MUST READ ADCL BEFORE ADCH!!!
return (inb(ADCL) | (inb(ADCH)<<8)); // read ADC (full 10 bits);
19c0: 84 b1 in r24, 0x04 ; 4
19c2: 28 2f mov r18, r24
19c4: 33 27 eor r19, r19
19c6: 85 b1 in r24, 0x05 ; 5
19c8: 99 27 eor r25, r25
19ca: 98 2f mov r25, r24
19cc: 88 27 eor r24, r24
}
19ce: 82 2b or r24, r18
19d0: 93 2b or r25, r19
19d2: 08 95 ret
000019d4 <__vector_16>:
/*// Perform a 8-bit conversion.
// starts conversion, waits until conversion is done, and returns result
unsigned char a2dConvert8bit(unsigned char ch)
{
// do 10-bit conversion and return highest 8 bits
return a2dConvert10bit(ch)>>2 ; // return ADC MSB byte
}*/
//! Interrupt handler for ADC complete interrupt.
SIGNAL(SIG_ADC)
{
19d4: 1f 92 push r1
19d6: 0f 92 push r0
19d8: 0f b6 in r0, 0x3f ; 63
19da: 0f 92 push r0
19dc: 11 24 eor r1, r1
19de: 8f 93 push r24
// set the a2d conversion flag to indicate "complete"
a2dCompleteFlag = TRUE;
19e0: 8f ef ldi r24, 0xFF ; 255
19e2: 80 93 2c 04 sts 0x042C, r24
19e6: 8f 91 pop r24
19e8: 0f 90 pop r0
19ea: 0f be out 0x3f, r0 ; 63
19ec: 0f 90 pop r0
19ee: 1f 90 pop r1
19f0: 18 95 reti
000019f2 <do_a2d>:
}
//去极值求平均数滤波,采样6次
u16 do_a2d(void)
{
19f2: 8f 92 push r8
19f4: 9f 92 push r9
19f6: af 92 push r10
19f8: bf 92 push r11
19fa: df 92 push r13
19fc: ef 92 push r14
19fe: ff 92 push r15
1a00: 0f 93 push r16
1a02: 1f 93 push r17
1a04: cf 93 push r28
1a06: df 93 push r29
1a08: cd b7 in r28, 0x3d ; 61
1a0a: de b7 in r29, 0x3e ; 62
1a0c: 2c 97 sbiw r28, 0x0c ; 12
1a0e: 0f b6 in r0, 0x3f ; 63
1a10: f8 94 cli
1a12: de bf out 0x3e, r29 ; 62
1a14: 0f be out 0x3f, r0 ; 63
1a16: cd bf out 0x3d, r28 ; 61
unsigned char count,i,j;
u16 value_buf[6];
u16 temp;
u16 sum=0;
1a18: aa 24 eor r10, r10
1a1a: bb 24 eor r11, r11
1a1c: 75 e0 ldi r23, 0x05 ; 5
1a1e: d7 2e mov r13, r23
1a20: 75 01 movw r14, r10
for (count=0;count<6;count++)
{
value_buf[count] = a2dConvert10bit();
1a22: 4e 01 movw r8, r28
1a24: 08 94 sec
1a26: 81 1c adc r8, r1
1a28: 91 1c adc r9, r1
1a2a: 87 01 movw r16, r14
1a2c: 08 0d add r16, r8
1a2e: 19 1d adc r17, r9
1a30: 0e 94 d9 0c call 0x19b2 <a2dConvert10bit>
1a34: f8 01 movw r30, r16
1a36: 91 83 std Z+1, r25 ; 0x01
1a38: 80 83 st Z, r24
1a3a: da 94 dec r13
1a3c: 82 e0 ldi r24, 0x02 ; 2
1a3e: 90 e0 ldi r25, 0x00 ; 0
1a40: e8 0e add r14, r24
1a42: f9 1e adc r15, r25
1a44: d7 fe sbrs r13, 7
1a46: ed cf rjmp .-38 ; 0x1a22 <do_a2d+0x30>
1a48: 00 e0 ldi r16, 0x00 ; 0
1a4a: 10 e0 ldi r17, 0x00 ; 0
1a4c: 46 e0 ldi r20, 0x06 ; 6
1a4e: 50 e0 ldi r21, 0x00 ; 0
1a50: ba 01 movw r22, r20
1a52: b4 e0 ldi r27, 0x04 ; 4
//_delay_ms(10) ;
}
for (j=0;j<6-1;j++)
{
for (i=0;i<6-j;i++)
1a54: a0 e0 ldi r26, 0x00 ; 0
1a56: 06 17 cp r16, r22
1a58: 17 07 cpc r17, r23
1a5a: bc f4 brge .+46 ; 0x1a8a <do_a2d+0x98>
{
if ( value_buf[i]>value_buf[i+1] )
1a5c: ea 2f mov r30, r26
1a5e: ff 27 eor r31, r31
1a60: ee 0f add r30, r30
1a62: ff 1f adc r31, r31
1a64: e8 0d add r30, r8
1a66: f9 1d adc r31, r9
1a68: 20 81 ld r18, Z
1a6a: 31 81 ldd r19, Z+1 ; 0x01
1a6c: 82 81 ldd r24, Z+2 ; 0x02
1a6e: 93 81 ldd r25, Z+3 ; 0x03
1a70: 82 17 cp r24, r18
1a72: 93 07 cpc r25, r19
1a74: 20 f4 brcc .+8 ; 0x1a7e <do_a2d+0x8c>
{
temp = value_buf[i];
value_buf[i] = value_buf[i+1];
1a76: 91 83 std Z+1, r25 ; 0x01
1a78: 80 83 st Z, r24
value_buf[i+1] = temp;
1a7a: 33 83 std Z+3, r19 ; 0x03
1a7c: 22 83 std Z+2, r18 ; 0x02
1a7e: af 5f subi r26, 0xFF ; 255
1a80: 8a 2f mov r24, r26
1a82: 99 27 eor r25, r25
1a84: 84 17 cp r24, r20
1a86: 95 07 cpc r25, r21
1a88: 4c f3 brlt .-46 ; 0x1a5c <do_a2d+0x6a>
1a8a: b1 50 subi r27, 0x01 ; 1
1a8c: 61 50 subi r22, 0x01 ; 1
1a8e: 70 40 sbci r23, 0x00 ; 0
1a90: 41 50 subi r20, 0x01 ; 1
1a92: 50 40 sbci r21, 0x00 ; 0
1a94: b7 ff sbrs r27, 7
1a96: de cf rjmp .-68 ; 0x1a54 <do_a2d+0x62>
1a98: 63 e0 ldi r22, 0x03 ; 3
1a9a: d6 2e mov r13, r22
1a9c: fe 01 movw r30, r28
1a9e: 33 96 adiw r30, 0x03 ; 3
}
}
}
for(count=1;count<5;count++)
sum += value_buf[count];
1aa0: 81 91 ld r24, Z+
1aa2: 91 91 ld r25, Z+
1aa4: a8 0e add r10, r24
1aa6: b9 1e adc r11, r25
1aa8: da 94 dec r13
1aaa: d7 fe sbrs r13, 7
1aac: f9 cf rjmp .-14 ; 0x1aa0 <do_a2d+0xae>
return (u16)(sum/(6-2));
}
1aae: c5 01 movw r24, r10
1ab0: 96 95 lsr r25
1ab2: 87 95 ror r24
1ab4: 96 95 lsr r25
1ab6: 87 95 ror r24
1ab8: 2c 96 adiw r28, 0x0c ; 12
1aba: 0f b6 in r0, 0x3f ; 63
1abc: f8 94 cli
1abe: de bf out 0x3e, r29 ; 62
1ac0: 0f be out 0x3f, r0 ; 63
1ac2: cd bf out 0x3d, r28 ; 61
1ac4: df 91 pop r29
1ac6: cf 91 pop r28
1ac8: 1f 91 pop r17
1aca: 0f 91 pop r16
1acc: ff 90 pop r15
1ace: ef 90 pop r14
1ad0: df 90 pop r13
1ad2: bf 90 pop r11
1ad4: af 90 pop r10
1ad6: 9f 90 pop r9
1ad8: 8f 90 pop r8
1ada: 08 95 ret
00001adc <ad_result>:
//还原模拟量,用u16,分开乘
u16 ad_result( u16 ad_data , u08 liangcheng )
{
1adc: 0f 93 push r16
1ade: 1f 93 push r17
1ae0: cf 93 push r28
1ae2: df 93 push r29
u16 ad_value;
ad_data = ad_data * 4;//1024 * 4 方便计算
1ae4: ec 01 movw r28, r24
1ae6: cc 0f add r28, r28
1ae8: dd 1f adc r29, r29
1aea: cc 0f add r28, r28
1aec: dd 1f adc r29, r29
1aee: e6 2f mov r30, r22
1af0: ff 27 eor r31, r31
if(liangcheng >15)
1af2: 60 31 cpi r22, 0x10 ; 16
1af4: 68 f4 brcc .+26 ; 0x1b10 <ad_result+0x34>
{
ad_value=(ad_data * 15)/100;//如43.5要用435表示
}
else
{
ad_value=(ad_data * liangcheng)/100;
1af6: ce 9f mul r28, r30
1af8: c0 01 movw r24, r0
1afa: cf 9f mul r28, r31
1afc: 90 0d add r25, r0
1afe: de 9f mul r29, r30
1b00: 90 0d add r25, r0
1b02: 11 24 eor r1, r1
1b04: 64 e6 ldi r22, 0x64 ; 100
1b06: 70 e0 ldi r23, 0x00 ; 0
1b08: 0e 94 59 26 call 0x4cb2 <__udivmodhi4>
1b0c: 9b 01 movw r18, r22
return (ad_value); //返回模拟量
1b0e: 45 c0 rjmp .+138 ; 0x1b9a <ad_result+0xbe>
1b10: 9e 01 movw r18, r28
1b12: a4 e0 ldi r26, 0x04 ; 4
1b14: 22 0f add r18, r18
1b16: 33 1f adc r19, r19
1b18: aa 95 dec r26
1b1a: e1 f7 brne .-8 ; 0x1b14 <ad_result+0x38>
1b1c: 2c 1b sub r18, r28
1b1e: 3d 0b sbc r19, r29
1b20: c9 01 movw r24, r18
1b22: 64 e6 ldi r22, 0x64 ; 100
1b24: 70 e0 ldi r23, 0x00 ; 0
1b26: 0e 94 59 26 call 0x4cb2 <__udivmodhi4>
1b2a: 8b 01 movw r16, r22
}
if(liangcheng-15 > 15)
1b2c: cf 01 movw r24, r30
1b2e: 0f 97 sbiw r24, 0x0f ; 15
1b30: 80 31 cpi r24, 0x10 ; 16
1b32: 91 05 cpc r25, r1
1b34: 64 f0 brlt .+24 ; 0x1b4e <ad_result+0x72>
{
ad_value+=(ad_data * 15)/100;
1b36: c9 01 movw r24, r18
1b38: 64 e6 ldi r22, 0x64 ; 100
1b3a: 70 e0 ldi r23, 0x00 ; 0
1b3c: 0e 94 59 26 ca
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -