Posuvný registr 74HC595 pomoc
Úvodní stránka › Fórum › Vaše projekty › Arduino › Posuvný registr 74HC595 pomoc
- Toto téma obsahuje celkem 4 odpovědi. Do diskuze (3 diskutující) se naposledy zapojil uživatel
posjirka a poslední změna proběhla před 7 roky a 4 měsíci.
-
AutorPříspěvky
-
23.4.2017 v 15:17 #11206
Jindra
ÚčastníkDobrý den,
chtěl bych Vás poprosit o radu.
Mám posuvný registr 74HC595 připojen k Arduinu mega. K registru 8x led a výsledný prográmek by měl dělat asi tohle.
Ještě na úvod píšu že dělá, ale mám vnitřní pocit, že jsem to vyřešil příliš složitě.
Po splnění podmínky se postupně rozesvítí ledky po určitém času (v řádech ms) a jako poslední krok bude, že svítí všechny a už neshasnou dokut podmínka, která uvedla tuto funkci v činnost nebude false.dodávám funkční kód, ale jak píši asi není uplně správný.
int latchPin = 3; int clockPin = 4; int dataPin = 2; byte data[] = { B10000000, B11000000, B11100000, B11110000, B11111000, B11111100, B11111110, B11111111, }; byte data2[1] = { B11111111, }; void setup() { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { for (int index = 0; index<10; index++) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, data[index]); if (index > 6) { shiftOut(dataPin, clockPin, MSBFIRST, data[7]); index = 7; } digitalWrite(latchPin, HIGH); delay(200); } }
Na konec se ještě zeptám. Nemůžu řešit časování delay(200);, protože nemůžu zastavit program. Šlo by to řešit millis();? A jak by to asi mělo vypadat?
Předem děkuji všem za odpovědi.Začátečník Jindra 🙂
EDIT: Ano vím, že nekteré části kodu tam být nemus, viz pole data2. Je to ale rozpracovaná verze, kde se už s polem data2 počítá.
24.4.2017 v 22:06 #11227RomanB
ÚčastníkFunkce delay(200) tam je proto, protože void loop() je stále se opakující smyčka. Když se postupně rozsvítí všechny ledky, pak se čeká 200 ms a ledky se začnou znova rozsvěcet. Vůbec tam nemusí být.
Pro podmínku použij if (podminka==1 && index<7){a tady dej rutinu pro zobrazení}
else (podminka==0) {rutina pro zobrazení,ale s data2[1]
=B00000000 aby ti to zhaslo}25.4.2017 v 13:20 #11233Jindra
ÚčastníkPokud tam nebude funkce delay() tak ty ledky blikaji tak rychle, ze to oko ani nezaregistruje. Myslel jsem ze loop() za jedno kolo odela posun na registru o jeden byt. To znamena ze za jedno kolo s funkci delay() rosviti jednu ledku podle pole data[] a pak prave ceka 200ms. Slo by to vyresit millis()?
EDIT: ne byt, ale bit
25.4.2017 v 19:48 #11237RomanB
Účastníkint latchPin = 4; int clockPin = 5; int dataPin = 6; int vstup = 7; //pridal jsem si vstup jako podminku int index=0; byte data[] = { B10000000, B11000000, B11100000, B11110000, B11111000, B11111100, B11111110, B11111111, }; byte data2[1] = { B11111111, }; unsigned long staryMillis = 0; const long interval = 800; unsigned long novyMillis = millis(); void setup() { Serial.begin(9600); pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(vstup, INPUT_PULLUP); } void loop() { boolean podminka = digitalRead(vstup); //********************************************************************** unsigned long novyMillis = millis(); if (novyMillis - staryMillis >= interval && podminka==0) { staryMillis = novyMillis; digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, data[index]); if (index > 6) { shiftOut(dataPin, clockPin, MSBFIRST, data[7]); index = 7; } digitalWrite(latchPin, HIGH); Serial.println(index); //Serial.println(staryMillis); //Serial.println(novyMillis); index=index+1; } //********************************************************************** if (novyMillis - staryMillis >= interval && podminka==1) { staryMillis = novyMillis; index = 0; digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, data2[index]); Serial.println(index); //Serial.println(staryMillis); //Serial.println(novyMillis); } //********************************************************************** }//konec smycky
Vyzkoušej toto. Jako podmínku jsem použil tlačítko: 0 je stlačeno.
1.5.2017 v 21:01 #11297posjirka
Účastníkona je opravdu otázka jak to je zapojeno …. ať tady nehoníte duchy 🙂
ps. omezil bych ty 2 pole za 1 hodnotu BYTE se smyčkou FOR pro naplnění log.1/0 -
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.