임베디드/고추건조기

FND 분석

twoweeks-within 2024. 12. 2. 20:51


// SCLK
  HAL_GPIO_WritePin(FND_SCLK_GPIO_Port, FND_SCLK_Pin, LOW);
HAL_GPIO_WritePin(FND_SCLK_GPIO_Port, FND_SCLK_Pin, HIGH);

// HIGH 로 끝나므로 시작도 HIGH

// DO (DATA OUT)
    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);
    }

   
send(0xF8);
HAL_Delay(1000);
> 오실로스코프로 1111 1000 확인
 
//
1.  send(0xF8); 
2.  send(0b0001);  // b: binary 2진수 // 
// 0b1000 : 세그먼트 4번째가 on
// 0b0100 : 세그먼트 3번째가 on
    "
// 0b0001 : 세그먼트 1번째가 on
3.  HAL_GPIO_WritePin(FND_RCLK_GPIO_Port, FND_RCLK_Pin, LOW);
4.  HAL_GPIO_WritePin(FND_RCLK_GPIO_Port, FND_RCLK_Pin, HIGH); 

 >> LOW 갔다가 HIGH 가 되면서 RCLK 작동 

     > 데이터 표시 확정

1.+ 2. > 16개bit 의 SCLK 에
 1111 1000 0000 0001 // send
3. + 4. > 또다른 RCLK 가  SCLK 다끝나고 L > H

uint8_t X : X 가 low로 떨어져야 세그먼트 ON
1111 1000 : 0번, 1번, 2번 ON
 __     // 0번
|__ |   // 1번
|__ | . // 2번

가운데 -- : 6번
마지막 ' . ' : 7번


함수분석

     for(int i=0; i<=9999;i++){

     digit4_replay(i,50);
     }

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

>

void digit4_show(int n, int replay, uint8_t showZero)
{
  int n1, n2, n3, n4;
  n1 = (int)  n % 10;  // 1의자리
  n2 = (int) ((n % 100)-n1)/10;  // 10의자리
  n3 = (int) ((n % 1000) - n2 - n1) / 100; // 100의자리
  n4 = (int) ((n % 10000) - n3 - n2 - n1) / 1000;  // 1000의 자리
// 코드오류: n3-n2-n1 : *100, *10 *1 을 해주어야함
//              > 사실 빼도 달라지진 않음 int 나누기 몫 게산 > 나머지가 버려짐 

 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);
 }
}

 digit4_show(n,replay,false);
    >  showZero == true  > n이 어떤값이는 세그먼트 2번, 3번,4번이 켜짐
    >  showZero == false  > 
                                     n>9 일때, n>99 일떄, n>999 일때여야 2번,3번,4번이켜짐
  > bit OR 계산

replay : 보여주는 길이 // ~= Delay
 replay = 1  > 1을 2번 하고 2, 2를 1번하고 3..
 replay = 50 > 1을 51번 하고 2, 2를 51번하고 3..
 >> replay 가 길수록 1~9 ~99 ~999 의 과정을 하나하나 다 볼 수 있음

전체과정!!
  Start : main.c 에서 for문 i=0 >  digit4_replay 함수 > digit4_show함수 > for문 replay 만큼 실행 .. 0이  51번 실행 > for문 종료
     > digit4_show함수 종료 > digit4_replay 함수 종료 > mai.c 에서 for문 i++ (i=1) > end
 다시 Start ,,,, 9999번 반복 


앞으로 온도표시...
ex) 
3000 > 300.0 도
22 > 2.2 도 
1005 > 100.5 도


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);
 }
}

>>>>

1. 최소가 0.1 이므로 두번째 자리까진 반드시 나와야함

send_port(_LED_0F[n1], 0b0001);
send_port(_LED_0F[n2], 0b0010);

2. 반드시 두번째 세그먼트 에는  ' . ' 이 찍혀야함
  ' . ' = 7번 (8번째) 자리 0111 1111 == 0x7F 
   _LED_0F[n2]의 값이
0xF9
0xA4
0xB0
....

>> 비트 AND 연산
     1. 8번bit > 0 과 만나면 뭐가됐든 0 이 나옴
    2. 세그먼트 ON 은 0 이되면 켜지도록 셋팅했음
 >나머지 111 1111 을 and로 하면 그대로 나옴

ex) 0111 1111 : 0x7F 
     1111 1001 : 0xF9
     ------------
     0111 1001 
 > 8번bit는 0 이나오면서 : 점 찍힘
    나머지bit는 데이터값 그대로 나옴 2번bit 3번bit ON > 숫자 1


 

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

온도센서  (0) 2024.12.05
GPIO >SPI  (0) 2024.12.03
SPI통신  (0) 2024.12.01
FND 모듈제어  (0) 2024.12.01
LED 회로  (0) 2024.11.29