임베디드 용어설명

Serial in Parallel Out bu2090f소자 Arduino shiftout() 사용

젊은우산 2019. 4. 19. 11:38
반응형

시프트레지스터 이니까 아두이노 코드 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의 비트를 잘 넣어서 보내면 된다. 

 

반응형