|
发表于 2010-10-25 14:39:23
|
显示全部楼层
下面是我在32A4上的测试程序,ADC还是比较准的,使用内部 1.00V 参考源。Xmega 的一大改进之一,就是内部参考源终于有点像个参考源了。
;==========================================================================
; 函数名称:Sub_Read_Vcc_Vol
; 函数功能:读取电池电压
; 入口参数:无
; 出口参数:无
; 用寄存器: ……
; 程序版本:1.0
; 编写日期:2009-11-13
; 修改次数:0
; 修改日期:
; 修改内容:
;==========================================================================
Sub_Read_Vcc_Vol: ;//
NOP ;//
SET_PWADCS_OUTPUT_SLEW_EN ;// 01. 开启 ADC 电压
SET_POWER_ADC_ENABLE ;//
LDI R16, 200 ;// 02. 延迟2ms,等待ADC电压稳定
CALL Sub_System_Delay_Nms ;//
CLR R31 ;// 03. 读取校准字节,校准ADCA
LDI R30, 0x20 ;//
LDI R20, 0x02 ;// 0x02 为读取校准字命令
CALL Sub_Read_Signature_Rows ;// R0 为出口参数
PUSH R0 ;//
CLR R31 ;// 高字节读取
LDI R30, 0x21 ;//
LDI R20, 0x02 ;// 0x02 为读取校准字命令
CALL Sub_Read_Signature_Rows ;// R0 为出口参数
POP R1 ;//
STS ADCA_CAL, R1 ;// 校准字低字节
STS (ADCA_CAL+1), R0 ;// 校准字高字节
LDI R16, 0x10 ;// 04. 设置ADC 为有符号模式,单次转换,结果右对齐12bit
STS ADCA_CTRLB, R16 ;//
CLR R16 ;// 05. 基准源设置为内部 1.00V
STS ADCA_REFCTRL, R16 ;//
LDI R16, 0x02 ;// 06. ADC时钟,系统时钟 16 分频
STS ADCA_PRESCALER, R16 ;//
LDI R16, 0x01 ;// 07. 设置SDC输入模式,使用 CH0 单端输入
STS ADCA_CH0_CTRL, R16 ;//
LDI R16, 0x20 ;// 08. ADC4 引脚输入
STS ADCA_CH0_MUXCTRL, R16 ;//
CLR R16 ;// 09. 转换接触设置中断标志,禁止中断
STS ADCA_CH0_INTCTRL, R16 ;//
LDI R16, 0x01 ;// 10. 清零中断标志
STS ADCA_CH0_INTFLAGS, R16 ;//
LDI R16, 0x05 ;// 11. 开启ADC转换
STS ADCA_CTRLA, R16 ;//
Wait_ADC_End: ;// 12. 等待ADC转换完毕
LDS R16, ADCA_CH0_INTFLAGS ;//
TST R16 ;//
BREQ Wait_ADC_End ;//
LDS R16, ADCA_CH0_RES ;// 13.读取转换结果
LDS R17, ADCA_TEMP ;//
LDI R18, 0x00 ;// 14. 关闭ADC转换
STS ADCA_CTRLA, R18 ;//
SET_POWER_ADC_DISABLE ;// 15. 关闭ADC电压
RET ;//
;==========================================================================
; 函数名称:Sub_Read_Signature_Rows
; 函数功能:读取产品签名、用户签名信息
; 入口参数:Z(R31 R30):签名信息地址; R20:读取命令
; 出口参数:R0
; 用寄存器: ……
; 程序版本:1.0
; 编写日期:2009-11-14
; 修改次数:0
; 修改日期:
; 修改内容:
;==========================================================================
Sub_Read_Signature_Rows: ;// 读取签名信息
NOP ;//
Wait_NVM_Operate_End: ;// 1. 等待 NVM 操作完毕
LDS R16, NVM_STATUS ;//
TST R16 ;//
BRNE Wait_NVM_Operate_End ;//
STS NVM_CMD, R20 ;// 2. 设置命令
LPM ;// 3. 读取,(Z)---> R0
LDI R16, 0x00 ;//
STS NVM_CMD, R16 ;// 4. 设置命令寄存器为空
RET ;// |
|