chore: HERV 통합 저장소 재초기화 커밋
손상된 .git 히스토리(missing tree)로 재초기화 후 작업트리 전체 커밋. .claude/ 만 제외(로컬 에이전트 설정). 구 저장소 백업(.git_corrupt_backup/) 포함. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,667 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "Nano100Series.h"
|
||||
#include "adc.h"
|
||||
#include "gpio.h"
|
||||
#include "pwm.h"
|
||||
#include "timer.h"
|
||||
#include "uart.h"
|
||||
#include "sys.h"
|
||||
#include "clk.h"
|
||||
#include "EEPROM_Emulate.h"
|
||||
|
||||
|
||||
#include "My_define.h"
|
||||
|
||||
uint32_t Read_Data(uint8_t index, uint8_t *data);
|
||||
uint32_t Write_Data(uint8_t index, uint8_t data);
|
||||
|
||||
|
||||
uint8_t page_data[EEP_SIZE];
|
||||
|
||||
|
||||
uint8_t Test_Fan1_Speed, Test_Fan2_Speed;
|
||||
uint8_t Test_Fan1_Ven_1_dan, Test_Fan1_Ven_2_dan, Test_Fan1_Ven_3_dan, Test_Fan1_Ven_4_dan, \
|
||||
Test_Fan1_Air_1_dan, Test_Fan1_Air_2_dan, Test_Fan1_Air_3_dan, Test_Fan1_Air_4_dan,\
|
||||
Test_Fan1_Bypass_1_dan, Test_Fan1_Bypass_2_dan, Test_Fan1_Bypass_3_dan, Test_Fan1_Bypass_4_dan;
|
||||
uint8_t Test_Fan2_Ven_1_dan, Test_Fan2_Ven_2_dan, Test_Fan2_Ven_3_dan, Test_Fan2_Ven_4_dan,\
|
||||
Test_Fan2_Air_1_dan, Test_Fan2_Air_2_dan, Test_Fan2_Air_3_dan , Test_Fan2_Air_4_dan,\
|
||||
Test_Fan2_Bypass_1_dan, Test_Fan2_Bypass_2_dan, Test_Fan2_Bypass_3_dan, Test_Fan2_Bypass_4_dan;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* 히스테리시스 프리셋(임계+데드밴드) <-> page_data (EEPROM 영역 43~127) */
|
||||
static void Hyst_To_Page(void)
|
||||
{
|
||||
uint8_t pp, k, o;
|
||||
page_data[EEP_HYST_PRESET] = Hyst_Preset;
|
||||
for(pp = 0; pp < 3; pp++)
|
||||
{
|
||||
page_data[EEP_HYST_DB_BASE + 0 + pp] = (uint8_t)Co2_Db[pp];
|
||||
page_data[EEP_HYST_DB_BASE + 3 + pp] = (uint8_t)Pm25_Db[pp];
|
||||
page_data[EEP_HYST_DB_BASE + 6 + pp] = (uint8_t)Pm10_Db[pp];
|
||||
page_data[EEP_HYST_DB_BASE + 9 + pp] = (uint8_t)Voc_Db[pp];
|
||||
for(k = 0; k < 4; k++)
|
||||
{
|
||||
o = (uint8_t)(pp * 8 + k * 2);
|
||||
page_data[EEP_THR_CO2_BASE + o] = (uint8_t)(Co2_Thr[pp][k] >> 8);
|
||||
page_data[EEP_THR_CO2_BASE + o + 1] = (uint8_t)(Co2_Thr[pp][k] & 0xFF);
|
||||
page_data[EEP_THR_VOC_BASE + o] = (uint8_t)(Voc_Thr[pp][k] >> 8);
|
||||
page_data[EEP_THR_VOC_BASE + o + 1] = (uint8_t)(Voc_Thr[pp][k] & 0xFF);
|
||||
page_data[EEP_THR_PM25_BASE + pp * 4 + k] = (uint8_t)Pm25_Thr[pp][k];
|
||||
page_data[EEP_THR_PM10_BASE + pp * 4 + k] = (uint8_t)Pm10_Thr[pp][k];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void Hyst_From_Page(void)
|
||||
{
|
||||
uint8_t pp, k, o;
|
||||
if(page_data[EEP_HYST_PRESET] > 2) return; /* 미초기화(0xFF) -> 컴파일 기본값 유지 */
|
||||
Hyst_Preset = page_data[EEP_HYST_PRESET];
|
||||
for(pp = 0; pp < 3; pp++)
|
||||
{
|
||||
Co2_Db[pp] = page_data[EEP_HYST_DB_BASE + 0 + pp];
|
||||
Pm25_Db[pp] = page_data[EEP_HYST_DB_BASE + 3 + pp];
|
||||
Pm10_Db[pp] = page_data[EEP_HYST_DB_BASE + 6 + pp];
|
||||
Voc_Db[pp] = page_data[EEP_HYST_DB_BASE + 9 + pp];
|
||||
for(k = 0; k < 4; k++)
|
||||
{
|
||||
o = (uint8_t)(pp * 8 + k * 2);
|
||||
Co2_Thr[pp][k] = (uint16_t)(((uint16_t)page_data[EEP_THR_CO2_BASE + o] << 8) | page_data[EEP_THR_CO2_BASE + o + 1]);
|
||||
Voc_Thr[pp][k] = (uint16_t)(((uint16_t)page_data[EEP_THR_VOC_BASE + o] << 8) | page_data[EEP_THR_VOC_BASE + o + 1]);
|
||||
Pm25_Thr[pp][k] = page_data[EEP_THR_PM25_BASE + pp * 4 + k];
|
||||
Pm10_Thr[pp][k] = page_data[EEP_THR_PM10_BASE + pp * 4 + k];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void init_process(void)
|
||||
{
|
||||
uint16_t i;
|
||||
uint8_t eep_error = 0;
|
||||
|
||||
union {
|
||||
uint32_t u32_val ;
|
||||
uint8_t u8_val[4] ;
|
||||
} tran ;
|
||||
|
||||
|
||||
for(i=0; i<20; i++)Tx_roomcon232_buffer[i] = 0;
|
||||
for(i=0; i<20; i++)Tx_display_buffer[i] = 0;
|
||||
for(i=0; i<20; i++)Tx_homenet_buffer[i] = 0;
|
||||
|
||||
|
||||
for(i=0; i<EEP_SIZE; i++)Read_Data(i, &page_data[i]);
|
||||
|
||||
tran.u8_val[0] = page_data[0];
|
||||
tran.u8_val[1] = page_data[1];
|
||||
tran.u8_val[2] = page_data[2];
|
||||
tran.u8_val[3] = page_data[3];
|
||||
|
||||
if(tran.u32_val == 0x55AA55AA)
|
||||
{
|
||||
s_FAN1_VEN_1_DAN = page_data[EEP_FAN1_VEN_1_DAN];
|
||||
s_FAN1_VEN_2_DAN = page_data[EEP_FAN1_VEN_2_DAN];
|
||||
s_FAN1_VEN_3_DAN = page_data[EEP_FAN1_VEN_3_DAN];
|
||||
s_FAN1_VEN_4_DAN = page_data[EEP_FAN1_VEN_4_DAN];
|
||||
s_FAN1_AIR_1_DAN = page_data[EEP_FAN1_AIR_1_DAN];
|
||||
s_FAN1_AIR_2_DAN = page_data[EEP_FAN1_AIR_2_DAN];
|
||||
s_FAN1_AIR_3_DAN = page_data[EEP_FAN1_AIR_3_DAN];
|
||||
s_FAN1_AIR_4_DAN = page_data[EEP_FAN1_AIR_4_DAN];
|
||||
s_FAN1_BYPASS_1_DAN = page_data[EEP_FAN1_BYPASS_1_DAN];
|
||||
s_FAN1_BYPASS_2_DAN = page_data[EEP_FAN1_BYPASS_2_DAN];
|
||||
s_FAN1_BYPASS_3_DAN = page_data[EEP_FAN1_BYPASS_3_DAN];
|
||||
s_FAN1_BYPASS_4_DAN = page_data[EEP_FAN1_BYPASS_4_DAN];
|
||||
|
||||
s_FAN2_VEN_1_DAN = page_data[EEP_FAN2_VEN_1_DAN];
|
||||
s_FAN2_VEN_2_DAN = page_data[EEP_FAN2_VEN_2_DAN];
|
||||
s_FAN2_VEN_3_DAN = page_data[EEP_FAN2_VEN_3_DAN];
|
||||
s_FAN2_VEN_4_DAN = page_data[EEP_FAN2_VEN_4_DAN];
|
||||
s_FAN2_AIR_1_DAN = page_data[EEP_FAN2_AIR_1_DAN];
|
||||
s_FAN2_AIR_2_DAN = page_data[EEP_FAN2_AIR_2_DAN];
|
||||
s_FAN2_AIR_3_DAN = page_data[EEP_FAN2_AIR_3_DAN];
|
||||
s_FAN2_AIR_4_DAN = page_data[EEP_FAN2_AIR_4_DAN];
|
||||
s_FAN2_BYPASS_1_DAN = page_data[EEP_FAN2_BYPASS_1_DAN];
|
||||
s_FAN2_BYPASS_2_DAN = page_data[EEP_FAN2_BYPASS_2_DAN];
|
||||
s_FAN2_BYPASS_3_DAN = page_data[EEP_FAN2_BYPASS_3_DAN];
|
||||
s_FAN2_BYPASS_4_DAN = page_data[EEP_FAN2_BYPASS_4_DAN];
|
||||
|
||||
Filter_timer_clean = ((uint16_t)page_data[EEP_FILTER_CLEAN_HOUR_H]<<8) + (uint16_t)page_data[EEP_FILTER_CLEAN_HOUR_L];
|
||||
Filter_timer_change = ((uint16_t)page_data[EEP_FILTER_CHANGE_HOUR_H]<<8) + (uint16_t)page_data[EEP_FILTER_CHANGE_HOUR_L];
|
||||
Soja_timer_change = ((uint16_t)page_data[EEP_SOJA_CHANGE_HOUR_H]<<8) + (uint16_t)page_data[EEP_SOJA_CHANGE_HOUR_L];
|
||||
|
||||
BlackOut_Power_On = page_data[EEP_BLACKOUT_POWER_ON];
|
||||
BlackOut_Run_Mode = page_data[EEP_BLACKOUT_RUN_MODE];
|
||||
BlackOut_Fan_Mode = page_data[EEP_BLACKOUT_FAN_MODE];
|
||||
|
||||
Hyst_From_Page(); /* 히스테리시스 임계/데드밴드/프리셋 로드(미초기화면 기본값 유지) */
|
||||
}
|
||||
else
|
||||
{
|
||||
tran.u32_val = 0x55AA55AA;
|
||||
page_data[0] = tran.u8_val[0];
|
||||
page_data[1] = tran.u8_val[1];
|
||||
page_data[2] = tran.u8_val[2];
|
||||
page_data[3] = tran.u8_val[3];
|
||||
|
||||
////////////////////////////////////////////////
|
||||
|
||||
/* VSP 기본값 = 사양서 DL H-ERV VSP 실측표 (FAN1=SA 급기, FAN2=EA 배기) */
|
||||
s_FAN1_VEN_1_DAN = 56;
|
||||
s_FAN1_VEN_2_DAN = 63;
|
||||
s_FAN1_VEN_3_DAN = 70;
|
||||
s_FAN1_VEN_4_DAN = 86;
|
||||
|
||||
s_FAN1_AIR_1_DAN = 65;
|
||||
s_FAN1_AIR_2_DAN = 72;
|
||||
s_FAN1_AIR_3_DAN = 78;
|
||||
s_FAN1_AIR_4_DAN = 80;
|
||||
|
||||
s_FAN1_BYPASS_1_DAN = 67;
|
||||
s_FAN1_BYPASS_2_DAN = 67;
|
||||
s_FAN1_BYPASS_3_DAN = 67;
|
||||
s_FAN1_BYPASS_4_DAN = 67;
|
||||
|
||||
s_FAN2_VEN_1_DAN = 57;
|
||||
s_FAN2_VEN_2_DAN = 63;
|
||||
s_FAN2_VEN_3_DAN = 70;
|
||||
s_FAN2_VEN_4_DAN = 85;
|
||||
|
||||
s_FAN2_AIR_1_DAN = 0; /* 공청 EA 미사용 */
|
||||
s_FAN2_AIR_2_DAN = 0;
|
||||
s_FAN2_AIR_3_DAN = 0;
|
||||
s_FAN2_AIR_4_DAN = 0;
|
||||
|
||||
s_FAN2_BYPASS_1_DAN = 75;
|
||||
s_FAN2_BYPASS_2_DAN = 75;
|
||||
s_FAN2_BYPASS_3_DAN = 75;
|
||||
s_FAN2_BYPASS_4_DAN = 75;
|
||||
|
||||
////////////////////////////////////////////////
|
||||
|
||||
|
||||
Filter_timer_clean = 0;
|
||||
Filter_timer_change = 0;
|
||||
Soja_timer_change = 0;
|
||||
|
||||
page_data[EEP_FAN1_VEN_1_DAN] = s_FAN1_VEN_1_DAN;
|
||||
page_data[EEP_FAN1_VEN_2_DAN] = s_FAN1_VEN_2_DAN;
|
||||
page_data[EEP_FAN1_VEN_3_DAN] = s_FAN1_VEN_3_DAN;
|
||||
page_data[EEP_FAN1_VEN_4_DAN] = s_FAN1_VEN_4_DAN;
|
||||
page_data[EEP_FAN1_AIR_1_DAN] = s_FAN1_AIR_1_DAN;
|
||||
page_data[EEP_FAN1_AIR_2_DAN] = s_FAN1_AIR_2_DAN;
|
||||
page_data[EEP_FAN1_AIR_3_DAN] = s_FAN1_AIR_3_DAN;
|
||||
page_data[EEP_FAN1_AIR_4_DAN] = s_FAN1_AIR_4_DAN;
|
||||
page_data[EEP_FAN1_BYPASS_1_DAN] = s_FAN1_BYPASS_1_DAN;
|
||||
page_data[EEP_FAN1_BYPASS_2_DAN] = s_FAN1_BYPASS_2_DAN;
|
||||
page_data[EEP_FAN1_BYPASS_3_DAN] = s_FAN1_BYPASS_3_DAN;
|
||||
page_data[EEP_FAN1_BYPASS_4_DAN] = s_FAN1_BYPASS_4_DAN;
|
||||
|
||||
page_data[EEP_FAN2_VEN_1_DAN] = s_FAN2_VEN_1_DAN;
|
||||
page_data[EEP_FAN2_VEN_2_DAN] = s_FAN2_VEN_2_DAN;
|
||||
page_data[EEP_FAN2_VEN_3_DAN] = s_FAN2_VEN_3_DAN;
|
||||
page_data[EEP_FAN2_VEN_4_DAN] = s_FAN2_VEN_4_DAN;
|
||||
page_data[EEP_FAN2_AIR_1_DAN] = s_FAN2_AIR_1_DAN;
|
||||
page_data[EEP_FAN2_AIR_2_DAN] = s_FAN2_AIR_2_DAN;
|
||||
page_data[EEP_FAN2_AIR_3_DAN] = s_FAN2_AIR_3_DAN;
|
||||
page_data[EEP_FAN2_AIR_4_DAN] = s_FAN2_AIR_4_DAN;
|
||||
page_data[EEP_FAN2_BYPASS_1_DAN] = s_FAN2_BYPASS_1_DAN;
|
||||
page_data[EEP_FAN2_BYPASS_2_DAN] = s_FAN2_BYPASS_2_DAN;
|
||||
page_data[EEP_FAN2_BYPASS_3_DAN] = s_FAN2_BYPASS_3_DAN;
|
||||
page_data[EEP_FAN2_BYPASS_4_DAN] = s_FAN2_BYPASS_4_DAN;
|
||||
|
||||
page_data[EEP_FILTER_CLEAN_HOUR_H] = (uint8_t)((Filter_timer_clean&0xFF00)>>8);
|
||||
page_data[EEP_FILTER_CLEAN_HOUR_L] = (uint8_t)(Filter_timer_clean&0x00FF);
|
||||
page_data[EEP_FILTER_CHANGE_HOUR_H] = (uint8_t)((Filter_timer_change&0xFF00)>>8);
|
||||
page_data[EEP_FILTER_CHANGE_HOUR_L] = (uint8_t)(Filter_timer_change&0x00FF);
|
||||
page_data[EEP_SOJA_CHANGE_HOUR_H] = (uint8_t)((Soja_timer_change&0xFF00)>>8);
|
||||
page_data[EEP_SOJA_CHANGE_HOUR_L] = (uint8_t)(Soja_timer_change&0x00FF);
|
||||
|
||||
page_data[EEP_BLACKOUT_POWER_ON] = Power_On;
|
||||
page_data[EEP_BLACKOUT_RUN_MODE] = Run_Mode;
|
||||
page_data[EEP_BLACKOUT_FAN_MODE] = Fan_Mode;
|
||||
|
||||
Hyst_To_Page(); /* 히스테리시스 임계/데드밴드/프리셋 기본값 저장 */
|
||||
|
||||
for(i=0; i<EEP_SIZE ; i++)Write_Data(i, page_data[i]);
|
||||
}
|
||||
|
||||
|
||||
Test_Fan1_Ven_1_dan = s_FAN1_VEN_1_DAN;
|
||||
Test_Fan1_Ven_2_dan = s_FAN1_VEN_2_DAN;
|
||||
Test_Fan1_Ven_3_dan = s_FAN1_VEN_3_DAN;
|
||||
Test_Fan1_Ven_4_dan = s_FAN1_VEN_4_DAN;
|
||||
Test_Fan1_Air_1_dan = s_FAN1_AIR_1_DAN;
|
||||
Test_Fan1_Air_2_dan = s_FAN1_AIR_2_DAN;
|
||||
Test_Fan1_Air_3_dan = s_FAN1_AIR_3_DAN;
|
||||
Test_Fan1_Air_4_dan = s_FAN1_AIR_4_DAN;
|
||||
Test_Fan1_Bypass_1_dan = s_FAN1_BYPASS_1_DAN;
|
||||
Test_Fan1_Bypass_2_dan = s_FAN1_BYPASS_2_DAN;
|
||||
Test_Fan1_Bypass_3_dan = s_FAN1_BYPASS_3_DAN;
|
||||
Test_Fan1_Bypass_4_dan = s_FAN1_BYPASS_4_DAN;
|
||||
|
||||
Test_Fan2_Ven_1_dan = s_FAN2_VEN_1_DAN;
|
||||
Test_Fan2_Ven_2_dan = s_FAN2_VEN_2_DAN;
|
||||
Test_Fan2_Ven_3_dan = s_FAN2_VEN_3_DAN;
|
||||
Test_Fan2_Ven_4_dan = s_FAN2_VEN_4_DAN;
|
||||
Test_Fan2_Air_1_dan = s_FAN2_AIR_1_DAN;
|
||||
Test_Fan2_Air_2_dan = s_FAN2_AIR_2_DAN;
|
||||
Test_Fan2_Air_3_dan = s_FAN2_AIR_3_DAN;
|
||||
Test_Fan2_Air_4_dan = s_FAN2_AIR_4_DAN;
|
||||
Test_Fan2_Bypass_1_dan = s_FAN2_BYPASS_1_DAN;
|
||||
Test_Fan2_Bypass_2_dan = s_FAN2_BYPASS_2_DAN;
|
||||
Test_Fan2_Bypass_3_dan = s_FAN2_BYPASS_3_DAN;
|
||||
Test_Fan2_Bypass_4_dan = s_FAN2_BYPASS_4_DAN;
|
||||
|
||||
//////////////////////// disp init ////////////////////////
|
||||
|
||||
Step_motor_init();
|
||||
delay_ms(100);
|
||||
|
||||
for(i=0; i<10; i++)
|
||||
{
|
||||
ADC_Sensing();
|
||||
delay_ms(20);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//*****************************************************
|
||||
// Humidity Convertion
|
||||
//*****************************************************
|
||||
//5th Degree Polynomial Fit: y=a+bx+cx^2+dx^3...
|
||||
//Coefficient Data:
|
||||
#define Ha -4.87601734329E+001
|
||||
#define Hb 8.96436964233E-002
|
||||
#define Hc -6.50196401698E-005
|
||||
#define Hd 3.36616112090E-008
|
||||
#define He -7.78888646058E-012
|
||||
#define Hf 6.68092914464E-016
|
||||
|
||||
float Humidity_Conversion(float V)
|
||||
{
|
||||
float Ret = 0;
|
||||
|
||||
V *= 1000;
|
||||
|
||||
Ret = Ha + (Hb * V) + (Hc * (V * V)) + (Hd * (V * V * V)) + (He * (V * V * V * V)) + (Hf * (V * V * V * V * V));
|
||||
|
||||
|
||||
if(Ret <= 0)Ret = 0;
|
||||
else if(Ret >= 99.9)Ret = 99.9;
|
||||
|
||||
return(Ret);
|
||||
}
|
||||
|
||||
// LNTK103FF
|
||||
|
||||
#define T_a 3.08197700643E-002
|
||||
#define T_b 8.77312053750E+002
|
||||
#define T_c -3.17755936684E+003
|
||||
#define T_d 5.62092429082E+003
|
||||
#define T_e -5.86906412922E+003
|
||||
#define T_f 3.82840309167E+003
|
||||
#define T_g -1.57651548838E+003
|
||||
#define T_h 3.97983185914E+002
|
||||
#define T_i -5.61894921403E+001
|
||||
#define T_j 3.39457675113E+000
|
||||
|
||||
|
||||
|
||||
#define PowerSupplyVoltage 3.300 //
|
||||
|
||||
float Temperature_Conversion(float V)
|
||||
{
|
||||
|
||||
return( T_a + T_b*V + T_c*V*V + T_d*V*V*V + T_e*V*V*V*V + T_f*V*V*V*V*V + T_g*V*V*V*V*V*V +\
|
||||
T_h*V*V*V*V*V*V*V + T_i*V*V*V*V*V*V*V*V + T_j*V*V*V*V*V*V*V*V*V );
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
// ADC Power Input
|
||||
|
||||
float VoltageConversion(unsigned int in_data)
|
||||
{
|
||||
return((float)((float)in_data) * (PowerSupplyVoltage / 4095));
|
||||
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
||||
float Humidity_Read(uint16_t data)
|
||||
{
|
||||
float Retf, fTmp;
|
||||
|
||||
fTmp = VoltageConversion(data);
|
||||
|
||||
if(fTmp < 0.1)Retf = 0;
|
||||
else Retf = Humidity_Conversion(fTmp)*10;
|
||||
|
||||
|
||||
return(Retf);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
float Temperature_Read(uint16_t data)
|
||||
{
|
||||
float Retf, fTmp;
|
||||
|
||||
fTmp = VoltageConversion(data);
|
||||
|
||||
Retf = Temperature_Conversion(fTmp) ; //
|
||||
|
||||
return(Retf);
|
||||
}
|
||||
|
||||
float Float_Aeverage_calculator(float val, float * array_val)
|
||||
{
|
||||
uint8_t i;
|
||||
float max = -10000;
|
||||
float min = 10000;
|
||||
float sum = 0;
|
||||
float Rval = 0;
|
||||
|
||||
for(i=9; i>0; i--)
|
||||
{
|
||||
*(array_val+i) = *(array_val+i-1);
|
||||
}
|
||||
*array_val = val;
|
||||
|
||||
for(i=0; i<10; i++)
|
||||
{
|
||||
if(array_val[i] >= max)
|
||||
{
|
||||
max = array_val[i];
|
||||
}
|
||||
if(array_val[i] <= min)
|
||||
{
|
||||
min = array_val[i];
|
||||
}
|
||||
sum += array_val[i];
|
||||
}
|
||||
Rval = (float)((sum - max - min)/8);
|
||||
|
||||
return(Rval);
|
||||
}
|
||||
|
||||
|
||||
uint16_t Aeverage_calculator(uint16_t val, uint16_t * array_val)
|
||||
{
|
||||
uint8_t i;
|
||||
uint16_t max = 0;
|
||||
uint16_t min = 10000;
|
||||
uint32_t sum = 0;
|
||||
uint16_t Rval = 0;
|
||||
|
||||
for(i=9; i>0; i--)
|
||||
{
|
||||
*(array_val+i) = *(array_val+i-1);
|
||||
}
|
||||
*array_val = val;
|
||||
|
||||
for(i=0; i<10; i++)
|
||||
{
|
||||
if(array_val[i] >= max)
|
||||
{
|
||||
max = array_val[i];
|
||||
}
|
||||
if(array_val[i] <= min)
|
||||
{
|
||||
min = array_val[i];
|
||||
}
|
||||
sum += array_val[i];
|
||||
}
|
||||
Rval = (uint16_t)((sum - max - min)/8);
|
||||
|
||||
return(Rval);
|
||||
}
|
||||
|
||||
uint16_t Current_Read(uint16_t adc_current)
|
||||
{
|
||||
return adc_current;
|
||||
}
|
||||
|
||||
|
||||
|
||||
extern volatile uint8_t ADC_Complete;
|
||||
|
||||
volatile uint8_t Err_Code = 0;
|
||||
|
||||
uint16_t adc_result = 0;
|
||||
uint16_t Main_Current;
|
||||
signed int Out_Temperature = 0;
|
||||
signed int In_Temperature = 0;
|
||||
|
||||
uint8_t Sen_Pos = 0;
|
||||
|
||||
int16_t Volum1_value = 0, Volum2_value = 0;
|
||||
|
||||
float Avr_Temperature_1[10]={0,0,0,0,0,0,0,0,0,0};
|
||||
float Avr_Temperature_2[10]={0,0,0,0,0,0,0,0,0,0};
|
||||
uint16_t Avr_Vol_1[10]={0,0,0,0,0,0,0,0,0,0};
|
||||
uint16_t Avr_Vol_2[10]={0,0,0,0,0,0,0,0,0,0};
|
||||
uint16_t Avr_Current[10]={0,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
|
||||
uint8_t Temp_sensor_error = 0;
|
||||
void ADC_Sensing(void)
|
||||
{
|
||||
float fTmp = 0;
|
||||
signed int sTmp = 0;
|
||||
uint16_t uTmp = 0;
|
||||
|
||||
|
||||
if(ADC_Complete == 1)
|
||||
{
|
||||
ADC_Complete = 0;
|
||||
|
||||
adc_result = ADC_GET_CONVERSION_DATA(ADC, 4); // in
|
||||
uTmp = Aeverage_calculator(adc_result, Avr_Current);
|
||||
Main_Current = Current_Read(uTmp);
|
||||
//////////// in
|
||||
/* adc_current = ADC_GET_CONVERSION_DATA(ADC, 0); // in
|
||||
fTmp = Temperature_Read(adc_result);
|
||||
|
||||
if(fTmp < 0) fTmp *= 1.05;
|
||||
sTmp = (signed int)fTmp;
|
||||
|
||||
|
||||
|
||||
if((sTmp > 85) || (sTmp < -40))
|
||||
{
|
||||
Temp_sensor_error |= 1;
|
||||
In_Temperature = 100;
|
||||
}
|
||||
else
|
||||
{
|
||||
sTmp = Float_Aeverage_calculator(sTmp, Avr_Temperature_1);
|
||||
Temp_sensor_error &= ~1;
|
||||
|
||||
if(sTmp >= 85)In_Temperature = 85;
|
||||
else if(sTmp <= -20)In_Temperature = -20;
|
||||
else In_Temperature = sTmp;
|
||||
}
|
||||
|
||||
*/
|
||||
//////////// out
|
||||
adc_result = ADC_GET_CONVERSION_DATA(ADC, 1); // out
|
||||
fTmp = Temperature_Read(adc_result);
|
||||
|
||||
if(fTmp < 0) fTmp *= 1.05;
|
||||
sTmp = (signed int)fTmp;
|
||||
|
||||
|
||||
if((sTmp > 85) || (sTmp < -40))
|
||||
{
|
||||
Temp_sensor_error |= 2;
|
||||
Out_Temperature = 100;
|
||||
}
|
||||
else
|
||||
{
|
||||
sTmp = Float_Aeverage_calculator(sTmp, Avr_Temperature_2);
|
||||
Temp_sensor_error &= ~2;
|
||||
|
||||
if(sTmp >= 85)Out_Temperature = 85;
|
||||
else if(sTmp <= -20)Out_Temperature = -20;
|
||||
else Out_Temperature = sTmp;
|
||||
}
|
||||
|
||||
|
||||
//if(Temp_sensor_error)Err_Code |= ERROR_TEMP_SENSOR;
|
||||
//else Err_Code &= ~ERROR_TEMP_SENSOR;
|
||||
|
||||
|
||||
////////////// vol 1
|
||||
adc_result = ADC_GET_CONVERSION_DATA(ADC, 2);
|
||||
//fTmp = Aeverage_calculator(adc_result, Avr_Vol_2);
|
||||
Volum1_value = 125 - (signed int)((float)adc_result/4.095/4) + 50; // -100 ~ 100
|
||||
|
||||
//////////////// vol 2
|
||||
adc_result = ADC_GET_CONVERSION_DATA(ADC, 3);
|
||||
//fTmp = Aeverage_calculator(adc_result, Avr_Vol_1);
|
||||
Volum2_value = 125 - (signed int)((float)adc_result/4.095/4) + 50; // -100 ~ 100
|
||||
|
||||
}
|
||||
ADC_START_CONV(ADC);
|
||||
}
|
||||
|
||||
void EEP_Save_process(void)
|
||||
{
|
||||
uint8_t i;
|
||||
|
||||
/* (구 PC메뉴용 Test_Fan -> s_FAN 복사 제거 : 대시보드 CTRL_VSP 로 설정한 s_FAN 값을 그대로 저장) */
|
||||
|
||||
page_data[EEP_FAN1_VEN_1_DAN] = s_FAN1_VEN_1_DAN;
|
||||
page_data[EEP_FAN1_VEN_2_DAN] = s_FAN1_VEN_2_DAN;
|
||||
page_data[EEP_FAN1_VEN_3_DAN] = s_FAN1_VEN_3_DAN;
|
||||
page_data[EEP_FAN1_VEN_4_DAN] = s_FAN1_VEN_4_DAN;
|
||||
page_data[EEP_FAN1_AIR_1_DAN] = s_FAN1_AIR_1_DAN;
|
||||
page_data[EEP_FAN1_AIR_2_DAN] = s_FAN1_AIR_2_DAN;
|
||||
page_data[EEP_FAN1_AIR_3_DAN] = s_FAN1_AIR_3_DAN;
|
||||
page_data[EEP_FAN1_AIR_4_DAN] = s_FAN1_AIR_4_DAN;
|
||||
page_data[EEP_FAN1_BYPASS_1_DAN] = s_FAN1_BYPASS_1_DAN;
|
||||
page_data[EEP_FAN1_BYPASS_2_DAN] = s_FAN1_BYPASS_2_DAN;
|
||||
page_data[EEP_FAN1_BYPASS_3_DAN] = s_FAN1_BYPASS_3_DAN;
|
||||
page_data[EEP_FAN1_BYPASS_4_DAN] = s_FAN1_BYPASS_4_DAN;
|
||||
|
||||
page_data[EEP_FAN2_VEN_1_DAN] = s_FAN2_VEN_1_DAN;
|
||||
page_data[EEP_FAN2_VEN_2_DAN] = s_FAN2_VEN_2_DAN;
|
||||
page_data[EEP_FAN2_VEN_3_DAN] = s_FAN2_VEN_3_DAN;
|
||||
page_data[EEP_FAN2_VEN_4_DAN] = s_FAN2_VEN_4_DAN;
|
||||
page_data[EEP_FAN2_AIR_1_DAN] = s_FAN2_AIR_1_DAN;
|
||||
page_data[EEP_FAN2_AIR_2_DAN] = s_FAN2_AIR_2_DAN;
|
||||
page_data[EEP_FAN2_AIR_3_DAN] = s_FAN2_AIR_3_DAN;
|
||||
page_data[EEP_FAN2_AIR_4_DAN] = s_FAN2_AIR_4_DAN;
|
||||
page_data[EEP_FAN2_BYPASS_1_DAN] = s_FAN2_BYPASS_1_DAN;
|
||||
page_data[EEP_FAN2_BYPASS_2_DAN] = s_FAN2_BYPASS_2_DAN;
|
||||
page_data[EEP_FAN2_BYPASS_3_DAN] = s_FAN2_BYPASS_3_DAN;
|
||||
page_data[EEP_FAN2_BYPASS_4_DAN] = s_FAN2_BYPASS_4_DAN;
|
||||
|
||||
page_data[EEP_FILTER_CLEAN_HOUR_H] = (uint8_t)((Filter_timer_clean&0xFF00)>>8);
|
||||
page_data[EEP_FILTER_CLEAN_HOUR_L] = (uint8_t)(Filter_timer_clean&0x00FF);
|
||||
page_data[EEP_FILTER_CHANGE_HOUR_H] = (uint8_t)((Filter_timer_change&0xFF00)>>8);
|
||||
page_data[EEP_FILTER_CHANGE_HOUR_L] = (uint8_t)(Filter_timer_change&0x00FF);
|
||||
page_data[EEP_SOJA_CHANGE_HOUR_H] = (uint8_t)((Soja_timer_change&0xFF00)>>8);
|
||||
page_data[EEP_SOJA_CHANGE_HOUR_L] = (uint8_t)(Soja_timer_change&0x00FF);
|
||||
|
||||
page_data[EEP_BLACKOUT_POWER_ON] = Power_On;
|
||||
page_data[EEP_BLACKOUT_RUN_MODE] = Run_Mode;
|
||||
page_data[EEP_BLACKOUT_FAN_MODE] = Fan_Mode;
|
||||
|
||||
Hyst_To_Page(); /* 히스테리시스 임계/데드밴드/프리셋 저장 (대시보드 0x06/0x07/0x0D) */
|
||||
|
||||
for(i=0; i<EEP_SIZE ; i++)Write_Data(i, page_data[i]);
|
||||
|
||||
|
||||
}
|
||||
|
||||
uint8_t Filter_Reset_Process(void)
|
||||
{
|
||||
Err_Code &= ~(ERROR_FILTER_CHANGE|ERROR_FILTER_CLEAN|ERROR_SOJA_CHANGE);
|
||||
if((Filter_timer_clean == 0)&&(Filter_timer_change == 0)&&(Filter_timer_change == 0))return(0);
|
||||
|
||||
Filter_timer_clean = 0;
|
||||
if(Filter_timer_change >= 4000)Filter_timer_change = 0;
|
||||
if(Soja_timer_change >= 20000)Soja_timer_change = 0;
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Reserve_Time_Update(uint8_t rtime)
|
||||
{
|
||||
if(Roomcon_connect_mode == 0)
|
||||
{
|
||||
Set_Reserve_timer_sec = (uint32_t)rtime * 3600;
|
||||
Reserve_timer_sec = Set_Reserve_timer_sec;
|
||||
Pre_Reserve_hour = rtime;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(rtime != Pre_Reserve_hour)
|
||||
{
|
||||
Set_Reserve_timer_sec = (uint32_t)rtime * 3600;
|
||||
Pre_Reserve_hour = rtime;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extern uint8_t Power_On;
|
||||
extern volatile uint8_t Run_Mode, Fan_Mode;
|
||||
void Power_off_process(uint8_t set)
|
||||
{ uint8_t i = 0;
|
||||
|
||||
Reserve_hour = 0;
|
||||
Pre_Reserve_hour = 0;
|
||||
Reserve_timer_sec = 0;
|
||||
Fan_Mode = 0;
|
||||
Run_Mode = 0;
|
||||
Power_On = 0;
|
||||
for(i=1; i<7; i++)Diffuser_Power[i] = 0; //////diffuser off
|
||||
|
||||
|
||||
if(set == 1)
|
||||
{
|
||||
Set_Reserve_timer_sec = 0;
|
||||
Set_Run_Mode = 0;
|
||||
Set_Fan_Mode = 0;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t BlackOut_Power_On = 0;
|
||||
uint8_t BlackOut_Run_Mode = 0;
|
||||
uint8_t BlackOut_Fan_Mode = 0;
|
||||
void Pre_Mode_Control(void)
|
||||
{
|
||||
uint8_t i;
|
||||
|
||||
if((BlackOut_Power_On != Power_On)||(BlackOut_Run_Mode != Run_Mode)||(BlackOut_Fan_Mode != Fan_Mode))
|
||||
{
|
||||
page_data[EEP_BLACKOUT_POWER_ON] = Power_On;
|
||||
page_data[EEP_BLACKOUT_RUN_MODE] = Run_Mode;
|
||||
page_data[EEP_BLACKOUT_FAN_MODE] = Fan_Mode;
|
||||
|
||||
for(i=EEP_BLACKOUT_POWER_ON; i<EEP_SIZE ; i++)Write_Data(i, page_data[i]);
|
||||
}
|
||||
|
||||
BlackOut_Power_On = Power_On;
|
||||
BlackOut_Run_Mode = Run_Mode;
|
||||
BlackOut_Fan_Mode = Fan_Mode;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
|
||||
|
||||
extern float Gas_Voltage;
|
||||
|
||||
extern void init_process(void);
|
||||
extern void ADC_Sensing(void);
|
||||
extern void EEP_Save_process(void);
|
||||
|
||||
extern uint16_t Aeverage_calculator(uint16_t val, uint16_t * array_val);
|
||||
extern void Reserve_Time_Update(uint8_t rtime);
|
||||
extern void Power_off_process(void);
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,5 @@
|
||||
extern void Step_process(void);
|
||||
extern uint8_t Step_motor_init(void);
|
||||
extern void Fan_Error_Check(void);
|
||||
extern uint8_t Limit_Mode_Process(void);
|
||||
|
||||
@@ -0,0 +1,451 @@
|
||||
/* =============================================================================
|
||||
* My_Homenet.c — HOMENET(UART1, 115200 N81) <-> ErvDashboard 바이너리 프로토콜
|
||||
* 규격 : TestProgram/PC_ERV_Protocol.md
|
||||
* (My_Uart.c 에서 분리 — PC 대시보드 통신 전용. 공용 전역/CRC16은 My_bunbaeggi.c 정의, My_define.h extern)
|
||||
* ===========================================================================*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include "Nano100Series.h"
|
||||
#include "adc.h"
|
||||
#include "gpio.h"
|
||||
#include "pwm.h"
|
||||
#include "timer.h"
|
||||
#include "uart.h"
|
||||
#include "sys.h"
|
||||
#include "clk.h"
|
||||
|
||||
#include "My_define.h"
|
||||
|
||||
/* ============================================================================
|
||||
* HOMENET (UART1, 115200 N81) <-> ErvDashboard 바이너리 프로토콜 (Rev2.0)
|
||||
* 규격 : TestProgram/PC_ERV_Protocol.md
|
||||
* 프레임 : STX(0xAA) | CMD | DATA[240] | CRC_L | CRC_H (항상 244B 고정)
|
||||
* CRC-16/MODBUS (CMD~DATA[240]=241B), 리틀엔디안. 멀티바이트 값은 빅엔디안.
|
||||
* PC->ERV : 명령 인자는 DATA 앞쪽, 나머지 0 패딩
|
||||
* ERV->PC : STATUS(0x81) DATA=240B 상태 / ACK(0x82) DATA[0]=echoCmd DATA[1]=result
|
||||
* ==========================================================================*/
|
||||
#define HN_STX 0xAA
|
||||
#define HN_STATUS 0x81
|
||||
#define HN_ACK 0x82
|
||||
#define HN_DATA_LEN 240 /* 고정 DATA 크기 */
|
||||
#define HN_STATUS_LEN 240 /* 238 + 2((꺼짐)예약 잔여초 u16) */
|
||||
|
||||
/* ---- 수신 파서 상태 (ISR 컨텍스트) ---- Hn_rx[0]=CMD, [1..240]=DATA ---- */
|
||||
static uint8_t Hn_step = 0, Hn_pos = 0, Hn_crc_lo = 0;
|
||||
static uint8_t Hn_rx[1 + HN_DATA_LEN];
|
||||
/* ---- 처리 대기 명령 (메인 컨텍스트로 전달) ---- */
|
||||
volatile uint8_t Hn_cmd_ready = 0;
|
||||
static uint8_t Hn_cmd = 0, Hn_cmd_pl[HN_DATA_LEN];
|
||||
/* PC대시보드 제어 → 룸컨(RJ2) 상태 푸시 래치 (My_RJ2.c roomcon_parsing 에서 소비/클리어) */
|
||||
volatile uint8_t Homenet_RJ_Request = 0;
|
||||
|
||||
uint8_t Homenet_Reset_State = 0;
|
||||
|
||||
void Homenet_Rx_Byte(uint8_t b)
|
||||
{
|
||||
switch(Hn_step)
|
||||
{
|
||||
case 0: if(b == HN_STX) Hn_step = 1; break;
|
||||
case 1: Hn_rx[0] = b; Hn_pos = 0; Hn_step = 2; break; /* CMD */
|
||||
case 2: /* DATA[240] */
|
||||
Hn_rx[1 + Hn_pos] = b;
|
||||
if(++Hn_pos >= HN_DATA_LEN) Hn_step = 3;
|
||||
break;
|
||||
case 3: Hn_crc_lo = b; Hn_step = 4; break; /* 첫 CRC 바이트(표준 하위) */
|
||||
case 4:
|
||||
{
|
||||
/* 수신 바이트(하위먼저) -> CRC16() 반환형식(바이트스왑)으로 재구성하여 비교 */
|
||||
uint16_t rxcrc = ((uint16_t)Hn_crc_lo << 8) | b;
|
||||
uint16_t i;
|
||||
/* CRC 대상 = CMD + DATA[240] = Hn_rx[0..240] (241B) */
|
||||
if((CRC16(Hn_rx, (uint16_t)(1 + HN_DATA_LEN)) == rxcrc) && (Hn_cmd_ready == 0))
|
||||
{
|
||||
Hn_cmd = Hn_rx[0];
|
||||
for(i = 0; i < HN_DATA_LEN; i++) Hn_cmd_pl[i] = Hn_rx[1 + i];
|
||||
Hn_cmd_ready = 1;
|
||||
}
|
||||
Hn_step = 0;
|
||||
break;
|
||||
}
|
||||
default: Hn_step = 0; break;
|
||||
}
|
||||
}
|
||||
|
||||
/* 고정 244B 송신 : STX | CMD | DATA[240] | CRC_L | CRC_H. payload는 len만큼 채우고 나머지 0 패딩 */
|
||||
static void Homenet_Send_Frame(uint8_t cmd, uint8_t *payload, uint16_t len)
|
||||
{
|
||||
static uint8_t buf[1 + 1 + HN_DATA_LEN + 2]; /* 244 */
|
||||
uint16_t crc; uint16_t n = 0; uint16_t i;
|
||||
|
||||
buf[n++] = HN_STX;
|
||||
buf[n++] = cmd;
|
||||
for(i = 0; i < HN_DATA_LEN; i++) buf[n++] = (i < len) ? payload[i] : 0;
|
||||
crc = CRC16(&buf[1], (uint16_t)(1 + HN_DATA_LEN)); /* CMD+DATA[240]=241B. CRC16()는 표준 MODBUS값의 바이트스왑 반환 */
|
||||
buf[n++] = (uint8_t)(crc >> 8); /* CRC_L (표준 하위바이트) - bunbaegi 와 동일 순서 */
|
||||
buf[n++] = (uint8_t)(crc & 0xFF); /* CRC_H (표준 상위바이트) */
|
||||
|
||||
HOMENET_485_DIR = 1;
|
||||
UART_Write(UART1, buf, n);
|
||||
while(!(UART1->FSR & UART_FSR_TX_EMPTY_F_Msk));
|
||||
while(!(UART1->FSR & UART_FSR_TE_F_Msk));
|
||||
HOMENET_485_DIR = 0;
|
||||
}
|
||||
|
||||
static void hn_w16(uint8_t *p, uint16_t v){ p[0] = (uint8_t)(v >> 8); p[1] = (uint8_t)(v & 0xFF); }
|
||||
|
||||
static uint8_t hn_runmode_code(void)
|
||||
{
|
||||
if(Power_On != 1) return 0x00;
|
||||
switch(Run_Mode)
|
||||
{
|
||||
case MODE_VENTILATION: return 0x01;
|
||||
case MODE_AUTO: return 0x02;
|
||||
case MODE_AIRCLEAN: return 0x03;
|
||||
case MODE_BYPASS: return 0x04;
|
||||
default: return 0x01;
|
||||
}
|
||||
}
|
||||
|
||||
/* Room_Level(0좋음~4매우나쁨) -> 프로토콜 공기질코드(1매우나쁨~4좋음) */
|
||||
static uint8_t hn_airq_code(uint8_t level)
|
||||
{
|
||||
switch(level){ case 0: return 4; case 1: return 3; case 2: return 2; default: return 1; }
|
||||
}
|
||||
|
||||
void Homenet_Build_Status(uint8_t *p)
|
||||
{
|
||||
uint8_t r;
|
||||
uint16_t i;
|
||||
|
||||
for(i = 0; i < HN_STATUS_LEN; i++) p[i] = 0;
|
||||
|
||||
/* --- 글로벌 0~16 --- */
|
||||
p[0] = Power_On;
|
||||
p[1] = hn_runmode_code();
|
||||
p[2] = Auto_Concentrate; /* 0 분산 / 1 집중 */
|
||||
p[3] = Fan_Mode;
|
||||
p[4] = (uint8_t)(((Ext_Run_Mode == 4) ? 0x01 : 0) /* 스마트수면 */
|
||||
| (Hood_YeunDong_Enable ? 0x02 : 0) /* 쾌적조리 */
|
||||
| ((Ext_Run_Mode == 1) ? 0x04 : 0)); /* 안심회복 */
|
||||
/* bit0 연동Enable / bit1 연동운전중 / bit2 후드 통신연결(폴 응답 생존) */
|
||||
p[5] = (uint8_t)((Hood_YeunDong_Enable ? 0x01 : 0) | ((Hood_Status != 0) ? 0x02 : 0) | ((Hood_Conn_Timeout != 0) ? 0x04 : 0));
|
||||
p[6] = Hyst_Preset;
|
||||
hn_w16(&p[7], Pm25_Db[Hyst_Preset]);
|
||||
hn_w16(&p[9], Pm10_Db[Hyst_Preset]);
|
||||
hn_w16(&p[11], Voc_Db[Hyst_Preset]);
|
||||
hn_w16(&p[13], Co2_Db[Hyst_Preset]);
|
||||
hn_w16(&p[15], (uint16_t)Err_Code);
|
||||
|
||||
/* --- 각실 17~ (14B x 4) : 거실=1, 침1=2, 침2=3, 침3=4 --- */
|
||||
for(r = 0; r < 4; r++)
|
||||
{
|
||||
uint8_t room = (uint8_t)(r + 1);
|
||||
uint8_t o = (uint8_t)(17 + r * 14);
|
||||
/* damper 비트맵 : bit0=급기(SA) 열림 / bit1=배기(RA/EA) 열림 */
|
||||
p[o+0] = (uint8_t)((Diffuser_Dmp_Ang_SA[room] != 0 ? 0x01 : 0)
|
||||
| (Diffuser_Dmp_Ang_RA[room] != 0 ? 0x02 : 0));
|
||||
hn_w16(&p[o+1], SEN66_pm2p5[room]);
|
||||
hn_w16(&p[o+3], SEN66_pm10p0[room]);
|
||||
hn_w16(&p[o+5], (uint16_t)SEN66_VOC_value[room]);
|
||||
hn_w16(&p[o+7], SEN66_CO2_value[room]);
|
||||
p[o+9] = hn_airq_code(Room_Level[room]);
|
||||
p[o+10] = Light_Bright[room];
|
||||
hn_w16(&p[o+11], (uint16_t)Room_Level[room]); /* 각실 부하점수 = 실 Level */
|
||||
p[o+13] = Fan_Mode; /* 최종 풍량(전체 단수) */
|
||||
}
|
||||
|
||||
/* --- ERV 리셋 73 --- */
|
||||
p[73] = Homenet_Reset_State;
|
||||
|
||||
/* --- VSP 74~109 : 환기1~4, 바이패스, 공청1~4 (각 SA,EA u16 BE) --- */
|
||||
hn_w16(&p[74], s_FAN1_VEN_1_DAN); hn_w16(&p[76], s_FAN2_VEN_1_DAN);
|
||||
hn_w16(&p[78], s_FAN1_VEN_2_DAN); hn_w16(&p[80], s_FAN2_VEN_2_DAN);
|
||||
hn_w16(&p[82], s_FAN1_VEN_3_DAN); hn_w16(&p[84], s_FAN2_VEN_3_DAN);
|
||||
hn_w16(&p[86], s_FAN1_VEN_4_DAN); hn_w16(&p[88], s_FAN2_VEN_4_DAN);
|
||||
hn_w16(&p[90], s_FAN1_BYPASS_1_DAN); hn_w16(&p[92], s_FAN2_BYPASS_1_DAN);
|
||||
hn_w16(&p[94], s_FAN1_AIR_1_DAN); hn_w16(&p[96], s_FAN2_AIR_1_DAN);
|
||||
hn_w16(&p[98], s_FAN1_AIR_2_DAN); hn_w16(&p[100], s_FAN2_AIR_2_DAN);
|
||||
hn_w16(&p[102], s_FAN1_AIR_3_DAN); hn_w16(&p[104], s_FAN2_AIR_3_DAN);
|
||||
hn_w16(&p[106], s_FAN1_AIR_4_DAN); hn_w16(&p[108], s_FAN2_AIR_4_DAN);
|
||||
|
||||
/* --- 히스테리시스 데드밴드 테이블 110~133 : ECO/NORMAL/TURBO x (PM2.5,PM10,VOC,CO2) --- */
|
||||
for(r = 0; r < 3; r++)
|
||||
{
|
||||
uint8_t o = (uint8_t)(110 + r * 8);
|
||||
hn_w16(&p[o+0], Pm25_Db[r]);
|
||||
hn_w16(&p[o+2], Pm10_Db[r]);
|
||||
hn_w16(&p[o+4], Voc_Db[r]);
|
||||
hn_w16(&p[o+6], Co2_Db[r]);
|
||||
}
|
||||
|
||||
/* --- 모드별 오염단계 임계표 134~229 : 3프리셋 x [CO2,PM2.5,PM10,VOC] x L1~L4 --- */
|
||||
for(r = 0; r < 3; r++)
|
||||
{
|
||||
int o = 134 + r * 32;
|
||||
uint8_t k;
|
||||
for(k = 0; k < 4; k++) hn_w16(&p[o + 0 + k*2], Co2_Thr[r][k]);
|
||||
for(k = 0; k < 4; k++) hn_w16(&p[o + 8 + k*2], Pm25_Thr[r][k]);
|
||||
for(k = 0; k < 4; k++) hn_w16(&p[o + 16 + k*2], Pm10_Thr[r][k]);
|
||||
for(k = 0; k < 4; k++) hn_w16(&p[o + 24 + k*2], Voc_Thr[r][k]);
|
||||
}
|
||||
|
||||
/* --- 각실 온도/습도 230~237 : 4실 x [Temp, Humi] (디퓨저 SEN66 값, 0~255 클램프) --- */
|
||||
for(r = 0; r < 4; r++)
|
||||
{
|
||||
uint8_t room = (uint8_t)(r + 1);
|
||||
uint8_t o = (uint8_t)(230 + r * 2);
|
||||
int16_t t = SEN66_temperature_value[room];
|
||||
int16_t h = SEN66_humidity_value[room];
|
||||
p[o+0] = (uint8_t)((t < 0) ? 0 : (t > 255) ? 255 : t);
|
||||
p[o+1] = (uint8_t)((h < 0) ? 0 : (h > 255) ? 255 : h);
|
||||
}
|
||||
|
||||
/* --- (꺼짐)예약 잔여초 238~239 (u16 BE) --- */
|
||||
hn_w16(&p[238], Reserve_Remain_Sec);
|
||||
}
|
||||
|
||||
static uint8_t hn_set_vsp(uint8_t grp, uint8_t idx, uint8_t sa, uint8_t ea)
|
||||
{
|
||||
if(grp == 0) /* 환기 idx 1~4 */
|
||||
{
|
||||
switch(idx){
|
||||
case 1: s_FAN1_VEN_1_DAN=sa; s_FAN2_VEN_1_DAN=ea; break;
|
||||
case 2: s_FAN1_VEN_2_DAN=sa; s_FAN2_VEN_2_DAN=ea; break;
|
||||
case 3: s_FAN1_VEN_3_DAN=sa; s_FAN2_VEN_3_DAN=ea; break;
|
||||
case 4: s_FAN1_VEN_4_DAN=sa; s_FAN2_VEN_4_DAN=ea; break;
|
||||
default: return 1;
|
||||
}
|
||||
}
|
||||
else if(grp == 1) /* 바이패스 idx 1 */
|
||||
{
|
||||
if(idx == 1){ s_FAN1_BYPASS_1_DAN=sa; s_FAN2_BYPASS_1_DAN=ea; } else return 1;
|
||||
}
|
||||
else if(grp == 2) /* 공청 idx 1~4 */
|
||||
{
|
||||
switch(idx){
|
||||
case 1: s_FAN1_AIR_1_DAN=sa; s_FAN2_AIR_1_DAN=ea; break;
|
||||
case 2: s_FAN1_AIR_2_DAN=sa; s_FAN2_AIR_2_DAN=ea; break;
|
||||
case 3: s_FAN1_AIR_3_DAN=sa; s_FAN2_AIR_3_DAN=ea; break;
|
||||
case 4: s_FAN1_AIR_4_DAN=sa; s_FAN2_AIR_4_DAN=ea; break;
|
||||
default: return 1;
|
||||
}
|
||||
}
|
||||
else return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* 수신 제어명령 적용 + ACK. result 0=OK / 1=ERR */
|
||||
static void hn_apply_cmd(uint8_t cmd, uint8_t *pl, uint8_t len)
|
||||
{
|
||||
uint8_t result = 0, i;
|
||||
uint8_t ack[2];
|
||||
|
||||
switch(cmd)
|
||||
{
|
||||
case 0x01: /* CTRL_POWER [onoff] */
|
||||
if(len >= 1)
|
||||
{
|
||||
Power_On = pl[0] ? 1 : 0;
|
||||
for(i = 1; i < 7; i++) Diffuser_Power[i] = Power_On;
|
||||
/* 전원 OFF : OFF 표현은 Fan_Mode==0 && Run_Mode==MODE_VENTILATION(0).
|
||||
Set_* 만 0 으로 두면 Run_Mode/Fan_Mode 가 이전값(유효모드/풍량)으로 남아
|
||||
Fan_Speed_process 의 OFF 분기가 성립 안 돼 모터가 Power_On 을 다시 켬 → 직접 0 설정 */
|
||||
if(Power_On == 0){ Set_Run_Mode = Run_Mode = MODE_VENTILATION; Set_Fan_Mode = Fan_Mode = 0; }
|
||||
else
|
||||
{
|
||||
/* 전원 ON : 환기 모드 + 풍량 1단 (ERVSimulator HomeNetProtocol 와 동일) */
|
||||
Set_Run_Mode = Run_Mode = MODE_VENTILATION;
|
||||
Set_Fan_Mode = Fan_Mode = 1;
|
||||
Fan_Speed_Setting(Run_Mode, Fan_Mode); /* 즉시 반영 (모드전환과 동일) */
|
||||
}
|
||||
/* 전원 토글 시 수동 댐퍼/LED 해제 → 자동 추종 복귀 */
|
||||
for(i = 1; i <= 4; i++) { Diffuser_Damper_Manual[i] = 0; Diffuser_Led_Manual[i] = 0; }
|
||||
/* 각실분배기 : 전원 비트(TYPE_POWER) + 모드/풍량. 룸컨(RJ2) : 별도 래치로 확실히 푸시 */
|
||||
Command_request_type |= (TYPE_POWER | TYPE_MODE | TYPE_FAN_SPEED);
|
||||
Homenet_RJ_Request |= (TYPE_MODE | TYPE_FAN_SPEED);
|
||||
} else result = 1;
|
||||
break;
|
||||
case 0x02: /* CTRL_RUNMODE [mode] 0off/1환기/2자동/3공청/4바이패스 */
|
||||
if(len >= 1)
|
||||
{
|
||||
if(pl[0] == 0) Power_On = 0;
|
||||
else
|
||||
{
|
||||
Power_On = 1;
|
||||
switch(pl[0])
|
||||
{
|
||||
case 1: Set_Run_Mode = MODE_VENTILATION; break;
|
||||
case 2: Set_Run_Mode = MODE_AUTO; break;
|
||||
case 3: Set_Run_Mode = MODE_AIRCLEAN; break;
|
||||
case 4: Set_Run_Mode = MODE_BYPASS; break;
|
||||
default: result = 1; break;
|
||||
}
|
||||
if(result == 0)
|
||||
{
|
||||
Run_Mode = Set_Run_Mode;
|
||||
Command_request_type |= TYPE_MODE;
|
||||
Homenet_RJ_Request |= TYPE_MODE; /* 룸컨이 새 모드 덮어쓰지 않게 푸시 */
|
||||
/* 운전모드 전환 시 풍량 1단 (자동 제외 - 자동은 부하점수로 결정) */
|
||||
if(Set_Run_Mode != MODE_AUTO)
|
||||
{
|
||||
Set_Fan_Mode = Fan_Mode = 1;
|
||||
Command_request_type |= TYPE_FAN_SPEED;
|
||||
Homenet_RJ_Request |= TYPE_FAN_SPEED;
|
||||
/* 즉시 반영 : 풍량 단수(Total_Air_Volume)가 안 바뀌는 모드전환
|
||||
(예: 환기1단→공청1단)에서도 새 모드 VSP가 걸리도록 CTRL_FAN 과 동일하게 직접 호출 */
|
||||
Fan_Speed_Setting(Run_Mode, Fan_Mode);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* 모드 전환 시 수동 댐퍼 해제 → 새 모드는 기본(전실 개방)에서 시작 */
|
||||
for(i = 1; i <= 4; i++) Diffuser_Damper_Manual[i] = 0;
|
||||
} else result = 1;
|
||||
break;
|
||||
case 0x03: /* CTRL_FAN [speed] */
|
||||
if(len >= 1)
|
||||
{
|
||||
Set_Fan_Mode = Fan_Mode = pl[0];
|
||||
Command_request_type |= TYPE_FAN_SPEED;
|
||||
Homenet_RJ_Request |= TYPE_FAN_SPEED; /* 룸컨이 새 풍량 덮어쓰지 않게 푸시 */
|
||||
if(Run_Mode != MODE_AUTO) Fan_Speed_Setting(Run_Mode, Fan_Mode); /* 즉시 반영(자동은 부하점수로 결정) */
|
||||
}
|
||||
else result = 1;
|
||||
break;
|
||||
case 0x04: /* CTRL_SUBMODE [type][onoff] 1수면/2조리/3회복 */
|
||||
if(len >= 2)
|
||||
{
|
||||
if(pl[0] == 1) Ext_Run_Mode = pl[1] ? 4 : 0;
|
||||
else if(pl[0] == 2) Hood_YeunDong_Enable = pl[1] ? 1 : 0;
|
||||
else if(pl[0] == 3){ Ext_Run_Mode = pl[1] ? 1 : 0; Ext_Select_Room = 2; }
|
||||
else result = 1;
|
||||
/* 부가모드 변경 시 수동 댐퍼 해제 (수동 댐퍼는 환기/공청/바이패스에서만) */
|
||||
if(result == 0) for(i = 1; i <= 4; i++) Diffuser_Damper_Manual[i] = 0;
|
||||
} else result = 1;
|
||||
break;
|
||||
case 0x05: /* CTRL_HOOD [onoff] */
|
||||
if(len >= 1) Hood_YeunDong_Enable = pl[0] ? 1 : 0; else result = 1;
|
||||
break;
|
||||
case 0x06: /* CTRL_HYST_PRESET [preset] */
|
||||
if(len >= 1 && pl[0] < 3) Hyst_Preset = pl[0]; else result = 1;
|
||||
break;
|
||||
case 0x07: /* CTRL_HYST_VALUE [preset][pm25][pm10][voc][co2] u16 BE */
|
||||
if(len >= 9 && pl[0] < 3)
|
||||
{
|
||||
uint8_t ps = pl[0];
|
||||
Pm25_Db[ps] = (uint16_t)(((uint16_t)pl[1] << 8) | pl[2]);
|
||||
Pm10_Db[ps] = (uint16_t)(((uint16_t)pl[3] << 8) | pl[4]);
|
||||
Voc_Db[ps] = (uint16_t)(((uint16_t)pl[5] << 8) | pl[6]);
|
||||
Co2_Db[ps] = (uint16_t)(((uint16_t)pl[7] << 8) | pl[8]);
|
||||
} else result = 1;
|
||||
break;
|
||||
case 0x08: /* CTRL_DAMPER [room][type 0급기SA/1배기EA][onoff] — 수동 댐퍼(비자동에서 위치 유지) */
|
||||
if(len >= 3 && pl[0] >= 1 && pl[0] <= 4)
|
||||
{
|
||||
uint8_t ang = pl[2] ? 110 : 0;
|
||||
if(pl[1] == 0) Memory_Diffuser_Dmp_Ang_SA[pl[0]] = Diffuser_Dmp_Ang_SA[pl[0]] = ang; /* 급기 */
|
||||
else if(pl[1] == 1) Memory_Diffuser_Dmp_Ang_RA[pl[0]] = Diffuser_Dmp_Ang_RA[pl[0]] = ang; /* 배기 */
|
||||
else result = 1;
|
||||
if(result == 0) Diffuser_Damper_Manual[pl[0]] = 1; /* 자동로직 덮어쓰기 차단(자동/모드전환 시 해제) */
|
||||
} else result = 1;
|
||||
break;
|
||||
case 0x09: /* CTRL_LED [room][dim] — 수동 LED : 자동 추종 해제하고 지정값 유지(모든 모드, 전원OFF만 해제) */
|
||||
if(len >= 2 && pl[0] >= 1 && pl[0] <= 4) { Light_Bright[pl[0]] = pl[1]; Diffuser_Led_Manual[pl[0]] = 1; }
|
||||
else result = 1;
|
||||
break;
|
||||
case 0x0A: /* REQ_STATUS : 응답은 호출부에서 */
|
||||
break;
|
||||
case 0x0B: /* CTRL_RESET [onoff] */
|
||||
if(len >= 1) Homenet_Reset_State = pl[0] ? 1 : 0; else result = 1;
|
||||
break;
|
||||
case 0x0C: /* CTRL_VSP [group][index][sa(2)][ea(2)] */
|
||||
if(len >= 6)
|
||||
result = hn_set_vsp(pl[0], pl[1],
|
||||
(uint8_t)(((uint16_t)pl[2] << 8) | pl[3]),
|
||||
(uint8_t)(((uint16_t)pl[4] << 8) | pl[5]));
|
||||
else result = 1;
|
||||
break;
|
||||
case 0x0D: /* CTRL_HYST_THR [preset][pollutant 0CO2/1PM2.5/2PM10/3VOC][L1~L4 u16] */
|
||||
if(len >= 10 && pl[0] < 3 && pl[1] < 4)
|
||||
{
|
||||
uint8_t ps = pl[0], g = pl[1], k;
|
||||
uint16_t *arr = 0;
|
||||
if(g == 0) arr = Co2_Thr[ps];
|
||||
else if(g == 1) arr = Pm25_Thr[ps];
|
||||
else if(g == 2) arr = Pm10_Thr[ps];
|
||||
else if(g == 3) arr = Voc_Thr[ps];
|
||||
if(arr) { for(k = 0; k < 4; k++) arr[k] = (uint16_t)(((uint16_t)pl[2 + k*2] << 8) | pl[3 + k*2]); }
|
||||
else result = 1;
|
||||
}
|
||||
else result = 1;
|
||||
break;
|
||||
case 0x0E: /* CTRL_RESERVE [hours 0~8] : N시간 후 전원 OFF (0=해제) */
|
||||
if(len >= 1 && pl[0] <= 8) Reserve_Remain_Sec = (uint16_t)(pl[0] * 3600);
|
||||
else result = 1;
|
||||
break;
|
||||
default: result = 1; break;
|
||||
}
|
||||
|
||||
/* 히스테리시스 프리셋/데드밴드/임계, VSP 변경은 EEPROM 영속화 */
|
||||
if(result == 0 && (cmd == 0x06 || cmd == 0x07 || cmd == 0x0C || cmd == 0x0D))
|
||||
EEP_Save_Flag = 1;
|
||||
|
||||
ack[0] = cmd; ack[1] = result;
|
||||
Homenet_Send_Frame(HN_ACK, ack, 2);
|
||||
}
|
||||
|
||||
/* 메인 루프(빠른 주기)에서 호출 : 수신 명령 처리 + REQ_STATUS 즉시 응답 */
|
||||
void Homenet_Process(void)
|
||||
{
|
||||
static uint8_t status_buf[HN_STATUS_LEN];
|
||||
|
||||
if(Hn_cmd_ready)
|
||||
{
|
||||
uint8_t cmd = Hn_cmd, pl[HN_DATA_LEN]; uint16_t i;
|
||||
for(i = 0; i < HN_DATA_LEN; i++) pl[i] = Hn_cmd_pl[i];
|
||||
Hn_cmd_ready = 0;
|
||||
|
||||
hn_apply_cmd(cmd, pl, HN_DATA_LEN);
|
||||
|
||||
if(cmd == 0x0A) /* REQ_STATUS */
|
||||
{
|
||||
Homenet_Build_Status(status_buf);
|
||||
Homenet_Send_Frame(HN_STATUS, status_buf, HN_STATUS_LEN);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* 1초 주기 STATUS 자동 송신 */
|
||||
void Homenet_Send_Status(void)
|
||||
{
|
||||
static uint8_t status_buf[HN_STATUS_LEN];
|
||||
Homenet_Build_Status(status_buf);
|
||||
Homenet_Send_Frame(HN_STATUS, status_buf, HN_STATUS_LEN);
|
||||
}
|
||||
|
||||
|
||||
void UART1_HANDLE()
|
||||
{
|
||||
uint8_t u8InChar=0xFF;
|
||||
uint32_t u32IntSts= UART1->ISR;
|
||||
|
||||
if(u32IntSts & UART_ISR_RDA_IS_Msk)
|
||||
{
|
||||
u8InChar = UART_READ(UART1); /* Rx trigger level is 1 byte*/
|
||||
|
||||
Homenet_Rx_Byte(u8InChar); // HOMENET(ErvDashboard) 바이너리 프레임 수신
|
||||
}
|
||||
|
||||
if(u32IntSts & UART_ISR_THRE_IS_Msk)
|
||||
{
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void UART1_IRQHandler(void)
|
||||
{
|
||||
UART1_HANDLE();
|
||||
}
|
||||
@@ -0,0 +1,248 @@
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include "Nano100Series.h"
|
||||
#include "adc.h"
|
||||
#include "gpio.h"
|
||||
#include "pwm.h"
|
||||
#include "timer.h"
|
||||
#include "uart.h"
|
||||
#include "sys.h"
|
||||
#include "clk.h"
|
||||
|
||||
#include "My_define.h"
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////// HOOD 485 //////////////////////////////////////////////
|
||||
extern uint16_t Hood_polling_timer;
|
||||
extern uint8_t rx_hood_485_TimeOut;
|
||||
uint8_t Tx_Hood_Buff[20], Rx_Hood_Buff[20];
|
||||
uint8_t Yeungong_Status = 0;
|
||||
uint8_t Hood_Power_On = 0;
|
||||
uint8_t Hood_Fan_Mode = 0;
|
||||
uint8_t Hood_Control = 0;
|
||||
uint8_t Hood_Rx_Complete = 0;
|
||||
uint8_t Hood_Status = 0;
|
||||
|
||||
uint8_t CheckSum_Creator(uint8_t *buf, uint8_t len)
|
||||
{
|
||||
uint8_t i, rt;
|
||||
|
||||
rt = 0;
|
||||
|
||||
for(i=0; i<len; i++)
|
||||
{
|
||||
rt ^= buf[i];
|
||||
}
|
||||
|
||||
return(rt);
|
||||
}
|
||||
|
||||
|
||||
uint8_t Rx_hood_Pos = 0;
|
||||
void rx_hood_check(uint8_t data)
|
||||
{
|
||||
uint8_t Tmp = 0, cksum = 0;
|
||||
|
||||
if(rx_hood_485_TimeOut == 0)Rx_hood_Pos = 0;
|
||||
|
||||
switch(Rx_hood_Pos)
|
||||
{
|
||||
case 0:
|
||||
if(data != 0xAA)break;
|
||||
Rx_Hood_Buff[Rx_hood_Pos++] = data;
|
||||
break;
|
||||
case 1:
|
||||
if(data != 0x11)
|
||||
{
|
||||
Rx_hood_Pos = 0;
|
||||
}
|
||||
Rx_Hood_Buff[Rx_hood_Pos++] = data;
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
case 8:
|
||||
case 9:
|
||||
case 10:
|
||||
case 11:
|
||||
Rx_Hood_Buff[Rx_hood_Pos++] = data;
|
||||
break;
|
||||
case 12:
|
||||
Rx_Hood_Buff[Rx_hood_Pos++] = data;
|
||||
cksum = data;
|
||||
|
||||
if(cksum == CheckSum_Creator(Rx_Hood_Buff, 12))
|
||||
{
|
||||
Hood_Rx_Complete = 1;
|
||||
}
|
||||
Rx_hood_Pos = 0;
|
||||
break;
|
||||
default:
|
||||
Rx_hood_Pos = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
//-------------------------------------
|
||||
void UART0_HANDLE()
|
||||
{
|
||||
uint8_t u8InChar=0xFF;
|
||||
uint32_t u32IntSts= UART0->ISR;
|
||||
|
||||
if(u32IntSts & UART_ISR_RDA_IS_Msk)
|
||||
{
|
||||
u8InChar = UART_READ(UART0); /* Rx trigger level is 1 byte*/
|
||||
|
||||
rx_hood_check(u8InChar);
|
||||
rx_hood_485_TimeOut = 10;
|
||||
}
|
||||
|
||||
if(u32IntSts & UART_ISR_THRE_IS_Msk)
|
||||
{
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void UART0_IRQHandler(void)
|
||||
{
|
||||
UART0_HANDLE();
|
||||
}
|
||||
//----------------------------------
|
||||
|
||||
void Hood_Tx_packet(void)
|
||||
{
|
||||
Tx_Hood_Buff[0] = 0xAA;
|
||||
Tx_Hood_Buff[1] = 0x21;
|
||||
Tx_Hood_Buff[2] = 0x01;
|
||||
Tx_Hood_Buff[3] = Run_Mode;
|
||||
Tx_Hood_Buff[4] = Fan_Mode;
|
||||
Tx_Hood_Buff[5] = Hood_YeunDong_Enable;
|
||||
Tx_Hood_Buff[6] = Yeungong_Status;
|
||||
Tx_Hood_Buff[7] = 0x00;
|
||||
Tx_Hood_Buff[8] = Hood_Power_On | Hood_Control;
|
||||
Tx_Hood_Buff[9] = Hood_Fan_Mode | Hood_Control;
|
||||
Tx_Hood_Buff[10] = 0x00;
|
||||
Tx_Hood_Buff[11] = 0x00;
|
||||
Tx_Hood_Buff[12] = CheckSum_Creator(Tx_Hood_Buff, 12);
|
||||
|
||||
if(Hood_Control == 0x80)Hood_Control = 0;
|
||||
|
||||
HOOD_485_DIR = 1; // DIR
|
||||
UART_Write(UART0,Tx_Hood_Buff, 13);
|
||||
while ( !(UART0->FSR & UART_FSR_TX_EMPTY_F_Msk) );
|
||||
while ( !(UART0->FSR & UART_FSR_TE_F_Msk) );
|
||||
HOOD_485_DIR = 0; // DIR;
|
||||
}
|
||||
|
||||
void Hood_RS485_process(void)
|
||||
{
|
||||
if(Hood_Rx_Complete == 1)
|
||||
{
|
||||
Hood_Rx_Complete = 0;
|
||||
Hood_Conn_Timeout = 1500; /* 유효 응답 수신 -> 통신연결 생존(폴 500ms 기준 ~3회 누락 허용) */
|
||||
Hood_Status = Rx_Hood_Buff[3];
|
||||
// if((Hood_Status == 1)&&(Hood_Yeundong_flag == 0))Command_request_type |= TYPE_HOOD_STATE;// add 2022.1.25
|
||||
// if((Hood_Status == 0)&&(Hood_Yeundong_flag == 1))Command_request_type |= TYPE_HOOD_STATE;// add 2022.1.25
|
||||
// Hood_Yeundong_flag = Hood_Status;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(Hood_polling_timer == 0)
|
||||
{
|
||||
Hood_polling_timer = 500;
|
||||
Hood_Tx_packet();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
uint8_t HREV_Hood_Control = 0;
|
||||
uint16_t Hood_Warming_up_Timer = 0;
|
||||
uint8_t Pre_Hood_Status = 0;
|
||||
uint8_t Tx_Yeundong_Delay = 0;
|
||||
|
||||
/* 후드 단수 -> 환기장치 풍량 추종 매핑(사양 260613 9p 3.2) : 1->1,2->2,3->3,4->4,5->4 */
|
||||
static uint8_t Hood_Step_To_Fan(uint8_t hs)
|
||||
{
|
||||
if(hs == 0) return 0;
|
||||
return (hs > 4) ? 4 : hs;
|
||||
}
|
||||
|
||||
uint8_t Hood_process(void)//200ms
|
||||
{
|
||||
if((Hood_YeunDong_Enable == 0)||(HREV_Hood_Control == 1))return(0);
|
||||
|
||||
if(Hood_Status != Pre_Hood_Status)
|
||||
{
|
||||
if((Pre_Hood_Status == 0)&&(Hood_Status != 0)) // 후드 ON : 메이크업 에어 진입(자동/수동 일시정지)
|
||||
{
|
||||
My_Memory_Run_Mode = Run_Mode;
|
||||
if((Run_Mode == MODE_AUTO)&&(Fan_Mode == 0))My_Memory_Fan_Mode = 1;
|
||||
else My_Memory_Fan_Mode = Fan_Mode;
|
||||
|
||||
Set_Run_Mode = MODE_VENTILATION;
|
||||
Set_Fan_Mode = Hood_Step_To_Fan(Hood_Status); // 후드 단수 추종(사양 260613 9p 3.2)
|
||||
|
||||
if(Set_Reserve_timer_sec != 0)
|
||||
{
|
||||
Set_Reserve_timer_sec = 0;
|
||||
Command_request_type |= (TYPE_RESERVATION);
|
||||
}
|
||||
|
||||
Command_request_type |= (TYPE_MODE|TYPE_FAN_SPEED);
|
||||
Tx_Yeundong_Delay = 30;
|
||||
}
|
||||
else if(Hood_Status == 0) // 후드 OFF : 즉시 원래 모드/풍량 복귀 (메이크업 유지는 후드측 담당, 사양 260613 9p 3.3)
|
||||
{
|
||||
Set_Run_Mode = My_Memory_Run_Mode;
|
||||
Set_Fan_Mode = My_Memory_Fan_Mode;
|
||||
|
||||
if(Set_Reserve_timer_sec != 0)
|
||||
{
|
||||
Set_Reserve_timer_sec = 0;
|
||||
Command_request_type |= (TYPE_RESERVATION);
|
||||
}
|
||||
|
||||
Command_request_type |= (TYPE_MODE|TYPE_FAN_SPEED|TYPE_HOOD_STATE);
|
||||
Hood_Yeundong_flag = 0;
|
||||
Hood_Warming_up_Timer = 0;
|
||||
Tx_Yeundong_Delay = 0;
|
||||
}
|
||||
else // 후드 단수 변경(1~5) : 메이크업 풍량 단수 추종 갱신
|
||||
{
|
||||
uint8_t f = Hood_Step_To_Fan(Hood_Status);
|
||||
if(Set_Fan_Mode != f)
|
||||
{
|
||||
Set_Fan_Mode = f;
|
||||
Command_request_type |= (TYPE_FAN_SPEED);
|
||||
Tx_Yeundong_Delay = 30; // 룸컨(My_RJ2)이 연동 풍량변경을 수동명령으로 오인하지 않도록 디바운스
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* 메이크업 진입/단수변경 MODE/FAN 전송 후 연동 플래그 set + 룸컨 통지.
|
||||
Tx_Yeundong_Delay 는 룸컨(My_RJ2)이 연동 명령을 사용자 수동명령과 구분하는 데 사용(불변).
|
||||
조리 종료 후 잔여 배출(메이크업 유지)은 후드측이 담당하므로 여기서 롤백 타이머는 두지 않음. */
|
||||
if(Tx_Yeundong_Delay)
|
||||
{
|
||||
Tx_Yeundong_Delay--;
|
||||
if(Tx_Yeundong_Delay == 0)
|
||||
{
|
||||
Hood_Yeundong_flag = 1;
|
||||
Command_request_type |= TYPE_HOOD_STATE;// add 2022.1.25
|
||||
}
|
||||
}
|
||||
|
||||
Pre_Hood_Status = Hood_Status;
|
||||
|
||||
return(1);
|
||||
}
|
||||
@@ -0,0 +1,781 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include "Nano100Series.h"
|
||||
#include "adc.h"
|
||||
#include "gpio.h"
|
||||
#include "pwm.h"
|
||||
#include "timer.h"
|
||||
#include "uart.h"
|
||||
#include "sys.h"
|
||||
#include "clk.h"
|
||||
|
||||
#include "My_define.h"
|
||||
|
||||
|
||||
|
||||
extern uint8_t Tx_roomcon232_buffer[25];
|
||||
extern uint8_t Rx_roomcon232_buffer[25];
|
||||
|
||||
extern volatile uint8_t Err_Code;
|
||||
extern uint8_t Target_Fan1_Speed, Target_Fan2_Speed;
|
||||
|
||||
extern volatile uint32_t Reserve_timer_sec;
|
||||
|
||||
|
||||
|
||||
extern signed int In_Temperature;
|
||||
extern signed int Out_Temperature;
|
||||
|
||||
//-------------------- SC 0 -----------------------------------
|
||||
//-------------------- roomcon ------------------------------
|
||||
|
||||
uint8_t Rx_roomcon_TimeOut = 0;
|
||||
uint8_t Rx_roomcon_Pos = 0;
|
||||
void rx_roomcon_check(uint8_t data)
|
||||
{
|
||||
uint8_t cksum = 0, i = 0;
|
||||
|
||||
if(Rx_roomcon_TimeOut == 0)Rx_roomcon_Pos = 0;
|
||||
switch(Rx_roomcon_Pos)
|
||||
{
|
||||
case 0:
|
||||
if(data != 0xAA)break;
|
||||
Rx_roomcon232_buffer[Rx_roomcon_Pos++] = data;
|
||||
break;
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
case 8:
|
||||
case 9:
|
||||
case 10:
|
||||
case 11:
|
||||
case 12:
|
||||
Rx_roomcon232_buffer[Rx_roomcon_Pos++] = data;
|
||||
break;
|
||||
case 13:
|
||||
for(i=0; i<13; i++)cksum ^= Rx_roomcon232_buffer[i];
|
||||
|
||||
if(cksum == data)
|
||||
{
|
||||
Rx_roomcon232_buffer[Rx_roomcon_Pos++] = data;
|
||||
}
|
||||
else
|
||||
{
|
||||
Rx_roomcon_Pos = 0;
|
||||
}
|
||||
break;
|
||||
case 14:
|
||||
if(data == 0xEE)
|
||||
{
|
||||
com_roomcon_delay = 50;
|
||||
Rx_roomcon_complete = 1;
|
||||
}
|
||||
Rx_roomcon_Pos = 0;
|
||||
break;
|
||||
default:
|
||||
Rx_roomcon_Pos = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
volatile uint8_t Roomcon_connect_mode = 0;
|
||||
uint8_t roomcon_com_count = 0;
|
||||
|
||||
void com_roomcon_process(void)
|
||||
{
|
||||
if(Rx_roomcon_complete == 1)
|
||||
{
|
||||
if(com_roomcon_delay)return;
|
||||
Rx_roomcon_complete = 0;
|
||||
roomcon_parsing();
|
||||
|
||||
Roomcon_connect_mode = 1;
|
||||
roomcon_com_count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t Com_Err_Flag = 0;
|
||||
void RJ_Com_Err_Check(void)
|
||||
{
|
||||
if(Roomcon_connect_mode == 0)
|
||||
{
|
||||
//Reservation_process();
|
||||
//Exception_mode_process();
|
||||
|
||||
roomcon_com_count = 0;
|
||||
Com_Err_Flag = 0;
|
||||
RJ_Vsp_Mode = 0;
|
||||
}
|
||||
else // exist roomcon
|
||||
{
|
||||
if(roomcon_com_count++ >= 10)
|
||||
{
|
||||
roomcon_com_count = 10;
|
||||
Roomcon_connect_mode = 0;
|
||||
Com_Err_Flag = 1;
|
||||
|
||||
RJ_Vsp_Mode = 0;
|
||||
// Power_off_process(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
volatile uint32_t Set_Reserve_timer_sec = 0;
|
||||
volatile uint8_t Set_Run_Mode = 0, Set_Fan_Mode = 0;
|
||||
|
||||
|
||||
uint8_t Rommcon_Version = 0;
|
||||
uint8_t Vsp_Select = 0;
|
||||
uint8_t Heater_OnOff = 0, UV_OnOff = 0;
|
||||
uint8_t Filter_Reset_Flag = 0;
|
||||
uint8_t EEP_Save_Flag = 0;
|
||||
|
||||
uint8_t Command_request_type = 0;
|
||||
uint8_t Roomcon_Filter_Error = 0; // 2021.5.31
|
||||
|
||||
|
||||
#define COMMAND_REQUEST_FILTER_INFO 0x05
|
||||
#define COMMAND_REQUEST_SENSOR_INFO 0x06
|
||||
#define COMMAND_CONTROLL 0x07 // mode / speed / reservaion
|
||||
|
||||
#define TYPE_MODE 0x01
|
||||
#define TYPE_FAN_SPEED 0x02
|
||||
#define TYPE_RESERVATION 0x04
|
||||
#define TYPE_FILTER_INFO 0x10
|
||||
#define TYPE_SENSOR_INFO 0x20
|
||||
#define TYPE_SEND_FLAG 0x80
|
||||
|
||||
|
||||
uint8_t Kijer_Enable = 0, Heater_Enable = 0, UV_Enable = 0;
|
||||
|
||||
void Txbuff_init(void)
|
||||
{
|
||||
uint8_t i;
|
||||
|
||||
Tx_roomcon232_buffer[0] = 0xAA;
|
||||
Tx_roomcon232_buffer[1] = 0;
|
||||
Tx_roomcon232_buffer[2] = Run_Mode;
|
||||
if(Run_Mode == MODE_AUTO)Fan_Mode = Set_Fan_Mode;///////////////// DEMO
|
||||
Tx_roomcon232_buffer[3] = Fan_Mode;
|
||||
Tx_roomcon232_buffer[4] = Auto_Mode;
|
||||
|
||||
Tx_roomcon232_buffer[5] = (Heater_Enable|(UV_Enable<<4)|Kijer_Enable);
|
||||
Tx_roomcon232_buffer[6] = 0;
|
||||
Tx_roomcon232_buffer[7] = Err_Code & (ERROR_EA_FAN|ERROR_SA_FAN|ERROR_TEMP_SENSOR|ERROR_FILTER_CLEAN|ERROR_FILTER_CHANGE|ERROR_SOJA_CHANGE|ERROR_PROTECT|ERROR_SOMETIME);
|
||||
Tx_roomcon232_buffer[7] |= Roomcon_Filter_Error; // 2021.5.31
|
||||
|
||||
|
||||
if(Out_Temperature < 0)Tx_roomcon232_buffer[8] = 0x01;
|
||||
else Tx_roomcon232_buffer[8] = 0x00;
|
||||
|
||||
if(Out_Temperature == 100) Tx_roomcon232_buffer[9] = 0xFF;
|
||||
else Tx_roomcon232_buffer[9] = (uint8_t)(Out_Temperature+20);
|
||||
|
||||
if(In_Temperature == 100)Tx_roomcon232_buffer[10] = 0xFF;
|
||||
else Tx_roomcon232_buffer[10] = (uint8_t)(In_Temperature+20);
|
||||
|
||||
Tx_roomcon232_buffer[11] = 0; //reserve hour
|
||||
Tx_roomcon232_buffer[12] = 0; //reserve min
|
||||
|
||||
Tx_roomcon232_buffer[13] = 0;
|
||||
for(i=0; i<13; i++)Tx_roomcon232_buffer[13] ^= Tx_roomcon232_buffer[i];
|
||||
Tx_roomcon232_buffer[14] = 0xEE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Spec_info_reply(void)
|
||||
{
|
||||
uint8_t i;
|
||||
|
||||
Tx_roomcon232_buffer[0] = 0xAA;
|
||||
Tx_roomcon232_buffer[1] = RX_DATA_CONTROLL_INFO;
|
||||
Tx_roomcon232_buffer[2] = SPEC_VERSION1_INFO;
|
||||
Tx_roomcon232_buffer[3] = SPEC_VERSION2_INFO;
|
||||
Tx_roomcon232_buffer[4] = SPEC_DEVICE_TYPE_INFO;
|
||||
|
||||
Tx_roomcon232_buffer[5] = SPEC_CMH_INFO;
|
||||
Tx_roomcon232_buffer[6] = SPEC_MODE_INFO;
|
||||
Tx_roomcon232_buffer[7] = SPEC_HOMENET_INFO;
|
||||
|
||||
Tx_roomcon232_buffer[8] = SPEC_HOOD_INFO ; // add 2022.1.25
|
||||
Tx_roomcon232_buffer[9] = 0; // add 2022.1.25
|
||||
Tx_roomcon232_buffer[10] = 0;
|
||||
Tx_roomcon232_buffer[11] = 0;
|
||||
Tx_roomcon232_buffer[12] = 0;
|
||||
Tx_roomcon232_buffer[13] = 0;
|
||||
|
||||
for(i=0; i<13; i++)Tx_roomcon232_buffer[13] ^= Tx_roomcon232_buffer[i];
|
||||
Tx_roomcon232_buffer[14] = 0xEE;
|
||||
}
|
||||
|
||||
|
||||
void Rpm_info_reply(void)
|
||||
{
|
||||
uint8_t i;
|
||||
|
||||
Tx_roomcon232_buffer[0] = 0xAA;
|
||||
Tx_roomcon232_buffer[1] = RX_DATA_RPM_INFO;
|
||||
Tx_roomcon232_buffer[2] = 0x41;
|
||||
Tx_roomcon232_buffer[3] = (uint8_t)((uint16_t)urpm1>>8);
|
||||
Tx_roomcon232_buffer[4] = (uint8_t)((uint16_t)urpm1);
|
||||
Tx_roomcon232_buffer[5] = 0;
|
||||
|
||||
Tx_roomcon232_buffer[6] = 0x42;
|
||||
Tx_roomcon232_buffer[7] = (uint8_t)((uint16_t)urpm2>>8);
|
||||
Tx_roomcon232_buffer[8] = (uint8_t)((uint16_t)urpm2);
|
||||
|
||||
Tx_roomcon232_buffer[9] = 0;
|
||||
Tx_roomcon232_buffer[10] = 0;
|
||||
Tx_roomcon232_buffer[11] = 0;
|
||||
Tx_roomcon232_buffer[12] = 0;
|
||||
Tx_roomcon232_buffer[13] = 0;
|
||||
|
||||
for(i=0; i<13; i++)Tx_roomcon232_buffer[13] ^= Tx_roomcon232_buffer[i];
|
||||
Tx_roomcon232_buffer[14] = 0xEE;
|
||||
|
||||
}
|
||||
|
||||
void Filter_info_reply(void)
|
||||
{
|
||||
uint8_t i;
|
||||
|
||||
Tx_roomcon232_buffer[0] = 0xAA;
|
||||
Tx_roomcon232_buffer[1] = RX_DATA_FILTER_INFO;
|
||||
Tx_roomcon232_buffer[2] = 0x01;
|
||||
Tx_roomcon232_buffer[3] = (uint8_t)((Filter_timer_clean>>8)&0x00FF);
|
||||
Tx_roomcon232_buffer[4] = (uint8_t)(Filter_timer_clean&0x00FF);
|
||||
Tx_roomcon232_buffer[5] = 0;
|
||||
Tx_roomcon232_buffer[6] = 0x02;
|
||||
Tx_roomcon232_buffer[7] = (uint8_t)((Filter_timer_change>>8)&0x00FF);
|
||||
Tx_roomcon232_buffer[8] = (uint8_t)(Filter_timer_change&0x00FF);
|
||||
Tx_roomcon232_buffer[9] = 0;
|
||||
Tx_roomcon232_buffer[10] = 0x03;
|
||||
Tx_roomcon232_buffer[11] = (uint8_t)((Soja_timer_change>>8)&0x00FF);
|
||||
Tx_roomcon232_buffer[12] = (uint8_t)(Soja_timer_change&0x00FF);
|
||||
Tx_roomcon232_buffer[13] = 0;
|
||||
|
||||
for(i=0; i<13; i++)Tx_roomcon232_buffer[13] ^= Tx_roomcon232_buffer[i];
|
||||
Tx_roomcon232_buffer[14] = 0xEE;
|
||||
}
|
||||
|
||||
uint8_t Hood_Yeundong_flag = 0;
|
||||
void Hood_info_command(void)// add 2022.1.25
|
||||
{
|
||||
uint8_t i;
|
||||
|
||||
Tx_roomcon232_buffer[0] = 0xAA;
|
||||
Tx_roomcon232_buffer[1] = RX_DATA_HOOD_INFO;
|
||||
|
||||
if(Hood_Yeundong_flag == 1)//on
|
||||
{
|
||||
Tx_roomcon232_buffer[2] = MODE_VENTILATION;
|
||||
Tx_roomcon232_buffer[3] = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
Tx_roomcon232_buffer[2] = Set_Run_Mode;
|
||||
Tx_roomcon232_buffer[3] = Set_Fan_Mode;
|
||||
}
|
||||
|
||||
|
||||
Tx_roomcon232_buffer[4] = Auto_Mode;
|
||||
|
||||
Tx_roomcon232_buffer[5] = 0;
|
||||
|
||||
|
||||
if((Hood_Yeundong_flag == 1) && (Hood_YeunDong_Enable == 1))//2023.02.14 Hood Enable Add
|
||||
{
|
||||
Tx_roomcon232_buffer[6] = 0x81; //ON
|
||||
}
|
||||
else
|
||||
{
|
||||
Tx_roomcon232_buffer[6] = 0x80; //OFF
|
||||
}
|
||||
|
||||
|
||||
Tx_roomcon232_buffer[7] = 0;
|
||||
Tx_roomcon232_buffer[8] = 0;
|
||||
Tx_roomcon232_buffer[9] = 0;
|
||||
Tx_roomcon232_buffer[10] = 0;
|
||||
Tx_roomcon232_buffer[11] = 0;
|
||||
Tx_roomcon232_buffer[12] = 0;
|
||||
Tx_roomcon232_buffer[13] = 0;
|
||||
|
||||
for(i=0; i<13; i++)Tx_roomcon232_buffer[13] ^= Tx_roomcon232_buffer[i];
|
||||
Tx_roomcon232_buffer[14] = 0xEE;
|
||||
}
|
||||
|
||||
|
||||
uint8_t RJ_Vsp_Mode = 0;
|
||||
void roomcon_parsing(void)
|
||||
{
|
||||
uint8_t i = 0;
|
||||
|
||||
RJ_Vsp_Mode = Rx_roomcon232_buffer[1];
|
||||
switch(Rx_roomcon232_buffer[1])
|
||||
{
|
||||
case RX_DATA_MODE_NORMAL:
|
||||
|
||||
Err_Code &= ~(ERROR_FILTER_CLEAN|ERROR_FILTER_CHANGE|ERROR_SOJA_CHANGE|ERROR_PROTECT|ERROR_SOMETIME);
|
||||
Err_Code |= Rx_roomcon232_buffer[7]&(ERROR_FILTER_CLEAN|ERROR_FILTER_CHANGE|ERROR_SOJA_CHANGE|ERROR_PROTECT|ERROR_SOMETIME);
|
||||
|
||||
if((Command_request_type & (TYPE_MODE|TYPE_FAN_SPEED|TYPE_RESERVATION)) || Homenet_RJ_Request )
|
||||
{
|
||||
Command_request_type |= Homenet_RJ_Request; /* PC대시보드 푸시 래치 병합(bunbaegi 클리어 무관) */
|
||||
if((Hood_Yeundong_flag == 1)&&(Tx_Yeundong_Delay == 0))
|
||||
{
|
||||
Hood_Warming_up_Timer = 0;/////////////////
|
||||
Hood_Yeundong_flag = 0;
|
||||
Command_request_type |= (TYPE_HOOD_STATE);
|
||||
}
|
||||
|
||||
Tx_roomcon232_buffer[0] = 0xAA;
|
||||
Tx_roomcon232_buffer[1] = COMMAND_CONTROLL;
|
||||
|
||||
Tx_roomcon232_buffer[2] = Set_Run_Mode;
|
||||
Tx_roomcon232_buffer[3] = Set_Fan_Mode;
|
||||
Tx_roomcon232_buffer[4] = Auto_Mode;
|
||||
|
||||
Tx_roomcon232_buffer[5] = (Heater_Enable|(UV_Enable<<4)|Kijer_Enable);
|
||||
Tx_roomcon232_buffer[6] = 0;
|
||||
Tx_roomcon232_buffer[7] = 0;
|
||||
Tx_roomcon232_buffer[8] = 0;
|
||||
Tx_roomcon232_buffer[9] = 0;
|
||||
if(Command_request_type & TYPE_RESERVATION)
|
||||
{
|
||||
Tx_roomcon232_buffer[10] = 1;
|
||||
Tx_roomcon232_buffer[11] = (uint8_t)(Set_Reserve_timer_sec/3600); //// extern setting timer
|
||||
Tx_roomcon232_buffer[12] = (uint8_t)(Set_Reserve_timer_sec%3600/60); ////extern setting timer
|
||||
}
|
||||
else
|
||||
{
|
||||
Tx_roomcon232_buffer[10] = 0;
|
||||
Tx_roomcon232_buffer[11] = 0;
|
||||
Tx_roomcon232_buffer[12] = 0;
|
||||
}
|
||||
|
||||
|
||||
Tx_roomcon232_buffer[13] = 0;
|
||||
for(i=0; i<13; i++)Tx_roomcon232_buffer[13] ^= Tx_roomcon232_buffer[i];
|
||||
Tx_roomcon232_buffer[14] = 0xEE;
|
||||
|
||||
Command_request_type |= TYPE_SEND_FLAG;
|
||||
|
||||
}
|
||||
else if(Command_request_type & (TYPE_HOOD_STATE))// add 2022.1.25
|
||||
{
|
||||
Hood_info_command();
|
||||
}
|
||||
else
|
||||
{
|
||||
Set_Reserve_timer_sec = (uint32_t)Rx_roomcon232_buffer[11]*3600 + (uint32_t)Rx_roomcon232_buffer[12]*60 ;
|
||||
Txbuff_init();
|
||||
}
|
||||
SCUART_Write(SC0,Tx_roomcon232_buffer,15);
|
||||
|
||||
break;
|
||||
|
||||
case RX_DATA_MODE_EVENT:
|
||||
|
||||
Run_Mode = Rx_roomcon232_buffer[2];
|
||||
if(Run_Mode != MODE_AUTO)
|
||||
{
|
||||
Fan_Mode = Rx_roomcon232_buffer[3];
|
||||
}
|
||||
|
||||
if(Fan_Mode != 0)Err_Code &= ~(ERROR_EA_FAN|ERROR_SA_FAN);
|
||||
|
||||
if(Command_request_type & TYPE_SEND_FLAG)
|
||||
{
|
||||
Command_request_type = 0;
|
||||
Command_request_type &= ~TYPE_SEND_FLAG;
|
||||
Homenet_RJ_Request = 0; /* PC대시보드 푸시 래치 소비 완료 */
|
||||
Run_Mode = Rx_roomcon232_buffer[2];
|
||||
if(Run_Mode != MODE_AUTO)
|
||||
{
|
||||
Fan_Mode = Rx_roomcon232_buffer[3];//DEMO
|
||||
}
|
||||
//if(Run_Mode != MODE_AUTO)Fan_Mode = Rx_roomcon232_buffer[3];//DEMO
|
||||
//else Fan_Mode = Set_Fan_Mode;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Set_Run_Mode = Run_Mode = Rx_roomcon232_buffer[2];
|
||||
Set_Fan_Mode = Fan_Mode = Rx_roomcon232_buffer[3];
|
||||
|
||||
if((Fan_Mode == 0)&&(Run_Mode == MODE_VENTILATION)&&(RJ_Vsp_Mode != RX_DATA_MODE_VSP))
|
||||
{
|
||||
if((Memory_Hood_Status != Hood_Status)&&(Hood_YeunDong_Enable == 1))
|
||||
{
|
||||
if(Memory_Hood_Status == 0)
|
||||
{
|
||||
Hood_Power_On = 0;
|
||||
Hood_Fan_Mode = 0;
|
||||
Hood_Control = 0x80;
|
||||
}
|
||||
else
|
||||
{
|
||||
Hood_Power_On = 1;
|
||||
Hood_Fan_Mode = Memory_Hood_Status;
|
||||
Hood_Control = 0x80;
|
||||
}
|
||||
|
||||
Hood_Status = Memory_Hood_Status;
|
||||
}
|
||||
|
||||
Set_Run_Mode = My_Memory_Run_Mode = 0;
|
||||
Set_Fan_Mode = My_Memory_Fan_Mode = 0;
|
||||
Command_request_type |= (TYPE_MODE|TYPE_FAN_SPEED);
|
||||
|
||||
Force_Damper_Mode = 0;
|
||||
Ext_Run_Mode = 0;
|
||||
Ext_Run_Mode_Off_Delay = 0;
|
||||
Pre_Ext_Run_Mode = Ext_Run_Mode ;
|
||||
Pre_Ext_Select_Room = Ext_Select_Room;
|
||||
|
||||
HREV_Hood_Control = 0;
|
||||
}
|
||||
|
||||
if(Hood_Yeundong_flag == 1)
|
||||
{
|
||||
Hood_Yeundong_flag = 0;
|
||||
Command_request_type |= (TYPE_HOOD_STATE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Auto_Mode = Rx_roomcon232_buffer[4];
|
||||
Heater_OnOff = Rx_roomcon232_buffer[5]&0x01;
|
||||
UV_OnOff = Rx_roomcon232_buffer[5]&0x10;
|
||||
|
||||
Filter_Reset_Flag |= Rx_roomcon232_buffer[7]&0x01;
|
||||
|
||||
if(Rx_roomcon232_buffer[10] == 1)
|
||||
{
|
||||
Set_Reserve_timer_sec = (uint32_t)Rx_roomcon232_buffer[11]*3600 + (uint32_t)Rx_roomcon232_buffer[12]*60 ;
|
||||
}
|
||||
|
||||
if(Run_Mode == MODE_VENTILATION)
|
||||
{
|
||||
for(i=1; i<7; i++)Diffuser_Run_Mode[i] = 1; ////// difuser run mode;
|
||||
}
|
||||
else if(Run_Mode == MODE_AUTO)
|
||||
{
|
||||
for(i=1; i<7; i++)Diffuser_Run_Mode[i] = 2; ////// difuser run mode;
|
||||
}
|
||||
else if(Run_Mode == MODE_BYPASS)
|
||||
{
|
||||
for(i=1; i<7; i++)Diffuser_Run_Mode[i] = 4; ////// difuser run mode;
|
||||
}
|
||||
else if(Run_Mode == MODE_AIRCLEAN)
|
||||
{
|
||||
for(i=1; i<7; i++)Diffuser_Run_Mode[i] = 8; ////// difuser run mode;
|
||||
}
|
||||
|
||||
for(i=1; i<7; i++)Diffuser_Fan_Speed[i] = Fan_Mode; ////// difuser fan mode;
|
||||
|
||||
|
||||
|
||||
|
||||
Tx_roomcon232_buffer[0] = 0xAA;
|
||||
Tx_roomcon232_buffer[1] = 0x01;
|
||||
Tx_roomcon232_buffer[2] = Run_Mode;
|
||||
//if(Run_Mode == MODE_AUTO)Fan_Mode = Set_Fan_Mode;///////////////// DEMO
|
||||
Tx_roomcon232_buffer[3] = Fan_Mode;
|
||||
|
||||
Tx_roomcon232_buffer[5] = (Heater_Enable|(UV_Enable<<4)|Kijer_Enable);
|
||||
Tx_roomcon232_buffer[6] = 0;
|
||||
Tx_roomcon232_buffer[7] = Err_Code & (ERROR_EA_FAN|ERROR_SA_FAN|ERROR_TEMP_SENSOR|ERROR_FILTER_CLEAN|ERROR_FILTER_CHANGE|ERROR_SOJA_CHANGE|ERROR_PROTECT|ERROR_SOMETIME);
|
||||
Tx_roomcon232_buffer[7] |= Roomcon_Filter_Error; // 2021.5.31
|
||||
|
||||
if(Out_Temperature < 0)Tx_roomcon232_buffer[8] = 0x01;
|
||||
else Tx_roomcon232_buffer[8] = 0x00;
|
||||
|
||||
if(Out_Temperature == 100) Tx_roomcon232_buffer[9] = 0xFF;
|
||||
else Tx_roomcon232_buffer[9] = (uint8_t)(Out_Temperature+20);
|
||||
|
||||
if(In_Temperature == 100)Tx_roomcon232_buffer[10] = 0xFF;
|
||||
else Tx_roomcon232_buffer[10] = (uint8_t)(In_Temperature+20);
|
||||
|
||||
Tx_roomcon232_buffer[11] = 0; //reserve hour
|
||||
Tx_roomcon232_buffer[12] = 0; //reserve min
|
||||
|
||||
Tx_roomcon232_buffer[13] = 0;
|
||||
for(i=0; i<13; i++)Tx_roomcon232_buffer[13] ^= Tx_roomcon232_buffer[i];
|
||||
Tx_roomcon232_buffer[14] = 0xEE;
|
||||
SCUART_Write(SC0,Tx_roomcon232_buffer,15);
|
||||
|
||||
|
||||
|
||||
break;
|
||||
|
||||
|
||||
case RX_DATA_MODE_RESTART1:
|
||||
Run_Mode = 0;
|
||||
Fan_Mode = 0;
|
||||
Reserve_hour = 0;
|
||||
Reserve_timer_sec = 0;
|
||||
//Reserve_Time_Update(Reserve_hour);
|
||||
Err_Code = 0;
|
||||
|
||||
Rommcon_Version = Rx_roomcon232_buffer[2];
|
||||
|
||||
|
||||
Tx_roomcon232_buffer[0] = 0xAA;
|
||||
Tx_roomcon232_buffer[1] = 0x02;
|
||||
Tx_roomcon232_buffer[2] = 0;
|
||||
Tx_roomcon232_buffer[3] = 0;
|
||||
Tx_roomcon232_buffer[4] = 0x10;
|
||||
|
||||
Tx_roomcon232_buffer[5] = s_FAN1_VEN_1_DAN;
|
||||
Tx_roomcon232_buffer[6] = s_FAN2_VEN_1_DAN;
|
||||
|
||||
Tx_roomcon232_buffer[7] = s_FAN1_VEN_2_DAN;
|
||||
Tx_roomcon232_buffer[8] = s_FAN2_VEN_2_DAN;
|
||||
|
||||
Tx_roomcon232_buffer[9] = s_FAN1_VEN_3_DAN;
|
||||
Tx_roomcon232_buffer[10] = s_FAN2_VEN_3_DAN;
|
||||
|
||||
Tx_roomcon232_buffer[11] = s_FAN1_VEN_4_DAN;
|
||||
Tx_roomcon232_buffer[12] = s_FAN2_VEN_4_DAN;
|
||||
Tx_roomcon232_buffer[13] = 0;
|
||||
for(i=0; i<13; i++)Tx_roomcon232_buffer[13] ^= Tx_roomcon232_buffer[i];
|
||||
Tx_roomcon232_buffer[14] = 0xEE;
|
||||
SCUART_Write(SC0,Tx_roomcon232_buffer,15);
|
||||
break;
|
||||
|
||||
case RX_DATA_MODE_RESTART2:
|
||||
Tx_roomcon232_buffer[0] = 0xAA;
|
||||
Tx_roomcon232_buffer[1] = 0x12;
|
||||
Tx_roomcon232_buffer[2] = 0;
|
||||
Tx_roomcon232_buffer[3] = 0;
|
||||
Tx_roomcon232_buffer[4] = 0x10;
|
||||
|
||||
Tx_roomcon232_buffer[5] = s_FAN1_BYPASS_1_DAN;
|
||||
Tx_roomcon232_buffer[6] = s_FAN2_BYPASS_1_DAN;
|
||||
|
||||
Tx_roomcon232_buffer[7] = s_FAN1_AIR_1_DAN;
|
||||
Tx_roomcon232_buffer[8] = s_FAN1_AIR_2_DAN;
|
||||
Tx_roomcon232_buffer[9] = s_FAN1_AIR_3_DAN;
|
||||
Tx_roomcon232_buffer[10] = s_FAN1_AIR_4_DAN;
|
||||
Tx_roomcon232_buffer[11] = 0;
|
||||
Tx_roomcon232_buffer[12] = 0; //
|
||||
|
||||
Tx_roomcon232_buffer[13] = 0;;
|
||||
for(i=0; i<13; i++)Tx_roomcon232_buffer[13] ^= Tx_roomcon232_buffer[i];
|
||||
Tx_roomcon232_buffer[14] = 0xEE;
|
||||
SCUART_Write(SC0,Tx_roomcon232_buffer,15);
|
||||
break;
|
||||
|
||||
case RX_DATA_MODE_VSP: // in test mode
|
||||
|
||||
Vsp_Select = Rx_roomcon232_buffer[3];
|
||||
|
||||
switch(Vsp_Select)
|
||||
{
|
||||
case 1: //
|
||||
Test_Fan1_Ven_1_dan = Rx_roomcon232_buffer[4];
|
||||
Test_Fan2_Ven_1_dan = Rx_roomcon232_buffer[5];
|
||||
break;
|
||||
case 2: //
|
||||
Test_Fan1_Ven_2_dan = Rx_roomcon232_buffer[4];
|
||||
Test_Fan2_Ven_2_dan = Rx_roomcon232_buffer[5];
|
||||
break;
|
||||
case 3: //
|
||||
Test_Fan1_Ven_3_dan = Rx_roomcon232_buffer[4];
|
||||
Test_Fan2_Ven_3_dan = Rx_roomcon232_buffer[5];
|
||||
break;
|
||||
case 4: //
|
||||
Test_Fan1_Ven_4_dan = Rx_roomcon232_buffer[4];
|
||||
Test_Fan2_Ven_4_dan = Rx_roomcon232_buffer[5];
|
||||
break;
|
||||
case 5: //
|
||||
Test_Fan1_Bypass_1_dan = Rx_roomcon232_buffer[4];
|
||||
Test_Fan2_Bypass_1_dan = Rx_roomcon232_buffer[5];
|
||||
break;
|
||||
case 6: //
|
||||
Test_Fan1_Air_1_dan = Rx_roomcon232_buffer[4];
|
||||
Test_Fan2_Air_1_dan = 0;//Rx_roomcon232_buffer[5];
|
||||
break;
|
||||
case 7: //
|
||||
Test_Fan1_Air_2_dan = Rx_roomcon232_buffer[4];
|
||||
Test_Fan2_Air_2_dan = 0;//Rx_roomcon232_buffer[5];
|
||||
break;
|
||||
case 8: //
|
||||
Test_Fan1_Air_3_dan = Rx_roomcon232_buffer[4];
|
||||
Test_Fan2_Air_3_dan = 0;//Rx_roomcon232_buffer[5];
|
||||
case 9: //
|
||||
Test_Fan1_Air_4_dan = Rx_roomcon232_buffer[4];
|
||||
Test_Fan2_Air_4_dan = 0;//Rx_roomcon232_buffer[5];
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
Test_Fan1_Speed = Rx_roomcon232_buffer[4];
|
||||
Test_Fan2_Speed = Rx_roomcon232_buffer[5];
|
||||
if((Vsp_Select == 6)||(Vsp_Select == 7)||(Vsp_Select == 8)||(Vsp_Select == 9))Test_Fan2_Speed = 0;
|
||||
|
||||
Tx_roomcon232_buffer[0] = 0xAA;
|
||||
Tx_roomcon232_buffer[1] = 0x03;
|
||||
Tx_roomcon232_buffer[2] = 0;
|
||||
Tx_roomcon232_buffer[3] = Rx_roomcon232_buffer[3];
|
||||
Tx_roomcon232_buffer[4] = Rx_roomcon232_buffer[4];
|
||||
Tx_roomcon232_buffer[5] = Rx_roomcon232_buffer[5];
|
||||
|
||||
Tx_roomcon232_buffer[6] = 0;
|
||||
Tx_roomcon232_buffer[7] = 0;
|
||||
Tx_roomcon232_buffer[8] = 0;
|
||||
|
||||
Tx_roomcon232_buffer[9] = (uint8_t)((urpm1>>8)&0x00FF); //2021.5.31
|
||||
Tx_roomcon232_buffer[10] = (uint8_t)(urpm1&0x00FF);
|
||||
Tx_roomcon232_buffer[11] = (uint8_t)((urpm2>>8)&0x00FF);
|
||||
Tx_roomcon232_buffer[12] = (uint8_t)(urpm2&0x00FF);
|
||||
|
||||
|
||||
Tx_roomcon232_buffer[13] = 0;
|
||||
for(i=0; i<13; i++)Tx_roomcon232_buffer[13] ^= Tx_roomcon232_buffer[i];
|
||||
Tx_roomcon232_buffer[14] = 0xEE;
|
||||
SCUART_Write(SC0,Tx_roomcon232_buffer,15);
|
||||
break;
|
||||
|
||||
case RX_DATA_MODE_EXIT: // out test mode
|
||||
Run_Mode = Rx_roomcon232_buffer[2];
|
||||
|
||||
EEP_Save_Flag = 1;
|
||||
Tx_roomcon232_buffer[0] = 0xAA;
|
||||
Tx_roomcon232_buffer[1] = 0x04;
|
||||
Tx_roomcon232_buffer[2] = 0;
|
||||
Tx_roomcon232_buffer[3] = 0;
|
||||
Tx_roomcon232_buffer[4] = 0;
|
||||
Tx_roomcon232_buffer[5] = 0;
|
||||
Tx_roomcon232_buffer[6] = 0;
|
||||
Tx_roomcon232_buffer[7] = 0;
|
||||
Tx_roomcon232_buffer[8] = 0;
|
||||
Tx_roomcon232_buffer[9] = 0;
|
||||
Tx_roomcon232_buffer[10] = 0;
|
||||
Tx_roomcon232_buffer[11] = 0;
|
||||
Tx_roomcon232_buffer[12] = 0;
|
||||
|
||||
Tx_roomcon232_buffer[13] = 0;
|
||||
for(i=0; i<13; i++)Tx_roomcon232_buffer[13] ^= Tx_roomcon232_buffer[i];
|
||||
Tx_roomcon232_buffer[14] = 0xEE;
|
||||
|
||||
SCUART_Write(SC0,Tx_roomcon232_buffer,15);
|
||||
|
||||
break;
|
||||
case RX_DATA_SENSOR_INFO: //
|
||||
Command_request_type &= ~(TYPE_SENSOR_INFO);
|
||||
Txbuff_init();
|
||||
SCUART_Write(SC0,Tx_roomcon232_buffer,15);
|
||||
break;
|
||||
|
||||
case RX_DATA_FILTER_INFO: //룸콘
|
||||
Command_request_type &= ~(TYPE_FILTER_INFO);
|
||||
Filter_info_reply();
|
||||
SCUART_Write(SC0,Tx_roomcon232_buffer,15);
|
||||
break;
|
||||
|
||||
case RX_DATA_CONTROLL: //
|
||||
if(Command_request_type & TYPE_SEND_FLAG)
|
||||
{
|
||||
Command_request_type &= ~TYPE_SEND_FLAG;
|
||||
Run_Mode = Rx_roomcon232_buffer[2];
|
||||
if(Run_Mode != MODE_AUTO)
|
||||
{
|
||||
Fan_Mode = Rx_roomcon232_buffer[3];///////////////// DEMO
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Set_Run_Mode = Run_Mode = Rx_roomcon232_buffer[2];
|
||||
if(Run_Mode != MODE_AUTO)
|
||||
{
|
||||
Set_Fan_Mode = Fan_Mode = Rx_roomcon232_buffer[3];
|
||||
}
|
||||
}
|
||||
//Auto_Mode = Rx_roomcon232_buffer[4];
|
||||
Heater_OnOff = Rx_roomcon232_buffer[5]&0x01;
|
||||
UV_OnOff = Rx_roomcon232_buffer[5]&0x10;
|
||||
|
||||
Filter_Reset_Flag |= Rx_roomcon232_buffer[7];
|
||||
|
||||
Reserve_timer_sec = (uint32_t)Rx_roomcon232_buffer[11]*3600 + (uint32_t)Rx_roomcon232_buffer[12]*60 ;
|
||||
|
||||
|
||||
if(Set_Run_Mode == Run_Mode)Command_request_type &= ~TYPE_MODE;
|
||||
if(Set_Fan_Mode == Fan_Mode)Command_request_type &= ~TYPE_FAN_SPEED;
|
||||
|
||||
if(Reserve_timer_sec == 0){if(Set_Reserve_timer_sec == 0)Command_request_type &= ~TYPE_RESERVATION;}
|
||||
else
|
||||
{
|
||||
if(Set_Reserve_timer_sec != 0)
|
||||
{
|
||||
if(((Reserve_timer_sec-1)/3600 + 1) == ((Set_Reserve_timer_sec-1)/3600 + 1))Command_request_type &= ~TYPE_RESERVATION;
|
||||
}
|
||||
}
|
||||
Txbuff_init();
|
||||
SCUART_Write(SC0,Tx_roomcon232_buffer,15);
|
||||
break;
|
||||
|
||||
case RX_DATA_CONTROLL_INFO: // 룸콘
|
||||
Spec_info_reply();
|
||||
SCUART_Write(SC0,Tx_roomcon232_buffer,15);
|
||||
break;
|
||||
case RX_DATA_RPM_INFO: //2021.5.31
|
||||
|
||||
if(Rx_roomcon232_buffer[2] == 1)Roomcon_Filter_Error |= ERROR_FILTER_CLEAN;
|
||||
else Roomcon_Filter_Error &= ~ERROR_FILTER_CLEAN;
|
||||
|
||||
if(Rx_roomcon232_buffer[3] == 1)Roomcon_Filter_Error |= ERROR_FILTER_CHANGE;
|
||||
else Roomcon_Filter_Error &= ~ERROR_FILTER_CHANGE;
|
||||
|
||||
if(Rx_roomcon232_buffer[4] == 1)Roomcon_Filter_Error |= ERROR_SOJA_CHANGE;
|
||||
else Roomcon_Filter_Error &= ~ERROR_SOJA_CHANGE;
|
||||
|
||||
Rpm_info_reply();
|
||||
SCUART_Write(SC0,Tx_roomcon232_buffer,15);
|
||||
break;
|
||||
case RX_DATA_ERROR_CLEAR: //2021.5.31
|
||||
|
||||
if(Rx_roomcon232_buffer[1] == 0x22)
|
||||
{
|
||||
Err_Code &= ~(ERROR_SA_FAN|ERROR_EA_FAN);
|
||||
}
|
||||
Txbuff_init();
|
||||
SCUART_Write(SC0,Tx_roomcon232_buffer,15);
|
||||
break;
|
||||
case RX_DATA_HOOD_INFO: // add 2022.1.25
|
||||
Command_request_type &= ~(TYPE_HOOD_STATE);
|
||||
Txbuff_init();
|
||||
SCUART_Write(SC0,Tx_roomcon232_buffer,15);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void SC0_IRQHandler(void)
|
||||
{
|
||||
uint8_t data;
|
||||
|
||||
data = SCUART_READ(SC0);
|
||||
|
||||
rx_roomcon_check(data);
|
||||
Rx_roomcon_TimeOut = 50;
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -0,0 +1,992 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include "Nano100Series.h"
|
||||
#include "adc.h"
|
||||
#include "gpio.h"
|
||||
#include "pwm.h"
|
||||
#include "timer.h"
|
||||
#include "uart.h"
|
||||
#include "sys.h"
|
||||
#include "clk.h"
|
||||
|
||||
#include "My_define.h"
|
||||
|
||||
|
||||
uint8_t test_num1=0,test_num2=0,test_num3=0;
|
||||
|
||||
|
||||
uint16_t com_bunbaegi_delay = 0;
|
||||
|
||||
|
||||
volatile uint8_t Rx_bunbaegi_complete=0, Rx_homenet_complete=0, Rx_roomcon_complete=0, Rx_debug_complete=0;
|
||||
volatile uint8_t Tx_bunbaegi_flag = 0, Tx_homenet_flag = 0, Tx_roomcon_flag = 0, Tx_debug_flag = 0;
|
||||
volatile uint8_t Tx_display_flag=0;
|
||||
uint8_t Tx_display_buffer[25], Rx_display_buffer[25];
|
||||
|
||||
uint8_t Tx_homenet_buffer[60],Tx_bunbaegi_buffer[40],Tx_roomcon232_buffer[25],Tx_debug_buffer[60];
|
||||
uint8_t Rx_homenet_buffer[60],Rx_bunbaegi_buffer[40],Rx_roomcon232_buffer[25],Rx_debug_buffer[20];
|
||||
|
||||
volatile uint8_t Reserve_hour = 0;
|
||||
volatile uint8_t Pre_Reserve_hour = 0;
|
||||
|
||||
extern volatile uint8_t Err_Code;
|
||||
extern uint8_t Target_Fan1_Speed, Target_Fan2_Speed;
|
||||
|
||||
extern volatile uint32_t Reserve_timer_sec;
|
||||
|
||||
extern signed int In_Temperature;
|
||||
extern signed int Out_Temperature;
|
||||
|
||||
extern uint16_t InCom_polling_timer;
|
||||
|
||||
uint16_t SEN66_pm1p0[7] = {0,}, SEN66_pm2p5[7] = {0,}, SEN66_pm4p0[7] = {0,}, SEN66_pm10p0[7] = {0,};
|
||||
int16_t SEN66_humidity_value[7] = {0};
|
||||
int16_t SEN66_temperature_value[7] = {0};
|
||||
int16_t SEN66_VOC_value[7] = {0};
|
||||
int16_t SEN66_NOx_value[7] = {0};
|
||||
uint16_t SEN66_CO2_value[7] = {0};
|
||||
|
||||
//uint8_t Diffuser_VSP_Mode[6] = {0};
|
||||
uint8_t Diffuser_VSP_Mode = 0;
|
||||
uint8_t Diffuser_Power[7] = {0,};
|
||||
uint8_t Diffuser_Run_Mode[7] = {0,};
|
||||
uint8_t Diffuser_Fan_Speed[7] = {0,};
|
||||
uint8_t Diffuser_Dmp_Ang_SA[7] = {0,}, Memory_Diffuser_Dmp_Ang_SA[7] = {0,}; //Damper Angle
|
||||
uint8_t Diffuser_Dmp_Ang_RA[7] = {0,}, Memory_Diffuser_Dmp_Ang_RA[7] = {0,}; //Damper Angle
|
||||
uint8_t Diffuser_Air_quality[7] = {0,}, Memory_Diffuser_Air_quality[7] = {0,};
|
||||
/* 대시보드 수동 댐퍼 제어(CTRL_DAMPER) : 1이면 환기/공청/바이패스에서 자동 개방이 덮어쓰지 않음.
|
||||
자동/부가모드/전원OFF/모드전환 시 해제. (각실 1~4 사용) */
|
||||
uint8_t Diffuser_Damper_Manual[7] = {0,};
|
||||
/* 대시보드 수동 LED 디밍(CTRL_LED) : 1이면 자동 추종(댐퍼개방→ON/닫힘→소등)이 덮어쓰지 않음.
|
||||
모든 운전모드에서 수동값 유지, 전원OFF 시에만 해제. (각실 1~4 사용) */
|
||||
uint8_t Diffuser_Led_Manual[7] = {0,};
|
||||
/* (꺼짐)예약 잔여초 : CTRL_RESERVE 로 설정(N시간×3600), 1초마다 감소, 0 도달 시 전원 OFF. 0=예약없음. 최대 8h=28800 */
|
||||
uint16_t Reserve_Remain_Sec = 0;
|
||||
|
||||
uint8_t Roomcon_Num = 5, Diffuser_Num = 6, VSP_Select_Num = 0;
|
||||
uint8_t VSP_Status_Trans = 0;
|
||||
|
||||
const unsigned char auchCRCHi[] = {
|
||||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
|
||||
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
|
||||
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
|
||||
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
|
||||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
|
||||
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
|
||||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
|
||||
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
|
||||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
|
||||
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
|
||||
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
|
||||
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
|
||||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
|
||||
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
|
||||
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
|
||||
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
|
||||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
|
||||
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
|
||||
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
|
||||
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
|
||||
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
|
||||
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
|
||||
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
|
||||
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
|
||||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
|
||||
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
|
||||
} ;
|
||||
|
||||
// Table of CRC values for low-order byte
|
||||
const unsigned char auchCRCLo[] = {
|
||||
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
|
||||
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
|
||||
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
|
||||
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
|
||||
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
|
||||
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
|
||||
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
|
||||
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
|
||||
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
|
||||
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
|
||||
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
|
||||
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
|
||||
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
|
||||
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
|
||||
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
|
||||
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
|
||||
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
|
||||
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
|
||||
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
|
||||
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
|
||||
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
|
||||
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
|
||||
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
|
||||
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
|
||||
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
|
||||
0x43, 0x83, 0x41, 0x81, 0x80, 0x40
|
||||
} ;
|
||||
|
||||
uint16_t CRC16(uint8_t *puchMsg, uint16_t usDataLen)
|
||||
{
|
||||
uint8_t uchCRCHi = 0xFF ; // high CRC byte initialized
|
||||
uint8_t uchCRCLo = 0xFF ; // low CRC byte initialized
|
||||
uint8_t uIndex ; // will index into CRC lookup table
|
||||
|
||||
while (usDataLen--) // pass through message buffer
|
||||
{
|
||||
uIndex = uchCRCHi ^ *puchMsg++ ; // calculate the CRC
|
||||
|
||||
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
|
||||
uchCRCLo = auchCRCLo[uIndex] ;
|
||||
}
|
||||
return ((uint16_t)uchCRCHi << 8 | (uint16_t)uchCRCLo) ;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//-------------------- SC 1 -----------------------------------
|
||||
//-------------------- BunBaeGi ------------------------------
|
||||
|
||||
void bunbaegi_run_mode_check(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
uint8_t Packet_Type = 0;
|
||||
uint8_t Rx_bunbaegi_Pos = 0;
|
||||
uint8_t Packet_Length = 0;
|
||||
|
||||
void rx_bunbaegi_check(uint8_t data)
|
||||
{
|
||||
uint16_t iTmp = 0, icrc = 0;
|
||||
|
||||
if(Rx_roomcon_TimeOut == 0)Rx_bunbaegi_Pos = 0;
|
||||
switch(Rx_bunbaegi_Pos)
|
||||
{
|
||||
case 0:
|
||||
if(data != 0xAA)break;
|
||||
Rx_bunbaegi_buffer[Rx_bunbaegi_Pos++] = data;
|
||||
break;
|
||||
case 1:
|
||||
if(data != 0x01)break;
|
||||
Rx_bunbaegi_buffer[Rx_bunbaegi_Pos++] = data;
|
||||
break;
|
||||
case 2:
|
||||
Rx_bunbaegi_buffer[Rx_bunbaegi_Pos++] = data;
|
||||
if(data == 0x03){Packet_Type = 0x02;} //RoomCon
|
||||
else{Packet_Type = 0x01;} //Diffuser
|
||||
break;
|
||||
case 3:
|
||||
Rx_bunbaegi_buffer[Rx_bunbaegi_Pos++] = data;
|
||||
Packet_Length = 39;
|
||||
break;
|
||||
case 4:
|
||||
Rx_bunbaegi_buffer[Rx_bunbaegi_Pos++] = data;
|
||||
if(Packet_Type == 0x02)
|
||||
{
|
||||
if((data == 0x01)||(data == 0x02)||(data == 0x03)) //29byte
|
||||
{
|
||||
Packet_Length = 39;
|
||||
}
|
||||
} //RoomCon
|
||||
break;
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
case 8:
|
||||
case 9:
|
||||
case 10:
|
||||
case 11:
|
||||
case 12:
|
||||
case 13:
|
||||
case 14:
|
||||
case 15:
|
||||
case 16:
|
||||
case 17:
|
||||
case 18:
|
||||
case 19:
|
||||
case 20:
|
||||
case 21:
|
||||
case 22:
|
||||
case 23:
|
||||
case 24:
|
||||
case 25:
|
||||
case 26:
|
||||
case 27:
|
||||
Rx_bunbaegi_buffer[Rx_bunbaegi_Pos++] = data;
|
||||
break;
|
||||
case 28:
|
||||
Rx_bunbaegi_buffer[Rx_bunbaegi_Pos++] = data;
|
||||
if(Packet_Length == 29)
|
||||
{
|
||||
iTmp = (uint16_t)Rx_bunbaegi_buffer[27]<<8;
|
||||
icrc = iTmp + (uint16_t)Rx_bunbaegi_buffer[28] ;
|
||||
if(icrc == CRC16(Rx_bunbaegi_buffer, 27))
|
||||
{
|
||||
Rx_bunbaegi_complete = 1;
|
||||
}
|
||||
Rx_bunbaegi_Pos = 0;
|
||||
}
|
||||
break;
|
||||
case 29:
|
||||
case 30:
|
||||
case 31:
|
||||
case 32:
|
||||
case 33:
|
||||
case 34:
|
||||
case 35:
|
||||
case 36:
|
||||
case 37:
|
||||
Rx_bunbaegi_buffer[Rx_bunbaegi_Pos++] = data;
|
||||
break;
|
||||
case 38:
|
||||
Rx_bunbaegi_buffer[Rx_bunbaegi_Pos++] = data;
|
||||
if(Packet_Length == 39)
|
||||
{
|
||||
iTmp = (uint16_t)Rx_bunbaegi_buffer[37]<<8;
|
||||
icrc = iTmp + (uint16_t)Rx_bunbaegi_buffer[38] ;
|
||||
if(icrc == CRC16(Rx_bunbaegi_buffer, 37))
|
||||
{
|
||||
Rx_bunbaegi_complete = 1;
|
||||
}
|
||||
Rx_bunbaegi_Pos = 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
Rx_bunbaegi_Pos = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
volatile uint8_t Bunbaegi_connect_mode = 0;
|
||||
uint8_t bunbaegi_com_count = 0;
|
||||
|
||||
void com_bunbaegi_process(void)
|
||||
{
|
||||
if(Rx_bunbaegi_complete == 1)
|
||||
{
|
||||
if(com_bunbaegi_delay)return;
|
||||
Rx_bunbaegi_complete = 0;
|
||||
bunbaegi_parsing();
|
||||
|
||||
// Roomcon_connect_mode = 1;
|
||||
bunbaegi_com_count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t Light_Bright[6] = {0,0,0,0,0,0};
|
||||
|
||||
uint8_t sa_sel = 1; //SA ID SELECTION
|
||||
uint8_t ea_sel = 1; //EA ID SELECTION
|
||||
uint8_t rc_sel = 1; //ROOMCON ID SELECTION
|
||||
uint8_t tx_sel = 1; //TX MODE SELECTION [1:SA],[2:EA],[3:RoomCon]
|
||||
|
||||
uint8_t id_tbl[6] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
|
||||
|
||||
uint8_t Polling_VSP_Mode = 0;
|
||||
|
||||
void Bunbaegi_Polling(void)
|
||||
{
|
||||
uint8_t id_1 = 0, id_2 = 0;
|
||||
uint16_t icrc = 0;
|
||||
uint8_t Tmp_sel = 0;
|
||||
|
||||
Tx_bunbaegi_buffer[0] = 0xAA;
|
||||
Tx_bunbaegi_buffer[1] = 0x10;
|
||||
Tx_bunbaegi_buffer[2] = tx_sel;
|
||||
|
||||
if(tx_sel == 1) // TX -> SA
|
||||
{
|
||||
id_2 = sa_sel;
|
||||
}
|
||||
else if(tx_sel == 2)
|
||||
{
|
||||
id_2 = ea_sel;
|
||||
}
|
||||
else if(tx_sel == 3) // roomcon
|
||||
{
|
||||
Polling_VSP_Mode = 0x00;
|
||||
if(rc_sel == 1){rc_sel = 2;Polling_VSP_Mode = 0x00;}
|
||||
else if(rc_sel == 2){rc_sel = 3;Polling_VSP_Mode = 0x11;}
|
||||
else if(rc_sel == 3){rc_sel = 1;Polling_VSP_Mode = 0x12;}
|
||||
|
||||
id_2 = 5; // room4 e����i?? roomcon
|
||||
|
||||
}
|
||||
id_1 = tx_sel; //sa/ea/roomcon
|
||||
Tx_bunbaegi_buffer[3] = id_2; // number
|
||||
|
||||
|
||||
if(tx_sel == 3) //RoomCon Polling
|
||||
{
|
||||
if((Diffuser_VSP_Mode == 1) && (id_2==5)) // room4 e����i?? roomcon
|
||||
{
|
||||
Tx_bunbaegi_buffer[4] = Diffuser_VSP_Mode;
|
||||
|
||||
Tx_bunbaegi_buffer[5] = (uint8_t)s_FAN1_VEN_1_DAN;
|
||||
Tx_bunbaegi_buffer[6] = (uint8_t)s_FAN2_VEN_1_DAN;
|
||||
Tx_bunbaegi_buffer[7] = (uint8_t)s_FAN1_VEN_2_DAN;
|
||||
Tx_bunbaegi_buffer[8] = (uint8_t)s_FAN2_VEN_2_DAN;
|
||||
Tx_bunbaegi_buffer[9] = (uint8_t)s_FAN1_VEN_3_DAN;
|
||||
Tx_bunbaegi_buffer[10] = (uint8_t)s_FAN2_VEN_3_DAN;
|
||||
|
||||
Tx_bunbaegi_buffer[11] = (uint8_t)s_FAN1_VEN_4_DAN;
|
||||
Tx_bunbaegi_buffer[12] = (uint8_t)s_FAN2_VEN_4_DAN;
|
||||
Tx_bunbaegi_buffer[13] = 0;
|
||||
Tx_bunbaegi_buffer[14] = 0; //5DAN
|
||||
|
||||
Tx_bunbaegi_buffer[15] = (uint8_t)s_FAN1_AIR_1_DAN;
|
||||
Tx_bunbaegi_buffer[16] = (uint8_t)s_FAN2_AIR_1_DAN;
|
||||
Tx_bunbaegi_buffer[17] = (uint8_t)s_FAN1_AIR_2_DAN;
|
||||
Tx_bunbaegi_buffer[18] = (uint8_t)s_FAN2_AIR_2_DAN;
|
||||
Tx_bunbaegi_buffer[19] = (uint8_t)s_FAN1_AIR_3_DAN;
|
||||
Tx_bunbaegi_buffer[20] = (uint8_t)s_FAN2_AIR_3_DAN;
|
||||
|
||||
Tx_bunbaegi_buffer[21] = 0;
|
||||
Tx_bunbaegi_buffer[22] = 0; //4DAN
|
||||
Tx_bunbaegi_buffer[23] = 0;
|
||||
Tx_bunbaegi_buffer[24] = 0; //5DAN
|
||||
|
||||
Tx_bunbaegi_buffer[25] = 0;
|
||||
Tx_bunbaegi_buffer[26] = 0; //BLANK
|
||||
|
||||
icrc = CRC16(Tx_bunbaegi_buffer, 27);
|
||||
Tx_bunbaegi_buffer[27] = (uint8_t)(icrc>>8); //CRC16
|
||||
Tx_bunbaegi_buffer[28] = (uint8_t)(icrc & 0x00FF); //CRC16
|
||||
|
||||
BUNBAGI_485_DIR = 1;
|
||||
SCUART_Write(SC1, Tx_bunbaegi_buffer, 29);
|
||||
while ( !(SC1->TRSR & SC_TRSR_TX_EMPTY_F_Msk) );
|
||||
delay_us(200);
|
||||
BUNBAGI_485_DIR = 0;
|
||||
Diffuser_VSP_Mode = 0;
|
||||
}
|
||||
else if((Diffuser_VSP_Mode == 2) && (id_2==5)) // room4 e����i?? roomcon
|
||||
{
|
||||
Tx_bunbaegi_buffer[4] = Diffuser_VSP_Mode;
|
||||
|
||||
Tx_bunbaegi_buffer[5] = s_FAN1_BYPASS_1_DAN; Tx_bunbaegi_buffer[6] = s_FAN2_BYPASS_1_DAN;
|
||||
Tx_bunbaegi_buffer[7] = s_FAN1_BYPASS_2_DAN; Tx_bunbaegi_buffer[8] = s_FAN2_BYPASS_2_DAN;
|
||||
Tx_bunbaegi_buffer[9] = s_FAN1_BYPASS_3_DAN; Tx_bunbaegi_buffer[10] = s_FAN2_BYPASS_3_DAN;
|
||||
|
||||
Tx_bunbaegi_buffer[11] = 0; Tx_bunbaegi_buffer[12] = 0; //4DAN
|
||||
Tx_bunbaegi_buffer[13] = 0; Tx_bunbaegi_buffer[14] = 0; //5DAN
|
||||
|
||||
Tx_bunbaegi_buffer[15] = 0; Tx_bunbaegi_buffer[16] = 0; //BLANK
|
||||
|
||||
Tx_bunbaegi_buffer[17] = Roomcon_Num;
|
||||
Tx_bunbaegi_buffer[18] = Diffuser_Num;
|
||||
|
||||
Tx_bunbaegi_buffer[19] = 0; Tx_bunbaegi_buffer[20] = 0; //BLANK
|
||||
Tx_bunbaegi_buffer[21] = 0; Tx_bunbaegi_buffer[22] = 0; //BLANK
|
||||
Tx_bunbaegi_buffer[23] = 0; Tx_bunbaegi_buffer[24] = 0; //BLANK
|
||||
Tx_bunbaegi_buffer[25] = 0; Tx_bunbaegi_buffer[26] = 0; //BLANK
|
||||
|
||||
icrc = CRC16(Tx_bunbaegi_buffer, 27);
|
||||
Tx_bunbaegi_buffer[27] = (uint8_t)(icrc>>8); //CRC16
|
||||
Tx_bunbaegi_buffer[28] = (uint8_t)(icrc & 0x00FF); //CRC16
|
||||
|
||||
BUNBAGI_485_DIR = 1;
|
||||
SCUART_Write(SC1, Tx_bunbaegi_buffer, 29);
|
||||
while ( !(SC1->TRSR & SC_TRSR_TX_EMPTY_F_Msk) );
|
||||
delay_us(200);
|
||||
BUNBAGI_485_DIR = 0;
|
||||
Diffuser_VSP_Mode = 0;
|
||||
}
|
||||
else if((Diffuser_VSP_Mode == 3) && (id_2==5)) // room4 e����i?? roomcon
|
||||
{
|
||||
Tx_bunbaegi_buffer[4] = Diffuser_VSP_Mode;
|
||||
|
||||
Tx_bunbaegi_buffer[5] = (uint8_t)Test_RPM_Vent_Reference[1];
|
||||
Tx_bunbaegi_buffer[6] = (uint8_t)(Test_RPM_Vent_Reference[1]>>8); // VENT RPM REF 2DAN
|
||||
Tx_bunbaegi_buffer[7] = (uint8_t)Test_RPM_Vent_Delta[1];
|
||||
Tx_bunbaegi_buffer[8] = (uint8_t)(Test_RPM_Vent_Delta[1]>>8); // VENT RPM DELTA 2DAN
|
||||
Tx_bunbaegi_buffer[9] = (uint8_t)Test_RPM_Vent_Reference[2];
|
||||
Tx_bunbaegi_buffer[10] = (uint8_t)(Test_RPM_Vent_Reference[2]>>8); // VENT RPM REF 3DAN
|
||||
Tx_bunbaegi_buffer[11] = (uint8_t)Test_RPM_Vent_Delta[2];
|
||||
Tx_bunbaegi_buffer[12] = (uint8_t)(Test_RPM_Vent_Delta[2]>>8);; //VENT RPM DELTA 3DAN
|
||||
Tx_bunbaegi_buffer[13] = (uint8_t)Test_RPM_Air_Reference[1];
|
||||
Tx_bunbaegi_buffer[14] = (uint8_t)(Test_RPM_Air_Reference[1]>>8); //AIR RPM REF 2DAN
|
||||
Tx_bunbaegi_buffer[15] = (uint8_t)Test_RPM_Air_Delta[1];
|
||||
Tx_bunbaegi_buffer[16] = (uint8_t)(Test_RPM_Air_Delta[1]>>8); //AIR RPM DELTA 2DAN
|
||||
Tx_bunbaegi_buffer[17] = (uint8_t)Test_RPM_Air_Reference[2];
|
||||
Tx_bunbaegi_buffer[18] = (uint8_t)(Test_RPM_Air_Reference[2]>>8); //AIR RPM REF 3DAN
|
||||
Tx_bunbaegi_buffer[19] = (uint8_t)Test_RPM_Air_Delta[2];
|
||||
Tx_bunbaegi_buffer[20] = (uint8_t)(Test_RPM_Air_Delta[2]>>8); //AIR RPM DELTA 3DAN
|
||||
Tx_bunbaegi_buffer[21] = 0; Tx_bunbaegi_buffer[22] = 0; //21byte Modbus ID
|
||||
Tx_bunbaegi_buffer[23] = 0; Tx_bunbaegi_buffer[24] = 0; //BLANK
|
||||
Tx_bunbaegi_buffer[25] = 0; Tx_bunbaegi_buffer[26] = 0; //BLANK
|
||||
|
||||
icrc = CRC16(Tx_bunbaegi_buffer, 27);
|
||||
Tx_bunbaegi_buffer[27] = (uint8_t)(icrc>>8); //CRC16
|
||||
Tx_bunbaegi_buffer[28] = (uint8_t)(icrc & 0x00FF); //CRC16
|
||||
|
||||
BUNBAGI_485_DIR = 1;
|
||||
SCUART_Write(SC1, Tx_bunbaegi_buffer, 29);
|
||||
while ( !(SC1->TRSR & SC_TRSR_TX_EMPTY_F_Msk) );
|
||||
delay_us(200);
|
||||
BUNBAGI_485_DIR = 0;
|
||||
Diffuser_VSP_Mode = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(id_2 == 5) // room4 e����i?? roomcon
|
||||
{
|
||||
if(Polling_VSP_Mode == 0x11) //air qurity
|
||||
{
|
||||
Tx_bunbaegi_buffer[4] = 0x11; //VSP_MODE
|
||||
// room1
|
||||
Tx_bunbaegi_buffer[5] = (uint8_t)(SEN66_pm10p0[3]>>8);
|
||||
Tx_bunbaegi_buffer[6] = (uint8_t)(SEN66_pm10p0[3]);
|
||||
Tx_bunbaegi_buffer[7] = (uint8_t)(SEN66_humidity_value[3]>>8);
|
||||
Tx_bunbaegi_buffer[8] = (uint8_t)(SEN66_humidity_value[3]);
|
||||
Tx_bunbaegi_buffer[9] = (uint8_t)(SEN66_temperature_value[3]>>8);
|
||||
Tx_bunbaegi_buffer[10] = (uint8_t)(SEN66_temperature_value[3]);
|
||||
Tx_bunbaegi_buffer[11] = (uint8_t)(SEN66_CO2_value[3]>>8);
|
||||
Tx_bunbaegi_buffer[12] = (uint8_t)(SEN66_CO2_value[3]);
|
||||
Tx_bunbaegi_buffer[13] = (uint8_t)(SEN66_VOC_value[3]>>8);;
|
||||
Tx_bunbaegi_buffer[14] = (uint8_t)(SEN66_VOC_value[3]);
|
||||
|
||||
Tx_bunbaegi_buffer[15] = 0;
|
||||
Tx_bunbaegi_buffer[16] = 0;
|
||||
Tx_bunbaegi_buffer[17] = 0;
|
||||
Tx_bunbaegi_buffer[18] = 0;
|
||||
Tx_bunbaegi_buffer[19] = 0;
|
||||
Tx_bunbaegi_buffer[20] = 0;
|
||||
Tx_bunbaegi_buffer[21] = 0;
|
||||
//room2
|
||||
Tx_bunbaegi_buffer[22] = (uint8_t)(SEN66_pm10p0[4]>>8);
|
||||
Tx_bunbaegi_buffer[23] = (uint8_t)(SEN66_pm10p0[4]);
|
||||
Tx_bunbaegi_buffer[24] = (uint8_t)(SEN66_humidity_value[4]>>8);
|
||||
Tx_bunbaegi_buffer[25] = (uint8_t)(SEN66_humidity_value[4]);
|
||||
Tx_bunbaegi_buffer[26] = (uint8_t)(SEN66_temperature_value[4]>>8);
|
||||
Tx_bunbaegi_buffer[27] = (uint8_t)(SEN66_temperature_value[4]);
|
||||
Tx_bunbaegi_buffer[28] = (uint8_t)(SEN66_CO2_value[4]>>8);
|
||||
Tx_bunbaegi_buffer[29] = (uint8_t)(SEN66_CO2_value[4]);
|
||||
Tx_bunbaegi_buffer[30] = (uint8_t)(SEN66_VOC_value[4]>>8);;
|
||||
Tx_bunbaegi_buffer[31] = (uint8_t)(SEN66_VOC_value[4]);
|
||||
|
||||
Tx_bunbaegi_buffer[32] = 0;
|
||||
}
|
||||
else if(Polling_VSP_Mode == 0x12) //air qurity
|
||||
{
|
||||
Tx_bunbaegi_buffer[4] = 0x12; //VSP_MODE
|
||||
// room3
|
||||
Tx_bunbaegi_buffer[5] = (uint8_t)(SEN66_pm10p0[5]>>8);
|
||||
Tx_bunbaegi_buffer[6] = (uint8_t)(SEN66_pm10p0[5]);
|
||||
Tx_bunbaegi_buffer[7] = (uint8_t)(SEN66_humidity_value[5]>>8);
|
||||
Tx_bunbaegi_buffer[8] = (uint8_t)(SEN66_humidity_value[5]);
|
||||
Tx_bunbaegi_buffer[9] = (uint8_t)(SEN66_temperature_value[5]>>8);
|
||||
Tx_bunbaegi_buffer[10] = (uint8_t)(SEN66_temperature_value[5]);
|
||||
Tx_bunbaegi_buffer[11] = (uint8_t)(SEN66_CO2_value[5]>>8);
|
||||
Tx_bunbaegi_buffer[12] = (uint8_t)(SEN66_CO2_value[5]);
|
||||
Tx_bunbaegi_buffer[13] = (uint8_t)(SEN66_VOC_value[5]>>8);;
|
||||
Tx_bunbaegi_buffer[14] = (uint8_t)(SEN66_VOC_value[5]);
|
||||
|
||||
Tx_bunbaegi_buffer[15] = 0;
|
||||
Tx_bunbaegi_buffer[16] = 0;
|
||||
Tx_bunbaegi_buffer[17] = 0;
|
||||
Tx_bunbaegi_buffer[18] = 0;
|
||||
Tx_bunbaegi_buffer[19] = 0;
|
||||
Tx_bunbaegi_buffer[20] = 0;
|
||||
Tx_bunbaegi_buffer[21] = 0;
|
||||
//room4
|
||||
Tx_bunbaegi_buffer[22] = (uint8_t)(SEN66_pm10p0[6]>>8);
|
||||
Tx_bunbaegi_buffer[23] = (uint8_t)(SEN66_pm10p0[6]);
|
||||
Tx_bunbaegi_buffer[24] = (uint8_t)(SEN66_humidity_value[6]>>8);
|
||||
Tx_bunbaegi_buffer[25] = (uint8_t)(SEN66_humidity_value[6]);
|
||||
Tx_bunbaegi_buffer[26] = (uint8_t)(SEN66_temperature_value[6]>>8);
|
||||
Tx_bunbaegi_buffer[27] = (uint8_t)(SEN66_temperature_value[6]);
|
||||
Tx_bunbaegi_buffer[28] = (uint8_t)(SEN66_CO2_value[6]>>8);
|
||||
Tx_bunbaegi_buffer[29] = (uint8_t)(SEN66_CO2_value[6]);
|
||||
Tx_bunbaegi_buffer[30] = (uint8_t)(SEN66_VOC_value[6]>>8);;
|
||||
Tx_bunbaegi_buffer[31] = (uint8_t)(SEN66_VOC_value[6]);
|
||||
|
||||
Tx_bunbaegi_buffer[32] = 0;
|
||||
}
|
||||
else //normal
|
||||
{
|
||||
id_2 = 1; //living room
|
||||
|
||||
Tx_bunbaegi_buffer[4] = 0x00; //VSP_MODE
|
||||
Tx_bunbaegi_buffer[5] = Diffuser_Power[id_2]; //Power Mode
|
||||
Tx_bunbaegi_buffer[6] = Diffuser_Run_Mode[id_2]; //Run Mode
|
||||
Tx_bunbaegi_buffer[7] = Diffuser_Fan_Speed[id_2]; //Fan Speed
|
||||
|
||||
if(Command_request_type & TYPE_POWER)Tx_bunbaegi_buffer[5] |= 0x80;
|
||||
if(Command_request_type & TYPE_MODE)Tx_bunbaegi_buffer[6] |= 0x80;
|
||||
if(Command_request_type & TYPE_FAN_SPEED)Tx_bunbaegi_buffer[7] |= 0x80;
|
||||
Command_request_type = 0;
|
||||
|
||||
Tx_bunbaegi_buffer[8] = 0; //reservation time
|
||||
Tx_bunbaegi_buffer[9] = UV_OnOff; //Heater/UV
|
||||
Tx_bunbaegi_buffer[10] = 0; //Filter Reset
|
||||
Tx_bunbaegi_buffer[11] = 0; //RPM Start
|
||||
Tx_bunbaegi_buffer[12] = 0; //RPM Stop
|
||||
|
||||
Tx_bunbaegi_buffer[13] = (uint8_t)(SEN66_pm2p5[id_2]>>8);
|
||||
Tx_bunbaegi_buffer[14] = (uint8_t)(SEN66_pm2p5[id_2]);
|
||||
Tx_bunbaegi_buffer[15] = (uint8_t)(SEN66_pm10p0[id_2]>>8);
|
||||
Tx_bunbaegi_buffer[16] = (uint8_t)(SEN66_pm10p0[id_2]);
|
||||
Tx_bunbaegi_buffer[17] = (uint8_t)(SEN66_humidity_value[id_2]>>8);
|
||||
Tx_bunbaegi_buffer[18] = (uint8_t)(SEN66_humidity_value[id_2]);
|
||||
Tx_bunbaegi_buffer[19] = (uint8_t)(SEN66_temperature_value[id_2]>>8);
|
||||
Tx_bunbaegi_buffer[20] = (uint8_t)(SEN66_temperature_value[id_2]);
|
||||
Tx_bunbaegi_buffer[21] = (uint8_t)(SEN66_CO2_value[id_2]>>8);
|
||||
Tx_bunbaegi_buffer[22] = (uint8_t)(SEN66_CO2_value[id_2]);
|
||||
|
||||
Tx_bunbaegi_buffer[23] = 0;
|
||||
Tx_bunbaegi_buffer[24] = 0;//(uint8_t)(Energy_Consumption>>8);
|
||||
Tx_bunbaegi_buffer[25] = 0;//(uint8_t)(Energy_Consumption);
|
||||
Tx_bunbaegi_buffer[26] = 0;
|
||||
|
||||
Tx_bunbaegi_buffer[27] = (uint8_t)(SEN66_VOC_value[id_2]>>8);;
|
||||
Tx_bunbaegi_buffer[28] = (uint8_t)(SEN66_VOC_value[id_2]);
|
||||
|
||||
Tx_bunbaegi_buffer[29] = (uint8_t)(Filter_timer_change>>8);
|
||||
Tx_bunbaegi_buffer[30] = (uint8_t)(Filter_timer_change);
|
||||
|
||||
Tx_bunbaegi_buffer[31] = (uint8_t)(Soja_timer_change>>8);
|
||||
Tx_bunbaegi_buffer[32] = (uint8_t)(Soja_timer_change);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Tx_bunbaegi_buffer[4] = 0x00; //VSP_MODE
|
||||
Tx_bunbaegi_buffer[5] = Diffuser_Power[id_2]; //Power Mode
|
||||
Tx_bunbaegi_buffer[6] = Diffuser_Run_Mode[id_2]; //Run Mode
|
||||
Tx_bunbaegi_buffer[7] = Diffuser_Fan_Speed[id_2]; //Fan Speed
|
||||
|
||||
|
||||
Tx_bunbaegi_buffer[8] = 0; //reservation time
|
||||
Tx_bunbaegi_buffer[9] = 0; //Heater/UV
|
||||
Tx_bunbaegi_buffer[10] = 0; //Filter Reset
|
||||
Tx_bunbaegi_buffer[11] = 0; //RPM Start
|
||||
Tx_bunbaegi_buffer[12] = 0; //RPM Stop
|
||||
|
||||
Tx_bunbaegi_buffer[13] = (uint8_t)(SEN66_pm2p5[id_2]>>8);
|
||||
Tx_bunbaegi_buffer[14] = (uint8_t)(SEN66_pm2p5[id_2]);
|
||||
Tx_bunbaegi_buffer[15] = (uint8_t)(SEN66_pm10p0[id_2]>>8);
|
||||
Tx_bunbaegi_buffer[16] = (uint8_t)(SEN66_pm10p0[id_2]);
|
||||
Tx_bunbaegi_buffer[17] = (uint8_t)(SEN66_humidity_value[id_2]>>8);
|
||||
Tx_bunbaegi_buffer[18] = (uint8_t)(SEN66_humidity_value[id_2]);
|
||||
Tx_bunbaegi_buffer[19] = (uint8_t)(SEN66_temperature_value[id_2]>>8);
|
||||
Tx_bunbaegi_buffer[20] = (uint8_t)(SEN66_temperature_value[id_2]);
|
||||
Tx_bunbaegi_buffer[21] = (uint8_t)(SEN66_CO2_value[id_2]>>8);
|
||||
Tx_bunbaegi_buffer[22] = (uint8_t)(SEN66_CO2_value[id_2]);
|
||||
|
||||
Tx_bunbaegi_buffer[23] = 0;
|
||||
Tx_bunbaegi_buffer[24] = 0;
|
||||
Tx_bunbaegi_buffer[25] = 0;
|
||||
Tx_bunbaegi_buffer[26] = 0;
|
||||
|
||||
Tx_bunbaegi_buffer[27] = (uint8_t)(SEN66_VOC_value[id_2]>>8);;
|
||||
Tx_bunbaegi_buffer[28] = (uint8_t)(SEN66_VOC_value[id_2]);
|
||||
|
||||
Tx_bunbaegi_buffer[29] = (uint8_t)(Filter_timer_change>>8);
|
||||
Tx_bunbaegi_buffer[30] = (uint8_t)(Filter_timer_change);
|
||||
|
||||
Tx_bunbaegi_buffer[31] = (uint8_t)(Soja_timer_change>>8);
|
||||
Tx_bunbaegi_buffer[32] = (uint8_t)(Soja_timer_change);
|
||||
}
|
||||
|
||||
Tx_bunbaegi_buffer[33] = (uint8_t)(Err_Code>>8); //Error Code
|
||||
Tx_bunbaegi_buffer[34] = (uint8_t)(Err_Code&0x00FF); //Error Code
|
||||
|
||||
Tx_bunbaegi_buffer[35] = 0;
|
||||
Tx_bunbaegi_buffer[36] = 0;
|
||||
|
||||
icrc = CRC16(Tx_bunbaegi_buffer, 37);
|
||||
Tx_bunbaegi_buffer[37] = (uint8_t)(icrc>>8); //CRC16
|
||||
Tx_bunbaegi_buffer[38] = (uint8_t)(icrc & 0x00FF); //CRC16
|
||||
|
||||
BUNBAGI_485_DIR = 1;
|
||||
SCUART_Write(SC1, Tx_bunbaegi_buffer, 39);
|
||||
while ( !(SC1->TRSR & SC_TRSR_TX_EMPTY_F_Msk) );
|
||||
delay_us(200);
|
||||
BUNBAGI_485_DIR = 0;
|
||||
}
|
||||
}
|
||||
else //////BunBaeGi Polling
|
||||
{
|
||||
Tx_bunbaegi_buffer[4] = 0x00; //VSP_MODE
|
||||
Tx_bunbaegi_buffer[5] = Diffuser_Power[id_2]; //Power Mode
|
||||
Tx_bunbaegi_buffer[6] = Diffuser_Run_Mode[id_2]; //Run Mode
|
||||
Tx_bunbaegi_buffer[7] = Diffuser_Fan_Speed[id_2]; //Fan Speed
|
||||
|
||||
if(Diffuser_Run_Mode[1] == 0x02) // auto mode
|
||||
{
|
||||
Tx_bunbaegi_buffer[8] = Light_Bright[id_2]; //LED
|
||||
|
||||
Tx_bunbaegi_buffer[9] = Diffuser_Air_quality[id_2]; //Air Quality
|
||||
Tx_bunbaegi_buffer[10] = Diffuser_Dmp_Ang_SA[id_2]; //Damper Angle - SA
|
||||
Tx_bunbaegi_buffer[11] = Diffuser_Dmp_Ang_RA[id_2]; //Damper Angle - EA
|
||||
Tx_bunbaegi_buffer[12] = (uint8_t)(urpm1>>8); //SA RPM
|
||||
Tx_bunbaegi_buffer[13] = (uint8_t)(urpm1); //SA RPM
|
||||
Tx_bunbaegi_buffer[14] = (uint8_t)(urpm2>>8); //EA RPM
|
||||
Tx_bunbaegi_buffer[15] = (uint8_t)(urpm2); //EA RPM
|
||||
Tx_bunbaegi_buffer[16] = 0; //SA Reset
|
||||
Tx_bunbaegi_buffer[17] = 0; //EA Reset
|
||||
Tx_bunbaegi_buffer[18] = 0; //Reserve Hour
|
||||
Tx_bunbaegi_buffer[19] = 0; //Blank
|
||||
Tx_bunbaegi_buffer[20] = 0; //Blank
|
||||
Tx_bunbaegi_buffer[21] = 0; //Blank
|
||||
Tx_bunbaegi_buffer[22] = 0; //Blank
|
||||
Tx_bunbaegi_buffer[23] = 0; //Version
|
||||
Tx_bunbaegi_buffer[24] = 0; //Version
|
||||
Tx_bunbaegi_buffer[25] = (uint8_t)(Err_Code>>8); //Error Code
|
||||
Tx_bunbaegi_buffer[26] = (uint8_t)(Err_Code&0x00FF); //Error Code
|
||||
}
|
||||
else
|
||||
{
|
||||
Tx_bunbaegi_buffer[8] = Light_Bright[id_2]; //LED
|
||||
|
||||
Tx_bunbaegi_buffer[9] = Diffuser_Air_quality[id_2]; //Air Quality
|
||||
Tx_bunbaegi_buffer[10] = Diffuser_Dmp_Ang_SA[id_2]; //Damper Angle - SA
|
||||
Tx_bunbaegi_buffer[11] = Diffuser_Dmp_Ang_RA[id_2]; //Damper Angle - EA
|
||||
Tx_bunbaegi_buffer[12] = 0; //SA RPM
|
||||
Tx_bunbaegi_buffer[13] = 0; //SA RPM
|
||||
Tx_bunbaegi_buffer[14] = 0; //EA RPM
|
||||
Tx_bunbaegi_buffer[15] = 0; //EA RPM
|
||||
Tx_bunbaegi_buffer[16] = 0; //SA Reset
|
||||
Tx_bunbaegi_buffer[17] = 0; //EA Reset
|
||||
Tx_bunbaegi_buffer[18] = 0; //Reserve Hour
|
||||
Tx_bunbaegi_buffer[19] = 0; //Blank
|
||||
Tx_bunbaegi_buffer[20] = 0; //Blank
|
||||
Tx_bunbaegi_buffer[21] = 0; //Blank
|
||||
Tx_bunbaegi_buffer[22] = 0; //Blank
|
||||
Tx_bunbaegi_buffer[23] = 0; //Version
|
||||
Tx_bunbaegi_buffer[24] = 0; //Version
|
||||
Tx_bunbaegi_buffer[25] = (uint8_t)(Err_Code>>8); //Error Code
|
||||
Tx_bunbaegi_buffer[26] = (uint8_t)(Err_Code&0x00FF); //Error Code
|
||||
}
|
||||
icrc = CRC16(Tx_bunbaegi_buffer, 27);
|
||||
Tx_bunbaegi_buffer[27] = (uint8_t)(icrc>>8); //CRC16
|
||||
Tx_bunbaegi_buffer[28] = (uint8_t)(icrc & 0x00FF); //CRC16
|
||||
|
||||
BUNBAGI_485_DIR = 1;
|
||||
SCUART_Write(SC1, Tx_bunbaegi_buffer, 29);
|
||||
while ( !(SC1->TRSR & SC_TRSR_TX_EMPTY_F_Msk) );
|
||||
delay_us(200);
|
||||
BUNBAGI_485_DIR = 0;
|
||||
}
|
||||
|
||||
if(tx_sel == 1) // TX -> SA
|
||||
{
|
||||
if(sa_sel++ >= 4)
|
||||
{
|
||||
tx_sel = 2;
|
||||
sa_sel = 1;
|
||||
}
|
||||
}
|
||||
else if(tx_sel == 2)
|
||||
{
|
||||
if(ea_sel++ >= 4)
|
||||
{
|
||||
ea_sel = 1;
|
||||
tx_sel = 3;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sa_sel = 1;
|
||||
ea_sel = 1;
|
||||
tx_sel = 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Diffuser_parsing(void)
|
||||
{
|
||||
uint8_t id = 0;
|
||||
|
||||
if(Rx_bunbaegi_buffer[2]==0x02) //EA
|
||||
{
|
||||
id = Rx_bunbaegi_buffer[3];
|
||||
|
||||
|
||||
SEN66_pm10p0[id] = ((uint16_t)Rx_bunbaegi_buffer[12]<<8 | (uint16_t)Rx_bunbaegi_buffer[13]);
|
||||
SEN66_pm4p0[id] = ((uint16_t)Rx_bunbaegi_buffer[14]<<8 | (uint16_t)Rx_bunbaegi_buffer[15]);
|
||||
SEN66_pm2p5[id] = ((uint16_t)Rx_bunbaegi_buffer[16]<<8 | (uint16_t)Rx_bunbaegi_buffer[17]);
|
||||
SEN66_pm1p0[id] = ((uint16_t)Rx_bunbaegi_buffer[18]<<8 | (uint16_t)Rx_bunbaegi_buffer[19]);
|
||||
SEN66_humidity_value[id] = ((uint16_t)Rx_bunbaegi_buffer[20]<<8 | (uint16_t)Rx_bunbaegi_buffer[21]);
|
||||
SEN66_temperature_value[id] = ((uint16_t)Rx_bunbaegi_buffer[22]<<8 | (uint16_t)Rx_bunbaegi_buffer[23]);
|
||||
SEN66_VOC_value[id] = ((uint16_t)Rx_bunbaegi_buffer[24]<<8 | (uint16_t)Rx_bunbaegi_buffer[25]);
|
||||
SEN66_NOx_value[id] = ((uint16_t)Rx_bunbaegi_buffer[26]<<8 | (uint16_t)Rx_bunbaegi_buffer[27]);
|
||||
SEN66_CO2_value[id] = ((uint16_t)Rx_bunbaegi_buffer[28]<<8 | (uint16_t)Rx_bunbaegi_buffer[29]);
|
||||
/*
|
||||
bunbaegi_Err_Code = ((uint16_t)Rx_bunbaegi_buffer[33]<<8 | (uint16_t)Rx_bunbaegi_buffer[34]);
|
||||
|
||||
if(bunbaegi_Err_Code == 0x0100)
|
||||
{
|
||||
if(id == 0)
|
||||
{
|
||||
Err_Code |= ERROR_SENSOR_MODULE_LIVING;
|
||||
}
|
||||
else if(id == 1)
|
||||
{
|
||||
Err_Code |= ERROR_SENSOR_MODULE_ROOM1;
|
||||
}
|
||||
else if(id == 2)
|
||||
{
|
||||
Err_Code |= ERROR_SENSOR_MODULE_ROOM2;
|
||||
}
|
||||
else if(id == 3)
|
||||
{
|
||||
Err_Code |= ERROR_SENSOR_MODULE_ROOM3;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(id == 0)
|
||||
{
|
||||
Err_Code &= ~ERROR_SENSOR_MODULE_LIVING;
|
||||
}
|
||||
else if(id == 1)
|
||||
{
|
||||
Err_Code &= ~ERROR_SENSOR_MODULE_ROOM1;
|
||||
}
|
||||
else if(id == 2)
|
||||
{
|
||||
Err_Code &= ~ERROR_SENSOR_MODULE_ROOM2;
|
||||
}
|
||||
else if(id == 3)
|
||||
{
|
||||
Err_Code &= ~ERROR_SENSOR_MODULE_ROOM3;
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
memset(Rx_bunbaegi_buffer, 0, sizeof(Rx_bunbaegi_buffer));
|
||||
}
|
||||
|
||||
|
||||
void EachRoomCon_parsing(void)
|
||||
{
|
||||
uint8_t id = 0;
|
||||
|
||||
id = Rx_bunbaegi_buffer[3];
|
||||
Diffuser_VSP_Mode = Rx_bunbaegi_buffer[4];
|
||||
|
||||
if(Diffuser_VSP_Mode == 0x10) //setting
|
||||
{
|
||||
switch(Rx_bunbaegi_buffer[5]) // vsp_select
|
||||
{
|
||||
case 1:
|
||||
s_FAN1_VEN_1_DAN = Rx_bunbaegi_buffer[6];
|
||||
s_FAN2_VEN_1_DAN = Rx_bunbaegi_buffer[7];
|
||||
s_FAN1_VEN_2_DAN = Rx_bunbaegi_buffer[8];
|
||||
s_FAN2_VEN_2_DAN = Rx_bunbaegi_buffer[9];
|
||||
s_FAN1_VEN_3_DAN = Rx_bunbaegi_buffer[10];
|
||||
s_FAN2_VEN_3_DAN = Rx_bunbaegi_buffer[11];
|
||||
|
||||
Test_RPM_Vent_Reference[1] = ((uint16_t)Rx_bunbaegi_buffer[18]<<8) + ((uint16_t)Rx_bunbaegi_buffer[19]);
|
||||
Test_RPM_Vent_Delta[1] = ((uint16_t)Rx_bunbaegi_buffer[20]<<8) + ((uint16_t)Rx_bunbaegi_buffer[21]);
|
||||
Test_RPM_Vent_Reference[2] = ((uint16_t)Rx_bunbaegi_buffer[22]<<8) + ((uint16_t)Rx_bunbaegi_buffer[23]);
|
||||
Test_RPM_Vent_Delta[2] = ((uint16_t)Rx_bunbaegi_buffer[24]<<8) + ((uint16_t)Rx_bunbaegi_buffer[25]);
|
||||
break;
|
||||
case 2:
|
||||
s_FAN1_AIR_1_DAN = Rx_bunbaegi_buffer[6];
|
||||
s_FAN2_AIR_1_DAN = Rx_bunbaegi_buffer[7];
|
||||
s_FAN1_AIR_2_DAN = Rx_bunbaegi_buffer[8];
|
||||
s_FAN2_AIR_2_DAN = Rx_bunbaegi_buffer[9];
|
||||
s_FAN1_AIR_3_DAN = Rx_bunbaegi_buffer[10];
|
||||
s_FAN2_AIR_3_DAN = Rx_bunbaegi_buffer[11];
|
||||
|
||||
Test_RPM_Air_Reference[1] = ((uint16_t)Rx_bunbaegi_buffer[18]<<8) + ((uint16_t)Rx_bunbaegi_buffer[19]);
|
||||
Test_RPM_Air_Delta[1] = ((uint16_t)Rx_bunbaegi_buffer[20]<<8) + ((uint16_t)Rx_bunbaegi_buffer[21]);
|
||||
Test_RPM_Air_Reference[2] = ((uint16_t)Rx_bunbaegi_buffer[22]<<8) + ((uint16_t)Rx_bunbaegi_buffer[23]);
|
||||
Test_RPM_Air_Delta[2] = ((uint16_t)Rx_bunbaegi_buffer[24]<<8) + ((uint16_t)Rx_bunbaegi_buffer[25]);
|
||||
break;
|
||||
case 3:
|
||||
s_FAN1_BYPASS_1_DAN = Rx_bunbaegi_buffer[6];
|
||||
s_FAN2_BYPASS_1_DAN = Rx_bunbaegi_buffer[7];
|
||||
s_FAN1_BYPASS_2_DAN = Rx_bunbaegi_buffer[8];
|
||||
s_FAN2_BYPASS_2_DAN = Rx_bunbaegi_buffer[9];
|
||||
s_FAN1_BYPASS_3_DAN = Rx_bunbaegi_buffer[10];
|
||||
s_FAN2_BYPASS_3_DAN = Rx_bunbaegi_buffer[11];
|
||||
|
||||
if(Rx_bunbaegi_buffer[36] == 1)EEP_Save_Flag = 1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
Roomcon_Num = Rx_bunbaegi_buffer[30];
|
||||
Diffuser_Num = Rx_bunbaegi_buffer[31];
|
||||
}
|
||||
else if(Diffuser_VSP_Mode == 0) //normal
|
||||
{
|
||||
if(id == 5) // living room
|
||||
{
|
||||
// Com_Err_Flag = 0;
|
||||
// Roomcon_Com_Count = 0;
|
||||
|
||||
if(Rx_bunbaegi_buffer[5] & 0x80)
|
||||
{
|
||||
Diffuser_Power[1] = Rx_bunbaegi_buffer[5] & 0x7f;
|
||||
Diffuser_Power[2] = Rx_bunbaegi_buffer[5] & 0x7f;
|
||||
Diffuser_Power[3] = Rx_bunbaegi_buffer[5] & 0x7f;
|
||||
Diffuser_Power[4] = Rx_bunbaegi_buffer[5] & 0x7f;
|
||||
Diffuser_Power[5] = Rx_bunbaegi_buffer[5] & 0x7f;
|
||||
Diffuser_Power[6] = Rx_bunbaegi_buffer[5] & 0x7f;
|
||||
|
||||
Power_On = Rx_bunbaegi_buffer[5] & 0x7f;
|
||||
}
|
||||
if(Rx_bunbaegi_buffer[6] & 0x80)
|
||||
{
|
||||
Diffuser_Run_Mode[1] = Rx_bunbaegi_buffer[6] & 0x7f;
|
||||
Diffuser_Run_Mode[2] = Rx_bunbaegi_buffer[6] & 0x7f;
|
||||
Diffuser_Run_Mode[3] = Rx_bunbaegi_buffer[6] & 0x7f;
|
||||
Diffuser_Run_Mode[4] = Rx_bunbaegi_buffer[6] & 0x7f;
|
||||
Diffuser_Run_Mode[5] = Rx_bunbaegi_buffer[6] & 0x7f;
|
||||
Diffuser_Run_Mode[6] = Rx_bunbaegi_buffer[6] & 0x7f;
|
||||
|
||||
if(Diffuser_Run_Mode[1] == 0x01) Run_Mode = MODE_VENTILATION;
|
||||
else if(Diffuser_Run_Mode[1] == 0x02) Run_Mode = MODE_AUTO;
|
||||
else if(Diffuser_Run_Mode[1] == 0x04) Run_Mode = MODE_BYPASS;
|
||||
else if(Diffuser_Run_Mode[1] == 0x08) Run_Mode = MODE_AIRCLEAN;
|
||||
else Run_Mode = MODE_VENTILATION;
|
||||
}
|
||||
if(Rx_bunbaegi_buffer[7] & 0x80)
|
||||
{
|
||||
Diffuser_Fan_Speed[1] = Rx_bunbaegi_buffer[7] & 0x7f;
|
||||
Diffuser_Fan_Speed[2] = Rx_bunbaegi_buffer[7] & 0x7f;
|
||||
Diffuser_Fan_Speed[3] = Rx_bunbaegi_buffer[7] & 0x7f;
|
||||
Diffuser_Fan_Speed[4] = Rx_bunbaegi_buffer[7] & 0x7f;
|
||||
Diffuser_Fan_Speed[5] = Rx_bunbaegi_buffer[7] & 0x7f;
|
||||
Diffuser_Fan_Speed[6] = Rx_bunbaegi_buffer[7] & 0x7f;
|
||||
|
||||
Fan_Mode = Rx_bunbaegi_buffer[7] & 0x7f;
|
||||
}
|
||||
|
||||
if(Rx_bunbaegi_buffer[8] & 0x80)
|
||||
{
|
||||
Set_Reserve_timer_sec = (uint32_t)(Rx_bunbaegi_buffer[7] & 0x7f)*3600;
|
||||
}
|
||||
|
||||
if(Rx_bunbaegi_buffer[9]&0x80)
|
||||
{
|
||||
Heater_OnOff = Rx_bunbaegi_buffer[9]&0x01;
|
||||
|
||||
//UV_OnOff = (Rx_bunbaegi_buffer[9]>>4)&0x01;
|
||||
}
|
||||
|
||||
if(Rx_bunbaegi_buffer[10] == 0x01)Filter_Reset_Flag |= 1;
|
||||
|
||||
// if(Rx_bunbaegi_buffer[23] & 0x80)
|
||||
// {
|
||||
if(Rx_bunbaegi_buffer[23] & 0x01){Diffuser_Power[2] = 1;}else{Diffuser_Power[2] = 0;}
|
||||
if(Rx_bunbaegi_buffer[23] & 0x02){Diffuser_Power[3] = 1;}else{Diffuser_Power[3] = 0;}
|
||||
if(Rx_bunbaegi_buffer[23] & 0x04){Diffuser_Power[4] = 1;}else{Diffuser_Power[4] = 0;}
|
||||
if(Rx_bunbaegi_buffer[23] & 0x08){Diffuser_Power[5] = 1;}else{Diffuser_Power[5] = 0;}
|
||||
// }
|
||||
|
||||
|
||||
}
|
||||
else if(id == 0) //wrong id
|
||||
{
|
||||
}
|
||||
else // id 2,3,4,5 room 1 ~3
|
||||
{
|
||||
if(Rx_bunbaegi_buffer[5] & 0x80)
|
||||
{
|
||||
Diffuser_Power[id] = Rx_bunbaegi_buffer[5] & 0x7f;
|
||||
}
|
||||
if(Rx_bunbaegi_buffer[6] & 0x80)
|
||||
{
|
||||
Diffuser_Run_Mode[id] = Rx_bunbaegi_buffer[6] & 0x7f;
|
||||
}
|
||||
if(Rx_bunbaegi_buffer[7] & 0x80)
|
||||
{
|
||||
Diffuser_Fan_Speed[id] = Rx_bunbaegi_buffer[7] & 0x7f;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SC1_IRQHandler(void)
|
||||
{
|
||||
uint8_t data;
|
||||
|
||||
data = SCUART_READ(SC1);
|
||||
|
||||
rx_bunbaegi_check(data);
|
||||
Rx_roomcon_TimeOut = 50;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void InCom_process(void)
|
||||
{
|
||||
if(Rx_bunbaegi_complete == 1)
|
||||
{
|
||||
Rx_bunbaegi_complete = 0;
|
||||
|
||||
if(Packet_Type == 0x01)//Diffuser
|
||||
{
|
||||
Diffuser_parsing();
|
||||
//Display_Com_Err_Count = 0;
|
||||
//Err_Code &= ~ERROR_COM_DISPLAY;
|
||||
}
|
||||
else if(Packet_Type == 0x02)//RoomCon
|
||||
{
|
||||
EachRoomCon_parsing();
|
||||
//Sensor_Com_Err_Count = 0;
|
||||
//Err_Code &= ~ERROR_COM_SENSOR;
|
||||
}
|
||||
}
|
||||
else if(InCom_polling_timer == 0)
|
||||
{
|
||||
InCom_polling_timer = 100;
|
||||
|
||||
Bunbaegi_Polling();
|
||||
/*if(Sensor_Com_Err_Count++ >= 20)
|
||||
{
|
||||
Sensor_Com_Err_Count = 20;
|
||||
Err_Code |= ERROR_COM_SENSOR;
|
||||
}*/
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t Debug_TxBuff[250];
|
||||
uint8_t Debug_Tx_Cycle = 0;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
uint16_t m_CO2_Level_1 = 600;
|
||||
uint16_t m_CO2_Level_2 = 700;
|
||||
uint16_t m_CO2_Level_3 = 800;
|
||||
uint16_t m_CO2_Level_4 = 900;
|
||||
|
||||
uint16_t m_VOC_Level_1 = 250;
|
||||
uint16_t m_VOC_Level_2 = 300;
|
||||
uint16_t m_VOC_Level_3 = 350;
|
||||
uint16_t m_VOC_Level_4 = 400;
|
||||
|
||||
uint16_t m_PM2_5_Level_1 = 15;
|
||||
uint16_t m_PM2_5_Level_2 = 30;
|
||||
uint16_t m_PM2_5_Level_3 = 50;
|
||||
uint16_t m_PM2_5_Level_4 = 70;
|
||||
|
||||
uint8_t Ext_Run_Mode = 0;
|
||||
uint8_t Ext_Select_Room = 0, Pre_Ext_Select_Room = 0;
|
||||
|
||||
uint8_t Tx_485_buff[100];
|
||||
uint32_t Damper_Status_Display = 0;
|
||||
uint8_t Force_Damper_Mode = 0;
|
||||
|
||||
uint8_t Force_Damper_run = 0;
|
||||
extern uint16_t Target_Step_Count[7];
|
||||
@@ -0,0 +1,495 @@
|
||||
|
||||
|
||||
|
||||
|
||||
void delay_ms(uint32_t ms);
|
||||
void delay_us(uint32_t us);
|
||||
void PowerDownFunction(void);
|
||||
void GPIO_Init(void);
|
||||
void PWM_Init(void);
|
||||
void Timer0_Init(void);
|
||||
void Timer1_Init(void);
|
||||
void SYS_Init(void);
|
||||
void UART0_Init(void);
|
||||
void UART1_Init(void);
|
||||
void SC0_Init();
|
||||
void SC1_Init();
|
||||
void ADC_Init(void);
|
||||
|
||||
void com_home_network_process(void);
|
||||
void com_display_process(void);
|
||||
void com_roomcon_process(void);
|
||||
void roomcon_parsing(void);
|
||||
void display_parsing(void);
|
||||
void tx_home_network_data(void);
|
||||
void RJ_Com_Err_Check(void);
|
||||
|
||||
|
||||
uint16_t CRC16(uint8_t *puchMsg, uint16_t usDataLen); /* My_bunbaeggi.c 정의 (My_Homenet.c 공용) */
|
||||
void com_bunbaegi_process(void);
|
||||
void bunbaegi_parsing(void);
|
||||
void InCom_process(void);
|
||||
|
||||
|
||||
void BLDC1_Duty_Change(uint32_t BLDC1_duty); // 0 ~ 10000
|
||||
void BLDC2_Duty_Change(uint32_t BLDC2_duty); // 0 ~ 10000
|
||||
|
||||
|
||||
void init_process(void);
|
||||
void ADC_Sensing(void);
|
||||
void EEP_Save_process(void);
|
||||
void Heater_process(void);
|
||||
void Reservation_process(void);
|
||||
void Filter_process(void);
|
||||
uint8_t Filter_Reset_Process(void);
|
||||
void Exception_mode_process(void);
|
||||
|
||||
uint16_t Aeverage_calculator(uint16_t val, uint16_t * array_val);
|
||||
void Reserve_Time_Update(uint8_t rtime);
|
||||
void Power_off_process(uint8_t set);
|
||||
|
||||
void Step_process(void);
|
||||
uint8_t Step_motor_init(void);
|
||||
void Fan_Error_Check(void);
|
||||
void Fan_Speed_process(void); // 100ms
|
||||
void Bldc_check(void);
|
||||
|
||||
void PWM_out_process(void);
|
||||
void Step_M1_Stop();
|
||||
void Step_M2_Stop();
|
||||
void Step_M3_Stop();
|
||||
void Step_M4_Stop();
|
||||
void Step_M5_Stop();
|
||||
void Step_M6_Stop();
|
||||
void Fan_Speed_Setting(uint8_t r_mode, uint8_t f_speed);
|
||||
|
||||
void Pre_Mode_Control(void);
|
||||
|
||||
void UV_process(void);
|
||||
|
||||
uint8_t Air_Quality_process(void);
|
||||
void Filter_RPM_Check(void);
|
||||
void Filter_Rpm_Auto_Cal_Process(void);
|
||||
|
||||
extern volatile uint8_t Rx_display_complete, Rx_homenet_complete, Rx_roomcon_complete, Rx_debug_complete;
|
||||
extern volatile uint8_t Tx_display_flag, Tx_homenet_flag, Tx_roomcon_flag, Tx_debug_flag;
|
||||
|
||||
extern uint8_t Tx_homenet_buffer[60],Tx_display_buffer[25],Tx_roomcon232_buffer[25],Tx_debug_buffer[60];
|
||||
extern uint8_t Rx_homenet_buffer[60],Rx_display_buffer[25],Rx_roomcon232_buffer[25],Rx_debug_buffer[20];
|
||||
|
||||
extern uint8_t Uart_Rx0,Uart_Rx1,Uart_Rx2, Uart_Rx3 ;
|
||||
extern uint8_t Rx_homenet_TimeOut, Rx_roomcon_TimeOut, Rx_debug_TimeOut;
|
||||
|
||||
extern uint8_t Test_Fan1_Speed, Test_Fan2_Speed;
|
||||
extern uint8_t Test_Fan1_Ven_1_dan, Test_Fan1_Ven_2_dan, Test_Fan1_Ven_3_dan, Test_Fan1_Ven_4_dan, \
|
||||
Test_Fan1_Air_1_dan, Test_Fan1_Air_2_dan, Test_Fan1_Air_3_dan, Test_Fan1_Air_4_dan,\
|
||||
Test_Fan1_Bypass_1_dan, Test_Fan1_Bypass_2_dan, Test_Fan1_Bypass_3_dan, Test_Fan1_Bypass_4_dan;
|
||||
extern uint8_t Test_Fan2_Ven_1_dan, Test_Fan2_Ven_2_dan, Test_Fan2_Ven_3_dan, Test_Fan2_Ven_4_dan,\
|
||||
Test_Fan2_Air_1_dan, Test_Fan2_Air_2_dan, Test_Fan2_Air_3_dan , Test_Fan2_Air_4_dan,\
|
||||
Test_Fan2_Bypass_1_dan, Test_Fan2_Bypass_2_dan, Test_Fan2_Bypass_3_dan, Test_Fan2_Bypass_4_dan;
|
||||
|
||||
extern volatile uint16_t Filter_timer_clean;
|
||||
extern volatile uint16_t Filter_timer_change;
|
||||
extern volatile uint16_t Soja_timer_change;
|
||||
|
||||
extern volatile uint8_t Run_Mode, Auto_Mode, Fan_Mode;
|
||||
extern uint8_t Power_On;
|
||||
|
||||
extern uint16_t SEN66_pm1p0[7], SEN66_pm2p5[7], SEN66_pm4p0[7], SEN66_pm10p0[7];
|
||||
extern int16_t SEN66_humidity_value[7];
|
||||
extern int16_t SEN66_temperature_value[7];
|
||||
extern int16_t SEN66_VOC_value[7];
|
||||
extern int16_t SEN66_NOx_value[7];
|
||||
extern uint16_t SEN66_CO2_value[7];
|
||||
|
||||
extern uint8_t Diffuser_VSP_Mode;
|
||||
extern uint8_t Diffuser_Power[7];
|
||||
extern uint8_t Diffuser_Run_Mode[7];
|
||||
extern uint8_t Diffuser_Fan_Speed[7];
|
||||
extern uint8_t Diffuser_Dmp_Ang_SA[7],Memory_Diffuser_Dmp_Ang_SA[7]; //Damper Angle
|
||||
extern uint8_t Diffuser_Dmp_Ang_RA[7],Memory_Diffuser_Dmp_Ang_RA[7]; //Damper Angle
|
||||
extern uint8_t Diffuser_Air_quality[7],Memory_Diffuser_Air_quality[7];
|
||||
extern uint8_t Diffuser_Damper_Manual[7]; /* 대시보드 수동 댐퍼 오버라이드(각실 1~4) */
|
||||
extern uint8_t Diffuser_Led_Manual[7]; /* 대시보드 수동 LED 오버라이드(각실 1~4) */
|
||||
extern uint16_t Reserve_Remain_Sec; /* (꺼짐)예약 잔여초 (0=예약없음) */
|
||||
|
||||
|
||||
extern volatile uint8_t Vsp_Mode[5];
|
||||
extern volatile uint8_t Pre_Vsp_Mode;
|
||||
|
||||
extern uint16_t Test_RPM_Vent_Reference[5];
|
||||
extern uint16_t Test_RPM_Vent_Delta[5];
|
||||
extern uint16_t Test_RPM_Air_Reference[5];
|
||||
extern uint16_t Test_RPM_Air_Delta[5];
|
||||
|
||||
extern uint16_t RPM_Vent_Reference[5];
|
||||
extern uint16_t RPM_Vent_Delta[5];
|
||||
extern uint16_t RPM_Air_Reference[5];
|
||||
extern uint16_t RPM_Air_Delta[5];
|
||||
|
||||
#define ST_LED PA10
|
||||
|
||||
#define TEMP1_ADC PA0
|
||||
#define TEMP2_ADC PA1
|
||||
|
||||
#define VOLUM1_ADC PA2
|
||||
#define VOLUM2_ADC PA3
|
||||
|
||||
#define CURRENT_VOL PA4
|
||||
|
||||
#define P_SW PA11
|
||||
#define BLDC_PW PB7
|
||||
#define UV_PW PA5
|
||||
|
||||
#define P_UV PF2
|
||||
|
||||
#define HOOD_485_TX PB1
|
||||
#define HOOD_485_RX PB0
|
||||
#define HOOD_485_DIR PB2
|
||||
|
||||
#define HOMENET_485_TX PB5
|
||||
#define HOMENET_485_RX PB4
|
||||
#define HOMENET_485_DIR PB6
|
||||
|
||||
#define ROOMCON_TX PA8
|
||||
#define ROOMCON_RX PA9
|
||||
|
||||
#define BUNBAGI_485_TX2 PC0
|
||||
#define BUNBAGI_485_RX2 PC1
|
||||
#define BUNBAGI_485_DIR PC7
|
||||
|
||||
#define BLDC_SA_PWM PB11
|
||||
#define BLDC_SA_FG_IN PE5
|
||||
#define BLDC_EA_PWM PA12
|
||||
#define BLDC_EA_FG_IN PA13
|
||||
|
||||
|
||||
#define REG_STEP_M1_A PB12
|
||||
#define REG_STEP_M1_B PB13
|
||||
#define REG_STEP_M1_NA PB14
|
||||
#define REG_STEP_M1_NB PB8
|
||||
|
||||
#define REG_STEP_M2_A PB15
|
||||
#define REG_STEP_M2_B PC14
|
||||
#define REG_STEP_M2_NA PC15
|
||||
#define REG_STEP_M2_NB PC6
|
||||
|
||||
#define REG_STEP_M3_A PA6
|
||||
#define REG_STEP_M3_B PA14
|
||||
#define REG_STEP_M3_NA PA15
|
||||
#define REG_STEP_M3_NB PC8
|
||||
|
||||
#define REG_STEP_M4_A PC9
|
||||
#define REG_STEP_M4_B PC10
|
||||
#define REG_STEP_M4_NA PC11
|
||||
#define REG_STEP_M4_NB PB9
|
||||
|
||||
#define REG_STEP_M5_A PB10
|
||||
#define REG_STEP_M5_B PC2
|
||||
#define REG_STEP_M5_NA PC3
|
||||
#define REG_STEP_M5_NB PD15
|
||||
|
||||
#define REG_STEP_M6_A PD14
|
||||
#define REG_STEP_M6_B PD7
|
||||
#define REG_STEP_M6_NA PD6
|
||||
#define REG_STEP_M6_NB PB3
|
||||
|
||||
|
||||
|
||||
#define DAMPER_EA 1
|
||||
#define DAMPER_OA 2
|
||||
#define DAMPER_BYPASS 3
|
||||
#define DAMPER_SA 4
|
||||
#define DAMPER_RA 5 // 3???í¼
|
||||
#define DAMPER_AIR 6
|
||||
|
||||
//---------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
#define ERROR_FILTER_CLEAN 0x01
|
||||
#define ERROR_FILTER_CHANGE 0x02
|
||||
#define ERROR_SOJA_CHANGE 0x04
|
||||
#define ERROR_TEMP_SENSOR 0x08
|
||||
|
||||
#define ERROR_SA_FAN 0x80
|
||||
#define ERROR_EA_FAN 0x20
|
||||
|
||||
#define ERROR_PROTECT 0x10 //2020.9.2
|
||||
#define ERROR_SOMETIME 0x40 //2020.9.10
|
||||
|
||||
|
||||
|
||||
#define RX_DATA_MODE_NORMAL 0
|
||||
#define RX_DATA_MODE_EVENT 0x01
|
||||
#define RX_DATA_MODE_RESTART1 0x02
|
||||
#define RX_DATA_MODE_RESTART2 0x12
|
||||
#define RX_DATA_MODE_VSP 0x03
|
||||
#define RX_DATA_MODE_EXIT 0x04
|
||||
#define RX_DATA_FILTER_INFO 0x05 //(룸콘 -> 환기장치)
|
||||
#define RX_DATA_SENSOR_INFO 0x06 //(환기장치 -> 룸콘)
|
||||
#define RX_DATA_CONTROLL 0x07 //(환기장치 -> 룸콘)
|
||||
#define RX_DATA_HOOD_INFO 0x0A //(main -> room) // // add 2022.1.25
|
||||
#define RX_DATA_CONTROLL_INFO 0x80 //(룸콘 -> 환기장치)
|
||||
#define RX_DATA_RPM_INFO 0x81 //(환기장치 -> 룸콘) // 2021.5.31
|
||||
#define RX_DATA_ERROR_CLEAR 0x22 //2021.5.31
|
||||
|
||||
//-----------------------------------------------------------------
|
||||
#define SPEC_VERSION1_INFO 0x01
|
||||
#define SPEC_VERSION2_INFO 0x00
|
||||
#define SPEC_DEVICE_TYPE_INFO 0x04//0x10 // C1 = 0x01, C2 = 0x02, E = 0x03, EBSN = 0x04, EBN = 0x05, EF = 0x06, A = 0x07, EF2=0x08, EGI=0x09, C4=0x10
|
||||
#define SPEC_CMH_INFO 0x03 // 50=1, 70=2, 100=3, 120=4, 150=5, 200=6, 250=7
|
||||
|
||||
// 1 : 일반 히터O - 환기/자동
|
||||
// 2 : 바이패스 히터O - 환기/자동/바이패스
|
||||
// 3 : 공청 히터O - 환기/자동/공청/바이패스
|
||||
// 4 : 일반 히터X - 환기/자동
|
||||
// 5 : 바이패스 히터X - 환기/자동/바이패스
|
||||
// 6 : 공청 히터X - 환기/자동/공청/바이패스
|
||||
// 0x10 | 대림사양
|
||||
// 0x20 | UV 사용
|
||||
#define SPEC_MODE_INFO 0x16
|
||||
|
||||
// 연동없음 = 0, 삼성SDS=1, 씨브이넷=2, 아이콘트롤=3, 코맥스=4, 코콤=5, 현대통신=6, | 세익=0x10, 신동테크=0x20, 한국하니웰=0x30, 한성시스코=0x40
|
||||
#define SPEC_HOMENET_INFO 0x00 //
|
||||
#define SPEC_HOOD_INFO 0x01 //
|
||||
|
||||
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
#if(((SPEC_MODE_INFO&0x0F) ==0x03)||((SPEC_MODE_INFO&0x0F) ==0x06))
|
||||
|
||||
// airclean mode O
|
||||
#define MODE_VENTILATION 0
|
||||
#define MODE_AUTO 1
|
||||
#define MODE_AIRCLEAN 2
|
||||
#define MODE_BYPASS 3
|
||||
#define MODE_FAN_TEST 4
|
||||
|
||||
|
||||
#else
|
||||
|
||||
// airclean mode X
|
||||
#define MODE_VENTILATION 0
|
||||
#define MODE_AUTO 1
|
||||
#define MODE_BYPASS 2
|
||||
#define MODE_AIRCLEAN 3 // not used
|
||||
#define MODE_FAN_TEST 4
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
//---------------------------------------------------------------
|
||||
|
||||
#define MAIN_FW_VERSION 0x01
|
||||
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
|
||||
#define EEP_ADDR_START 0x01
|
||||
#define EEP_ADDR_MODBUS_ID 0x05
|
||||
|
||||
|
||||
#define EEP_FAN1_VEN_1_DAN 10
|
||||
#define EEP_FAN1_VEN_2_DAN 11
|
||||
#define EEP_FAN1_VEN_3_DAN 12
|
||||
#define EEP_FAN1_VEN_4_DAN 13
|
||||
#define EEP_FAN1_AIR_1_DAN 14
|
||||
#define EEP_FAN1_AIR_2_DAN 15
|
||||
#define EEP_FAN1_AIR_3_DAN 16
|
||||
#define EEP_FAN1_AIR_4_DAN 17
|
||||
#define EEP_FAN1_BYPASS_1_DAN 18
|
||||
#define EEP_FAN1_BYPASS_2_DAN 19
|
||||
#define EEP_FAN1_BYPASS_3_DAN 20
|
||||
#define EEP_FAN1_BYPASS_4_DAN 21
|
||||
|
||||
#define EEP_FAN2_VEN_1_DAN 22
|
||||
#define EEP_FAN2_VEN_2_DAN 23
|
||||
#define EEP_FAN2_VEN_3_DAN 24
|
||||
#define EEP_FAN2_VEN_4_DAN 25
|
||||
#define EEP_FAN2_AIR_1_DAN 26
|
||||
#define EEP_FAN2_AIR_2_DAN 27
|
||||
#define EEP_FAN2_AIR_3_DAN 28
|
||||
#define EEP_FAN2_AIR_4_DAN 29
|
||||
#define EEP_FAN2_BYPASS_1_DAN 30
|
||||
#define EEP_FAN2_BYPASS_2_DAN 31
|
||||
#define EEP_FAN2_BYPASS_3_DAN 32
|
||||
#define EEP_FAN2_BYPASS_4_DAN 33
|
||||
|
||||
#define EEP_FILTER_CLEAN_HOUR_H 34
|
||||
#define EEP_FILTER_CLEAN_HOUR_L 35
|
||||
#define EEP_FILTER_CHANGE_HOUR_H 36
|
||||
#define EEP_FILTER_CHANGE_HOUR_L 37
|
||||
#define EEP_SOJA_CHANGE_HOUR_H 38
|
||||
#define EEP_SOJA_CHANGE_HOUR_L 39
|
||||
|
||||
#define EEP_BLACKOUT_POWER_ON 40
|
||||
#define EEP_BLACKOUT_RUN_MODE 41
|
||||
#define EEP_BLACKOUT_FAN_MODE 42
|
||||
|
||||
/* 260520 히스테리시스 프리셋(임계+데드밴드) 영속화 영역 43~127
|
||||
- 구 m_*_Level (45~68) 영역 폐기·재사용. 1프레임=4B, 페이지 127엔트리 한계 내(약 123) */
|
||||
#define EEP_HYST_PRESET 43 /* 1B : Hyst_Preset 0~2 (유효성 마커 겸용) */
|
||||
#define EEP_HYST_DB_BASE 44 /* 12B u8 : Co2_Db[3],Pm25_Db[3],Pm10_Db[3],Voc_Db[3] */
|
||||
#define EEP_THR_CO2_BASE 56 /* 24B u16: Co2_Thr[3][4] */
|
||||
#define EEP_THR_VOC_BASE 80 /* 24B u16: Voc_Thr[3][4] */
|
||||
#define EEP_THR_PM25_BASE 104 /* 12B u8 : Pm25_Thr[3][4] */
|
||||
#define EEP_THR_PM10_BASE 116 /* 12B u8 : Pm10_Thr[3][4] (116~127) */
|
||||
|
||||
#define EEP_SIZE 128
|
||||
|
||||
|
||||
//---------------------------------------------------
|
||||
|
||||
#define COMMAND_REQUEST_FILTER_INFO 0x05
|
||||
#define COMMAND_REQUEST_SENSOR_INFO 0x06
|
||||
#define COMMAND_CONTROLL 0x07 // mode / speed / reservaion
|
||||
|
||||
#define TYPE_POWER 0x40
|
||||
#define TYPE_MODE 0x01
|
||||
#define TYPE_FAN_SPEED 0x02
|
||||
#define TYPE_RESERVATION 0x04
|
||||
#define TYPE_FILTER_INFO 0x10
|
||||
#define TYPE_SENSOR_INFO 0x20
|
||||
#define TYPE_HOOD_STATE 0x40 // add 2022.1.25
|
||||
#define TYPE_SEND_FLAG 0x80
|
||||
|
||||
|
||||
|
||||
extern volatile uint8_t Roomcon_connect_mode;
|
||||
extern volatile uint32_t Set_Reserve_timer_sec;
|
||||
extern volatile uint8_t Set_Run_Mode, Set_Fan_Mode;
|
||||
extern uint32_t urpm1, urpm2;
|
||||
extern uint8_t EEP_Save_Flag;
|
||||
|
||||
extern uint8_t Sometime_Mode;
|
||||
|
||||
extern uint8_t BlackOut_Power_On;
|
||||
extern uint8_t BlackOut_Run_Mode;
|
||||
extern uint8_t BlackOut_Fan_Mode;
|
||||
|
||||
extern uint8_t Command_request_type;
|
||||
/* PC대시보드 제어 → 룸컨(RJ2) 상태 푸시 래치. bunbaegi 의 Command_request_type=0 클리어와 무관하게
|
||||
* 유지되어 룸컨 누락 방지. TYPE_POWER(0x40)=TYPE_HOOD_STATE 충돌 때문에 모드/풍량 비트만 사용. */
|
||||
extern volatile uint8_t Homenet_RJ_Request;
|
||||
|
||||
|
||||
uint16_t Diffuser_Damper_process(uint8_t mode);//100ms
|
||||
uint8_t Air_Quality_damper_process(void);
|
||||
uint8_t Air_Quality_color_process(void);
|
||||
|
||||
extern volatile uint16_t CO2_Histeresys;
|
||||
|
||||
extern volatile uint8_t Err_Code;
|
||||
extern uint8_t Target_Fan1_Speed, Target_Fan2_Speed;
|
||||
|
||||
extern volatile uint32_t Reserve_timer_sec;
|
||||
|
||||
extern uint8_t s_FAN1_VEN_1_DAN;
|
||||
extern uint8_t s_FAN1_VEN_2_DAN;
|
||||
extern uint8_t s_FAN1_VEN_3_DAN;
|
||||
extern uint8_t s_FAN1_VEN_4_DAN;
|
||||
extern uint8_t s_FAN1_AIR_1_DAN;
|
||||
extern uint8_t s_FAN1_AIR_2_DAN;
|
||||
extern uint8_t s_FAN1_AIR_3_DAN;
|
||||
extern uint8_t s_FAN1_AIR_4_DAN;
|
||||
extern uint8_t s_FAN1_BYPASS_1_DAN;
|
||||
extern uint8_t s_FAN1_BYPASS_2_DAN;
|
||||
extern uint8_t s_FAN1_BYPASS_3_DAN;
|
||||
extern uint8_t s_FAN1_BYPASS_4_DAN;
|
||||
|
||||
extern uint8_t s_FAN2_VEN_1_DAN;
|
||||
extern uint8_t s_FAN2_VEN_2_DAN;
|
||||
extern uint8_t s_FAN2_VEN_3_DAN;
|
||||
extern uint8_t s_FAN2_VEN_4_DAN;
|
||||
extern uint8_t s_FAN2_AIR_1_DAN;
|
||||
extern uint8_t s_FAN2_AIR_2_DAN;
|
||||
extern uint8_t s_FAN2_AIR_3_DAN;
|
||||
extern uint8_t s_FAN2_AIR_4_DAN;
|
||||
extern uint8_t s_FAN2_BYPASS_1_DAN;
|
||||
extern uint8_t s_FAN2_BYPASS_2_DAN;
|
||||
extern uint8_t s_FAN2_BYPASS_3_DAN;
|
||||
extern uint8_t s_FAN2_BYPASS_4_DAN;
|
||||
|
||||
|
||||
extern signed int In_Temperature;
|
||||
extern signed int Out_Temperature;
|
||||
extern uint8_t Heater_OnOff, UV_OnOff;
|
||||
extern uint16_t com_roomcon_delay;
|
||||
extern uint8_t Filter_Reset_Flag;
|
||||
|
||||
extern uint8_t RJ_Vsp_Mode;
|
||||
|
||||
extern volatile uint32_t Reserve_timer_sec;
|
||||
extern volatile uint8_t Reserve_hour, Pre_Reserve_hour;
|
||||
|
||||
extern uint16_t m_CO2_Level_1;
|
||||
extern uint16_t m_CO2_Level_2;
|
||||
extern uint16_t m_CO2_Level_3,m_CO2_Level_4;
|
||||
|
||||
extern uint16_t m_VOC_Level_1;
|
||||
extern uint16_t m_VOC_Level_2;
|
||||
extern uint16_t m_VOC_Level_3,m_VOC_Level_4;
|
||||
|
||||
extern uint16_t m_PM2_5_Level_1;
|
||||
extern uint16_t m_PM2_5_Level_2;
|
||||
extern uint16_t m_PM2_5_Level_3,m_PM2_5_Level_4;
|
||||
|
||||
extern uint32_t Damper_Status_Display;
|
||||
extern uint8_t Force_Damper_Mode;
|
||||
extern uint8_t Force_Damper_run;
|
||||
extern uint8_t Focus_Mode;
|
||||
extern uint16_t Focus_Mode_RunTime;
|
||||
extern uint8_t ROOM_air_volume[7];
|
||||
|
||||
/* 260520 사양 자동 동작로직 (집중/분산) - My_system.c */
|
||||
extern uint16_t Co2_Thr[3][4];
|
||||
extern uint16_t Pm25_Thr[3][4];
|
||||
extern uint16_t Pm10_Thr[3][4];
|
||||
extern uint16_t Voc_Thr[3][4];
|
||||
extern uint16_t Co2_Db[3];
|
||||
extern uint16_t Pm25_Db[3];
|
||||
extern uint16_t Pm10_Db[3];
|
||||
extern uint16_t Voc_Db[3];
|
||||
extern uint8_t Hyst_Preset; /* 0 ECO / 1 NORMAL / 2 TURBO */
|
||||
extern uint8_t Room_Level[7]; /* 실별 오염단계 0~4 */
|
||||
extern uint8_t Load_Score; /* 부하 총점 0~16 */
|
||||
extern uint8_t Auto_P_max;
|
||||
extern uint8_t Auto_dP;
|
||||
extern uint8_t Auto_Concentrate; /* 0 분산 / 1 집중 */
|
||||
|
||||
|
||||
uint8_t Hood_process(void);
|
||||
void Hood_RS485_process(void);
|
||||
|
||||
extern uint16_t Hood_Warming_up_Timer;
|
||||
extern uint8_t Tx_Yeundong_Delay;
|
||||
|
||||
extern uint8_t Yuendong_Enable;
|
||||
extern uint8_t Yeungong_Status;
|
||||
extern uint8_t Hood_Power_On;
|
||||
extern uint8_t Hood_Fan_Mode;
|
||||
extern uint8_t Hood_Control;
|
||||
|
||||
extern uint8_t Ext_Run_Mode, Pre_Ext_Run_Mode, Ext_Select_Room, Pre_Ext_Select_Room;
|
||||
extern uint8_t Hood_Status;
|
||||
extern uint8_t Hood_Yeundong_flag;
|
||||
extern uint16_t Ext_Run_Mode_Off_Delay;
|
||||
extern uint8_t Memory_Hood_Status;
|
||||
extern uint8_t My_Memory_Run_Mode, My_Memory_Fan_Mode;
|
||||
extern uint8_t Hood_YeunDong_Enable;
|
||||
extern uint16_t Hood_Conn_Timeout; /* 후드 485 통신연결 생존 카운터(ms) */
|
||||
|
||||
extern uint8_t HREV_Hood_Control;
|
||||
|
||||
/* HOMENET(ErvDashboard) 바이너리 프로토콜 - My_Uart.c */
|
||||
void Homenet_Rx_Byte(uint8_t b);
|
||||
void Homenet_Process(void);
|
||||
void Homenet_Send_Status(void);
|
||||
void Homenet_Build_Status(uint8_t *p);
|
||||
extern uint8_t Homenet_Reset_State;
|
||||
|
||||
extern uint8_t Total_Air_Volume, Pre_Total_Air_Volume;
|
||||
extern uint8_t Light_Bright[6];
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,189 @@
|
||||
/**************************************************************************//**
|
||||
* @file main.c
|
||||
* @version V1.00
|
||||
* $Revision: 4 $
|
||||
* $Date: 14/09/11 5:23p $
|
||||
* @brief Show how to pixel on and off on LCD panel.
|
||||
*
|
||||
* @note
|
||||
* Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
|
||||
*****************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include "Nano100Series.h"
|
||||
#include "adc.h"
|
||||
#include "gpio.h"
|
||||
#include "pwm.h"
|
||||
#include "timer.h"
|
||||
#include "uart.h"
|
||||
#include "sys.h"
|
||||
#include "clk.h"
|
||||
#include "EEPROM_Emulate.h"
|
||||
|
||||
|
||||
#include "My_define.h"
|
||||
|
||||
#define __wdt_setting() SYS_UnlockReg(); WDT_Open(WDT_TIMEOUT_2POW14, 0, TRUE, FALSE); SYS_LockReg();
|
||||
#define __wdt_reset() SYS_UnlockReg(); WDT_RESET_COUNTER(); SYS_LockReg();
|
||||
|
||||
|
||||
extern volatile uint16_t Process_1000ms , Process_333ms, Process_100ms, Process_10ms, Process_5ms;
|
||||
extern volatile uint8_t Err_Code;
|
||||
|
||||
|
||||
|
||||
extern volatile uint8_t Tx_Mode_Event, Tx_Fan_Event, Tx_Reserve_Event;
|
||||
extern volatile uint8_t Reserve_hour;
|
||||
|
||||
extern volatile uint8_t Roomcon_connect_mode;
|
||||
|
||||
uint32_t Reset_src_value = 0;
|
||||
|
||||
// HERV~~~MAIN
|
||||
void main(void)
|
||||
{
|
||||
/*
|
||||
// === 부팅 검증 코드 — 다른 모든 init 보다 먼저 ===
|
||||
{
|
||||
// 1. SYS 보호 레지스터 unlock — BSP 함수 사용
|
||||
SYS_UnlockReg();
|
||||
|
||||
// 2. GPIO AHB 클럭 강제 활성화 (Nano100: CLK->AHBCLK bit 0 = GPIO_EN)
|
||||
CLK->AHBCLK |= CLK_AHBCLK_GPIO_EN_Msk;
|
||||
|
||||
// 3. PA10 을 push-pull OUTPUT 으로 강제 설정 (PMD[21:20] = 01)
|
||||
PA->PMD &= ~(0x3UL << 20);
|
||||
PA->PMD |= (0x1UL << 20);
|
||||
|
||||
// 4. LED 무조건 토글 — 이게 깜박이면 부팅 자체는 정상
|
||||
while(1) {
|
||||
PA->DOUT ^= (1UL << 10);
|
||||
for(volatile uint32_t i = 0; i < 200000; i++);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
uint8_t Indicate_Error = 0;
|
||||
|
||||
|
||||
|
||||
__disable_irq(); // NuEclipse(GCC) 포팅: __disable_interrupt() → __disable_irq() (CMSIS 표준)
|
||||
|
||||
SYS_Init();
|
||||
|
||||
SYS_EnableBOD(SYS_BODCTL_BOD25_RST_EN_Msk, SYS_BODCTL_BOD25_EN_Msk);
|
||||
|
||||
|
||||
ADC_Init();
|
||||
|
||||
GPIO_Init();
|
||||
PWM_Init();
|
||||
Timer0_Init();
|
||||
Timer1_Init();
|
||||
|
||||
UART0_Init(); // INT1 Hood
|
||||
UART1_Init(); // to EX1 - homnet
|
||||
SC0_Init(); // to RJ roomcon
|
||||
SC1_Init(); // to EX2 --> BUNBAGI
|
||||
|
||||
Init_EEPROM(eep_data_size, eep_page_amount);
|
||||
Search_Valid_Page();
|
||||
|
||||
__enable_irq(); // NuEclipse(GCC) 포팅: __enable_interrupt() → __enable_irq() (CMSIS 표준)
|
||||
|
||||
Reset_src_value = SYS_GetResetSrc();
|
||||
init_process();
|
||||
SYS_ClearResetSrc(Reset_src_value);
|
||||
|
||||
__wdt_setting();
|
||||
|
||||
while(1)
|
||||
{
|
||||
Hood_RS485_process(); // Hood connect - uart0
|
||||
//com_display_process(); // display
|
||||
com_roomcon_process(); // roomcon
|
||||
InCom_process(); // Bunbaegi
|
||||
Homenet_Process(); // HOMENET(ErvDashboard) 수신 명령 처리 + REQ_STATUS 응답
|
||||
|
||||
if(Process_5ms == 0)
|
||||
{
|
||||
Process_5ms = 5;
|
||||
}
|
||||
|
||||
if(Process_10ms == 0)
|
||||
{
|
||||
Process_10ms = 3000;
|
||||
}
|
||||
|
||||
if(Process_100ms == 0)
|
||||
{
|
||||
Process_100ms = 100;
|
||||
Fan_Speed_process();
|
||||
Fan_Error_Check();
|
||||
Tx_display_flag = 1;
|
||||
}
|
||||
if(Process_333ms == 0)
|
||||
{
|
||||
Process_333ms = 200;
|
||||
Hood_process();
|
||||
__wdt_reset();
|
||||
}
|
||||
|
||||
Indicate_Error = Err_Code;
|
||||
Indicate_Error &= ~(ERROR_SOMETIME|ERROR_PROTECT|ERROR_FILTER_CHANGE|ERROR_FILTER_CLEAN|ERROR_SOJA_CHANGE);
|
||||
|
||||
if((Indicate_Error))
|
||||
{
|
||||
if(Process_1000ms < 600)ST_LED = 0;
|
||||
else ST_LED = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(Process_1000ms < 2)ST_LED = 0;
|
||||
else ST_LED = 1;
|
||||
}
|
||||
|
||||
|
||||
if(Process_1000ms == 0)
|
||||
{
|
||||
Process_1000ms = 999;
|
||||
|
||||
/* (꺼짐)예약 카운트다운 : 0 도달 시 전원 OFF (대시보드 CTRL_RESERVE) */
|
||||
if(Reserve_Remain_Sec > 0)
|
||||
{
|
||||
Reserve_Remain_Sec--;
|
||||
if(Reserve_Remain_Sec == 0)
|
||||
{
|
||||
Power_On = 0;
|
||||
Set_Run_Mode = 0;
|
||||
Set_Fan_Mode = 0;
|
||||
Command_request_type |= (TYPE_MODE | TYPE_FAN_SPEED);
|
||||
}
|
||||
}
|
||||
|
||||
Bldc_check();
|
||||
ADC_Sensing();
|
||||
|
||||
Filter_process();
|
||||
|
||||
Air_Quality_color_process();
|
||||
Total_Air_Volume = Air_Quality_damper_process(); // 260520 사양 자동 동작로직(집중/분산) - 1s 주기
|
||||
Homenet_Send_Status(); // HOMENET(ErvDashboard) STATUS(0x81) 1s 주기 송신
|
||||
|
||||
RJ_Com_Err_Check();
|
||||
#if((SPEC_MODE_INFO&0x20) == 0x20) // UV 옵션
|
||||
UV_process(); // 1sec
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
if(EEP_Save_Flag == 1)
|
||||
{
|
||||
EEP_Save_Flag = 0;
|
||||
EEP_Save_process();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,536 @@
|
||||
/**************************************************************************//**
|
||||
* @file PWM.c
|
||||
* @version V1.00
|
||||
* $Revision: 14 $
|
||||
* $Date: 14/09/04 11:58a $
|
||||
* @brief NANO100 series PWM driver source file
|
||||
*
|
||||
* @note
|
||||
* Copyright (C) 2013-2014 Nuvoton Technology Corp. All rights reserved.
|
||||
*****************************************************************************/
|
||||
#include "Nano100Series.h"
|
||||
|
||||
/** @addtogroup NANO100_Device_Driver NANO100 Device Driver
|
||||
@{
|
||||
*/
|
||||
|
||||
/** @addtogroup NANO100_PWM_Driver PWM Driver
|
||||
@{
|
||||
*/
|
||||
|
||||
|
||||
/** @addtogroup NANO100_PWM_EXPORTED_FUNCTIONS PWM Exported Functions
|
||||
@{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief This function config PWM generator and get the nearest frequency in edge aligned auto-reload mode
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
|
||||
* @param[in] u32Frequency Target generator frequency
|
||||
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%...
|
||||
* @return Nearest frequency clock in nano second
|
||||
* @note Since every two channels, (0 & 1), (2 & 3), (4 & 5), shares a prescaler. Call this API to configure PWM frequency may affect
|
||||
* existing frequency of other channel.
|
||||
*/
|
||||
uint32_t PWM_ConfigOutputChannel (PWM_T *pwm,
|
||||
uint32_t u32ChannelNum,
|
||||
uint32_t u32Frequency,
|
||||
uint32_t u32DutyCycle)
|
||||
{
|
||||
uint32_t i;
|
||||
uint32_t u32ClkSrc;
|
||||
uint32_t u32PWM_Clock = SystemCoreClock;
|
||||
uint8_t u8Divider = 1, u8Prescale = 0xFF;
|
||||
uint16_t u16CNR = 0xFFFF;
|
||||
|
||||
if(pwm == PWM0)
|
||||
u32ClkSrc = (CLK->CLKSEL1 & (CLK_CLKSEL1_PWM0_CH01_S_Msk << (u32ChannelNum & 2))) >> (CLK_CLKSEL1_PWM0_CH01_S_Pos + (u32ChannelNum & 2));
|
||||
|
||||
else
|
||||
u32ClkSrc = (CLK->CLKSEL2 & (CLK_CLKSEL2_PWM1_CH01_S_Msk << (u32ChannelNum & 2))) >> (CLK_CLKSEL2_PWM1_CH01_S_Pos + (u32ChannelNum & 2));
|
||||
|
||||
switch (u32ClkSrc)
|
||||
{
|
||||
case 0:
|
||||
u32PWM_Clock = __HXT;
|
||||
break;
|
||||
case 1:
|
||||
u32PWM_Clock = __LXT;
|
||||
break;
|
||||
case 2:
|
||||
u32PWM_Clock = SystemCoreClock;
|
||||
break;
|
||||
case 3:
|
||||
u32PWM_Clock = __HIRC12M;
|
||||
break;
|
||||
}
|
||||
|
||||
for(; u8Divider < 17; u8Divider <<= 1) // clk divider could only be 1, 2, 4, 8, 16
|
||||
{
|
||||
i = (u32PWM_Clock / u32Frequency) / u8Divider;
|
||||
// If target value is larger than CNR * prescale, need to use a larger divider
|
||||
if(i > (0x10000 * 0x100))
|
||||
continue;
|
||||
|
||||
// CNR = 0xFFFF + 1, get a prescaler that CNR value is below 0xFFFF
|
||||
u8Prescale = (i + 0xFFFF)/ 0x10000;
|
||||
|
||||
// u8Prescale must at least be 2, otherwise the output stop
|
||||
if(u8Prescale < 3)
|
||||
u8Prescale = 2;
|
||||
|
||||
i /= u8Prescale;
|
||||
|
||||
if(i <= 0x10000)
|
||||
{
|
||||
if(i == 1)
|
||||
u16CNR = 1; // Too fast, and PWM cannot generate expected frequency...
|
||||
else
|
||||
u16CNR = i;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
// Store return value here 'cos we're gonna change u8Divider & u8Prescale & u16CNR to the real value to fill into register
|
||||
i = u32PWM_Clock / (u8Prescale * u8Divider * u16CNR);
|
||||
|
||||
u8Prescale -= 1;
|
||||
u16CNR -= 1;
|
||||
// convert to real register value
|
||||
if(u8Divider == 1)
|
||||
u8Divider = 4;
|
||||
else if (u8Divider == 2)
|
||||
u8Divider = 0;
|
||||
else if (u8Divider == 4)
|
||||
u8Divider = 1;
|
||||
else if (u8Divider == 8)
|
||||
u8Divider = 2;
|
||||
else // 16
|
||||
u8Divider = 3;
|
||||
|
||||
// every two channels share a prescaler
|
||||
while((pwm->INTSTS & PWM_INTSTS_PRESSYNC_Msk ) == PWM_INTSTS_PRESSYNC_Msk);
|
||||
pwm->PRES = (pwm->PRES & ~(PWM_PRES_CP01_Msk << ((u32ChannelNum >> 1) * 8))) | (u8Prescale << ((u32ChannelNum >> 1) * 8));
|
||||
pwm->CLKSEL = (pwm->CLKSEL & ~(PWM_CLKSEL_CLKSEL0_Msk << (4 * u32ChannelNum))) | (u8Divider << (4 * u32ChannelNum));
|
||||
pwm->CTL |= (PWM_CTL_CH0MOD_Msk << (u32ChannelNum * 8));
|
||||
while((pwm->INTSTS & (PWM_INTSTS_DUTY0SYNC_Msk << u32ChannelNum)) == (PWM_INTSTS_DUTY0SYNC_Msk << u32ChannelNum));
|
||||
if(u32DutyCycle == 0)
|
||||
*(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) &= ~PWM_DUTY_CM_Msk;
|
||||
else
|
||||
{
|
||||
*(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) &= ~PWM_DUTY_CM_Msk;
|
||||
*(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) |= ((u32DutyCycle * (u16CNR + 1) / 10000 - 1) << PWM_DUTY_CM_Pos);
|
||||
}
|
||||
*(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) &= ~PWM_DUTY_CN_Msk;
|
||||
*(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) |= u16CNR;
|
||||
|
||||
return(i);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function config PWM capture and get the nearest unit time
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
|
||||
* @param[in] u32UnitTimeNsec Unit time of counter
|
||||
* @param[in] u32CaptureEdge Condition to latch the counter
|
||||
* @return Nearest unit time in nano second
|
||||
* @note Since every two channels, (0 & 1), (2 & 3), (4 & 5), shares a prescaler. Call this API to configure PWM frequency may affect
|
||||
* existing frequency of other channel.
|
||||
*/
|
||||
uint32_t PWM_ConfigCaptureChannel (PWM_T *pwm,
|
||||
uint32_t u32ChannelNum,
|
||||
uint32_t u32UnitTimeNsec,
|
||||
uint32_t u32CaptureEdge)
|
||||
{
|
||||
uint32_t i;
|
||||
uint32_t u32ClkSrc;
|
||||
uint32_t u32PWM_Clock = SystemCoreClock;
|
||||
uint8_t u8Divider = 1, u8Prescale = 0xFF;
|
||||
uint16_t u16CNR = 0xFFFF;
|
||||
|
||||
if(pwm == PWM0)
|
||||
u32ClkSrc = (CLK->CLKSEL1 & (CLK_CLKSEL1_PWM0_CH01_S_Msk << (u32ChannelNum & 2))) >> (CLK_CLKSEL1_PWM0_CH01_S_Pos + (u32ChannelNum & 2));
|
||||
else
|
||||
u32ClkSrc = (CLK->CLKSEL2 & (CLK_CLKSEL2_PWM1_CH01_S_Msk << (u32ChannelNum & 2))) >> (CLK_CLKSEL2_PWM1_CH01_S_Pos + (u32ChannelNum & 2));
|
||||
|
||||
switch (u32ClkSrc)
|
||||
{
|
||||
case 0:
|
||||
u32PWM_Clock = __HXT;
|
||||
break;
|
||||
case 1:
|
||||
u32PWM_Clock = __LXT;
|
||||
break;
|
||||
case 2:
|
||||
u32PWM_Clock = SystemCoreClock;
|
||||
break;
|
||||
case 3:
|
||||
u32PWM_Clock = __HIRC12M;
|
||||
break;
|
||||
}
|
||||
|
||||
for(; u8Divider < 17; u8Divider <<= 1) // clk divider could only be 1, 2, 4, 8, 16
|
||||
{
|
||||
i = ((long long)(u32PWM_Clock / u8Divider) * u32UnitTimeNsec) / 1000000000;
|
||||
|
||||
// If target value is larger than 0xFF, need to use a larger divider
|
||||
if(i > (0xFF))
|
||||
continue;
|
||||
|
||||
u8Prescale = i;
|
||||
|
||||
// u8Prescale must at least be 2, otherwise the output stop
|
||||
if(u8Prescale < 3)
|
||||
u8Prescale = 2;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
// Store return value here 'cos we're gonna change u8Divider & u8Prescale & u16CNR to the real value to fill into register
|
||||
i = (long long) (u8Prescale * u8Divider) * 1000000000 / u32PWM_Clock;
|
||||
|
||||
u8Prescale -= 1;
|
||||
u16CNR -= 1;
|
||||
// convert to real register value
|
||||
if(u8Divider == 1)
|
||||
u8Divider = 4;
|
||||
else if (u8Divider == 2)
|
||||
u8Divider = 0;
|
||||
else if (u8Divider == 4)
|
||||
u8Divider = 1;
|
||||
else if (u8Divider == 8)
|
||||
u8Divider = 2;
|
||||
else // 16
|
||||
u8Divider = 3;
|
||||
|
||||
// every two channels share a prescaler
|
||||
while((pwm->INTSTS & PWM_INTSTS_PRESSYNC_Msk ) == PWM_INTSTS_PRESSYNC_Msk);
|
||||
pwm->PRES = (pwm->PRES & ~(PWM_PRES_CP01_Msk << ((u32ChannelNum >> 1) * 8))) | (u8Prescale << ((u32ChannelNum >> 1) * 8));
|
||||
pwm->CLKSEL = (pwm->CLKSEL & ~(PWM_CLKSEL_CLKSEL0_Msk << (4 * u32ChannelNum))) | (u8Divider << (4 * u32ChannelNum));
|
||||
pwm->CTL |= (PWM_CTL_CH0MOD_Msk << (u32ChannelNum * 8));
|
||||
while((pwm->INTSTS & (PWM_INTSTS_DUTY0SYNC_Msk << u32ChannelNum)) == (PWM_INTSTS_DUTY0SYNC_Msk << u32ChannelNum));
|
||||
*(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) &= ~PWM_DUTY_CN_Msk;
|
||||
*(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) |= u16CNR;
|
||||
|
||||
return(i);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function start PWM module
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel.
|
||||
* Bit 0 is channel 0, bit 1 is channel 1...
|
||||
* @return None
|
||||
*/
|
||||
void PWM_Start (PWM_T *pwm, uint32_t u32ChannelMask)
|
||||
{
|
||||
uint8_t i;
|
||||
uint32_t u32Mask = 0;
|
||||
|
||||
for (i = 0; i < PWM_CHANNEL_NUM; i++)
|
||||
{
|
||||
if ( u32ChannelMask & (1 << i))
|
||||
u32Mask |= (PWM_CTL_CH0EN_Msk << (i * 8));
|
||||
}
|
||||
|
||||
pwm->CTL |= u32Mask;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function stop PWM module
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel.
|
||||
* Bit 0 is channel 0, bit 1 is channel 1...
|
||||
* @return None
|
||||
*/
|
||||
void PWM_Stop (PWM_T *pwm, uint32_t u32ChannelMask)
|
||||
{
|
||||
uint32_t i;
|
||||
for(i = 0; i < PWM_CHANNEL_NUM; i ++)
|
||||
{
|
||||
if(u32ChannelMask & (1 << i))
|
||||
{
|
||||
*(__IO uint32_t *) (&pwm->DUTY0 + 3 * i) &= ~PWM_DUTY_CN_Msk;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function stop PWM generation immediately by clear channel enable bit
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel.
|
||||
* Bit 0 is channel 0, bit 1 is channel 1...
|
||||
* @return None
|
||||
*/
|
||||
void PWM_ForceStop (PWM_T *pwm, uint32_t u32ChannelMask)
|
||||
{
|
||||
uint32_t i;
|
||||
for (i = 0; i < PWM_CHANNEL_NUM; i++)
|
||||
{
|
||||
if ( u32ChannelMask & (1 << i))
|
||||
pwm->CTL &= ~(PWM_CTL_CH0EN_Msk << (i * 8));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function enables PWM capture of selected channels
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel.
|
||||
* Set bit 0 to 1 enables channel 0 output, set bit 1 to 1 enables channel 1 output...
|
||||
* @return None
|
||||
*/
|
||||
void PWM_EnableCapture (PWM_T *pwm, uint32_t u32ChannelMask)
|
||||
{
|
||||
uint8_t i;
|
||||
uint32_t u32Mask = 0;
|
||||
|
||||
for (i = 0; i < PWM_CHANNEL_NUM; i++)
|
||||
{
|
||||
if ( u32ChannelMask & (1 << i))
|
||||
{
|
||||
u32Mask |= ((PWM_CAPCTL_CAPCH0EN_Msk | PWM_CAPCTL_CAPCH0PADEN_Msk) << (i * 8));
|
||||
}
|
||||
}
|
||||
|
||||
pwm->CAPCTL |= u32Mask;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function disables PWM capture of selected channels
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel.
|
||||
* Set bit 0 to 1 enables channel 0 output, set bit 1 to 1 enables channel 1 output...
|
||||
* @return None
|
||||
*/
|
||||
void PWM_DisableCapture (PWM_T *pwm, uint32_t u32ChannelMask)
|
||||
{
|
||||
uint8_t i;
|
||||
uint32_t u32CTLMask = 0;
|
||||
uint32_t u32CAPCTLMask = 0;
|
||||
|
||||
for (i = 0; i < PWM_CHANNEL_NUM; i++)
|
||||
{
|
||||
if ( u32ChannelMask & (1 << i))
|
||||
{
|
||||
u32CTLMask |= (PWM_CTL_CH0EN_Msk << (i * 8));
|
||||
u32CAPCTLMask |= ((PWM_CAPCTL_CAPCH0EN_Msk | PWM_CAPCTL_CAPCH0PADEN_Msk) << (i * 8));
|
||||
}
|
||||
}
|
||||
|
||||
pwm->CTL &= ~u32CTLMask;
|
||||
pwm->CAPCTL &= ~u32CAPCTLMask;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function enables PWM output generation of selected channels
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel.
|
||||
* Set bit 0 to 1 enables channel 0 output, set bit 1 to 1 enables channel 1 output...
|
||||
* @return None
|
||||
*/
|
||||
void PWM_EnableOutput (PWM_T *pwm, uint32_t u32ChannelMask)
|
||||
{
|
||||
pwm->OE |= u32ChannelMask;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function disables PWM output generation of selected channels
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel
|
||||
* Set bit 0 to 1 disables channel 0 output, set bit 1 to 1 disables channel 1 output...
|
||||
* @return None
|
||||
*/
|
||||
void PWM_DisableOutput (PWM_T *pwm, uint32_t u32ChannelMask)
|
||||
{
|
||||
pwm->OE &= ~u32ChannelMask;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function enable Dead zone of selected channel
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
|
||||
* @param[in] u32Duration Dead Zone length in PWM clock count, valid values are between 0~0xFF, but 0 means there is no
|
||||
* dead zone.
|
||||
* @return None
|
||||
*/
|
||||
void PWM_EnableDeadZone (PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Duration)
|
||||
{
|
||||
// every two channels shares the same setting
|
||||
u32ChannelNum >>= 1;
|
||||
// set duration
|
||||
pwm->PRES = (pwm->PRES & ~(PWM_PRES_DZ01_Msk << (8 * u32ChannelNum))) | ((u32Duration << PWM_PRES_DZ01_Pos ) << (8 * u32ChannelNum));
|
||||
// enable dead zone
|
||||
pwm->CTL |= (PWM_CTL_DZEN01_Msk << u32ChannelNum);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function disable Dead zone of selected channel
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
|
||||
* @return None
|
||||
*/
|
||||
void PWM_DisableDeadZone (PWM_T *pwm, uint32_t u32ChannelNum)
|
||||
{
|
||||
// every two channels shares the same setting
|
||||
u32ChannelNum >>= 1;
|
||||
// enable dead zone
|
||||
pwm->CTL &= ~(PWM_CTL_DZEN01_Msk << u32ChannelNum);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function enable capture interrupt of selected channel
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
|
||||
* @param[in] u32Edge Capture interrupt type. It could be either
|
||||
* - \ref PWM_RISING_LATCH_INT_ENABLE
|
||||
* - \ref PWM_FALLING_LATCH_INT_ENABLE
|
||||
* - \ref PWM_RISING_FALLING_LATCH_INT_ENABLE
|
||||
* @return None
|
||||
*/
|
||||
void PWM_EnableCaptureInt (PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge)
|
||||
{
|
||||
// enable capture interrupt
|
||||
pwm->CAPINTEN |= (u32Edge << (u32ChannelNum * 8));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function disable capture interrupt of selected channel
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
|
||||
* @param[in] u32Edge Capture interrupt type. It could be either
|
||||
* - \ref PWM_RISING_LATCH_INT_ENABLE
|
||||
* - \ref PWM_FALLING_LATCH_INT_ENABLE
|
||||
* - \ref PWM_RISING_FALLING_LATCH_INT_ENABLE
|
||||
* @return None
|
||||
*/
|
||||
void PWM_DisableCaptureInt (PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge)
|
||||
{
|
||||
// disable capture interrupt
|
||||
pwm->CAPINTEN &= ~(u32Edge << (u32ChannelNum * 8));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function clear capture interrupt flag of selected channel
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
|
||||
* @param[in] u32Edge Capture interrupt type. It could be either
|
||||
* - \ref PWM_RISING_LATCH_INT_FLAG
|
||||
* - \ref PWM_FALLING_LATCH_INT_FLAG
|
||||
* - \ref PWM_RISING_FALLING_LATCH_INT_FLAG
|
||||
* @return None
|
||||
*/
|
||||
void PWM_ClearCaptureIntFlag (PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge)
|
||||
{
|
||||
// disable capture interrupt flag
|
||||
pwm->CAPINTSTS = (u32Edge + 1) << (u32ChannelNum * 8);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function get capture interrupt flag of selected channel
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
|
||||
* @return Capture interrupt flag of specified channel
|
||||
* @retval 0 Capture interrupt did not occurred
|
||||
* @retval PWM_RISING_LATCH_INT_FLAG Rising edge latch interrupt occurred
|
||||
* @retval PWM_FALLING_LATCH_INT_FLAG Falling edge latch interrupt occurred
|
||||
* @retval PWM_RISING_FALLING_LATCH_INT_FLAG Rising and falling edge latch interrupt occurred
|
||||
*/
|
||||
uint32_t PWM_GetCaptureIntFlag (PWM_T *pwm, uint32_t u32ChannelNum)
|
||||
{
|
||||
return ((pwm->CAPINTSTS >> (u32ChannelNum * 8)) & (PWM_RISING_FALLING_LATCH_INT_FLAG));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function enable period interrupt of selected channel
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
|
||||
* @param[in] u32IntPeriodType This parameter is not used
|
||||
* @return None
|
||||
* @note All channels share the same period interrupt type setting.
|
||||
*/
|
||||
void PWM_EnablePeriodInt (PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32IntPeriodType)
|
||||
{
|
||||
// enable period interrupt
|
||||
pwm->INTEN |= (PWM_INTEN_TMIE0_Msk << u32ChannelNum);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function disable period interrupt of selected channel
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
|
||||
* @return None
|
||||
*/
|
||||
void PWM_DisablePeriodInt (PWM_T *pwm, uint32_t u32ChannelNum)
|
||||
{
|
||||
pwm->INTEN &= ~(PWM_INTEN_TMIE0_Msk << u32ChannelNum);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function clear period interrupt of selected channel
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
|
||||
* @return None
|
||||
*/
|
||||
void PWM_ClearPeriodIntFlag (PWM_T *pwm, uint32_t u32ChannelNum)
|
||||
{
|
||||
// write 1 clear
|
||||
pwm->INTSTS = (PWM_INTSTS_TMINT0_Msk << u32ChannelNum);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function get period interrupt of selected channel
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
|
||||
* @return Period interrupt flag of specified channel
|
||||
* @retval 0 Period interrupt did not occurred
|
||||
* @retval 1 Period interrupt occurred
|
||||
*/
|
||||
uint32_t PWM_GetPeriodIntFlag (PWM_T *pwm, uint32_t u32ChannelNum)
|
||||
{
|
||||
return ((pwm->INTSTS & (PWM_INTSTS_TMINT0_Msk << u32ChannelNum)) ? 1 : 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function enable capture PDMA of selected channel
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelNum PWM channel number. Valid values are 0 and 2
|
||||
* @param[in] u32RisingFirst Order of captured data transferred by PDMA. It could be either
|
||||
* - \ref PWM_CAP_PDMA_RFORDER_R
|
||||
* - \ref PWM_CAP_PDMA_RFORDER_F
|
||||
* @param[in] u32Mode Captured data transferred by PDMA interrupt type. It could be either
|
||||
* - \ref PWM_RISING_LATCH_PDMA_ENABLE
|
||||
* - \ref PWM_FALLING_LATCH_PDMA_ENABLE
|
||||
* - \ref PWM_RISING_FALLING_LATCH_PDMA_ENABLE
|
||||
* @return None
|
||||
*/
|
||||
void PWM_EnablePDMA(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32RisingFirst, uint32_t u32Mode)
|
||||
{
|
||||
if (u32ChannelNum == 0)
|
||||
pwm->CAPCTL = (pwm->CAPCTL & ~(PWM_CAPCTL_PDMACAPMOD0_Msk | PWM_CAPCTL_CH0RFORDER_Msk)) | u32Mode | u32RisingFirst | PWM_CAPCTL_CH0PDMAEN_Msk;
|
||||
else
|
||||
pwm->CAPCTL = (pwm->CAPCTL & ~(PWM_CAPCTL_PDMACAPMOD2_Msk | PWM_CAPCTL_CH2RFORDER_Msk)) | (u32Mode << 16)| (u32RisingFirst << 16)| PWM_CAPCTL_CH2PDMAEN_Msk;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function disable capture PDMA of selected channel
|
||||
* @param[in] pwm The base address of PWM module
|
||||
* @param[in] u32ChannelNum PWM channel number. Valid values are 0 and 2
|
||||
* @return None
|
||||
*/
|
||||
void PWM_DisablePDMA(PWM_T *pwm, uint32_t u32ChannelNum)
|
||||
{
|
||||
if (u32ChannelNum == 0)
|
||||
pwm->CAPCTL &= ~PWM_CAPCTL_CH0PDMAEN_Msk;
|
||||
else
|
||||
pwm->CAPCTL &= ~PWM_CAPCTL_CH2PDMAEN_Msk;
|
||||
}
|
||||
|
||||
/*@}*/ /* end of group NANO100_PWM_EXPORTED_FUNCTIONS */
|
||||
|
||||
/*@}*/ /* end of group NANO100_PWM_Driver */
|
||||
|
||||
/*@}*/ /* end of group NANO100_Device_Driver */
|
||||
|
||||
/*** (C) COPYRIGHT 2013-2014 Nuvoton Technology Corp. ***/
|
||||
@@ -0,0 +1,73 @@
|
||||
//=============================================================================
|
||||
// S E N S I R I O N AG, Laubisruetistr. 50, CH-8712 Staefa, Switzerland
|
||||
//=============================================================================
|
||||
// Project : SHT3x Sample Code (V1.1)
|
||||
// File : typedefs.h (V1.1)
|
||||
// Author : RFU
|
||||
// Date : 6-Mai-2015
|
||||
// Controller: STM32F100RB
|
||||
// IDE : µVision V5.12.0.0
|
||||
// Compiler : Armcc
|
||||
// Brief : Definitions of typedefs for good readability and portability.
|
||||
//=============================================================================
|
||||
|
||||
|
||||
//-- Defines ------------------------------------------------------------------
|
||||
//Processor endian system
|
||||
//#define BIG ENDIAN //e.g. Motorola (not tested at this time)
|
||||
#define LITTLE_ENDIAN //e.g. PIC, 8051, NEC V850
|
||||
//=============================================================================
|
||||
// basic types: making the size of types clear
|
||||
//=============================================================================
|
||||
typedef unsigned char u8t; ///< range: 0 .. 255
|
||||
typedef signed char i8t; ///< range: -128 .. +127
|
||||
|
||||
typedef unsigned short u16t; ///< range: 0 .. 65535
|
||||
typedef signed short i16t; ///< range: -32768 .. +32767
|
||||
|
||||
typedef unsigned long u32t; ///< range: 0 .. 4'294'967'295
|
||||
typedef signed long i32t; ///< range: -2'147'483'648 .. +2'147'483'647
|
||||
|
||||
typedef float ft; ///< range: +-1.18E-38 .. +-3.39E+38
|
||||
typedef double dt; ///< range: .. +-1.79E+308
|
||||
|
||||
typedef enum{
|
||||
bFALSE = 0,
|
||||
bTRUE = 1
|
||||
}bt;
|
||||
|
||||
typedef union {
|
||||
u16t u16; // element specifier for accessing whole u16
|
||||
i16t i16; // element specifier for accessing whole i16
|
||||
struct {
|
||||
#ifdef LITTLE_ENDIAN // Byte-order is little endian
|
||||
u8t u8L; // element specifier for accessing low u8
|
||||
u8t u8H; // element specifier for accessing high u8
|
||||
#else // Byte-order is big endian
|
||||
u8t u8H; // element specifier for accessing low u8
|
||||
u8t u8L; // element specifier for accessing high u8
|
||||
#endif
|
||||
} s16; // element spec. for acc. struct with low or high u8
|
||||
} nt16;
|
||||
|
||||
typedef union {
|
||||
u32t u32; // element specifier for accessing whole u32
|
||||
i32t i32; // element specifier for accessing whole i32
|
||||
struct {
|
||||
#ifdef LITTLE_ENDIAN // Byte-order is little endian
|
||||
u16t u16L; // element specifier for accessing low u16
|
||||
u16t u16H; // element specifier for accessing high u16
|
||||
#else // Byte-order is big endian
|
||||
u16t u16H; // element specifier for accessing low u16
|
||||
u16t u16L; // element specifier for accessing high u16
|
||||
#endif
|
||||
} s32; // element spec. for acc. struct with low or high u16
|
||||
} nt32;
|
||||
|
||||
typedef enum{
|
||||
NO_ERROR = 0x00, // no error
|
||||
ACK_ERROR = 0x01, // no acknowledgment error
|
||||
CHECKSUM_ERROR = 0x02, // checksum mismatch error
|
||||
TIMEOUT_ERROR = 0x04, // timeout error
|
||||
PARM_ERROR = 0x80, // parameter out of range error
|
||||
}etError;
|
||||
Reference in New Issue
Block a user