Added callback for xosc measurement, osc8m calibration and tc for this

geofence_dev
Richard Meadows 2015-03-15 17:34:46 +00:00
rodzic 372af471d3
commit e4f81caaae
5 zmienionych plików z 123 dodań i 12 usunięć

Wyświetl plik

@ -25,13 +25,22 @@
#ifndef XOSC_H
#define XOSC_H
#include "samd20.h"
enum xosc_measurement_t {
XOSC_MEASURE_OSC8M,
XOSC_MEASURE_TIMEPULSE,
};
struct osc8m_calibration_t {
uint8_t temperature;
uint8_t process;
};
typedef void (*measurement_result_t)(uint32_t result);
void xosc_init(void);
void measure_xosc(enum xosc_measurement_t measurement_t);
struct osc8m_calibration_t osc8m_get_calibration(void);
void osc8m_set_calibration(struct osc8m_calibration_t calib);
void measure_xosc(enum xosc_measurement_t measurement_t, measurement_result_t callback);
#endif /* XOSC_H */

Wyświetl plik

@ -316,6 +316,11 @@ void init(void)
}
void xosc_measure_callback(uint32_t result)
{
}
/**
* MAIN
* =============================================================================
@ -324,7 +329,7 @@ int main(void)
{
init();
measure_xosc(XOSC_MEASURE_TIMEPULSE);
measure_xosc(XOSC_MEASURE_TIMEPULSE, xosc_measure_callback);
while (1) {
system_sleep();

Wyświetl plik

@ -41,6 +41,7 @@ enum measure_state_t {
MEASURE_MEASUREMENT,
} measure_state = MEASURE_WAIT_FOR_FIRST_EVENT;
enum xosc_measurement_t _measurement_t;
measurement_result_t _callback;
/**
* Configures external oscillator, waits for it to stabilise
@ -57,6 +58,21 @@ void xosc_init(void) {
while (!system_clock_source_is_ready(SYSTEM_CLOCK_SOURCE_XOSC));
}
struct osc8m_calibration_t osc8m_get_calibration(void) {
uint16_t calib_word = SYSCTRL->OSC8M.bit.CALIB;
struct osc8m_calibration_t calib;
calib.temperature = (calib_word >> 6) & 0x3F;
calib.process = (calib_word >> 0) & 0x3F;
return calib;
}
void osc8m_set_calibration(struct osc8m_calibration_t calib) {
uint16_t calib_word = ((calib.temperature & 0x3F) << 6) | (calib.process & 0x3F);
system_clock_source_write_calibration(SYSTEM_CLOCK_SOURCE_OSC8M, calib_word, 0x1);
}
/**
@ -148,21 +164,19 @@ void timepulse_extint_event_source(void) {
}
void timepulse_extint_event_source_disable(void) {
// Oh I don't know
}
void EIC_Handler(void) {
}
/**
* Triggers a measurements the number of cycles on XOSC
*
* A callback from the timer interrupt is available. Obviously don't dwell here too long.
*/
void measure_xosc(enum xosc_measurement_t measurement_t) {
void measure_xosc(enum xosc_measurement_t measurement_t,
measurement_result_t callback) {
measure_state = MEASURE_WAIT_FOR_FIRST_EVENT;
_measurement_t = measurement_t;
_callback = callback;
/* Configure GCLK1 to XOSC */
system_gclk_gen_set_config(GCLK_GENERATOR_1,
@ -244,7 +258,6 @@ void measure_xosc_disable(enum xosc_measurement_t measurement_t) {
*/
void TC2_Handler(void) {
uint32_t capture_value;
float frequency;
if (tc_get_status(TC2) & TC_STATUS_CHANNEL_0_MATCH) {
tc_clear_status(TC2, TC_STATUS_CHANNEL_0_MATCH);
@ -257,7 +270,10 @@ void TC2_Handler(void) {
/* Measurement done. Read off data */
capture_value = tc_get_capture_value(TC2, 0);
frequency = capture_value * XOSC_COUNT_RESOLUTION;
/* Callback if we have one */
if (_callback) {
_callback(capture_value * XOSC_COUNT_RESOLUTION);
}
/* Disable measurement system */
measure_xosc_disable(_measurement_t);

Wyświetl plik

@ -0,0 +1,45 @@
#ifndef __verification__
#define __verification__
#endif
#include "xosc.h"
/****************************//* osc8m_calib_tc *//****************************/
/* The simplest test case. ever. Used to check for sanity */
/* Parameters in */
struct osc8m_calib_tc_params {
int dummy;
} osc8m_calib_tc_params;
/* Results out */
struct osc8m_calib_tc_results {
int result;
int c_process;
int c_temp;
} osc8m_calib_tc_results;
uint32_t _result;
void osc8m_tc_xosc_measure_callback(uint32_t result) {
_result = result;
}
/* Function */
__verification__ void osc8m_calib_tc(void) {
struct osc8m_calibration_t calib;
calib.process = 9;
calib.temperature = 28;
osc8m_set_calibration(calib);
_result = 0;
measure_xosc(XOSC_MEASURE_TIMEPULSE, osc8m_tc_xosc_measure_callback);
while (_result == 0);
osc8m_calib_tc_results.result = _result;
calib = osc8m_get_calibration();
osc8m_calib_tc_results.c_process = calib.process;
osc8m_calib_tc_results.c_temp = calib.temperature;
}

Wyświetl plik

@ -0,0 +1,36 @@
#!/usr/bin/env python
# ------------------------------------------------------------------------------
# Imports
# ------------------------------------------------------------------------------
import sys
sys.path.append("./test")
import main
from random import randint
# ------------------------------------------------------------------------------
# Test Script
# ------------------------------------------------------------------------------
class osc8m_calib_tc:
def __init__(self):
self.name = self.__class__.__name__
self.iterations = 5
def get_test(self):
"""Returns some suitable test parameters"""
params = main.struct_osc8m_calib_tc_params()
return params
def is_correct(self, params, result, print_info):
"""Returns if a result is correct for the given parameters"""
print_info(str(result))
#"OSC8M measured at %d Hz (Ctemp = %d, Cprocess = %d)"%
# (result['result'], result['c_temp'], result['c_process']))
return True