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
|
||||
#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 */
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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