60 nap alatt Arduino #36 - Shift regiszter

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00

Hozzászólás Szerző: SzLacus »

Sziasztok!

Lehet, hogy én a magam kezdő szemével hasonlóan látom a problémát mint a kérdés feltevője. A ciklus működését részletesen láthatjuk a segítő magyarázatokban, most én megpróbálom konyha nyelven. Szerintem a gond az, hogy a ciklus felépítésében a második részben egy vizsgálandó feltételt kell megadni. A nem rég tanultak alapján az = önmagában értékadást jelent, ha összehasonlítást szeretenénk egyenlőségre, akkor == a megoldás. De a dolog így sem működne, a magyarázatot többen is leítrák. Addig megy a ciklus, amíg igaz a feltétel vizsgálat eredménye. Márpedig ez a legelején sem lesz igaz, amikor 0-ával bele kezdünk a ciklusba. Hát akkor legyen a feltétel != (nem egyenlő). Na így már működhetne, csak az a csapda a dologban, hogy csak egyenlőség esetén kerülhetsz ki a ciklusból, ha a léptetés során valamilyen módon elkerülöd az egyenlőséget, (előtte kisebb, utána meg nagyobb), akkor nem kerülsz ki a ciklusból, esetleg csak akkor, ha a ciklus index átfordul a definiált adat típuson és a következő körben pont beletalál az egyenlőségbe. Volt egy ilyen ravaszság a hangkeltés lecke elején, ahol a ciklus indexet is és az összehasonlítás alapját is változtattuk a ciklusban, így elő tudott fordulni, hogy elkerülték egymást. Szóval a reláció jelek a legjobbak erre. "Amíg kisebb mint"..., addig csináljuk amit kell, aztán megyünk tovább.
Talán jól értettem a probléma felvetését is, meg remélem a magyarázatokat is.
Avatar
volkov
DrótVégénSzéndarab
Hozzászólások: 45
Csatlakozott: 2012. november 10. szombat, 7:00

Re: 60 nap alatt Arduino #36 - Shift regiszter

Hozzászólás Szerző: volkov »

Sziasztok!

Most értem ehhez a leckéhez.

Gondoltam kipróbálom a kódot, viszont itthon a fiókban csak CD4015BCN-em van (dual 4 bit shit reg.) amiben nincs latch.
Ettől függetlenül megépítettem a dolgot és működik szépen latch nélkül is.
Jó a bináris számláló is, egyenként is tudom kapcsolgatni a ledeket, semmi furcsát nem veszek észre.

Kérdésem ebből adódóan: minek a latch pin?


És pici OFF:
Kinght Rider "villogo" :lol:

Kód: Egész kijelölése

//const int latchPin = 8;
const int clockPin = 12;
const int dataPin = 11;

const byte LED_CHAR[18] = {
 B10000000, B11000000, B11100000, B01110000, B00111000, B00011100,
 B00001110, B00000111, B00000011, B00000001, B00000011, B00000111,
 B00001110, B00011100, B00111000, B01110000, B11100000, B11000000
 };

void setup() {
 //pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
}

void loop() {
  for (int i=0; i<18; i++){
    shiftOut(dataPin, clockPin, MSBFIRST, LED_CHAR[i]);
    delay(40);
  }
}
Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00

Re: 60 nap alatt Arduino #36 - Shift regiszter

Hozzászólás Szerző: SzLacus »

Mire is jó az a latch pin? Most neked pont arra van szükséged, hogy a ledeken menjen végig a villogás ahogy a mintázatot lépteted a regiszterben. De tegyük, fel, hogy valamit vezérelsz, és a ledek helyén relék laknak, amik be, vagy kikapcsolnak valamit. Neked például az ötödik relét kell kapcsolnod, a többihez nem akarsz hozzányúlni. Ha nincs latch, akkor a minta végig vonul a kimeneteken, és minden relé röccen egyet, míg az ötödikhez ér a kívánt jel. Ha van latch, akkor a kimeneteket csak akkor váltod, amikor a megfelelő mintázat a helyére került. Ekkor eltárolod a mintát ami a kimenetre kerül. Mügötte a regiszterekben pedig mehet az adatáramlás. Vagyis az, hogy kell-e latch, vagy sem, az attól függ, mit oldasz meg a shift regiszterrel.
happy555
Biztosítékgyilkos
Hozzászólások: 51
Csatlakozott: 2013. augusztus 16. péntek, 12:45

Re: 60 nap alatt Arduino #36 - Shift regiszter

Hozzászólás Szerző: happy555 »

Sziasztok!

Shift regiszterrel kapcsolatban van fejvakarásom.
Ha a kiküldött kód pl. 11101111 volt, és a következő küldésnél csak az egyik kivezetést szeretném változtatni pl. hogy a harmadik láb is kikapcsoljon (11001111) hogyan lehet frappánsan megoldani?
Mivel nem kijelzőt hajtanék vele, jó lenne ha egyesével tudnám változtatni a kimeneteket....
:?:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #36 - Shift regiszter

Hozzászólás Szerző: Robert »

Sajna újra ki kell küldened a teljes sort, mert _soros_ adatküldés és elérés van bennük....
happy555
Biztosítékgyilkos
Hozzászólások: 51
Csatlakozott: 2013. augusztus 16. péntek, 12:45

Re: 60 nap alatt Arduino #36 - Shift regiszter

Hozzászólás Szerző: happy555 »

Értem hogy újra kell küldeni az egészet, csak azt szeretném megoldani hogy tudva az utolsó küldött adatot, abban csak egy jegyet változtasson a program és úgy küldje ki!
Valahogy lehet karakterekből összefűzni??
Vagy egyéb ötlet?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #36 - Shift regiszter

Hozzászólás Szerző: Robert »

1, Melyik kódot használod? (Copy Code)
2, Bitet/karaktert/mit akarsz megváltoztatni?
happy555
Biztosítékgyilkos
Hozzászólások: 51
Csatlakozott: 2013. augusztus 16. péntek, 12:45

Re: 60 nap alatt Arduino #36 - Shift regiszter

Hozzászólás Szerző: happy555 »

Bitet kellene változtatni ahogy írtam , ha pl. az utolsó kimenő 11101111 volt és csak pl. a harmadik kimenetet szeretném változtatni (11001111) azt hogy tegyem !?
Valahogy vizsgálhatónak kellene lennie az értéknek, úgy hogy ha a harmadik 1 volt akkor esemény hatására változzon 0-ra,aztán küldje ki. De a többi maradjon!
H-h melyik kódot használom??
Nem nyomnék Copy-t mert vagy 3000 soros a kódom :)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #36 - Shift regiszter

Hozzászólás Szerző: Robert »

A kiküldendő adat:
- karkterlánc (byte-onként küldve),
- integer (azaz szám),
- karakterlánc "1001010111010000010101" formában,
- tömb, és a byte-k az egyes shiftregisztereké?

Szám esetén:

Kód: Egész kijelölése

bitSet(x, n)
, ahol
x: szám (integer, byte, ...)
n: ennyiedik bitet kell 1-be rakni

Kód: Egész kijelölése

bitClear(x, n)

x: szám (integer, byte, ...)
n: ennyiedik bitet kell 0-ba rakni

Kód: Egész kijelölése

bitWrite(x, n, b)

x: szám (integer, byte, ...)
n: ennyiedik bitet kell átállítani
b, 0 vagy 1, azaz erre legyen az adott bit állítva.
happy555
Biztosítékgyilkos
Hozzászólások: 51
Csatlakozott: 2013. augusztus 16. péntek, 12:45

Re: 60 nap alatt Arduino #36 - Shift regiszter

Hozzászólás Szerző: happy555 »

Ezaz!

Köszönöm!
Már csak a vizsgálatra lenne szükségem!
bitRead(x, n, b) :?: Ilyen létezik :?:
pl.
if(bitRead(x, n, b)==1){} :?:

HEURÉKA!
Lehet használnom kellene az arduino.cc-t? :lol:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #36 - Shift regiszter

Hozzászólás Szerző: Robert »

A fórum, amelyik részre beírtad, az pont az Arduino....
De Bascomul egyszerűbb:

Kód: Egész kijelölése

változó.bitszám=1
van.4=1
happy555
Biztosítékgyilkos
Hozzászólások: 51
Csatlakozott: 2013. augusztus 16. péntek, 12:45

Re: 60 nap alatt Arduino #36 - Shift regiszter

Hozzászólás Szerző: happy555 »

Az első tag (n) az a 0. vagy 1. ?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #36 - Shift regiszter

Hozzászólás Szerző: Robert »

0. a hivatkozás rá.
Avatar
s.dvid
DrótVégénSzéndarab
Hozzászólások: 25
Csatlakozott: 2014. január 6. hétfő, 9:36

Re: 60 nap alatt Arduino #36 - Shift regiszter

Hozzászólás Szerző: s.dvid »

Szerintetek mi lehet a bibi?
ezekre a sorokra írja a hibát:

Kód: Egész kijelölése

    shiftOut (dataPin, clockPin, LSBFIRST, ea); // egyesekre meno jel kikuldese
homero.png
Most csak az első 2 kijelzőre megy a program, értelem szerűen egyesek és tizesek szerint:

Kód: Egész kijelölése

int dataPin = 11; //74HC595 Data az Arduino Pin11-re kotve
int clockPin = 12; //74HC595 Clock az Arduino Pin12-re kotve
int latchPin = 13; //74HC595 Latch az Arduino Pin13-ra kotve
float tempC;  //homerseklet LM35-tel
int reading;
int tempPin = A0;

void setup() {
  pinMode(dataPin, OUTPUT); // Data lab kimenet
  pinMode(clockPin, OUTPUT); // Clock lab kimenet
  pinMode(latchPin, OUTPUT); // Latch lab kimenet
  analogReference(INTERNAL); //Homersekletnek
 //tizesek megadasa
 //1-8ig:    Bcde0bagf
  byte (tnone) = B00000000; //none
  byte (tb) = B00100001; //10
  byte (tc) = B01101110; //20
  byte (td) = B11001110; //30
  byte (te) = B10001011; //40
  byte (tf) = B11000111; //50

  //egyesek megadasa
  //1-8:     B0cdegfab
  byte (enone) = B00000000; // none
  byte (ea) = B01110111; // 0
  byte (eb) = B00010100; // 1
  byte (ec) = B00111011; // 2
  byte (ed) = B01101111; // 3
  byte (ee) = B01001101; // 4
  byte (ef) = B01101110; // 5
  byte (eg) = B01111110; // 6
  byte (eh) = B01000011; // 7
  byte (ei) = B01111111; // 8
  byte (ej) = B01101111; // 9
}
void loop(){
  reading = analogRead(tempPin); //Homerseklet beolvasasa
  tempC = reading / 9.31; //Homerseklet atvaltasa
  if (tempC == 0){
    digitalWrite(latchPin, LOW);
    shiftOut (dataPin, clockPin, LSBFIRST, ea); // egyesekre meno jel kikuldese
    shiftOut (dataPin, clockPin, LSBFIRST, tnone); // tizesekre meno jel kikuldese
    digitalWrite(latchPin, HIGH); // latch jel kikuldese
  }
 if (tempC == 1){
    digitalWrite(latchPin, LOW);
    shiftOut (dataPin, clockPin, LSBFIRST, eb); // egyesekre meno jel kikuldese
    shiftOut (dataPin, clockPin, LSBFIRST, tnone); // tizesekre meno jel kikuldese
    digitalWrite(latchPin, HIGH); // latch jel kikuldese
  }
  if (tempC == 2){
    digitalWrite(latchPin, LOW);
    shiftOut (dataPin, clockPin, LSBFIRST, ec); // egyesekre meno jel kikuldese
    shiftOut (dataPin, clockPin, LSBFIRST, tnone); // tizesekre meno jel kikuldese
    digitalWrite(latchPin, HIGH); // latch jel kikuldese
  }
  if (tempC == 3){
    digitalWrite(latchPin, LOW);
    shiftOut (dataPin, clockPin, LSBFIRST, ed); // egyesekre meno jel kikuldese
    shiftOut (dataPin, clockPin, LSBFIRST, tnone); // tizesekre meno jel kikuldese
    digitalWrite(latchPin, HIGH); // latch jel kikuldese
  }
  if (tempC == 4){
    digitalWrite(latchPin, LOW);
    shiftOut (dataPin, clockPin, LSBFIRST, ee); // egyesekre meno jel kikuldese
    shiftOut (dataPin, clockPin, LSBFIRST, tnone); // tizesekre meno jel kikuldese
    digitalWrite(latchPin, HIGH); // latch jel kikuldese
  }
  if (tempC == 5){
    digitalWrite(latchPin, LOW);
    shiftOut (dataPin, clockPin, LSBFIRST, ef); // egyesekre meno jel kikuldese
    shiftOut (dataPin, clockPin, LSBFIRST, tnone); // tizesekre meno jel kikuldese
    digitalWrite(latchPin, HIGH); // latch jel kikuldese
  }
  if (tempC == 6){
    digitalWrite(latchPin, LOW);
    shiftOut (dataPin, clockPin, LSBFIRST, eg); // egyesekre meno jel kikuldese
    shiftOut (dataPin, clockPin, LSBFIRST, tnone); // tizesekre meno jel kikuldese
    digitalWrite(latchPin, HIGH); // latch jel kikuldese
  }
  if (tempC == 7){
    digitalWrite(latchPin, LOW);
    shiftOut (dataPin, clockPin, LSBFIRST, eh); // egyesekre meno jel kikuldese
    shiftOut (dataPin, clockPin, LSBFIRST, tnone); // tizesekre meno jel kikuldese
    digitalWrite(latchPin, HIGH); // latch jel kikuldese
  }
  if (tempC == 8){
    digitalWrite(latchPin, LOW);
    shiftOut (dataPin, clockPin, LSBFIRST, ei); // egyesekre meno jel kikuldese
    shiftOut (dataPin, clockPin, LSBFIRST, tnone); // tizesekre meno jel kikuldese
    digitalWrite(latchPin, HIGH); // latch jel kikuldese
  }
Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #36 - Shift regiszter

Hozzászólás Szerző: Robert »

mi az az ea?

Szerintem nem jó:

Kód: Egész kijelölése

 byte (tnone) = B00000000; //none
Nem kell a zárójel:

Kód: Egész kijelölése

 byte tnone = B00000000; //none
Válasz küldése