Stránka 1 z 1

Vynecháni bitu

Napsal: 03 úno 2019, 00:51
od Kwt 23
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.

Re: Vynecháni bitu

Napsal: 03 úno 2019, 03:42
od gilhad
Asi proto, ze zacina nulou, ktera se nevypisuje :)

Re: Vynecháni bitu

Napsal: 03 úno 2019, 14:52
od Kwt 23
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.

Re: Vynecháni bitu

Napsal: 03 úno 2019, 14:55
od Kwt 23
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...

Re: Vynecháni bitu

Napsal: 03 úno 2019, 15:00
od gilhad
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 ...

Re: Vynecháni bitu

Napsal: 03 úno 2019, 21:17
od Kwt 23
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.

Re: Vynecháni bitu

Napsal: 03 úno 2019, 21:32
od Kwt 23
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

Re: Vynecháni bitu

Napsal: 04 úno 2019, 06:37
od gilhad
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);
  };
}

Re: Vynecháni bitu

Napsal: 04 úno 2019, 11:41
od Kwt 23
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 ;)

Re: Vynecháni bitu

Napsal: 04 úno 2019, 12:04
od gilhad
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