시프트레지스터 이니까 아두이노 코드 Shiftout()을 사용하려고했다.
하지만 bu2090f 는 12bit 를 지원하고있고
아두이노 Shiftout의 .h 파일을 열어보면 8비트로 되어있다는것을 알수 있따.
void shiftOut_me(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
{
uint8_t i;
for (i = 0; i < 8; i++) {
if (bitOrder == LSBFIRST)
digitalWrite(dataPin, !!(val & (1 << i)));
else
digitalWrite(dataPin, !!(val & (1 << (7- i))));
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
}
bu2090f는 12bit를 지원하므로 8비트까지는 표현의 한계가 있고, (내가여기서 계속 shiftout()을 사용하려고해서 비트가 계속 안나오는 부분이 많았다. ) 12비트 이상의 수를 표현하기위해 shiftout함수를 바꾸어줘야하는 부분이었다.
바꾼코드
void shiftOut_me(uint32_t dataPin, uint32_t clockPin, uint32_t bitOrder, uint32_t val)
{
uint32_t i;
for (i = 0; i < 12; i++) {
if (bitOrder == LSBFIRST)
digitalWrite(dataPin, !!(val & (1 << i)));
else
digitalWrite(dataPin, !!(val & (1 << (11 - i))));
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
}
bu2090f 2개를 병렬로 연결해서 두개의 clock과 하나의 data를 사용할 예정이었기에 uint32를 사용하였다.
즉 데이터를 12bit가 아닌 24bit으로 길게 늘린다음 data에 넣어보낼 계획이다.
/*
void setup() {
Serial.begin(115200);
pinMode(DATA,OUTPUT);
pinMode(clk1,OUTPUT);
pinMode(clk2,OUTPUT);
}
void loop() {
shiftOut_me(DATA, clk1, LSBFIRST, 0xffffff); //seq[]
shiftOut_me(DATA, clk2, LSBFIRST, 0xffffff>>12); //seq[]
}
*/
위의 코드형식으로 보내면되고, 0xffffff 이부분에 앞에는 clk1의 비트, 뒤에는 clk2의 비트를 잘 넣어서 보내면 된다.
'임베디드 용어설명' 카테고리의 다른 글
Date Code 란? 데이트 코드란? (0) | 2020.03.01 |
---|---|
가속도센서의 원리 각도 검출방법(중력가속도센서, 자이로센서) (0) | 2020.01.06 |
74HC595 / 74HC165 시프트레지스터(Shift Register) (0) | 2019.03.11 |
ESP32 (0) | 2019.03.08 |
AMS1117CD-5.0 5V 레귤레이터 (0) | 2019.03.06 |