Nejste přihlášen/a.

Přihlásit se do poradny

 

Registr 74HC595 + arduino

Od: ladefeto* odpovědí: 5 změna:

Zdravím, mám problém s posuvným registrem 74HC595. Po odeslání dat z arduina (ATMega32) nepřijímá registr číslo 0, vždy ponechává alespoň jednu LED zaplou do okamžiku než mu příde jiné číslo, tedy neakceptuje stav 00000000. vždy ta poslední 1 v binárním čísle zůstává do doby než jí nahradí jiná a vypne až poté. Do kódu jsem vložil odeslání do PC a odesílané číslo je správně. Je divné že vždy při prvním spuštění nic nesvítí a chyby nastane až po prvním sepnutí tlačítka. Vážně v tom chybu nevidím.

Zde je kód , zřejmě není 100% ideální ale funguje dobře pro přijetí signálu např z tlačítek a následně překlad do binárního čísla.

int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
int f = 0;
int g = 0;
int h = 0;
int zmacknuti_1 = 1;
int zmacknuti_1x = 1;
int zmacknuti_2 = 1;
int zmacknuti_2x = 1;
int zmacknuti_3 = 1;
int zmacknuti_3x = 1;
int zmacknuti_4 = 1;
int zmacknuti_4x = 1;
int zmacknuti_5 = 1;
int zmacknuti_5x = 1;
int zmacknuti_6 = 1;
int zmacknuti_6x = 1;
int zmacknuti_7 = 1;
int zmacknuti_7x = 1;
int zmacknuti_8 = 1;
int zmacknuti_8x = 1;
int data_1 = 1;
int zmacknuti_kruh_1 = 1;
int zmacknuti_kruh_2 = 1;
int zmacknuti_kruh_3 = 1;
int zmacknuti_kruh_4 = 1;
int zmacknuti_kruh_5 = 1;
int zmacknuti_kruh_6 = 1;
int zmacknuti_kruh_7 = 1;
int zmacknuti_kruh_8 = 1;
int reg_1_latch = 10;
int reg_1_clock = 11;
int reg_1_data = 12;
int data_tok_1 = 1;

void setup() {
Serial.begin(9600);
pinMode(9, INPUT);
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
pinMode(6, INPUT);
pinMode(7, INPUT);
pinMode(8, INPUT);
pinMode(reg_1_latch, OUTPUT);
pinMode(reg_1_clock, OUTPUT);
pinMode(reg_1_data, OUTPUT);
}

void loop() {
zmacknuti_1 = digitalRead(9);
zmacknuti_2 = digitalRead(2);
zmacknuti_3 = digitalRead(3);
zmacknuti_4 = digitalRead(4);
zmacknuti_5 = digitalRead(5);
zmacknuti_6 = digitalRead(6);
zmacknuti_7 = digitalRead(7);
zmacknuti_8 = digitalRead(8);
if(zmacknuti_1!= zmacknuti_1x) {
if(zmacknuti_1 == HIGH) {
zmacknuti_kruh_1++;}}
if(zmacknuti_kruh_1 % 2 == 0) {
a = 1;data_tok_1 = 1;
} else {a = 0;}
if(zmacknuti_2!= zmacknuti_2x) {
if(zmacknuti_2 == HIGH) {
zmacknuti_kruh_2++;}}
if(zmacknuti_kruh_2 % 2 == 0) {
b = 1;data_tok_1 = 1;
} else {b = 0;}

if(zmacknuti_3!= zmacknuti_3x) {
if(zmacknuti_3 == HIGH) {
zmacknuti_kruh_3++;}}
if(zmacknuti_kruh_3 % 2 == 0) {
c = 1;data_tok_1 = 1;
} else {c = 0;}

if(zmacknuti_4!= zmacknuti_4x) {
if(zmacknuti_4 == HIGH) {
zmacknuti_kruh_4++;}}
if(zmacknuti_kruh_4 % 2 == 0) {
d = 1;data_tok_1 = 1;
} else {d = 0;}

if(zmacknuti_5!= zmacknuti_5x) {
if(zmacknuti_5 == HIGH) {
zmacknuti_kruh_5++;}}
if(zmacknuti_kruh_5 % 2 == 0) {
e = 1;data_tok_1 = 1;
} else {e = 0;}
if(zmacknuti_6!= zmacknuti_6x) {
if(zmacknuti_6 == HIGH) {
zmacknuti_kruh_6++;}}
if(zmacknuti_kruh_6 % 2 == 0) {
f = 1;data_tok_1 = 1;
} else {f = 0;}

if(zmacknuti_7!= zmacknuti_7x) {
if(zmacknuti_7 == HIGH) {
zmacknuti_kruh_7++;}}
if(zmacknuti_kruh_7 % 2 == 0) {
g = 1;data_tok_1 = 1;
} else {g = 0;}

if(zmacknuti_8!= zmacknuti_8x) {
if(zmacknuti_8 == HIGH) {
zmacknuti_kruh_8++;}}
if(zmacknuti_kruh_8 % 2 == 0) {
h = 1;data_tok_1 = 1;
} else {h = 0;}

data_1 = prepocet_binarni_1(a, b, c, d, e, f, g, h);
if(data_tok_1 == 1) {
digitalWrite(reg_1_latch, LOW);
shiftOut(reg_1_data, reg_1_clock, MSBFIRST, data_1);
digitalWrite(reg_1_latch, HIGH);
}
if(zmacknuti_1!= zmacknuti_1x) {
if(zmacknuti_1 == HIGH) {
Serial.println("tlacitko A");
Serial.println(data_1, DEC);
}
zmacknuti_1x = zmacknuti_1;
}
if(zmacknuti_2!= zmacknuti_2x) {
if(zmacknuti_2 == HIGH) {
Serial.println("tlacitko B");
Serial.println(data_1, DEC);
}
zmacknuti_2x = zmacknuti_2;
}

if(zmacknuti_3!= zmacknuti_3x) {
if(zmacknuti_3 == HIGH) {
Serial.println("tlacitko C");
Serial.println(data_1, DEC);
}
zmacknuti_3x = zmacknuti_3;
}

if(zmacknuti_4!= zmacknuti_4x) {
if(zmacknuti_4 == HIGH) {
Serial.println("tlacitko D");
Serial.println(data_1, DEC);
}
zmacknuti_4x = zmacknuti_4;
}

if(zmacknuti_5!= zmacknuti_5x) {
if(zmacknuti_5 == HIGH) {
Serial.println("tlacitko E");
Serial.println(data_1, DEC);
}
zmacknuti_5x = zmacknuti_5;
}

if(zmacknuti_6!= zmacknuti_6x) {
if(zmacknuti_6 == HIGH) {
Serial.println("tlacitko F");
Serial.println(data_1, DEC);
}
zmacknuti_6x = zmacknuti_6;
}

if(zmacknuti_7!= zmacknuti_7x) {
if(zmacknuti_7 == HIGH) {
Serial.println("tlacitko G");
Serial.println(data_1, DEC);
}
zmacknuti_7x = zmacknuti_7;
}

if(zmacknuti_8!= zmacknuti_8x) {
if(zmacknuti_8 == HIGH) {
Serial.println("tlacitko H");
Serial.println(data_1, DEC);
}
zmacknuti_8x = zmacknuti_8;
}
data_tok_1 = 0;

delay(30);
}

int prepocet_binarni_1(int ax, int bx, int cx, int dx, int ex, int fx, int gx, int hx) {
int vysledek;
vysledek = ax+bx*2+cx*4+dx*8+ex*16+fx*32+gx*64+hx*128;
return vysledek;
}

Děkuji L

 

 

5 odpovědí na otázku
Řazeno dle hodnocení

 

 

lui*

2x

Nejsem programátor, ale jestli máte arduino napájené těmi 3.3V které umí, tak ta 74HC595 je TTL. Takže tam možná dochází k nějakým hazardním stavům. 3,3V je pro TTL málo. Pokud napájíte Arduino 5V, tak jako bych nic neřekl.

ladefeto*

Ano já používám 5V .

doplněno 11.02.11 21:59:

Nevím jak je to tedy u předchozích modelů Arduina ale já pouívám model UNO a ten má i 3,3V i 5V

lui*

Rozhodující je napětí procesoru. Tedy spíš napětí výstupních portů v log "1". Pokud tedy jimi přímo ovládáte tu 595ku. Aby jsme si rozuměli.

 

hm*

0x

Ne, že bych se v tom kódu zrovna vyznal, nevím, kde vlastně začíná (main()?), neznám aktivní úrovně vstupů atd.

Proberem bit 1 v loop(), když spustíš poprvé:

zmacknuti_1 = digitalRead(9); // je nula, když se nedrží tlačítko? Předpokládám, že ano.

if(zmacknuti_1!= zmacknuti_1x) if(zmacknuti_1 == HIGH) zmacknuti_kruh_1++; // druhý if neplatí, takže se nic nedělá

if(zmacknuti_kruh_1 % 2 == 0) {a = 1;data_tok_1 = 1;} else a = 0;

// if neplatí, takže se dá a=0

Podobně se všemi ostatními.

Pak

data_1 = prepocet_binarni_1(a, b, c, d, e, f, g, h); // data_1 = 0 a ta se pošle na výstup, takže výstup je zhasnutý

Na konci loop je: data_tok_1 = 0;

-

Další průchody:

Dokud nic nezmáčkneš, je data_tok_1 pořád 0 a nic se na výstup neposílá bez ohledu na ostatní proměnné

Při zmáčknutí tlačítka A: zmacknuti_kruh_1 = sude_cislo, proto a=1 a data_tok_1=1 a posílá se na výstup. Dokud nezmáčkneš zas, bude se pořád posílat na výstup.

Až zmáčkneš podruhé tl. A: zmacknuti_kruh_1 = liche_cislo a proto se nenastavi data_tok_1 a proto se nic nikam nepošle.

Teprve až zmáčkneš jiné tlačítko, to jiné tlačítko nastaví data_tok_1=1 a výsledek se pošle (a konečně zhasne ten bit 1)

Možná.

ladefeto*

ano, je to přesně tak děkuji moc, vůbec sem si to neuvědomil a přitom to je úplně logické. :D Pro případ že by někdo měl zájem tenhle kód někdy použít a nechce se mu ho vymýšlet tak doplním pár inormací. Když tlačítkem prochází proud dojde ke změně stavu a přičte se 1 do smyčky pro podmínku která každé druhé zmáčknutí hodnotí jako přiřazení buď a-h = 1 nebo a-h = 0 a zároveň odešle do PC hodnotu binárního čísla přepočítaného na dekadické. Dále je opravený už opravený a úspěšně ozkoušený kód. Některé výrazi se dají napsat i jednodušeji a s úsporou paměti ale já jsem kůli návaznosti na jiný kód ponechal toto rozšíření.

int a = 0;int b = 0;int c = 0;int d = 0;int e = 0;int f = 0;int g = 0;int h = 0;int zmacknuti_1 = 1;
int zmacknuti_1x = 1;int zmacknuti_2 = 1;int zmacknuti_2x = 1;int zmacknuti_3 = 1;int zmacknuti_3x = 1;
int zmacknuti_4 = 1;int zmacknuti_4x = 1;int zmacknuti_5 = 1;int zmacknuti_5x = 1;int zmacknuti_6 = 1;
int zmacknuti_6x = 1;int zmacknuti_7 = 1;int zmacknuti_7x = 1;int zmacknuti_8 = 1;int zmacknuti_8x = 1;
int data_1 = 1;int zmacknuti_kruh_1 = 1;int zmacknuti_kruh_2 = 1;int zmacknuti_kruh_3 = 1;int zmacknuti_kruh_4 = 1;
int zmacknuti_kruh_5 = 1;int zmacknuti_kruh_6 = 1;int zmacknuti_kruh_7 = 1;int zmacknuti_kruh_8 = 1;
int reg_1_latch = 10;int reg_1_clock = 11;int reg_1_data = 12;int data_tok_1 = 1;

void setup() {
Serial.begin(9600);
pinMode(2, INPUT);pinMode(3, INPUT);pinMode(4, INPUT);pinMode(5, INPUT);pinMode(6, INPUT);pinMode(7, INPUT);
pinMode(8, INPUT);pinMode(9, INPUT);
pinMode(reg_1_latch, OUTPUT);pinMode(reg_1_clock, OUTPUT);pinMode(reg_1_data, OUTPUT);
}

void loop() {
zmacknuti_1 = digitalRead(2); zmacknuti_2 = digitalRead(3); zmacknuti_3 = digitalRead(4);
zmacknuti_4 = digitalRead(5); zmacknuti_5 = digitalRead(6); zmacknuti_6 = digitalRead(7);
zmacknuti_7 = digitalRead(8); zmacknuti_8 = digitalRead(9);
if(zmacknuti_1!= zmacknuti_1x) {
if(zmacknuti_1 == HIGH) {
zmacknuti_kruh_1++;}data_tok_1 = 1;}
if(zmacknuti_kruh_1 % 2 == 0) {
a = 1;
} else {a = 0;}
if(zmacknuti_2!= zmacknuti_2x) {
if(zmacknuti_2 == HIGH) {
zmacknuti_kruh_2++;} data_tok_1 = 1;}
if(zmacknuti_kruh_2 % 2 == 0) {
b = 1;
} else {b = 0;}

if(zmacknuti_3!= zmacknuti_3x) {
if(zmacknuti_3 == HIGH) {
zmacknuti_kruh_3++;} data_tok_1 = 1;}
if(zmacknuti_kruh_3 % 2 == 0) {
c = 1;
} else {c = 0;}

if(zmacknuti_4!= zmacknuti_4x) {
if(zmacknuti_4 == HIGH) {
zmacknuti_kruh_4++;} data_tok_1 = 1;}
if(zmacknuti_kruh_4 % 2 == 0) {
d = 1;
} else {d = 0;}

if(zmacknuti_5!= zmacknuti_5x) {
if(zmacknuti_5 == HIGH) {
zmacknuti_kruh_5++;} data_tok_1 = 1;}
if(zmacknuti_kruh_5 % 2 == 0) {
e = 1;
} else {e = 0;}
if(zmacknuti_6!= zmacknuti_6x) {
if(zmacknuti_6 == HIGH) {
zmacknuti_kruh_6++;} data_tok_1 = 1;}
if(zmacknuti_kruh_6 % 2 == 0) {
f = 1;
} else {f = 0;}

if(zmacknuti_7!= zmacknuti_7x) {
if(zmacknuti_7 == HIGH) {
zmacknuti_kruh_7++;} data_tok_1 = 1;}

if(zmacknuti_kruh_7 % 2 == 0) {
g = 1;
} else {g = 0;}

if(zmacknuti_8!= zmacknuti_8x) {
if(zmacknuti_8 == HIGH) {
zmacknuti_kruh_8++;} data_tok_1 = 1;}
if(zmacknuti_kruh_8 % 2 == 0) {
h = 1;
} else {h = 0;}

data_1 = prepocet_binarni_1(a, b, c, d, e, f, g, h);
if(data_tok_1 == 1) {
digitalWrite(reg_1_latch, LOW);
shiftOut(reg_1_data, reg_1_clock, MSBFIRST, data_1);
digitalWrite(reg_1_latch, HIGH);
}
if(zmacknuti_1!= zmacknuti_1x) {
if(zmacknuti_1 == HIGH) {
Serial.println("tlacitko A");
Serial.println(data_1, DEC);
}
zmacknuti_1x = zmacknuti_1;
}
if(zmacknuti_2!= zmacknuti_2x) {
if(zmacknuti_2 == HIGH) {
Serial.println("tlacitko B");
Serial.println(data_1, DEC);
}
zmacknuti_2x = zmacknuti_2;
}

if(zmacknuti_3!= zmacknuti_3x) {
if(zmacknuti_3 == HIGH) {
Serial.println("tlacitko C");
Serial.println(data_1, DEC);
}
zmacknuti_3x = zmacknuti_3;
}

if(zmacknuti_4!= zmacknuti_4x) {
if(zmacknuti_4 == HIGH) {
Serial.println("tlacitko D");
Serial.println(data_1, DEC);
}
zmacknuti_4x = zmacknuti_4;
}

if(zmacknuti_5!= zmacknuti_5x) {
if(zmacknuti_5 == HIGH) {
Serial.println("tlacitko E");
Serial.println(data_1, DEC);
}
zmacknuti_5x = zmacknuti_5;
}

if(zmacknuti_6!= zmacknuti_6x) {
if(zmacknuti_6 == HIGH) {
Serial.println("tlacitko F");
Serial.println(data_1, DEC);
}
zmacknuti_6x = zmacknuti_6;
}

if(zmacknuti_7!= zmacknuti_7x) {
if(zmacknuti_7 == HIGH) {
Serial.println("tlacitko G");
Serial.println(data_1, DEC);
}
zmacknuti_7x = zmacknuti_7;
}

if(zmacknuti_8!= zmacknuti_8x) {
if(zmacknuti_8 == HIGH) {
Serial.println("tlacitko H");
Serial.println(data_1, DEC);
}
zmacknuti_8x = zmacknuti_8;
}
data_tok_1 = 0;

delay(100);
}

int prepocet_binarni_1(int ax, int bx, int cx, int dx, int ex, int fx, int gx, int hx) {
int vysledek;
vysledek = ax+bx*2+cx*4+dx*8+ex*16+fx*32+gx*64+hx*128;
return vysledek;
}

 

 


 

 

 

Přihlásit se k odběru odpovědí z této otázky:

Neneseme odpovědnost za správnost informací a za škodu vzniklou jejich využitím. Jednotlivé odpovědi vyjadřují názory jejich autorů a nemusí se shodovat s názorem provozovatele poradny Poradte.cz.

Používáním poradny vyjadřujete souhlas s personifikovanou reklamou, která pomáhá financovat tento server, děkujeme.

Copyright © 2004-2025 Poradna Poradte.cz. Všechna práva vyhrazena. Prohlášení o ochraně osobních údajů. | [tmavý motiv]