Merck / Mbed OS SmartCap_OS5

Dependencies:   nRF51822

Committer:
sgetz7908
Date:
Tue Dec 20 14:48:43 2016 +0000
Revision:
2:def2c045c43a
Child:
4:1bfa16834dd4
Initial release to PolyG.; Basic recognition used for testing.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sgetz7908 2:def2c045c43a 1 //**********************************************************************
sgetz7908 2:def2c045c43a 2 //
sgetz7908 2:def2c045c43a 3 // Hardware Routines
sgetz7908 2:def2c045c43a 4 //
sgetz7908 2:def2c045c43a 5 // SPG 12/13/2016
sgetz7908 2:def2c045c43a 6 //
sgetz7908 2:def2c045c43a 7 //**********************************************************************
sgetz7908 2:def2c045c43a 8
sgetz7908 2:def2c045c43a 9 /// @file hw.cpp
sgetz7908 2:def2c045c43a 10
sgetz7908 2:def2c045c43a 11 #include "mbed.h"
sgetz7908 2:def2c045c43a 12 #include "hw.h"
sgetz7908 2:def2c045c43a 13 #include "nrf_delay.h"
sgetz7908 2:def2c045c43a 14 #include "nrf_gpio.h"
sgetz7908 2:def2c045c43a 15
sgetz7908 2:def2c045c43a 16 // define I/O pins
sgetz7908 2:def2c045c43a 17 //DigitalIn cap_sw(CAP, PullNone); // Cap off switch
sgetz7908 2:def2c045c43a 18 //DigitalOut vdd_enable(VDD_ENABLE,0);// Analog voltage on when hi
sgetz7908 2:def2c045c43a 19
sgetz7908 2:def2c045c43a 20 Ticker seconds_ticker;
sgetz7908 2:def2c045c43a 21 volatile uint32_t seconds = 0; // seconds clock, time since power up
sgetz7908 2:def2c045c43a 22 volatile uint32_t sec_offset = 0; // when the actual time is set, this will contain the difference between actual time and the above variable
sgetz7908 2:def2c045c43a 23
sgetz7908 2:def2c045c43a 24
sgetz7908 2:def2c045c43a 25 /// Software generate delay.
sgetz7908 2:def2c045c43a 26 /// Interrupt can increase the delay length.
sgetz7908 2:def2c045c43a 27 /// CPU runs at full power during delay.
sgetz7908 2:def2c045c43a 28 void delay_ms(uint32_t volatile number_of_ms)
sgetz7908 2:def2c045c43a 29 {
sgetz7908 2:def2c045c43a 30 while(number_of_ms != 0) {
sgetz7908 2:def2c045c43a 31 number_of_ms--;
sgetz7908 2:def2c045c43a 32 nrf_delay_us(999);
sgetz7908 2:def2c045c43a 33 }
sgetz7908 2:def2c045c43a 34 }
sgetz7908 2:def2c045c43a 35
sgetz7908 2:def2c045c43a 36 // RTC in seconds since boot
sgetz7908 2:def2c045c43a 37 static void seconds_ticker_interrupt(void)
sgetz7908 2:def2c045c43a 38 {
sgetz7908 2:def2c045c43a 39 seconds++;
sgetz7908 2:def2c045c43a 40 }
sgetz7908 2:def2c045c43a 41
sgetz7908 2:def2c045c43a 42 /// Initialize the seconds clock to 's' seconds
sgetz7908 2:def2c045c43a 43 void init_clock(uint32_t s)
sgetz7908 2:def2c045c43a 44 {
sgetz7908 2:def2c045c43a 45 seconds_ticker.detach();
sgetz7908 2:def2c045c43a 46 seconds_ticker.attach(seconds_ticker_interrupt, 1.00);
sgetz7908 2:def2c045c43a 47 seconds = s;
sgetz7908 2:def2c045c43a 48 }
sgetz7908 2:def2c045c43a 49
sgetz7908 2:def2c045c43a 50 /// Read the number of seconds since init_clock() was called
sgetz7908 2:def2c045c43a 51 uint32_t read_clock(void)
sgetz7908 2:def2c045c43a 52 {
sgetz7908 2:def2c045c43a 53 return seconds;
sgetz7908 2:def2c045c43a 54 }
sgetz7908 2:def2c045c43a 55
sgetz7908 2:def2c045c43a 56 /// Set sec_offset by passing the current time, so correct time/date can be be found by adding sec_offset to internal time
sgetz7908 2:def2c045c43a 57 void set_time_offset(uint32_t s)
sgetz7908 2:def2c045c43a 58 {
sgetz7908 2:def2c045c43a 59 sec_offset = s - read_clock();
sgetz7908 2:def2c045c43a 60 }
sgetz7908 2:def2c045c43a 61
sgetz7908 2:def2c045c43a 62 /// Return the time correction value, add this to the internal time to get real time
sgetz7908 2:def2c045c43a 63 uint32_t read_time_correction(void)
sgetz7908 2:def2c045c43a 64 {
sgetz7908 2:def2c045c43a 65 return sec_offset;
sgetz7908 2:def2c045c43a 66 }
sgetz7908 2:def2c045c43a 67
sgetz7908 2:def2c045c43a 68 /// 10-bit ADC reading of the requested channel
sgetz7908 2:def2c045c43a 69 /// Uses internal 1.2V reference, and 1/3 of the signal source.
sgetz7908 2:def2c045c43a 70 /// This provides a result = Voltage/3.6*1023
sgetz7908 2:def2c045c43a 71 /// @param chan is the channel to read
sgetz7908 2:def2c045c43a 72 /// @param times is the number of readings to take
sgetz7908 2:def2c045c43a 73 /// @return sum of all the readings
sgetz7908 2:def2c045c43a 74 uint16_t adc_read(int chan, int num_readings)
sgetz7908 2:def2c045c43a 75 {
sgetz7908 2:def2c045c43a 76 uint16_t result = 0;
sgetz7908 2:def2c045c43a 77 int times = num_readings;
sgetz7908 2:def2c045c43a 78
sgetz7908 2:def2c045c43a 79 NRF_ADC->INTENCLR = ADC_INTENCLR_END_Clear; // turn off ADC interrupts
sgetz7908 2:def2c045c43a 80 //NRF_ADC->EVENTS_END = 0;
sgetz7908 2:def2c045c43a 81
sgetz7908 2:def2c045c43a 82 switch(chan) {
sgetz7908 2:def2c045c43a 83 case ADC_CHAN_BATTERY:
sgetz7908 2:def2c045c43a 84 NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
sgetz7908 2:def2c045c43a 85 (ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
sgetz7908 2:def2c045c43a 86 (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
sgetz7908 2:def2c045c43a 87 (ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos) |
sgetz7908 2:def2c045c43a 88 (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);
sgetz7908 2:def2c045c43a 89 break;
sgetz7908 2:def2c045c43a 90
sgetz7908 2:def2c045c43a 91 case ADC_CHAN_OPTO:
sgetz7908 2:def2c045c43a 92 NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
sgetz7908 2:def2c045c43a 93 (ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
sgetz7908 2:def2c045c43a 94 (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
sgetz7908 2:def2c045c43a 95 (ADC_CONFIG_PSEL_AnalogInput2 << ADC_CONFIG_PSEL_Pos) |
sgetz7908 2:def2c045c43a 96 (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);
sgetz7908 2:def2c045c43a 97 break;
sgetz7908 2:def2c045c43a 98
sgetz7908 2:def2c045c43a 99 default:
sgetz7908 2:def2c045c43a 100 return 0;
sgetz7908 2:def2c045c43a 101 }
sgetz7908 2:def2c045c43a 102
sgetz7908 2:def2c045c43a 103 NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled; // enable ADC
sgetz7908 2:def2c045c43a 104
sgetz7908 2:def2c045c43a 105 while(times--) {
sgetz7908 2:def2c045c43a 106 NRF_ADC->TASKS_START = 1; // start ADC conversion
sgetz7908 2:def2c045c43a 107
sgetz7908 2:def2c045c43a 108 // wait for conversion to end
sgetz7908 2:def2c045c43a 109 while (!NRF_ADC->EVENTS_END) {
sgetz7908 2:def2c045c43a 110 ;
sgetz7908 2:def2c045c43a 111 }
sgetz7908 2:def2c045c43a 112
sgetz7908 2:def2c045c43a 113 NRF_ADC->EVENTS_END = 0;
sgetz7908 2:def2c045c43a 114 result += NRF_ADC->RESULT; //Save your ADC result
sgetz7908 2:def2c045c43a 115 NRF_ADC->TASKS_STOP = 1; //Use the STOP task to save current.
sgetz7908 2:def2c045c43a 116 }
sgetz7908 2:def2c045c43a 117
sgetz7908 2:def2c045c43a 118 //NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Disabled;
sgetz7908 2:def2c045c43a 119 return (uint16_t)result/num_readings; // 10 bit
sgetz7908 2:def2c045c43a 120 }
sgetz7908 2:def2c045c43a 121
sgetz7908 2:def2c045c43a 122 /// Reads the battery voltage
sgetz7908 2:def2c045c43a 123 /// Returns the voltage as an int * 100. 3V = 300
sgetz7908 2:def2c045c43a 124 uint16_t read_battery_voltage(void)
sgetz7908 2:def2c045c43a 125 {
sgetz7908 2:def2c045c43a 126 return ((float)adc_read(ADC_CHAN_BATTERY,4)*3.6)/1023.0*100.0;
sgetz7908 2:def2c045c43a 127 }
sgetz7908 2:def2c045c43a 128
sgetz7908 2:def2c045c43a 129 char str_buf[21];
sgetz7908 2:def2c045c43a 130
sgetz7908 2:def2c045c43a 131 /// Convert unsigned int to string
sgetz7908 2:def2c045c43a 132 /// @returns pointer to string
sgetz7908 2:def2c045c43a 133 char * uli2a(uint32_t num)
sgetz7908 2:def2c045c43a 134 {
sgetz7908 2:def2c045c43a 135 char * buf = str_buf;
sgetz7908 2:def2c045c43a 136 //int n=0;
sgetz7908 2:def2c045c43a 137 unsigned long d=1;
sgetz7908 2:def2c045c43a 138 while (num/d >= 10)
sgetz7908 2:def2c045c43a 139 d*=10;
sgetz7908 2:def2c045c43a 140 while (d!=0) {
sgetz7908 2:def2c045c43a 141 int dgt = num / d;
sgetz7908 2:def2c045c43a 142 num%=d;
sgetz7908 2:def2c045c43a 143 d/=10;
sgetz7908 2:def2c045c43a 144 *buf++ = dgt+'0';
sgetz7908 2:def2c045c43a 145 //n++;
sgetz7908 2:def2c045c43a 146 }
sgetz7908 2:def2c045c43a 147 *buf=0;
sgetz7908 2:def2c045c43a 148
sgetz7908 2:def2c045c43a 149 return str_buf;
sgetz7908 2:def2c045c43a 150 }
sgetz7908 2:def2c045c43a 151
sgetz7908 2:def2c045c43a 152 char hexdig(char c)
sgetz7908 2:def2c045c43a 153 {
sgetz7908 2:def2c045c43a 154 if(c<10) return c+'0';
sgetz7908 2:def2c045c43a 155 return c-10+'a';
sgetz7908 2:def2c045c43a 156 }
sgetz7908 2:def2c045c43a 157
sgetz7908 2:def2c045c43a 158 /// Convert unsigned char to string, 2 digit hex
sgetz7908 2:def2c045c43a 159 /// @returns pointer to string
sgetz7908 2:def2c045c43a 160 char * char2hex(char c)
sgetz7908 2:def2c045c43a 161 {
sgetz7908 2:def2c045c43a 162 char * buf = str_buf;
sgetz7908 2:def2c045c43a 163
sgetz7908 2:def2c045c43a 164 *buf++ = hexdig(c>>4);
sgetz7908 2:def2c045c43a 165 *buf++ = hexdig(c&0x0f);
sgetz7908 2:def2c045c43a 166 *buf=0;
sgetz7908 2:def2c045c43a 167
sgetz7908 2:def2c045c43a 168 return str_buf;
sgetz7908 2:def2c045c43a 169 }
sgetz7908 2:def2c045c43a 170
sgetz7908 2:def2c045c43a 171 /// Converts an unsigned 32 bit int to a hex string,
sgetz7908 2:def2c045c43a 172 /// 'digits' specifies the number of hex digits to output
sgetz7908 2:def2c045c43a 173 /// output string is null terminated
sgetz7908 2:def2c045c43a 174 char * char2hex(uint32_t n, int digits)
sgetz7908 2:def2c045c43a 175 {
sgetz7908 2:def2c045c43a 176 char * buf = str_buf+digits;
sgetz7908 2:def2c045c43a 177 *buf-- = 0; // null terminator
sgetz7908 2:def2c045c43a 178
sgetz7908 2:def2c045c43a 179 if(digits>0 && digits<20) {
sgetz7908 2:def2c045c43a 180 while(digits-->0) {
sgetz7908 2:def2c045c43a 181 *buf-- = hexdig(n & 0x0f);
sgetz7908 2:def2c045c43a 182 n = n>>4;
sgetz7908 2:def2c045c43a 183 }
sgetz7908 2:def2c045c43a 184 }
sgetz7908 2:def2c045c43a 185 else
sgetz7908 2:def2c045c43a 186 {
sgetz7908 2:def2c045c43a 187 return "";
sgetz7908 2:def2c045c43a 188 }
sgetz7908 2:def2c045c43a 189
sgetz7908 2:def2c045c43a 190 return str_buf;
sgetz7908 2:def2c045c43a 191 }