문제원인
7세그먼트
1. 동시에 같은숫자 O
2. " 다른숫자 X
> 1 , 2, 3 ,4 를 각각 빠르게 껏다켰다
> 눈에는 다르게 켜진컷 처럼 보임
그러느라 while 문은 하나여서 다른 일을 못함
> timer
: 숫자표현
> main
: printf("hello\r\n");
>> 세그먼트 + UART 동시실행
근데..
7세그먼트 표현 | 온도 가져옴
: GPIO 신호 만듬 | : GPIO 신호 만듬
> 온도 쪽에서 GPIO 쓰다가 세그먼트에서 갑자기 그걸 뻇어감
> 온도에서 끝나면 세그먼트로 넘어가게 해주어야함
문제해결
1. 하드웨어적으로 > 불가..
>
모듈 구조
: 7세그먼트 + 쉬프트 레지스터
a) 7세그먼트
: 3.3v > DIG 1, 2,3,4 가 동시에 켜지는 구조
ex) A > A A A A .. 서로 다르게 못킴 ex) A B C D : X
b) 쉬프트 레지트터
: MCU 가아닌 순수 회로
: 목적) 직렬 > 병렬로 바꾸는 역할
14번 in + 11번(SCLK) > + 12번 ( LCLK) > 13번 ( ON/ OFF) > Qa,Qb,Qc,,
11100011 > > >> > 11100011
( 직렬입력 ) > SR 로 병렬입력 > LR로 병렬입력 > 병렬 출력
// 1, 1, 1, 0, 0, 1, 1 // 11100011
중간에 LR (LATCH CLOCK) 이 있는이유
SR 중에 출력하면 SCLK에 의해 데이터 출력이 불안정함 > 값이 바뀔수 있음
// 일부 bit 는 이전값, 일부bit는 새로운값
> LR 로 한번 옮겨서 고정 ! > 출력
// 데이터를 받아온뒤 LR을 on 해서 8bit 받고 off 로 차단 ! > 고정할 수 있음
>> SR 로도 가능하나.. 그러면 NEW DATA 를 받아올수 없게 됨
: SR 은 데이터를 계속 받아오고 (데이터 연속성)
: LR 은 8bit 씩 짤라서 저장 ( 데이터 안정성)
> 출력 : 11100011
void send_port(unsigned char X, unsigned char port) {
send(X); // 첫 번째 데이터 전송 // 8bit
send(port); // 4bit
HAL_GPIO_WritePin(FND_RCLK_GPIO_Port, FND_RCLK_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(FND_RCLK_GPIO_Port, FND_RCLK_Pin, GPIO_PIN_SET);
}
레지스터 (IC칩 ) 2개
a b c d e f g 표시용 1개
DIG 1,2,3,4 표시용 1개 // 세그먼트 1,2,3,4번
이 둘은
SERIAL DATA OUTPUT 으로 연결되어있음
> 첫번째 칩의 SERIAL DATA OUTPUT 이 두 번째 칩의 SERIAL DATA INPUT 과 연결
8bit 를 받고 ( X에대한)
4bit를 받으면 (Port)
SRh 에있던게 OUTPUT 으로 빠짐 > 다음 칩의 SRa 로 들어감
ex) send(0x80) // 8bit
0x80 : 1000 0000
// 11 , 7, 4, 2, 1, 10, 5, 3에 연결
1) 1 이므로 DATA : HIGH // DATA 1로 셋팅
2) SCLK : LOW > HIGH // 클럭을 LOW > HIGH
>> SRa : 1
2) 0 DATA : 0, (1) 의 DATA > Q를 거쳐 SRb 로 이동
> SRa : 0
"
"
>> 0000 0001 로 나옴 // 오실로스코프로 확인
a) LCLK > SR 에있는게 다 LR 로 이동 > 출력
: 0000 0001
> 7세그먼트
ex) send(ob0001) // 4bit
// DIG 1, 2, 3, 4 에 연결
알수없는 이유로 프로그램이 맛갈수도 있음
>> 백업의 일상화