kopia lustrzana https://github.com/bristol-seds/pico-tracker
Added callback for xosc measurement, osc8m calibration and tc for this
rodzic
372af471d3
commit
e4f81caaae
|
@ -25,13 +25,22 @@
|
||||||
#ifndef XOSC_H
|
#ifndef XOSC_H
|
||||||
#define XOSC_H
|
#define XOSC_H
|
||||||
|
|
||||||
|
#include "samd20.h"
|
||||||
|
|
||||||
enum xosc_measurement_t {
|
enum xosc_measurement_t {
|
||||||
XOSC_MEASURE_OSC8M,
|
XOSC_MEASURE_OSC8M,
|
||||||
XOSC_MEASURE_TIMEPULSE,
|
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 xosc_init(void);
|
||||||
|
struct osc8m_calibration_t osc8m_get_calibration(void);
|
||||||
void measure_xosc(enum xosc_measurement_t measurement_t);
|
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 */
|
#endif /* XOSC_H */
|
||||||
|
|
|
@ -316,6 +316,11 @@ void init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void xosc_measure_callback(uint32_t result)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MAIN
|
* MAIN
|
||||||
* =============================================================================
|
* =============================================================================
|
||||||
|
@ -324,7 +329,7 @@ int main(void)
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
|
|
||||||
measure_xosc(XOSC_MEASURE_TIMEPULSE);
|
measure_xosc(XOSC_MEASURE_TIMEPULSE, xosc_measure_callback);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
system_sleep();
|
system_sleep();
|
||||||
|
|
|
@ -41,6 +41,7 @@ enum measure_state_t {
|
||||||
MEASURE_MEASUREMENT,
|
MEASURE_MEASUREMENT,
|
||||||
} measure_state = MEASURE_WAIT_FOR_FIRST_EVENT;
|
} measure_state = MEASURE_WAIT_FOR_FIRST_EVENT;
|
||||||
enum xosc_measurement_t _measurement_t;
|
enum xosc_measurement_t _measurement_t;
|
||||||
|
measurement_result_t _callback;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configures external oscillator, waits for it to stabilise
|
* 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));
|
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) {
|
void timepulse_extint_event_source_disable(void) {
|
||||||
// Oh I don't know
|
// Oh I don't know
|
||||||
}
|
|
||||||
|
|
||||||
void EIC_Handler(void) {
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Triggers a measurements the number of cycles on XOSC
|
* 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;
|
measure_state = MEASURE_WAIT_FOR_FIRST_EVENT;
|
||||||
_measurement_t = measurement_t;
|
_measurement_t = measurement_t;
|
||||||
|
_callback = callback;
|
||||||
|
|
||||||
/* Configure GCLK1 to XOSC */
|
/* Configure GCLK1 to XOSC */
|
||||||
system_gclk_gen_set_config(GCLK_GENERATOR_1,
|
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) {
|
void TC2_Handler(void) {
|
||||||
uint32_t capture_value;
|
uint32_t capture_value;
|
||||||
float frequency;
|
|
||||||
|
|
||||||
if (tc_get_status(TC2) & TC_STATUS_CHANNEL_0_MATCH) {
|
if (tc_get_status(TC2) & TC_STATUS_CHANNEL_0_MATCH) {
|
||||||
tc_clear_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 */
|
/* Measurement done. Read off data */
|
||||||
capture_value = tc_get_capture_value(TC2, 0);
|
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 */
|
/* Disable measurement system */
|
||||||
measure_xosc_disable(_measurement_t);
|
measure_xosc_disable(_measurement_t);
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -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
|
Ładowanie…
Reference in New Issue