인프런 커뮤니티 질문&답변

김준한님의 프로필 이미지
김준한

작성한 질문수

[임베디드 입문용] 임베디드 개발은 실제로 이렇게 해요.

FND제어 (실무 노하우) 3

FND를 제어하자 3 실무 노하우

해결된 질문

작성

·

487

·

수정됨

1

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 자주 묻는 질문에 혹시 답이 있을 수 있어요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

안녕하세요. 임베디드를 공부하고 있는 수강생입니다. 좋은 강의 경청하고 있습니다. 감사합니다.

 

FND 제어 중 에러가 발생합니다.

main.c > while(1) >

for(int i = 0; i <= 9; i++)

{

digit2(i,0b0001,50);

}

}

만 실행했을뿐인데,

FND에 4칸 모두 불이 켜지고, 숫자가 올라가는 상황입니다.

수초마다 전체 FND에 점을 포함해서 불 빛이 다 들어오고 있습니다. ㅠㅠㅠㅠ

우문에 현답을 부탁드리겠습니다.

감사합니다. 정보가 완전치 못한 점 양해드립니다.

KakaoTalk_20230704_223724502.jpg

 

답변 2

1

저도 비슷한 문제가 생겨서

void send_port(uint8_t X,uint8_t port){

send(X);

send(port);

HAL_GPIO_WritePin(FND_RCLK_GPIO_Port, FND_RCLK_Pin,HIGH);

HAL_GPIO_WritePin(FND_RCLK_GPIO_Port, FND_RCLK_Pin, LOW);

}

RCLK동작을 LOW -> HIGH에서

HIGH->LOW로 하니깐 4자리까지 잘 동작하네요.. 왜그런지는 모르겠는데;...

ojtube5님의 프로필 이미지
ojtube5
지식공유자

image

제가 드린 자료에서.
\주변 장치 자료\FND 데이터 시트\쉬프트 레지스터를 보시면,
위 내용이 나오는데..

자세히 보니
HIGH->LOW가 맞는것 같네요-_-;;
평상시에 LOW로 있다가, HIGH로 가야하는 것 같네요.

상승 엣지에서, 데이터를 내보네고,
하강 엣지에서는 hold하고 있는다고 하네요.

그러니깐 평상시에 LOW로 있어야 하네요.
그래도 동작했던 이유는 어째던 SCK는 움직이니깐 동작한 것 같네요.

기존 코드가 잘 못 된것 같습니다.
죄송합니다.

1

저도 같은 문제가 있는데요,

refresh되면서 전체 불이 한번 다 들어왔다가 꺼지게 되어, 잔상으로 계속 켜져있는것으로 보이는 것 같습니다. 다만 딜레이를 주면 뭔가 보이긴 하는데, 잔상으로 여러자리가 보이지 않는 문제가 있네요. 여러자리를 출력하기 위해서 아래와 같이 해보는데 모든 LED에 불이 들어옵니다.


int n1, n2, n3, n4;

int n = 123;

 

n1 = (int) n % 10;

n2 = (int) (n % 100)/10;

n3 = (int) (n % 1000)/ 100;

n4 = (int) (n % 10000) / 1000;

 

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

send_port(_LED_0F[n1], 0b0001);

send_port(_LED_0F[n2], 0b0010);

send_port(_LED_0F[n3], 0b0100);

send_port(_LED_0F[n4], 0b1000);

}
위와 같은 코드를 돌리면, 123이 떠야할거 같은데 123이 떠있는 것 같긴한데 모든 LED에 불이 들어와 있습니다. 왜 그런지 모르겠습니다.

해결책을 못찾겠네요.

도움 부탁드립니다.

ojtube5님의 프로필 이미지
ojtube5
지식공유자

안녕하세요.
일단 숫자 하나만 켜보는 코드가 동작하는지 확인해보실래요?
무조건 4개가 다 들어 오는지.
아니면 하나켜지는게 가능한지요 ㅇㅇ/

그리고 아래 상황도 한번 체크 해주시고, 그래도 문제 있으시면 연락 따로 주세요.
1. FND에 숫자가 무조건다 전체가 다 들어오는 상황인지.
2. 하나라도 제어가 되는 상황인지.
3. 혹시나 배선에 문제가 없는지 체크.
4. 기타 설정이 강의와 동일한지
5. 소스코드가 강의와 동일한지

하나만 켜는것은 전혀문제없습니다. GPIO로 하던지, 내장 SPI로 하던지 하나출력하고 딜레이걸면 잘작동하는데 저 코드처럼 계속 반복적으로 출력하게하면 다켜집니다. 뭔가 중간중간에 전체값에 0이 들어가는 refresh가 일어나는게 아닌가싶습니다.

ojtube5님의 프로필 이미지
ojtube5
지식공유자

우선 제가 코드를 한번 보고 오늘 중으로 답변 달겠습니다.

ojtube5님의 프로필 이미지
ojtube5
지식공유자

한번 이렇게 해보실래요 ㅇㅇ?
제가 딜레이 넣으라는 곳에 딜레이를 조금 씩 넣어봐 주세요.
그리고 어떤 결과가 나오는지 좀 알려주세요.
혼자서 해보다가 안되면,
ohjiwan@gmail.com로 연락처 좀 보내주세요.

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

send_port(_LED_0F[n1], 0b0001);
//딜레이를 넣어 보세요.

send_port(_LED_0F[n2], 0b0010);
//딜레이를 넣어 보세요.

send_port(_LED_0F[n3], 0b0100);
//딜레이를 넣어 보세요.

send_port(_LED_0F[n4], 0b1000);
//딜레이를 넣어 보세요.

}

저대로 하면 숫자가 하나씩 명확하게 들어옵니다. 이렇게 되면 두자리 이상을 표현할 수가 없네요... 코드랑 영상찍어서 연락드리겠습니다. 감사합니다.

ojtube5님의 프로필 이미지
ojtube5
지식공유자

딜레이 숫자를 줄여보시면서 해보세요.

나중에 왜 이런지 제가 강의에서 설명해욤.

아하! 감사합니다. 한번 해보겠습니다ㅎ

send_port()사이에 HAL_Delay(1)을 주니까 그나마 좀 나아졌습니다.(불 들어오는 것 빼고 나머지는 약하게 불들어옴) 왜 그런지 간단하게라도 설명해주시면 좋겠습니다.

감사합니다!!

ojtube5님의 프로필 이미지
ojtube5
지식공유자

불을 넣었다 빼따 하면서 숫자를 만들고 있는 건데요.
너무 빠르게 불을 껏다 켰다 하니깐, 꺼진 순간이 너무 없는 거예요.
그래서 다 켜져 있는 걸로 보니는 거예요.

답변 감사합니다!!

ojtube5님의 프로필 이미지
ojtube5
지식공유자

위에 유인수님이 질문 하신 답변 한번 참조해서 수정 해보시겠어요?

김준한님의 프로필 이미지
김준한

작성한 질문수

질문하기