임베디드/고추건조기

FND 모듈제어

twoweeks-within 2024. 12. 1. 00:30

모듈 구성
: 메인칩 + 필요한 최소한의 회로
  (쪽보드)

제어 단계
1. 칩, 부품 모델명 확인 : TM74HC595 , 7세그먼트 

2. 데이터시트 구글링
1) TM74HC595
2) 모듈 자체의 데이터시트

QA , QB, QC ,,, 찾는법 
1) 모듈 데이터시트
2) 쇼트테스트
3) 남이 정리한것 찾기
4) 샘플 코드를 구해서, 일단 동작시키고
    > 그다음 추리
    구글에 칩 sample code 검색..
@
STI 통신

CLK > DI( data ) 
클럭을 기준으로 데이터를 보냄

GPIO3개 outut > CLK, DATA Input , DATA output
@

cpp 코드 > stm 으로 변환 해석

void TM74HC595Display::send(unsigned char X)
{

  for (int i = 8; i >= 1; i--)
  {
    if (X & 0x80)
    {
      digitalWrite(_DIO, HIGH);
    }
    else
    {
      digitalWrite(_DIO, LOW);
    }
    X <<= 1;
    digitalWrite(_SCLK, LOW);
    digitalWrite(_SCLK, HIGH);  
  }
}

>>>>>>>

void send(uint8_t x) {// unsigned 8bit ( char == 1byte ) 
for (int i = 8; i >= 1; i--)
  {
    if (X & 0x80)
    {
      HAL_GPIO_WritePin(FND_DIO_GPIO_Port, FND_DIO_Pin, HIGH);
    }
    else
    {
     HAL_GPIO_WritePin(FND_DIO_GPIO_Port, FND_DIO_Pin, LOW);
    }
    X <<= 1;
    HAL_GPIO_WritePin(FND_SCLK_GPIO_Port, FND_SCLK_Pin, LOW);
    HAL_GPIO_WritePin(FND_SCLK_GPIO_Port, FND_SCLK_Pin, HIGH);
  }


1. if 문 > X & 0x80 ( 0x80 == 1000 0000 )
    // 8번째 bit 가 1일때만 if문 통과
2.  X<< 1 // 1칸 왼쪽 시프트
   8개의 비트를 모두 확인
3. 클럭 LOW > HIGH 로 끝나므로 평소에 HIGH 유지

> 1 or 0 으로 셋팅후 클럭을 LOW > HIGH 로 바꾸면서 값 입력

CPP 
// 이름 중복가능
void TM74HC595Display::send(unsigned char X, unsigned char port)
{
  send(X);
  send(port);
  digitalWrite(_RCLK, LOW);
  digitalWrite(_RCLK, HIGH);
}
C
// 이름 중복 불가
>>>>>>>>>>>>
void send_port(unsigned char X, unsigned char port)
{
  send(X);
  send(port);
  HAL_GPIO_WritePin(FND_RCLK_GPIO_Port, FND_RCLK_Pin, LOW);
  HAL_GPIO_WritePin(FND_RCLK_GPIO_Port, FND_RCLK_Pin, HIGH);
}




void TM74HC595Display::send(unsigned char X)
{

  for (int i = 8; i >= 1; i--)
  {
    if (X & 0x80)
    {
      digitalWrite(_DIO, HIGH);
    }
    else
    {
      digitalWrite(_DIO, LOW);
    }
    X <<= 1;
    digitalWrite(_SCLK, LOW);
    digitalWrite(_SCLK, HIGH);  
  }
}

void TM74HC595Display::send(unsigned char X, unsigned char port)
{
  send(X);
  send(port);
  digitalWrite(_RCLK, LOW);
  digitalWrite(_RCLK, HIGH);
}

void TM74HC595Display::digit4(int n, int replay, bool showZero)
{
  int n1, n2, n3, n4;
  n1 = (int)  n % 10;
  n2 = (int) ((n % 100)-n1)/10;
  n3 = (int) ((n % 1000) - n2 - n1) / 100;
  n4 = (int) ((n % 10000) - n3 - n2 - n1) / 1000;

 for(int i = 0; i<=replay; i++){
send(_LED_0F[n1], 0b0001);
    if(showZero | n>9)send(_LED_0F[n2], 0b0010);
    if(showZero | n>99)send(_LED_0F[n3], 0b0100);
    if(showZero | n>999)send(_LED_0F[n4], 0b1000);
 }
}

void TM74HC595Display::digit4(int n, int replay)
{
  digit4(n,replay,false);
}

void TM74HC595Display::digit4(int n)
{
  digit4(n,0,false);
}

void TM74HC595Display::digit4showZero(int n, int replay)
{
digit4(n, replay, true);
}

void TM74HC595Display::digit4showZero(int n)
{
digit4(n, 0, true);
}


void TM74HC595Display::digit2(int n, int port, int replay)
{
  int n1, n2;
  n1 = (int)  n % 10;
  n2 = (int) ((n % 100)-n1)/10;
  
   for(int i = 0; i<=replay; i++){  
   send(_LED_0F[n1], port);
   send(_LED_0F[n2], port<<1); 
   }  
}

void TM74HC595Display::digit2(int n, int port)
{
digit2(n, port, 0);
}

>>>>


void send(uint8_t X) {
for (int i = 8; i >= 1; i--)
  {
    if (X & 0x80)
    {
      HAL_GPIO_WritePin(FND_DIO_GPIO_Port, FND_DIO_Pin, HIGH);
    }
    else
    {
     HAL_GPIO_WritePin(FND_DIO_GPIO_Port, FND_DIO_Pin, LOW);
    }
    X <<= 1;
    HAL_GPIO_WritePin(FND_SCLK_GPIO_Port, FND_SCLK_Pin, LOW);
    HAL_GPIO_WritePin(FND_SCLK_GPIO_Port, FND_SCLK_Pin, HIGH);
  }

}

void send_port(unsigned char X, unsigned char port)
{
  send(X);
  send(port);
  HAL_GPIO_WritePin(FND_RCLK_GPIO_Port, FND_RCLK_Pin, LOW);
  HAL_GPIO_WritePin(FND_RCLK_GPIO_Port, FND_RCLK_Pin, HIGH);
}


void digit4_show(int n, int replay, uint8_t showZero)
{
  int n1, n2, n3, n4;
  n1 = (int)  n % 10;
  n2 = (int) ((n % 100)-n1)/10;
  n3 = (int) ((n % 1000) - n2 - n1) / 100;
  n4 = (int) ((n % 10000) - n3 - n2 - n1) / 1000;

 for(int i = 0; i<=replay; i++){
 send_port(_LED_0F[n1], 0b0001);
    if(showZero | n>9)send_port(_LED_0F[n2], 0b0010);
    if(showZero | n>99)send_port(_LED_0F[n3], 0b0100);
    if(showZero | n>999)send_port(_LED_0F[n4], 0b1000);
 }
}

void digit4_replay(int n, int replay)
{
  digit4_show(n,replay,false);
}

void digit4(int n)
{
  digit4_show(n,0,false);
}

void digit4showZero_replay(int n, int replay)
{
digit4_show(n, replay, true);
}

void digit4showZero(int n)
{
digit4_show(n, 0, true);
}


void digit2(int n, int port, int replay)
{
  int n1, n2;
  n1 = (int)  n % 10;
  n2 = (int) ((n % 100)-n1)/10;

   for(int i = 0; i<=replay; i++){
   send_port(_LED_0F[n1], port);
   send_port(_LED_0F[n2], port<<1);
   }
}

void digit2_port(int n, int port)
{
digit2(n, port, 0);
}

// 0b0010 > 0b : 2진수 나타내기위함, 값x
// ==   0000 0010 


헤더파일에서는 함수 이름만 

.c 파일에서 함수구현

>

main.c 에서 include 한다음 함수에 값을 잘 넣어 활용

'임베디드 > 고추건조기' 카테고리의 다른 글

FND 분석  (0) 2024.12.02
SPI통신  (0) 2024.12.01
LED 회로  (0) 2024.11.29
UART로 printf() 구현  (0) 2024.11.29
오실로스코프  (1) 2024.11.26