Go Down

Topic: controllare più 74HC595 shift registers (Read 1 time) previous topic - next topic

aelfraed89

Oct 10, 2012, 07:03 pm Last Edit: Oct 10, 2012, 08:58 pm by aelfraed89 Reason: 1
Ciao, premetto che sono nuovo nel mondo di Arduino e ho un po' di problemi a comprendere gli sketch. Vi spiego il problema (ho cerato nel forum ma non ho trovato quello che mi serviva): vorrei utilizzare diversi 74HC595 per per controllare più LEDs possibili e poi usare maxmsp per gestire il tutto. ho cercato in rete e ho trovato queste utilissime guide per l'utilizzo e la connessione di due o tre 595:
http://www.arduino.cc/en/Tutorial/ShiftOut
http://little-scale.blogspot.co.uk/2008/01/three-595-shift-registers.html
ho anche trovato una guida per maxuino, quindi ora come ora riesco tranquillamente a controllare 3 595 usando 3 uscite digitali di Arduino. Mi chiedo: ho usato solo 3 pin di arduino per controllare 3 595, potrei usare i pin rimanenti per controllare altri 595..in teoria potrei quindi controllare altri 9 595 in quanto ho i 9 pin disponibili per farlo, giusto? se si, qualcuno potrebbe aiutarmi a modificare lo skecth che usa solo 3 pin e adattarlo all'utilizzo di più pin e quindi più 595?
Code: [Select]

//Pin connected to ST_CP of 74HC595

int latchPin = 8;

//Pin connected to SH_CP of 74HC595

int clockPin = 12;

////Pin connected to DS of 74HC595

int dataPin = 11;
byte data1;

byte data2;

byte data3;


void setup() {

Serial.begin(57600);

pinMode(latchPin, OUTPUT);


}


void loop() {

if(Serial.available() > 2) {

data1 = Serial.read();

data2 = Serial.read();

data3 = Serial.read();

digitalWrite(latchPin, 0);

shiftOut(dataPin, clockPin, data1);

shiftOut(dataPin, clockPin, data2);

shiftOut(dataPin, clockPin, data3);

digitalWrite(latchPin, 1);

}

}


void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {

int i=0;

int pinState;

pinMode(myClockPin, OUTPUT);

pinMode(myDataPin, OUTPUT);


digitalWrite(myDataPin, 0);

digitalWrite(myClockPin, 0);


for (i=7; i>=0; i--) {

digitalWrite(myClockPin, 0);

if ( myDataOut & (1<<i) ) {

pinState= 1;

}

else {

pinState= 0;

}

digitalWrite(myDataPin, pinState);

digitalWrite(myClockPin, 1);

digitalWrite(myDataPin, 0);

}

digitalWrite(myClockPin, 0);

}

Michele Menniti

Ciao, racchiudi il codice tra i tag
Code: [Select]
così diventa molto più leggibile.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

UweFederer

Senza driver che amplificano i segnali di usita dovresti poter mettere 5-6 HC595 in serie.
Puoi senza problemi usare altri 3 pin per un altra serie di 595.
Ciao Uwe

aelfraed89

ciao Uwe e grazie! quindi ciò che voglio fare è possibile...di questo ne ero quasi certo, ora il problema principale è modificare lo skecth per usare altri 3 pin. Mettiamo il caso che voglio continuare ad usare 3 595 sui 3 pin di arduino e altri 3 595 su altrettanti pin (ad esempio uso 2,3 e 4), in tal caso come dovrei modificare lo skecth? in primis dovrei introdurre le variabili quindi la prima parte dovrebbe diventare così:
Code: [Select]

//Pin connected to ST_CP of 74HC595
int latchPin1 = 8;
int latchPin2 = 2 ;
//Pin connected to SH_CP of 74HC595
int clockPin2 = 12;
int clockPin2 = 4;
////Pin connected to DS of 74HC595
int dataPin1 = 11;
int dataPin2 = 3;

byte data1;
byte data2;
byte data3;

byte data4;
byte data5;
byte data6;

void setup() {

Serial.begin(57600);

pinMode(latchPin1, OUTPUT);
pinMode(latchPin2, OUTPUT);

}

void loop() {

if(Serial.available() > 2) {

data1 = Serial.read();
data2 = Serial.read();
data3 = Serial.read();

data4 = Serial.read();
data5 = Serial.read();
data6 = Serial.read();

digitalWrite(latchPin1, 0);
digitalWrite(latchPin2, 0);

shiftOut(dataPin1, clockPin1, data1);
shiftOut(dataPin1, clockPin1, data2);
shiftOut(dataPin1, clockPin1, data3);

shiftOut(dataPin2, clockPin2, data4);
shiftOut(dataPin2, clockPin2, data5);
shiftOut(dataPin2, clockPin2, data6);

digitalWrite(latchPin1, 1);
digitalWrite(latchPin2, 1);

}

}


sbaglio?

uwefed

devi modificare
Quote
int clockPin2 = 12;
int clockPin2 = 4;

Manca clockPin1 e devi fare pinMode di tutti i pin, ma senó funziona.
Ciao Uwe

Go Up