Closed
Description
In current core adc result is read by combining two bytes ADCH and ADCL, that way adds two unnecessary commands in assembler code. But avr-gcc compiler provides a way to access 16-bit ADC register through ADC or ADCW as long as it is defined. avr/io libraries provide those defines.
#ifndef __ASSEMBLER__
#define ADC _SFR_MEM16(0x78)
#endif
#define ADCW _SFR_MEM16(0x78)
It is shown below the difference in reading adc result as a combining two bytes or reading directly. As you can see there are two more command LDI and OR when combining two bytes, which are completely unnecessary.
x= (ADCH << 8) | ADCL;
000004B0 LDS R24,0x0078 Load direct from data space
000004B2 LDS R18,0x0079 Load direct from data space
000004B4 LDI R25,0x00 Load immediate
000004B5 OR R25,R18 Logical OR
00000086 STS 0x0123,R25 Store direct to data space
00000088 STS 0x0122,R24 Store direct to data space
x=ADC;
000004B0 LDS R24,0x0078 Load direct from data space
000004B2 LDS R25,0x0079 Load direct from data space
00000086 STS 0x0123,R25 Store direct to data space
00000088 STS 0x0122,R24 Store direct to data space
I can take care of this fix, if it is needed.
Metadata
Metadata
Assignees
Labels
No labels