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:
jeon
2026-06-16 09:29:03 +09:00
commit a502322188
630 changed files with 65126 additions and 0 deletions
+667
View File
@@ -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;
}
+13
View File
@@ -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
+5
View File
@@ -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);
+451
View File
@@ -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();
}
+248
View File
@@ -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);
}
+781
View File
@@ -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;
}
+992
View File
@@ -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 ei?? 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 ei?? 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 ei?? 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 ei?? 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 ei?? 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];
+495
View File
@@ -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
+189
View File
@@ -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();
}
}
}
+536
View File
@@ -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. ***/
+73
View File
@@ -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;