22 changed files with 2252 additions and 1553 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Binary file not shown.
@ -1,110 +1,70 @@ |
|||
#include "anaout.h" |
|||
|
|||
// -------------------------------------------------------
|
|||
// Helper macros
|
|||
// -------------------------------------------------------
|
|||
#define BIT(n) (1u << (n)) |
|||
|
|||
// -------------------------------------------------------
|
|||
// ANAOUT mapping (사용자 제공 기준)
|
|||
// ANAOUT_1 : P64 -> P6.4
|
|||
// ANAOUT_2 : P65 -> P6.5
|
|||
// ANAOUT_3 : P66 -> P6.6
|
|||
// ANAOUT_4 : P67 -> P6.7
|
|||
//
|
|||
// ANAOUT_5 : P44 -> P4.4
|
|||
// ANAOUT_6 : P43 -> P4.3
|
|||
// ANAOUT_7 : P42 -> P4.2
|
|||
// ANAOUT_8 : P41 -> P4.1
|
|||
//
|
|||
// ANAOUT_9 : P50 -> P5.0
|
|||
// ANAOUT_10 : P51 -> P5.1
|
|||
// ANAOUT_11 : P52 -> P5.2
|
|||
//
|
|||
// ANAOUT_12 : P60 -> P6.0
|
|||
// ANAOUT_13 : P61 -> P6.1
|
|||
//
|
|||
// ANAOUT_14 : P72 -> P7.2
|
|||
// ANAOUT_15 : P73 -> P7.3
|
|||
// ANAOUT_16 : P75 -> P7.5
|
|||
// ANAOUT_17 : P74 -> P7.4
|
|||
// ANAOUT_18 : P76 -> P7.6
|
|||
// ANAOUT_19 : P77 -> P7.7
|
|||
//
|
|||
// ANAOUT_20 : P130 -> P13.0
|
|||
// -------------------------------------------------------
|
|||
|
|||
// 그룹별 마스크(빠른 AllLow/Init용)
|
|||
#define P4_ANA_MASK (BIT(4) | BIT(3) | BIT(2) | BIT(1)) // P4.4~P4.1
|
|||
#define P5_ANA_MASK (BIT(0) | BIT(1) | BIT(2)) // P5.0~P5.2
|
|||
#define P6_ANA_MASK (BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(1) | BIT(0)) // P6.7~P6.4 + P6.1~P6.0
|
|||
#define P7_ANA_MASK (BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2)) // P7.7~P7.2
|
|||
#define P13_ANA_MASK (BIT(0)) // P13.0
|
|||
|
|||
void ANAOUT_AllLow(void) |
|||
static void write_port(volatile uint8_t *port, uint8_t mask, uint8_t on) |
|||
{ |
|||
// 해당 비트만 LOW로 내림
|
|||
P4 &= (uint8_t)~(uint8_t)P4_ANA_MASK; |
|||
P5 &= (uint8_t)~(uint8_t)P5_ANA_MASK; |
|||
P6 &= (uint8_t)~(uint8_t)P6_ANA_MASK; |
|||
P7 &= (uint8_t)~(uint8_t)P7_ANA_MASK; |
|||
P13 &= (uint8_t)~(uint8_t)P13_ANA_MASK; |
|||
if (on) *port |= mask; |
|||
else *port &= (uint8_t)~mask; |
|||
} |
|||
|
|||
void ANAOUT_Init(void) |
|||
/* ?? -> (?? ??, ???) ??? */ |
|||
static volatile uint8_t * const s_port[21] = { |
|||
0, |
|||
&P6, &P6, &P6, &P6, // 1~4
|
|||
&P4, &P4, &P4, &P4, // 5~8
|
|||
&P5, &P5, &P5, // 9~11
|
|||
&P6, &P6, // 12~13
|
|||
&P7, &P7, &P7, &P7, &P7, &P7, // 14~19
|
|||
&P13 // 20
|
|||
}; |
|||
|
|||
static const uint8_t s_mask[21] = { |
|||
0, |
|||
(uint8_t)BIT(4), (uint8_t)BIT(5), (uint8_t)BIT(6), (uint8_t)BIT(7), // P64~P67
|
|||
(uint8_t)BIT(4), (uint8_t)BIT(3), (uint8_t)BIT(2), (uint8_t)BIT(1), // P44,P43,P42,P41
|
|||
(uint8_t)BIT(0), (uint8_t)BIT(1), (uint8_t)BIT(2), // P50,P51,P52
|
|||
(uint8_t)BIT(0), (uint8_t)BIT(1), // P60,P61
|
|||
(uint8_t)BIT(2), (uint8_t)BIT(3), (uint8_t)BIT(5), (uint8_t)BIT(4), (uint8_t)BIT(6), (uint8_t)BIT(7), // P72~P77
|
|||
(uint8_t)BIT(0) // P130
|
|||
}; |
|||
|
|||
void ANAOUT_Set(uint8_t ch, uint8_t on) |
|||
{ |
|||
// 출력 설정: PM bit = 0 이 출력
|
|||
PM4 &= (uint8_t)~(uint8_t)P4_ANA_MASK; |
|||
PM5 &= (uint8_t)~(uint8_t)P5_ANA_MASK; |
|||
PM6 &= (uint8_t)~(uint8_t)P6_ANA_MASK; |
|||
PM7 &= (uint8_t)~(uint8_t)P7_ANA_MASK; |
|||
if (ch < 1 || ch > 20) return; |
|||
write_port(s_port[ch], s_mask[ch], on); |
|||
} |
|||
|
|||
// 초기 상태: 전부 LOW
|
|||
ANAOUT_AllLow(); |
|||
void ANAOUT_AllOff(void) |
|||
{ |
|||
uint8_t ch; |
|||
for (ch = 1; ch <= 20; ch++) |
|||
{ |
|||
ANAOUT_Set(ch, 0); |
|||
} |
|||
} |
|||
|
|||
void ANAOUT_Select(uint8_t ch) |
|||
{ |
|||
if (ch < ANAOUT_CH_MIN || ch > ANAOUT_CH_MAX) { |
|||
ANAOUT_AllLow(); |
|||
return; |
|||
if (ch < 1 || ch > 20) return; |
|||
ANAOUT_AllOff(); |
|||
ANAOUT_Set(ch, 1); |
|||
} |
|||
|
|||
ANAOUT_AllLow(); |
|||
__nop(); __nop(); __nop(); __nop(); // break-before-make
|
|||
|
|||
// 2) 선택된 채널만 HIGH
|
|||
switch (ch) |
|||
void anaout_pin(uint8_t ch, uint8_t on) |
|||
{ |
|||
case 1: P6 |= (uint8_t)BIT(4); break; // P64
|
|||
case 2: P6 |= (uint8_t)BIT(5); break; // P65
|
|||
case 3: P6 |= (uint8_t)BIT(6); break; // P66
|
|||
case 4: P6 |= (uint8_t)BIT(7); break; // P67
|
|||
|
|||
case 5: P4 |= (uint8_t)BIT(4); break; // P44
|
|||
case 6: P4 |= (uint8_t)BIT(3); break; // P43
|
|||
case 7: P4 |= (uint8_t)BIT(2); break; // P42
|
|||
case 8: P4 |= (uint8_t)BIT(1); break; // P41
|
|||
|
|||
case 9: P5 |= (uint8_t)BIT(0); break; // P50
|
|||
case 10: P5 |= (uint8_t)BIT(1); break; // P51
|
|||
case 11: P5 |= (uint8_t)BIT(2); break; // P52
|
|||
|
|||
case 12: P6 |= (uint8_t)BIT(0); break; // P60
|
|||
case 13: P6 |= (uint8_t)BIT(1); break; // P61
|
|||
|
|||
case 14: P7 |= (uint8_t)BIT(2); break; // P72
|
|||
case 15: P7 |= (uint8_t)BIT(3); break; // P73
|
|||
case 16: P7 |= (uint8_t)BIT(5); break; // P75
|
|||
case 17: P7 |= (uint8_t)BIT(4); break; // P74
|
|||
case 18: P7 |= (uint8_t)BIT(6); break; // P76
|
|||
case 19: P7 |= (uint8_t)BIT(7); break; // P77
|
|||
|
|||
case 20: P13 |= (uint8_t)BIT(0); break; // P130
|
|||
|
|||
default: |
|||
// 범위 밖이면 전체 LOW 유지
|
|||
break; |
|||
if (ch < 1 || ch > 20) return; |
|||
|
|||
if (on) { |
|||
// on=1?? "??" ???? ??(??? 1?? ??)
|
|||
ANAOUT_Select(ch); |
|||
} else { |
|||
// off? ?? ??? OFF
|
|||
ANAOUT_Set(ch, 0); |
|||
} |
|||
} |
|||
|
|||
void anaout_all_off(void) |
|||
{ |
|||
ANAOUT_AllOff(); |
|||
} |
|||
|
|||
@ -0,0 +1,79 @@ |
|||
#include "check_pin.h" |
|||
|
|||
#define BIT(n) (1u << (n)) |
|||
|
|||
static void write_port(volatile uint8_t *port, uint8_t mask, uint8_t on) |
|||
{ |
|||
if (on) *port |= mask; |
|||
else *port &= (uint8_t)~mask; |
|||
} |
|||
|
|||
static void set_output_pm(volatile uint8_t *pm, uint8_t mask) |
|||
{ |
|||
*pm &= (uint8_t)~mask; |
|||
} |
|||
|
|||
void check_pin_init(void) |
|||
{ |
|||
// CHECK_1,2,4 : P15.4,5,6
|
|||
set_output_pm(&PM15, (uint8_t)(BIT(4)|BIT(5)|BIT(6))); |
|||
|
|||
// CHECK_3,7 : P0.0,3
|
|||
set_output_pm(&PM0, (uint8_t)(BIT(0)|BIT(3))); |
|||
|
|||
// CHECK_5,6 : P3.0,2
|
|||
set_output_pm(&PM3, (uint8_t)(BIT(0)|BIT(2))); |
|||
|
|||
// CHECK_8,9 : P7.0,1
|
|||
set_output_pm(&PM7, (uint8_t)(BIT(0)|BIT(1))); |
|||
|
|||
// CHECK_10~13 : P10.4~7
|
|||
set_output_pm(&PM10, (uint8_t)(BIT(4)|BIT(5)|BIT(6)|BIT(7))); |
|||
|
|||
// CHECK_14~17 : P5.7,6,5,4
|
|||
set_output_pm(&PM5, (uint8_t)(BIT(7)|BIT(6)|BIT(5)|BIT(4))); |
|||
|
|||
// CHECK_18~20 : P1.0,3,4
|
|||
set_output_pm(&PM1, (uint8_t)(BIT(0)|BIT(3)|BIT(4))); |
|||
|
|||
check_all_off(); |
|||
} |
|||
|
|||
void check_all_off(void) |
|||
{ |
|||
P15 &= (uint8_t)~(BIT(4)|BIT(5)|BIT(6)); |
|||
P0 &= (uint8_t)~(BIT(0)|BIT(3)); |
|||
P3 &= (uint8_t)~(BIT(0)|BIT(2)); |
|||
P7 &= (uint8_t)~(BIT(0)|BIT(1)); |
|||
P10 &= (uint8_t)~(BIT(4)|BIT(5)|BIT(6)|BIT(7)); |
|||
P5 &= (uint8_t)~(BIT(4)|BIT(5)|BIT(6)|BIT(7)); |
|||
P1 &= (uint8_t)~(BIT(0)|BIT(3)|BIT(4)); |
|||
} |
|||
|
|||
void check_pin(uint8_t ch, uint8_t on) |
|||
{ |
|||
switch (ch) |
|||
{ |
|||
case 1: write_port(&P15, BIT(4), on); break; // CHECK_1 : P154
|
|||
case 2: write_port(&P15, BIT(5), on); break; // CHECK_2 : P155
|
|||
case 3: write_port(&P0, BIT(0), on); break; // CHECK_3 : P00
|
|||
case 4: write_port(&P15, BIT(6), on); break; // CHECK_4 : P156
|
|||
case 5: write_port(&P3, BIT(0), on); break; // CHECK_5 : P30
|
|||
case 6: write_port(&P3, BIT(2), on); break; // CHECK_6 : P32
|
|||
case 7: write_port(&P0, BIT(3), on); break; // CHECK_7 : P03
|
|||
case 8: write_port(&P7, BIT(0), on); break; // CHECK_8 : P70
|
|||
case 9: write_port(&P7, BIT(1), on); break; // CHECK_9 : P71
|
|||
case 10: write_port(&P10, BIT(4), on); break; // CHECK_10: P104
|
|||
case 11: write_port(&P10, BIT(5), on); break; // CHECK_11: P105
|
|||
case 12: write_port(&P10, BIT(6), on); break; // CHECK_12: P106
|
|||
case 13: write_port(&P10, BIT(7), on); break; // CHECK_13: P107
|
|||
case 14: write_port(&P5, BIT(7), on); break; // CHECK_14: P57
|
|||
case 15: write_port(&P5, BIT(6), on); break; // CHECK_15: P56
|
|||
case 16: write_port(&P5, BIT(5), on); break; // CHECK_16: P55
|
|||
case 17: write_port(&P5, BIT(4), on); break; // CHECK_17: P54
|
|||
case 18: write_port(&P1, BIT(0), on); break; // CHECK_18: P10
|
|||
case 19: write_port(&P1, BIT(3), on); break; // CHECK_19: P13
|
|||
case 20: write_port(&P1, BIT(4), on); break; // CHECK_20: P14
|
|||
default: /* ignore */ break; |
|||
} |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
#ifndef CHECK_PIN_H |
|||
#define CHECK_PIN_H |
|||
|
|||
#include "r_cg_macrodriver.h" |
|||
#include "r_cg_port.h" |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
|
|||
void check_pin_init(void); |
|||
|
|||
/**
|
|||
* 채널(ch=1~20)의 CHECK 핀을 on/off |
|||
* 예) ch=2 -> CHECK_2(P155) 제어 |
|||
*/ |
|||
void check_pin(uint8_t ch, uint8_t on); |
|||
|
|||
/** (옵션) CHECK_1~CHECK_20 전체 OFF */ |
|||
void check_all_off(void); |
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
|||
|
|||
#endif /* CHECK_PIN_H */ |
|||
@ -0,0 +1,78 @@ |
|||
#include "gatectrl.h" |
|||
|
|||
#define BIT(n) (1u << (n)) |
|||
|
|||
// 공통핀 매핑
|
|||
// ALL : P47 -> Port4 bit7
|
|||
// ZACWIRE : P157 -> Port15 bit7
|
|||
#define ALL_PM PM4 |
|||
#define ALL_MASK (uint8_t)BIT(7) |
|||
|
|||
#define ZAC_PM PM15 |
|||
#define ZAC_MASK (uint8_t)BIT(7) |
|||
|
|||
static uint8_t s_ch = 1; |
|||
|
|||
static void write_port(volatile uint8_t *port, uint8_t mask, uint8_t on) |
|||
{ |
|||
if (on) *port |= mask; |
|||
else *port &= (uint8_t)~mask; |
|||
} |
|||
|
|||
void GateCtrl_Init(void) |
|||
{ |
|||
// 공통핀 출력 설정
|
|||
ALL_PM &= (uint8_t)~ALL_MASK; |
|||
ZAC_PM &= (uint8_t)~ZAC_MASK; |
|||
|
|||
// 기본 OFF
|
|||
GateCtrl_SetAll(0); |
|||
GateCtrl_SetZacwire(0); |
|||
|
|||
// 채널 관련 모듈 init
|
|||
hash_init(); |
|||
check_pin_init(); |
|||
|
|||
// ANAOUT_Init()는 main에서 한다면 여기서 중복 호출 X
|
|||
} |
|||
|
|||
void GateCtrl_SetAll(uint8_t on) |
|||
{ |
|||
write_port(&P4, ALL_MASK, on); |
|||
} |
|||
|
|||
void GateCtrl_SetZacwire(uint8_t on) |
|||
{ |
|||
write_port(&P15, ZAC_MASK, on); |
|||
} |
|||
|
|||
void GateCtrl_ClearChannelPins(void) |
|||
{ |
|||
hash_all_off(); |
|||
check_all_off(); |
|||
anaout_all_off(); |
|||
} |
|||
|
|||
void GateCtrl_SelectChannel(uint8_t ch) |
|||
{ |
|||
if (ch < 1 || ch > 20) return; |
|||
|
|||
s_ch = ch; |
|||
|
|||
GateCtrl_ClearChannelPins(); |
|||
} |
|||
|
|||
void GateCtrl_Anaout(uint8_t on) |
|||
{ |
|||
anaout_pin(s_ch, on); |
|||
} |
|||
|
|||
void GateCtrl_Hash(uint8_t on) |
|||
{ |
|||
hash_pin(s_ch, on); |
|||
} |
|||
|
|||
void GateCtrl_Check(uint8_t on) |
|||
{ |
|||
check_pin(s_ch, on); |
|||
} |
|||
@ -0,0 +1,40 @@ |
|||
#ifndef GATECTRL_H |
|||
#define GATECTRL_H |
|||
|
|||
#include "r_cg_macrodriver.h" |
|||
#include "r_cg_port.h" |
|||
#include "anaout.h" |
|||
#include "hash_pin.h" |
|||
#include "check_pin.h" |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
|
|||
void GateCtrl_Init(void); |
|||
|
|||
/** ???: ALL (P47) */ |
|||
void GateCtrl_SetAll(uint8_t on); |
|||
|
|||
/** ???: ZACWIRE (P157) */ |
|||
void GateCtrl_SetZacwire(uint8_t on); |
|||
|
|||
void GateCtrl_SelectChannel(uint8_t ch); |
|||
|
|||
/** ?? ??? ??? ANAOUT ?? (?? ?? ???) */ |
|||
void GateCtrl_Anaout(uint8_t on); |
|||
|
|||
/** ?? ??? ??? #? ?? */ |
|||
void GateCtrl_Hash(uint8_t on); |
|||
|
|||
/** ?? ??? ??? CHECK? ?? */ |
|||
void GateCtrl_Check(uint8_t on); |
|||
|
|||
/** (??) #/CHECK ?? OFF */ |
|||
void GateCtrl_ClearChannelPins(void); |
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
|||
|
|||
#endif /* GATECTRL_H */ |
|||
@ -0,0 +1,88 @@ |
|||
#include "hash_pin.h" |
|||
|
|||
#define BIT(n) (1u << (n)) |
|||
|
|||
static void hash_write_port(volatile uint8_t *port, uint8_t mask, uint8_t on) |
|||
{ |
|||
if (on) *port |= mask; |
|||
else *port &= (uint8_t)~mask; |
|||
} |
|||
|
|||
static void hash_set_output_pm(volatile uint8_t *pm, uint8_t mask) |
|||
{ |
|||
*pm &= (uint8_t)~mask; // PM bit=0 -> output
|
|||
} |
|||
|
|||
void hash_init(void) |
|||
{ |
|||
// #1~#4 : P15.3~P15.0
|
|||
hash_set_output_pm(&PM15, (uint8_t)(BIT(0)|BIT(1)|BIT(2)|BIT(3))); |
|||
|
|||
// #5 : P12.0
|
|||
hash_set_output_pm(&PM12, (uint8_t)BIT(0)); |
|||
|
|||
// #6 : P12.5
|
|||
hash_set_output_pm(&PM12, (uint8_t)BIT(5)); |
|||
|
|||
// #7 : P0.1
|
|||
hash_set_output_pm(&PM0, (uint8_t)BIT(1)); |
|||
|
|||
// #8 : P12.6
|
|||
hash_set_output_pm(&PM12, (uint8_t)BIT(6)); |
|||
|
|||
// #9 : P12.7
|
|||
hash_set_output_pm(&PM12, (uint8_t)BIT(7)); |
|||
|
|||
// #10 : P0.2
|
|||
hash_set_output_pm(&PM0, (uint8_t)BIT(2)); |
|||
|
|||
// #11~#14 : P10.3~P10.0
|
|||
hash_set_output_pm(&PM10, (uint8_t)(BIT(0)|BIT(1)|BIT(2)|BIT(3))); |
|||
|
|||
// #15~#20 : P9.7,6,5,4,3,2
|
|||
hash_set_output_pm(&PM9, (uint8_t)(BIT(7)|BIT(6)|BIT(5)|BIT(4)|BIT(3)|BIT(2))); |
|||
|
|||
hash_all_off(); |
|||
} |
|||
|
|||
void hash_all_off(void) |
|||
{ |
|||
// P15.0~3 OFF
|
|||
P15 &= (uint8_t)~(BIT(0)|BIT(1)|BIT(2)|BIT(3)); |
|||
// P12.0,5,6,7 OFF
|
|||
P12 &= (uint8_t)~(BIT(0)|BIT(5)|BIT(6)|BIT(7)); |
|||
// P0.1,2 OFF
|
|||
P0 &= (uint8_t)~(BIT(1)|BIT(2)); |
|||
// P10.0~3 OFF
|
|||
P10 &= (uint8_t)~(BIT(0)|BIT(1)|BIT(2)|BIT(3)); |
|||
// P9.2~7 OFF
|
|||
P9 &= (uint8_t)~(BIT(2)|BIT(3)|BIT(4)|BIT(5)|BIT(6)|BIT(7)); |
|||
} |
|||
|
|||
void hash_pin(uint8_t ch, uint8_t on) |
|||
{ |
|||
switch (ch) |
|||
{ |
|||
case 1: hash_write_port(&P15, BIT(3), on); break; // #1 : P153
|
|||
case 2: hash_write_port(&P15, BIT(2), on); break; // #2 : P152
|
|||
case 3: hash_write_port(&P15, BIT(1), on); break; // #3 : P151
|
|||
case 4: hash_write_port(&P15, BIT(0), on); break; // #4 : P150
|
|||
case 5: hash_write_port(&P12, BIT(0), on); break; // #5 : P120
|
|||
case 6: hash_write_port(&P12, BIT(5), on); break; // #6 : P125
|
|||
case 7: hash_write_port(&P0, BIT(1), on); break; // #7 : P01
|
|||
case 8: hash_write_port(&P12, BIT(6), on); break; // #8 : P126
|
|||
case 9: hash_write_port(&P12, BIT(7), on); break; // #9 : P127
|
|||
case 10: hash_write_port(&P0, BIT(2), on); break; // #10: P02
|
|||
case 11: hash_write_port(&P10, BIT(3), on); break; // #11: P103
|
|||
case 12: hash_write_port(&P10, BIT(2), on); break; // #12: P102
|
|||
case 13: hash_write_port(&P10, BIT(1), on); break; // #13: P101
|
|||
case 14: hash_write_port(&P10, BIT(0), on); break; // #14: P100
|
|||
case 15: hash_write_port(&P9, BIT(7), on); break; // #15: P97
|
|||
case 16: hash_write_port(&P9, BIT(6), on); break; // #16: P96
|
|||
case 17: hash_write_port(&P9, BIT(5), on); break; // #17: P95
|
|||
case 18: hash_write_port(&P9, BIT(4), on); break; // #18: P94
|
|||
case 19: hash_write_port(&P9, BIT(3), on); break; // #19: P93
|
|||
case 20: hash_write_port(&P9, BIT(2), on); break; // #20: P92
|
|||
default: /* ignore */ break; |
|||
} |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
#ifndef HASH_H |
|||
#define HASH_H |
|||
|
|||
#include "r_cg_macrodriver.h" |
|||
#include "r_cg_port.h" |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
|
|||
void hash_init(void); |
|||
|
|||
/*
|
|||
채널(ch=1~20)의 #핀을 on/off |
|||
예) ch=2 -> #2(P152) 제어 |
|||
*/ |
|||
void hash_pin(uint8_t ch, uint8_t on); |
|||
|
|||
/* (옵션) #1~#20 전체 OFF */ |
|||
void hash_all_off(void); |
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
|||
|
|||
#endif |
|||
File diff suppressed because one or more lines are too long
Loading…
Reference in new issue