Vizitator Postat Ianuarie 29, 2017 Partajează Postat Ianuarie 29, 2017 Salut! Cum as putea sa transfer datele de la 8 intrari ai lui arduino (micro, nano, ...), pe iesirile unui 74HC595? Am tot cautat exemple, dar fara rezultate. Link spre comentariu
deejay2k1 Postat Ianuarie 29, 2017 Partajează Postat Ianuarie 29, 2017 (editat) void trasferSerial(uint8_t datele_tale){ shiftOut(data_pin, clock_pin, MSBFIRST,datele_tale); digitalWrite(latch_pin, LOW); digitalWrite(latch_pin, HIGH); } bitWrite(datele_tale,0,digitalRead(pin_buton_1)); bitWrite(datele_tale,1,digitalRead(pin_buton_2)); .... bitWrite(datele_tale,7,digitalRead(pin_buton_8)); transferSerial(datele_tale); ori pui definitiv OE la masa, ori printr-un pin arduino, ca sa-si activeze iesirile 595-ul Editat Ianuarie 29, 2017 de deejay2k1 Link spre comentariu
Vizitator Postat Ianuarie 29, 2017 Partajează Postat Ianuarie 29, 2017 (editat) Multumesc deejay2k1. De compilat se compileaza, dar nu merge. Am o problema in program. int data_pin = 8; //pin 14 on the 75HC595int latch_pin = 9; //pin 12 on the 75HC595int clock_pin = 10; //pin 11 on the 75HC595const int pin_buton_1 = 2; // the number of the pushbutton pinconst int pin_buton_2 = 3; // the number of the pushbutton pinconst int pin_buton_3 = 4; // the number of the pushbutton pinconst int pin_buton_4 = 5; // the number of the pushbutton pinconst int pin_buton_5 = 6; // the number of the pushbutton pinconst int pin_buton_6 = 7; // the number of the pushbutton pinconst int pin_buton_7 = 11; // the number of the pushbutton pinconst int pin_buton_8 = 12; // the number of the pushbutton pin/////// aici cred ca este o greseala /////////////// int datele_tale; #define transferSerial(datele_tale);////////////////////////////////////////////////////void setup() { pinMode(data_pin, OUTPUT); pinMode(latch_pin, OUTPUT); pinMode(clock_pin, OUTPUT); pinMode(pin_buton_1, INPUT_PULLUP); pinMode(pin_buton_2, INPUT_PULLUP); pinMode(pin_buton_3, INPUT_PULLUP); pinMode(pin_buton_4, INPUT_PULLUP); pinMode(pin_buton_5, INPUT_PULLUP); pinMode(pin_buton_6, INPUT_PULLUP); pinMode(pin_buton_7, INPUT_PULLUP); pinMode(pin_buton_8, INPUT_PULLUP); } void trasferSerial(uint8_t datele_tale){ shiftOut(data_pin, clock_pin, MSBFIRST, datele_tale); digitalWrite(latch_pin, LOW); digitalWrite(latch_pin, HIGH); }void loop() { bitWrite(datele_tale, 0, digitalRead(pin_buton_1)); bitWrite(datele_tale, 1, digitalRead(pin_buton_2)); bitWrite(datele_tale, 2, digitalRead(pin_buton_3)); bitWrite(datele_tale, 3, digitalRead(pin_buton_4)); bitWrite(datele_tale, 4, digitalRead(pin_buton_5)); bitWrite(datele_tale, 5, digitalRead(pin_buton_6)); bitWrite(datele_tale, 6, digitalRead(pin_buton_7)); bitWrite(datele_tale, 7, digitalRead(pin_buton_8)); transferSerial(datele_tale);} Editat Ianuarie 29, 2017 de Vizitator Link spre comentariu
rlodina Postat Ianuarie 29, 2017 Partajează Postat Ianuarie 29, 2017 Sterge linia: #define transferSerial(datele_tale); nu inteleg la ce folosesti acest define. Si ca sa fim extrem de exacti - linia: int datele_tale; ar trebui sa fie: uint8_t datele_tale daca tot nu merge verifica: ori pui definitiv OE la masa, ori printr-un pin arduino, ca sa-si activeze iesirile 595-ul Link spre comentariu
deejay2k1 Postat Ianuarie 29, 2017 Partajează Postat Ianuarie 29, 2017 la cererea colegului, draft-ul de program #define transferInterval 100 //trimitem datele o data la 100ms#define data_pin A1#define oe_pin A0#define latch_pin A3#define clock_pin A2int arrayButoane[] = {2, 3, 4, 5, 6, 7, 8, 9}; //pinii la care sunt legate butoanelelong lastTime = 0L;uint8_t butoane = 0x00;void transferData(uint8_t butoane) { shiftOut(data_pin, clock_pin, MSBFIRST, butoane); digitalWrite(latch_pin, LOW); digitalWrite(latch_pin, HIGH);}void setup () { for (int i = 0; i < 8; i++) { pinMode(arrayButoane[i], INPUT_PULLUP); //legi butoanele catre masa } pinMode(data_pin, OUTPUT); pinMode(clock_pin, OUTPUT); pinMode(latch_pin, OUTPUT); pinMode(oe_pin, OUTPUT); digitalWrite(oe_pin, LOW); transferData(0x00); //trimitem 0 catre toate iesirile la inceput}void loop () { if (millis() > lastTime + transferInterval) { for (int i = 0; i < 8; i++) { bitWrite(butoane, i, digitalRead(arrayButoane[i])); } transferData(butoane); }} Link spre comentariu
Vizitator Postat Ianuarie 30, 2017 Partajează Postat Ianuarie 30, 2017 (editat) la cererea colegului, draft-ul de program #define transferInterval 100 //trimitem datele o data la 100ms#define data_pin A1#define oe_pin A0#define latch_pin A3#define clock_pin A2int arrayButoane[] = {2, 3, 4, 5, 6, 7, 8, 9}; //pinii la care sunt legate butoanelelong lastTime = 0L;uint8_t butoane = 0x00;void transferData(uint8_t butoane) { shiftOut(data_pin, clock_pin, MSBFIRST, butoane); digitalWrite(latch_pin, LOW); digitalWrite(latch_pin, HIGH);}void setup () { for (int i = 0; i < 8; i++) { pinMode(arrayButoane[i], INPUT_PULLUP); //legi butoanele catre masa } pinMode(data_pin, OUTPUT); pinMode(clock_pin, OUTPUT); pinMode(latch_pin, OUTPUT); pinMode(oe_pin, OUTPUT); digitalWrite(oe_pin, LOW); transferData(0x00); //trimitem 0 catre toate iesirile la inceput}void loop () { if (millis() > lastTime + transferInterval) { for (int i = 0; i < 8; i++) { bitWrite(butoane, i, digitalRead(arrayButoane[i])); } transferData(butoane); }} Felicitari deejay2k1. Functioneaza perfect. Sterge linia: #define transferSerial(datele_tale); nu inteleg la ce folosesti acest define. Si ca sa fim extrem de exacti - linia: int datele_tale; ar trebui sa fie: uint8_t datele_tale daca tot nu merge verifica: ori pui definitiv OE la masa, ori printr-un pin arduino, ca sa-si activeze iesirile 595-ul Am facut si modificarile tale rlodina. int data_pin = A1; //pin 14 on the 75HC595 (8)int latch_pin = A3; //pin 12 on the 75HC595 (9)int clock_pin = A2; //pin 11 on the 75HC595 (10) int pin_buton_1 = 2; // the number of the pushbutton pin int pin_buton_2 = 3; // the number of the pushbutton pin int pin_buton_3 = 4; // the number of the pushbutton pin int pin_buton_4 = 5; // the number of the pushbutton pin int pin_buton_5 = 6; // the number of the pushbutton pin int pin_buton_6 = 7; // the number of the pushbutton pin int pin_buton_7 = 8; // the number of the pushbutton pin int pin_buton_8 = 9; // the number of the pushbutton pinuint8_t datele_tale;void setup() { pinMode(data_pin, OUTPUT); pinMode(latch_pin, OUTPUT); pinMode(clock_pin, OUTPUT); pinMode(pin_buton_1, INPUT_PULLUP); pinMode(pin_buton_2, INPUT_PULLUP); pinMode(pin_buton_3, INPUT_PULLUP); pinMode(pin_buton_4, INPUT_PULLUP); pinMode(pin_buton_5, INPUT_PULLUP); pinMode(pin_buton_6, INPUT_PULLUP); pinMode(pin_buton_7, INPUT_PULLUP); pinMode(pin_buton_8, INPUT_PULLUP); } void trasferSerial(uint8_t datele_tale){ shiftOut(data_pin, clock_pin, MSBFIRST, datele_tale); digitalWrite(latch_pin, LOW); digitalWrite(latch_pin, HIGH); }void loop() { bitWrite(datele_tale, 0, digitalRead(pin_buton_1)); bitWrite(datele_tale, 1, digitalRead(pin_buton_2)); bitWrite(datele_tale, 2, digitalRead(pin_buton_3)); bitWrite(datele_tale, 3, digitalRead(pin_buton_4)); bitWrite(datele_tale, 4, digitalRead(pin_buton_5)); bitWrite(datele_tale, 5, digitalRead(pin_buton_6)); bitWrite(datele_tale, 6, digitalRead(pin_buton_7)); bitWrite(datele_tale, 7, digitalRead(pin_buton_8)); trasferSerial(datele_tale);} Functioneaza perfect si asa. https://www.youtube.com/watch?v=3ufpnDaB_98 Editat Ianuarie 30, 2017 de Vizitator Link spre comentariu
deejay2k1 Postat Ianuarie 30, 2017 Partajează Postat Ianuarie 30, 2017 (editat) am sters din greseala o linie, in loop(), dupa transferData(butoane), mai trebuie adaugat lastTime = millis(); ca sa fie non-blocking. Editat Ianuarie 30, 2017 de deejay2k1 Link spre comentariu
Vizitator Postat Ianuarie 30, 2017 Partajează Postat Ianuarie 30, 2017 (editat) Am completat codul cu recomandarea ta deejay2k1, functioneaza perfect. Codul, deja l-am adaptat pt un mic proiect. A suferit multe schimbari, deoarece nu am nevoie ca intrarile sa fie citite, si apoi transferate. Dar mai aveam nevoie de o singura iesire pt un proiect, realizat cu un Nano. Din acest motiv, a terbuit sa modific proiectul, si sa folosesc un 74HC595. Proiectul inceput este acesta: https://www.youtube.com/watch?v=nynfHIkcWp4&index=6&list=PL7yEqAHOmrzIA9vhZujzrubPxgeHaGba7 Editat Ianuarie 30, 2017 de Vizitator Link spre comentariu
Vizitator Postat Februarie 4, 2017 Partajează Postat Februarie 4, 2017 (editat) Dupa mai multe cautari pentru extinderea iesirilor, care sa utilizeze circuitul 74HC595, atasez codul: // Exemplu preluat de pe saitul// http://www.zem.fr/decouverte-du-composant-74hc595-8-bit-shift-register/int SER_Pin = A1; //pin 14 on the 75HC595 8int RCLK_Pin = A3; //pin 12 on the 75HC595 9int SRCLK_Pin = A2; //pin 11 on the 75HC595 10//How many of the shift registers - change this#define number_of_74hc595s 1 //do not touch#define numOfRegisterPins number_of_74hc595s * 24 // * 8 pentru 8 biti // * 16 pentru 16 bitiboolean registers[numOfRegisterPins]; void setup(){ pinMode(SER_Pin, OUTPUT); pinMode(RCLK_Pin, OUTPUT); pinMode(SRCLK_Pin, OUTPUT); //reset all register pins clearRegisters(); writeRegisters();} //set all register pins to LOWvoid clearRegisters(){ for(int i = numOfRegisterPins - 1; i >= 0; i--){ registers[i] = LOW; }} //Set and display registers//Only call AFTER all values are set how you would like (slow otherwise)void writeRegisters(){ digitalWrite(RCLK_Pin, LOW); for(int i = numOfRegisterPins - 1; i >= 0; i--){ digitalWrite(SRCLK_Pin, LOW); int val = registers[i]; digitalWrite(SER_Pin, val); digitalWrite(SRCLK_Pin, HIGH); } digitalWrite(RCLK_Pin, HIGH); } //set an individual pin HIGH or LOWvoid setRegisterPin(int index, int value){ registers[index] = value;} void loop(){ setRegisterPin(0, LOW); setRegisterPin(1, HIGH); setRegisterPin(2, LOW); setRegisterPin(3, HIGH); setRegisterPin(4, LOW); setRegisterPin(5, HIGH); setRegisterPin(6, LOW); setRegisterPin(7, HIGH); setRegisterPin(8, LOW); setRegisterPin(9, HIGH); setRegisterPin(10, LOW); setRegisterPin(11, HIGH); setRegisterPin(12, LOW); setRegisterPin(13, HIGH); setRegisterPin(14, LOW); setRegisterPin(15, HIGH); setRegisterPin(16, LOW); setRegisterPin(17, HIGH); setRegisterPin(18, LOW); setRegisterPin(19, HIGH); setRegisterPin(20, LOW); setRegisterPin(21, HIGH); setRegisterPin(22, LOW); setRegisterPin(23, HIGH); writeRegisters(); //MUST BE CALLED TO DISPLAY CHANGES //Only call once after the values are set how you need. delay(1500); setRegisterPin(0, HIGH); setRegisterPin(1, LOW); setRegisterPin(2, HIGH); setRegisterPin(3, LOW); setRegisterPin(4, HIGH); setRegisterPin(5, LOW); setRegisterPin(6, HIGH); setRegisterPin(7, LOW); setRegisterPin(8, HIGH); setRegisterPin(9, LOW); setRegisterPin(10, HIGH); setRegisterPin(11, LOW); setRegisterPin(12, HIGH); setRegisterPin(13, LOW); setRegisterPin(14, HIGH); setRegisterPin(15, LOW); setRegisterPin(16, HIGH); setRegisterPin(17, LOW); setRegisterPin(18, HIGH); setRegisterPin(19, LOW); setRegisterPin(20, HIGH); setRegisterPin(21, LOW); setRegisterPin(22, HIGH); setRegisterPin(23, LOW); writeRegisters(); //MUST BE CALLED TO DISPLAY CHANGES //Only call once after the values are set how you need. delay(1500);} Editat Februarie 4, 2017 de Vizitator Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum