Ga naar inhoud


[arduino] 32 bit shiftregisters vraagje


Matchless

Aanbevolen berichten

  • Moderator

Ik ben al een hele tijd ons huis aan het verbouwen en nu kan ik langzaam beginnen aan de meer technische (en leukere) karweitjes.

 

In het huis heb ik ongeveer 80 ledspotjes hangen en alle draden van deze spotjes komen in 1 ruimte uit.

 

De bedoeling is dat alle spotjes gestuurd worden door een arduino microcontroller. Hiervoor wil ik een shiftregister op de arduino aansluiten wat ook gelukt is.

 

Het probleem is echter dat ik nu 2 shiftregisters wil gebruiken die per chip (lc7935) 32 uitgangen heeft.

Echter vind ik op het net alleen maar code waar men gebruik maakt van 74hc595 of tpic6b595 shiftregisters. Dit zijn 8 en 16 bit shiftregisters en deze kan je evt daisy-chainen.

 

Mij lukt het echter niet om de code zo aan te passen dat hij de 2 chips van mij aanstuurt. Hij laat wel licht zien als ik de 16 bit code gebruik maar deze is uiteraard 2x16 bits.

Per chip ziet hij dus "dubbel".Ook moet ik per bit kunnen aanpassen zonder de andere 63 bits te veranderen.

 

De bedoeling is om verschillende functies aan een ruimte te geven.Bijv een paar lampen aan als het donkerder wordt of even knipperen als iemand op de deurbel drukt.

 

Hier is iig de code die ik wil aanpassen:

 

// STP16C596_1.pde (Arduino, ATMega168)
//
// Peter H Anderson, Jan, '08

#define DIR_OUT(pin) pinMode(pin, OUTPUT)
#define DIR_IN(pin)   pinMode(pin, INPUT)
#define O_HIGH(pin) digitalWrite(pin, HIGH)
#define O_LOW(pin) digitalWrite(pin, LOW)
#define IN(pin) digitalRead(pin)

#define DOUT 2
#define CLK 3
#define NOT_LE 4


void setup()
{
  DIR_OUT(DOUT);
  DIR_OUT(CLK);
  DIR_OUT(NOT_LE);
  O_HIGH(NOT_LE);
  Serial.begin(9600);
  delay(5000);
}

void loop()
{
    int n;
    unsigned int val = 0;

    val = 0x0000;  // start with all off
    for (n=0; n<16; n++)
    {
        shift_out_16(val);
        val = (val << 1) | 0x01; // walk the LEDs up
        delay(25);
    }

    val = 0xffff; // start with all ones
    for (n=0; n<16; n++)
    {
        val = val & ~(0x01 << (15 - n)); // walk a zero down
        shift_out_16(val);
        delay(25);
    }
 }

void shift_out_16(unsigned int v)
{
   int n;
   O_LOW(CLK);   // be sure CLK is idle at zero
   O_HIGH(NOT_LE);
   for (n=0; n<16; n++)
   {
       if (v >> (15 - n))  // most sig bit first
       {
           O_HIGH(DOUT);
       }
       else
       {
           O_LOW(DOUT);
       }

       delay(1);
       O_HIGH(CLK);
       delay(1);
       O_LOW(CLK);
   }
   O_LOW(NOT_LE);
   O_HIGH(NOT_LE);
}

 

 

 

Link naar de maker: http://www.phanderson.com/arduino/stp_596.html

 

 

 

Een smartphone is een hulpmiddel, geen levensstijl 

Kijk rond IN de wereld in plaats van voorover gebogen NAAR de wereld.

Link naar reactie
Delen op andere sites


  • Moderator

Hallo twan..

 

Dat ken ik en heb dat voor de test al eens opgebouwd.

 

Het lastige hiervan is dat de nodo gebruik maakt van x10 of 433mhz setjes. Dat is voor mij geen oplossing omdat je dat zo'n 80 van die draadloze stopcontacten nodig hebt (met trafo's want de spotjes zijn 12 volt).

erg duur en veel extra electronica wat weer extra energie verbruikt.

Daarom wil ik de spotjes direct aansturen.

En de draden van de spotjes en schakelaars liggen al in het huis.Ik heb nl behalve een 220 volt lichtnet ook een 12 volt netwerk ge-installeerd.

 

Nu heb ik de draden en schakelaars gewoon aan elkaar geknoopt en dat werkt gewoon. Alleen wil ik de arduino gebruiken om wat meer functionaliteit in het systeem te krijgen.

Een smartphone is een hulpmiddel, geen levensstijl 

Kijk rond IN de wereld in plaats van voorover gebogen NAAR de wereld.

Link naar reactie
Delen op andere sites

Matchless;

Declareer de var als een long. Dat is een 32 bit datatype. En dan gewoon i.p.v. 16 stappen, 32 stappen maken. (Ook niet vergeten de shift "<<" aan te passen...)

 

Als je mij een email stuurt met je huidige project, dan maak ik wel even de juiste aanpassingen.

“Success is not final, failure is not fatal: it is the courage to continue that counts.” ~ Winston Churchill

Link naar reactie
Delen op andere sites

  • Moderator

hallo big fellow..

 

 

Declareer de var als een long. Dat is een 32 bit datatype. En dan gewoon i.p.v. 16 stappen, 32 stappen maken. (Ook niet vergeten de shift "<<" aan te passen...)

ws haal ik dan wel de 32 bits maar hoe zit het dan met de andere registers die "ge-daisy-chained" zijn?

 

Want ik heb een 2e lc7935 aangesloten en straks moeten er nog meer registers aangesloten worden.

 Loop ik dan niet tegen de beperkingen van de arduino aan ?

 

Nu had ik geprobeerd om de registers via SPI aan te sluiten maar daar kom ik dezelfde problemen tegen. Maar SPI zou wel sneller zijn en minder flash verbruiken. Alleen kan ik dan niet meer dan 1 byte per keer sturen.

Stuur ik nu 4 bytes dan branden de ledjes op 1 register 4x .

Dus bijv. led 1 , 8 , 16 en 32.

Die bytes zouden volgens mij op de een of andere manier  "aan elkaar geknoopt" moeten worden om zo alle 32 bits ineens te versturen.

 

Maar ik zal contact met je opnemen met mijn plannen.

Een smartphone is een hulpmiddel, geen levensstijl 

Kijk rond IN de wereld in plaats van voorover gebogen NAAR de wereld.

Link naar reactie
Delen op andere sites

Een 32 bits long schuif je naar buiten voor een van de IC's en daarna de volgende long voor het volgende IC... Je kan zelfs allemaal bytes gebruiken, maar dan wordt het makkelijker met een array...

Stuur mij het maar door, en dan zal ik er eens naar kijken... :)

“Success is not final, failure is not fatal: it is the courage to continue that counts.” ~ Winston Churchill

Link naar reactie
Delen op andere sites

  • Moderator

klein succesje..

 

Ik heb de "var" als long gedeclareerd maar dat werkte niet.

Wel nadat ik   "  if (v >> (15 - n)) // most sig bit first "  veranderde in "   if (long v >> (31 - n)) // most sig bit first".

 

 

Nu telt hij netjes naar boven tot de 32e bit. Maar het terug tellen gaat niet goed.

Hij slaat nl eerst bit 32 tot 17 over en gaat dan vanaf bit 16 wel goed omlaag. Dus led voor led uitgaan.

Uiteraard heb ik alle 16 waarden veranderd in 32. En de var beginwaarden veranderd zodat hij op 32 bit uitkomt (0x00000000 en 0xffffffff).

 

Een beetje een halve "night rider" lichtje dus.

Een smartphone is een hulpmiddel, geen levensstijl 

Kijk rond IN de wereld in plaats van voorover gebogen NAAR de wereld.

Link naar reactie
Delen op andere sites

Maak een account aan of log in om te reageren

Je moet een lid zijn om een reactie te kunnen achterlaten

Account aanmaken

Registreer voor een nieuwe account in onze community. Het is erg gemakkelijk!

Registreer een nieuwe account

Inloggen

Heb je reeds een account? Log hier in.

Nu inloggen
×
×
  • Nieuwe aanmaken...