vbat.c
Go to the documentation of this file.00001 #include "avr_compiler.h"
00002 #include "vbat.h"
00003
00009 void vbat_reset(void)
00010 {
00011
00012 VBAT.CTRL = VBAT_ACCEN_bm;
00013
00014
00015 ENTER_CRITICAL_REGION();
00016 CCP = 0xD8;
00017 VBAT.CTRL = VBAT_RESET_bm;
00018 LEAVE_CRITICAL_REGION();
00019 }
00020
00027 void vbat_enable_xosc(bool use1khz)
00028 {
00029
00030 VBAT.CTRL |= VBAT_XOSCFDEN_bm;
00031
00032
00033
00034
00035 delay_us(200);
00036
00037
00038 if (use1khz)
00039 VBAT.CTRL |= VBAT_XOSCEN_bm | VBAT_XOSCSEL_bm;
00040 else
00041 VBAT.CTRL |= VBAT_XOSCEN_bm;
00042 }
00043
00044 uint8_t vbat_system_check(bool first_time_startup)
00045 {
00046 uint8_t vbat_status;
00047
00048
00049
00050
00051
00052 if (VBAT.STATUS & VBAT_BBPWR_bm)
00053 vbat_status = VBAT_STATUS_NO_POWER;
00054 else {
00055
00056
00057
00058
00059
00060 if (VBAT.STATUS & VBAT_BBPORF_bm) {
00061 if (first_time_startup)
00062 vbat_status = VBAT_STATUS_INIT;
00063 else
00064 vbat_status = VBAT_STATUS_BBPOR;
00065 }
00066 else if (VBAT.STATUS & VBAT_BBBORF_bm)
00067 vbat_status = VBAT_STATUS_BBBOD;
00068 else {
00069 VBAT.CTRL = VBAT_ACCEN_bm;
00070 if (VBAT.STATUS & VBAT_XOSCFAIL_bm)
00071 vbat_status = VBAT_STATUS_XOSCFAIL;
00072 else
00073 vbat_status = VBAT_STATUS_OK;
00074 }
00075 }
00076 return vbat_status;
00077 }