LedCube 2.0?

Vuosi vierähtänyt kuutioprojektista ja sen kanssa on viime aikoina tullut vähän värkkäiltyä. Idea juolahti mieleen, että jos tekis parememman kontrollerin. Noh, sen enempää homman järkevyyttä ajattelematta KiCad auki ja hahmotelmaa miltä homma voisi näyttää.

Kontrollerilla on kaksi tehtävää.

  1. Laske efektin frame
  2. Puske framen data shiftrekistereille ja näytä oikea kerros

Mitä voisi tehdä paremmin? Nykyisessä versiossa shiftrekisterille syötettävät signaalit generoidaan softalla. Hidasta! Meillä kuiteskin on käytössä rautatason SPI. Toiseksi kerroksen valitsevia transistoreja ohjataan myös shiftrekisterillä. Hidasta! Voitaisiin pyhittää mikrokontrollerilta kokonaan oma portti sitä varten.

Kaivetaan kaapista hiukan tavaraa ja tutkitaan.

Nasha + ShiftregisterSeuraavanlainen setuppi: Nasha (AtMega32), 74HC595 Shiftrekisteri ja muutama ledi.

Ajetaan yksi tavu sisään softapohjasesti.


for(uint8_t i = 0; i < 8; i++) {
    PORTB &= ~(1 << CLOCK); //Clock LOW

    PORTB &= ~(1 << DATA); //Clear data bit
    PORTB |= (((0b10100010 >> i) & 0x01) << DATA); //Set data bit

    PORTB |= (1 << CLOCK); //Clock HIGH
}

PORTB |= (1 << LATCH); //Latch
PORTB &= ~(1 << LATCH);

Lopputulos näyttää seuraavalta

Softapohjanen shitrekisterin ohjausNasha sykkii 16 MHz kelloilla joten

Latex formula

Reilu viisikymmentä sykliä yhteen bittiin. Koko tavuun pyöreät 400 ja koko kerrokseen hiukan yli 2600. Kaikki kerrokset, kun on käyty läpi, niin syklejä on tuhlattu melkein 210 tuhatta. Eli 16 MHz kellotaajuudella yhdestä sekunnista kuluu 1.3% ledien vilkutteluun.

Datasheetistä löytyy SPI:n kohdalta seuraavanalinen taulukko.

SPI Clock

SPI Control Register – SPCR 

• Bits 1, 0 – SPR1, SPR0: SPI Clock Rate Select 1 and 0

These two bits control the SCK rate of the device configured as a Master. SPR1 and SPR0 have no effect on the Slave.

SPI Status Register – SPSR:

• Bit 7 – SPIF: SPI Interrupt Flag 

When a serial transfer is complete, the SPIF Flag is set. An interrupt is generated if SPIE in SPCR is set and global interrupts are enabled. If SS is an input and is driven low when the SPI is in Master mode, this will also set the SPIF Flag. SPIF is cleared by hardware when executing the corresponding interrupt handling vector. Alternatively, the SPIF bit is cleared by first reading the SPI Status Register with SPIF set, then accessing the SPI Data Register (SPDR). 

• Bit 0 – SPI2X: Double SPI Speed Bit

When this bit is written logic one the SPI speed (SCK Frequency) will be doubled when the SPI is in Master mode (see Table 58).

Eli asettamalla SPR1 ja SPR0 nollaksi sekä SPI2X ykköseksi saadaan SPI sykkimään kellotaajuudella, joka on puolet kontrollerin taajuudesta. SPIF kertoo meille, kun SPI on lopettanut hommansa.


SPCR = (1 << SPE) | (1 << MSTR) | (1 << DORD); //Enable SPI, Master Mode, LSB first
SPSR |= (1 << SPI2X); //Double speed

SPDR = 0b10100010; //Send byte
while(!(SPSR & (1 << SPIF))); //Wait for transfer is complete

PORTB |= (1 << LATCH); //Latch
PORTB &= ~(1 << LATCH);

SPI 8MHzSkooppi sen todistaakin. Nätisti jutellaan shiftrekisterille 8 MHz:n nopeudella. Eli tuhlamme kaksi sykliä yhteen bittiin, tavu = 16 sykliä, kerros = 1024 sykliä ja koko kuutio = 8192 sykliä. Säästettiin semmonen 200 tuhatta sykliä. Nyt käytämme sekunnista 0.05 prosenttia shiftrekisterien ohjailuun. Muutos on kuiteski reilut 90%. Ei paha parannus.

Katsotaan mihin tämä etenee.

This entry was posted in Jotain aivan muuta and tagged , , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *