Vynecháni bitu

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
Kwt 23
Příspěvky: 13
Registrován: 05 led 2019, 22:47
Reputation: 0

Vynecháni bitu

Příspěvek od Kwt 23 » 03 úno 2019, 00:51

Zdravím a ptám se:
Jako začátečník mám uplně jednoduchý prográmek, Jakého si hada s posuvným registrem. Vypsané pole a funkci loop dokola počítající nahoru a dolu, ale nechápu proč mi při každém druhém přejetí vynechá jeden bit. Jednou had dojede až nakonec, podruhé ne. Pomocí jakési diagnostiky se Serial printem sem nezjistil proč ho to vynechá.

Kód: Vybrat vše

// pin  RCLK 12
int zapis = 3;
// pin  SRCLK 11
int hodiny = 4;
// data pin 14
int data = 2;

int vystup[] = {B01111111,
                B10111111,
                B11011111,
                B11101111,
                B11110111,
                B11111011,
                B11111101,
                B11111110,
                B11111101,
                B11111011,
                B11110111,
                B11101111,
                B11011111,
                B10111111};

 
void setup() {
 
  
  pinMode(zapis, OUTPUT);
  pinMode(hodiny, OUTPUT);
  pinMode(data, OUTPUT);
 
 
  Serial.begin(9600);

 
}
 // 13 hodnot

 int poradi = 0;
 bool znamenko = true;

 
void loop() {


    digitalWrite(zapis, LOW);
    shiftOut(data, hodiny, LSBFIRST, vystup[poradi]);  
    digitalWrite(zapis, HIGH); 
    
    
Serial.print(" Z pole: ");  
Serial.print(vystup[poradi],BIN);
Serial.print("  --  ");
Serial.print(poradi);
Serial.print(" <- Poradi | Znamenko -> ");
Serial.println(znamenko);

    if (znamenko)
    {poradi += 1;}
    if (!znamenko)
    {poradi -= 1;}

    if (poradi == 13 || poradi == 0){znamenko = !znamenko;}
    
    //if (poradi == 0 ){znamenko = !znamenko;}

    delay(150);

 

   }
A výstup

Kód: Vybrat vše

Z pole: 1111111  --  0 <- Poradi | Znamenko -> 1
 Z pole: 10111111  --  1 <- Poradi | Znamenko -> 1
 Z pole: 11011111  --  2 <- Poradi | Znamenko -> 1
 Z pole: 11101111  --  3 <- Poradi | Znamenko -> 1
 Z pole: 11110111  --  4 <- Poradi | Znamenko -> 1
 Z pole: 11111011  --  5 <- Poradi | Znamenko -> 1
 Z pole: 11111101  --  6 <- Poradi | Znamenko -> 1
 Z pole: 11111110  --  7 <- Poradi | Znamenko -> 1
 Z pole: 11111101  --  8 <- Poradi | Znamenko -> 1
 Z pole: 11111011  --  9 <- Poradi | Znamenko -> 1
 Z pole: 11110111  --  10 <- Poradi | Znamenko -> 1
 Z pole: 11101111  --  11 <- Poradi | Znamenko -> 1
 Z pole: 11011111  --  12 <- Poradi | Znamenko -> 1
 Z pole: 10111111  --  13 <- Poradi | Znamenko -> 0
 Z pole: 11011111  --  12 <- Poradi | Znamenko -> 0
 Z pole: 11101111  --  11 <- Poradi | Znamenko -> 0
 Z pole: 11110111  --  10 <- Poradi | Znamenko -> 0
 Z pole: 11111011  --  9 <- Poradi | Znamenko -> 0
 Z pole: 11111101  --  8 <- Poradi | Znamenko -> 0
 Z pole: 11111110  --  7 <- Poradi | Znamenko -> 0
 Z pole: 11111101  --  6 <- Poradi | Znamenko -> 0
 Z pole: 11111011  --  5 <- Poradi | Znamenko -> 0
 Z pole: 11110111  --  4 <- Poradi | Znamenko -> 0
 Z pole: 11101111  --  3 <- Poradi | Znamenko -> 0
 Z pole: 11011111  --  2 <- Poradi | Znamenko -> 0
 Z pole: 10111111  --  1 <- Poradi | Znamenko -> 0
 Z pole: 1111111  --  0 <- Poradi | Znamenko -> 1
 Z pole: 10111111  --  1 <- Poradi | Znamenko -> 1
 Z pole: 11011111  --  2 <- Poradi | Znamenko -> 1
 Z pole: 11101111  --  3 <- Poradi | Znamenko -> 1
 Z pole: 11110111  --  4 <- Poradi | Znamenko -> 1
 Z pole: 11111011  --  5 <- Poradi | Znamenko -> 1
 Z pole: 11111101  --  6 <- Poradi | Znamenko -> 1
 Z pole: 11111110  --  7 <- Poradi | Znamenko -> 1
 Z pole: 11111101  --  8 <- Poradi | Znamenko -> 1
 Z pole: 11111011  --  9 <- Poradi | Znamenko -> 1
 Z pole: 11110111  --  10 <- Poradi | Znamenko -> 1
 Z pole: 11101111  --  11 <- Poradi | Znamenko -> 1
 Z pole: 11011111  --  12 <- Poradi | Znamenko -> 1
 Z pole: 10111111  --  13 <- Poradi | Znamenko -> 0
 Z pole: 11011111  --  12 <- Poradi | Znamenko -> 0
 Z pole: 11101111  --  11 <- Poradi | Znamenko -> 0
 Z pole: 11110111  --  10 <- Poradi | Znamenko -> 0
 Z pole: 11111011  --  9 <- Poradi | Znamenko -> 0
 Z pole: 11111101  --  8 <- Poradi | Znamenko -> 0
 Z pole: 11111110  --  7 <- Poradi | Znamenko -> 0
 Z pole: 11111101  --  6 <- Poradi | Znamenko -> 0
 Z pole: 11111011  --  5 <- Poradi | Znamenko -> 0
 Z pole: 11110111  --  4 <- Poradi | Znamenko -> 0
 Z pole: 11101111  --  3 <- Poradi | Znamenko -> 0
 Z pole: 11011111  --  2 <- Poradi | Znamenko -> 0
 Z pole: 10111111  --  1 <- Poradi | Znamenko -> 0
 Z pole: 1111111  --  0 <- Poradi | Znamenko -> 1
 Z pole: 10111111  --  1 <- Poradi | Znamenko -> 1
 Z pole: 11011111  --  2 <- Poradi | Znamenko -> 1
 Z pole: 11101111  --  3 <- Poradi | Znamenko -> 1
 Z pole: 11110111  --  4 <- Poradi | Znamenko -> 1
 Z pole: 11111011  --  5 <- Poradi | Znamenko -> 1
 Z pole: 11111101  --  6 <- Poradi | Znamenko -> 1
 Z pole: 11111110  --  7 <- Poradi | Znamenko -> 1
 Z pole: 11111101  --  8 <- Poradi | Znamenko -> 1
 Z pole: 11111011  --  9 <- Poradi | Znamenko -> 1
 Z pole: 11110111  --  10 <- Poradi | Znamenko -> 1
 Z pole: 11101111  --  11 <- Poradi | Znamenko -> 1
 Z pole: 11011111  --  12 <- Poradi | Znamenko -> 1

Proč je každé 26. dvojkové číslo o jeden bit kratší?
Díky za odpověďi.

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Vynecháni bitu

Příspěvek od gilhad » 03 úno 2019, 03:42

Asi proto, ze zacina nulou, ktera se nevypisuje :)

Kwt 23
Příspěvky: 13
Registrován: 05 led 2019, 22:47
Reputation: 0

Re: Vynecháni bitu

Příspěvek od Kwt 23 » 03 úno 2019, 14:52

A proč pak funguje příklad který má samé nuly a sem tam jedničku? To bylo dlouhé zkoumání proč mi nefunguje registr. Vždycky vše zapojeno podle příkladu a nakonec i samotný příklad zkopírován. Měl ledky proti zemi a pole plný B00000001, B00000010 ,... atd. Tak tam by to dělalo ještě větší bordel.? Já jsem zjistil že mam nejspíš jiný registr a musím mít ledky proti plusu, jinak nesvítilo nic.

Kwt 23
Příspěvky: 13
Registrován: 05 led 2019, 22:47
Reputation: 0

Re: Vynecháni bitu

Příspěvek od Kwt 23 » 03 úno 2019, 14:55

Jo aha, ona se do registru pošle ale nevipíše se v Serial.printu! Díky. Taky vidim že když tam mam to počítání tak můžu to pole o polovičku zkrátit...

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Vynecháni bitu

Příspěvek od gilhad » 03 úno 2019, 15:00

Vsechna cisla jsou stejne dlouha, jen se nevypisuji ty nuly predtim, ale to LEDky nezajima, protoze ty pozice v tom cislu jsou.

Pokud se divis, proc ti had jednou do konce dojede a jednou ne, tak se podivej, ze v tom poli jezdis tou nulou sem a tam a na zacatku mas nulu i na prvnim miste a na konci nikoli, takze tam pochopitelne ten had nedojede az do kraje.

pridej na konec vystup[] jeste B01111111 a protahni cyklus o jeden krok, nebo, jak jsi mezitim napsal, muzes jezdit jen v te prvni pulce. Nebo to muzes udelat i bez pole a jezdit si jednickou pomoci shiftu << a >> v jedne promenne ...

Kwt 23
Příspěvky: 13
Registrován: 05 led 2019, 22:47
Reputation: 0

Re: Vynecháni bitu

Příspěvek od Kwt 23 » 03 úno 2019, 21:17

Jo, prográmek je to zmatečný. pole sem připravil na to že dojedu na konec a vrátim se zase hned na začátek, pak nevim co mě napadlo sem udelal to "překlápění" znaménka +/- Už sem to upravil. používám jen polovinu pole. Bitový posun jsem zkoušel, ale ještě to budu muset prozkoumat. Nějak to zatim nešlo podle mého očekávání.
Tímhle vším se chci dostat k rozsvícení matice ledek 8x8, jen jdu po krocích abych se to vše naučil a odzkoušel.
K tomu ještě dotaz: Je vhodné použít osmi bitovou paměť 74hc540 k buzení společných vývodů ledek abych nepřetížil výstupy na desce ale spínal to tímhle. druhý registr ještě nemam.

Kwt 23
Příspěvky: 13
Registrován: 05 led 2019, 22:47
Reputation: 0

Re: Vynecháni bitu

Příspěvek od Kwt 23 » 03 úno 2019, 21:32

Pro pokusu s bitovým posuvem mi to v první půlce vyšoupne jedničky do pryč a při druhém směru to našoupe nuly

Kód: Vybrat vše

 Z pole: 1111111  --  0 <- Poradi | Znamenko -> 1
 Z pole: 111111  --  1 <- Poradi | Znamenko -> 1
 Z pole: 11111  --  2 <- Poradi | Znamenko -> 1
 Z pole: 1111  --  3 <- Poradi | Znamenko -> 1
 Z pole: 111  --  4 <- Poradi | Znamenko -> 1
 Z pole: 11  --  5 <- Poradi | Znamenko -> 1
 Z pole: 1  --  6 <- Poradi | Znamenko -> 0
 Z pole: 10  --  5 <- Poradi | Znamenko -> 0
 Z pole: 100  --  4 <- Poradi | Znamenko -> 0
 Z pole: 1000  --  3 <- Poradi | Znamenko -> 0
 Z pole: 10000  --  2 <- Poradi | Znamenko -> 0
 Z pole: 100000  --  1 <- Poradi | Znamenko -> 0
 Z pole: 1000000  --  0 <- Poradi | Znamenko -> 1
 Z pole: 100000  --  1 <- Poradi | Znamenko -> 1
 Z pole: 10000  --  2 <- Poradi | Znamenko -> 1
 Z pole: 1000  --  3 <- Poradi | Znamenko -> 1
 Z pole: 100  --  4 <- Poradi | Znamenko -> 1
 Z pole: 10  --  5 <- Poradi | Znamenko -> 1
 Z pole: 1  --  6 <- Poradi | Znamenko -> 0
 Z pole: 10  --  5 <- Poradi | Znamenko -> 0
 Z pole: 100  --  4 <- Poradi | Znamenko -> 0
 Z pole: 1000  --  3 <- Poradi | Znamenko -> 0
 Z pole: 10000  --  2 <- Poradi | Znamenko -> 0
 Z pole: 100000  --  1 <- Poradi | Znamenko -> 0
 Z pole: 1000000  --  0 <- Poradi | Znamenko -> 1

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Vynecháni bitu

Příspěvek od gilhad » 04 úno 2019, 06:37

Tam by to chtelo soupat jednou jednickou (a mit ty LED zapojene opacne)

Kód: Vybrat vše

int vystup=1;
Serial.println(vystup,BIN);
for (int i=0;i<7;++i) {
  vystup <<=1;
  Serial.println(vystup,BIN);
};
for (int i=0;i<7;++i) {
  vystup >>=1;
  Serial.println(vystup,BIN);
};
nebo ten vystup pouzit negovany:

Kód: Vybrat vše

int vystup = 1;
void setup() {
  Serial.begin(9600);
  Serial.println(~vystup, BIN);
}

void loop() {
  for (int i = 0; i < 7; ++i) {
    vystup <<= 1;
    Serial.println(~vystup, BIN);
  };
  for (int i = 0; i < 7; ++i) {
    vystup >>= 1;
    Serial.println(~vystup, BIN);
  };
}

Kwt 23
Příspěvky: 13
Registrován: 05 led 2019, 22:47
Reputation: 0

Re: Vynecháni bitu

Příspěvek od Kwt 23 » 04 úno 2019, 11:41

Jo funguje to. Sem si myslel že negace je vždy vykřičníkem, ale to nějak nešlo. No na začátku se to zdálo jako jednoduchý příklad, ale nakonec to je dost poučný. Díky moc za pomoc ;)

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Vynecháni bitu

Příspěvek od gilhad » 04 úno 2019, 12:04

Rado se stalo :)

Vykricnik je logicka (stejne jako && a ||), vlnovka je po bitech (stejne jako & a |). Nekdy potrebujes logicke operace na urorovni promenne (je true a nebo false (=0)), nekdy na urovni jednotlivych bitu ...


4 && 2 == true
4 || 2 == true
4 & 2 == 0 == false
4 | 2 == 6 ==true

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 12 hostů