📄 main.c
字号:
//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#include "exchange.h"
#include "utils.h"
#include "globdefs.h"
#include "sigproc.h"
#include "dataproc.h"
#include "display.h"
#include "stdlib.h"
#include "string.h"
#define POS_LAST_ROW 0
#define POS_MIN_ROW 1
#define POS_MAX_ROW 2
#define POS_MODE_ROW 3
#define POS_GAIN_ROW 4
#define POS_STATUS_ROW 5
#define POS_DATA_COL 35
#define POS_BARGRAPH 75
#define POS_BARGRAPH_START 0
#define POS_BARGRAPH_STOP 5
#define INFO_LAST_TEXT "LAST:"
#define INFO_MIN_TEXT " MIN:"
#define INFO_MAX_TEXT " MAX:"
#define INFO_MODE_TEXT "MODE:"
#define INFO_MODE_INSTANT "Slow"
#define INFO_MODE_AVERAGE "Fast"
#define INFO_GAIN_TEXT "GAIN:"
#define INFO_STATUS_TEXT "COND:"
#define INFO_STATUS_ERROR "Error"
#define INFO_STATUS_WORK "Work "
#define INFO_BLANK_NUMBER " -- "
#define FLAG_ERROR_BIT 0
#define FLAG_INIT_BIT 1
#define FLAG_MODE_BIT 2
#define ADC_RANGE_SHIFT 6
#define CONV_BUFFER_LENGHT 5
#define MAX_VALUE 999
#if DEBUG
struct TADC_DATA {WORD y, x;} ADC_Data;
#endif
typedef struct
{
INT last, min, max;
BYTE gain, swing, flags;
} TPULSE_STATE;
static INT temp;
static TPULSE_STATE pulse;
BYTE *strfrm(WORD value, WORD max_val, BYTE *dest)
{
BYTE *ps = dest;
if (value > max_val) value = max_val;
itoa(dest, value,10);
while (*ps) ps++;
while (ps < (dest + CONV_BUFFER_LENGHT - 1)) *ps++ = ' ';
*ps = 0;
return dest;
}
void LCDUpdate(TPULSE_STATE *params)
{
BYTE buffer[CONV_BUFFER_LENGHT];
if (CHECKBIT(params->flags, FLAG_INIT_BIT))
{
LcdInit();
LcdGoto(0, POS_LAST_ROW); LcdCStr(INFO_LAST_TEXT);
LcdGoto(0, POS_MIN_ROW); LcdCStr(INFO_MIN_TEXT);
LcdGoto(0, POS_MAX_ROW); LcdCStr(INFO_MAX_TEXT);
LcdGoto(0, POS_MODE_ROW); LcdCStr(INFO_MODE_TEXT);
LcdGoto(0, POS_GAIN_ROW); LcdCStr(INFO_GAIN_TEXT);
LcdGoto(0, POS_STATUS_ROW); LcdCStr(INFO_STATUS_TEXT);
LcdVBargraph(POS_BARGRAPH, POS_BARGRAPH_START, POS_BARGRAPH_STOP, 0);
CLEARBIT(params->flags, FLAG_INIT_BIT);
}
LcdGoto(POS_DATA_COL, POS_LAST_ROW);
if (params->last) LcdStr(strfrm(params->last, MAX_VALUE, buffer)); else LcdCStr(INFO_BLANK_NUMBER);
LcdGoto(POS_DATA_COL, POS_MIN_ROW);
if (params->min) LcdStr(strfrm(params->min, MAX_VALUE, buffer)); else LcdCStr(INFO_BLANK_NUMBER);
LcdGoto(POS_DATA_COL, POS_MAX_ROW);
if (params->max) LcdStr(strfrm(params->max, MAX_VALUE, buffer)); else LcdCStr(INFO_BLANK_NUMBER);
LcdGoto(POS_DATA_COL, POS_MODE_ROW);
CHECKBIT(params->flags, FLAG_MODE_BIT)?(LcdCStr(INFO_MODE_INSTANT)):(LcdCStr(INFO_MODE_AVERAGE));
LcdGoto(POS_DATA_COL, POS_GAIN_ROW);
LcdStr(strfrm(params->gain, MAX_VALUE, buffer));
LcdGoto(POS_DATA_COL, POS_STATUS_ROW);
CHECKBIT(params->flags, FLAG_ERROR_BIT)?(LcdCStr(INFO_STATUS_ERROR)):(LcdCStr(INFO_STATUS_WORK));
LcdVBargraph(POS_BARGRAPH, POS_BARGRAPH_START, POS_BARGRAPH_STOP, params->swing);
}
BYTE ReadButtons(void)
{
static BYTE last_read = 0;
BYTE temp, result = 0;
BUTTONS_PORT |= BIT(BUTTON_MODE_BIT) | BIT(BUTTON_RESET_BIT);
temp = BUTTONS_PORT & (BIT(BUTTON_MODE_BIT) | BIT(BUTTON_RESET_BIT));
result = (temp ^ last_read) & (~temp);
last_read = temp;
return result;
}
void main()
{
In_PGA_Start(In_PGA_HIGHPOWER);
In_PGA_SetGain(In_PGA_G1_00);
Carrier_Timer_Start();
Mixer_Start(Mixer_HIGHPOWER);
In_BPF_Start(In_BPF_HIGHPOWER);
#if DEBUG
Exchange_Start();
#endif
//AMD_CR1 |= 0x01; -- global output bus driven
AMD_CR1 |= 0x04; // -- comparator bus driven
SETBIT(INT_MSK3, 0);
SETBIT(INT_MSK0, 6);
ADC_SetResolution(13);
ADC_bPWM_IntTime_LSB = (BYTE)ADC_INTEGRATION;
ADC_bPWM_IntTime_MSB = (BYTE)(ADC_INTEGRATION >> 8);
ADC_bPWM_Period_LSB = (BYTE)ADC_PERIOD;
ADC_bPWM_Period_MSB = (BYTE)(ADC_PERIOD >> 8);
M8C_EnableGInt;
#if DEBUG
Exchange_Start();
#endif
ADC_Start(ADC_HIGHPOWER);
ADC_GetSamples(0);
pulse.flags = BIT(FLAG_INIT_BIT);
LCDUpdate(&pulse);
while(1)
{
temp = ReadButtons();
if (CHECKBIT(temp, BUTTON_MODE_BIT))
{
pulse.flags ^= BIT(FLAG_MODE_BIT);
Pulse_Init_Calculate();
LCDUpdate(&pulse);
}
if (CHECKBIT(temp, BUTTON_RESET_BIT))
{
pulse.last = pulse.min = pulse.max = 0;
LCDUpdate(&pulse);
Pulse_Init_Calculate();
}
temp = (CHECKBIT(pulse.flags, FLAG_MODE_BIT))?
(Pulse_Averaged_Calculate()) : (Pulse_Instant_Calculate());
pulse.gain = GetGainLevel();
pulse.swing = GetADCRange() >> ADC_RANGE_SHIFT;
if (PULSE_IN_PROGRESS == temp) CLEARBIT(pulse.flags, FLAG_ERROR_BIT);
else
if (PULSE_CALC_ERROR == temp) SETBIT(pulse.flags, FLAG_ERROR_BIT);
else
{
pulse.last = temp;
if (pulse.max < pulse.last) pulse.max = pulse.last;
if ((pulse.min > pulse.last) || (0 == pulse.min)) pulse.min = pulse.last;
}
if (Check_Update_Timeout()) LCDUpdate(&pulse);
#if DEBUG
while (!ADC_fIsDataAvailable());
ADC_Data.y = GetDebugVar();
ADC_Data.x = ADC_iGetDataClearFlag();
Exchange_SendBuf((BYTE*)&ADC_Data, 4);
#endif
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -