zaterdag 13 juni 2015

Het aansturen van een schuifregister (shift register) in twee zinnen

Wie YouTube bezoekt vindt tal van filmpjes waarin een heel theoretisch kader over schuifregisters (of: shift registers) wordt opgebouwd. Enorm interessant, maar veel wijzer op praktisch gebied wordt je er vaak niet van. Het kwartje viel bij mij toen tussen neus en lippen door een opmerking werd gemaakt. Hoe die precies luidde, kan ik niet meer achterhalen. Mijn variant luidt als volgt:
Je schuift een 1 het register in als de data-pin op HIGH staat als de klok-pin op HIGH komt. 
Daarnaast geldt:
Je schuift een 0 het register in als de data-pin op LOW staat als de klok-pin op HIGH komt.
Met andere woorden: als de data-pin en de klok-pin beiden op HIGH staan, heb je een 1, als alleen de klok-pin op HIGH staat, heb je een 0.

Klaar met schuiven? Dan de latch-pin naar HIGH brengen om de ingestelde waardes op de output-pinnen te plaatsen.

Een voorbeeld: onderstaande Arduino-schets stuurt 10 LED'jes aan (de snelle lezer merkt op dat een 8-bits schuifregister als de 595 geen 10 outputs heeft, maar slechts 8; ik heb er twee aan elkaar verbonden door pin 9 van de eerste op pin 14 (data input) van de tweede te plaatsen, en de overige pinnen (10 t/m 16) steeds door te lussen). Heb je slechts 1 register dan is dat geen punt, dan brandt er de laatste twee seconden alleen even geen LED'je.
#include <Time.h>

int latchPin = 12;
int clockPin = 11;
int dataPin  = 10;

void setup() 
{
  pinMode( dataPin,  OUTPUT );
  pinMode( clockPin, OUTPUT );
  pinMode( latchPin, OUTPUT );
}

void loop() 
{
   int secondesTiental = second() / 10;
   int secondesEnkel   = second() % 10;
   
   for( int p=10; p>=0; p-- )
   {
     digitalWrite( dataPin, p == secondesEnkel ? HIGH : LOW );
     digitalWrite( clockPin, HIGH );
     digitalWrite( clockPin, LOW );
   }
   
   digitalWrite( latchPin, HIGH );
   digitalWrite( latchPin, LOW );
   
   delay( 250 );
}

Deze schets maakt gebruik van de Time-library met de functie "second()". Geen toeval, want ik ben bezig met het maken van een klok. De functie second() geeft het aantal seconden van de huidige tijd (dus om 22:30:45 geeft de functie 45 terug). Daarvan wil ik slechts de 5 overhouden (dit register stuurt slechts één van de twee seconde-displays aan), dus moeten we eerst de secondes zo vaak  mogelijk delen door 10 (ofwel: second() % 10). Resteert in dit voorbeeld de 5.

Vervolgens worden in de for-loop alle 10 de pins afgelopen. Voor elke pin doorlopen we een klok-cyclus. Als het pin-nummer gelijk is aan de huidige seconde, dan wordt een 1 (HIGH) het register ingeschoven. Bij alle andere pins een 0 (LOW). Hebben we alle pins gehad, dan wordt ge-latch-ed.

Het resultaat: een looplicht dat elke seconde een LED'je opschuift :)

Geen opmerkingen:

Een reactie posten