You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
3.3 KiB
110 lines
3.3 KiB
#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)
|
|
{
|
|
// 해당 비트만 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;
|
|
}
|
|
|
|
void ANAOUT_Init(void)
|
|
{
|
|
// 출력 설정: 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;
|
|
|
|
// 초기 상태: 전부 LOW
|
|
ANAOUT_AllLow();
|
|
}
|
|
|
|
void ANAOUT_Select(uint8_t ch)
|
|
{
|
|
if (ch < ANAOUT_CH_MIN || ch > ANAOUT_CH_MAX) {
|
|
ANAOUT_AllLow();
|
|
return;
|
|
}
|
|
|
|
ANAOUT_AllLow();
|
|
__nop(); __nop(); __nop(); __nop(); // break-before-make
|
|
|
|
// 2) 선택된 채널만 HIGH
|
|
switch (ch)
|
|
{
|
|
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;
|
|
}
|
|
}
|
|
|
|
|