Heidenhain TE-355-A => Arduino => EasyCAT => LinuxCNC

Odpovědět
Uživatelský avatar
zz912
Příspěvky: 1355
Registrován: 25. 5. 2008, 7:16

17. 6. 2020, 8:16

Začal jsem se začal prohrabávat zdrojákem pro EasyCAT a poprosil bych zkušené o vysvětlení základů. Sám si v Arduinu napíšu cokoliv, ale cizí zdrojáky jsou pro mě průšvih.
TestEasyCAT.ino.txt
(14.19 KiB) Staženo 106 x
Začnem hned na začátku:

Kód: Vybrat vše

    pinMode(13, OUTPUT);                                          // stay in loop for ever
                                                                  // with the Arduino led blinking
    while(1)                                                      //
    {                                                             //   
      digitalWrite (13, LOW);                                     // 
      delay(500);                                                 //   
      digitalWrite (13, HIGH);                                    //  
      delay(500);                                                 // 
    }                                                             // 
Co znamená "while(1) "? Umím používat "while" ve stylu dělej něco dokud. Ovšem jednička bude vždy jedničkou, takže by se to mělo tady zacyklit?

Když se podívám do návodu, tak taky takový zápis není předpokládán:
https://www.arduino.cc/reference/en/lan ... ure/while/

Kód: Vybrat vše

  if (EASYCAT.BufferOut.Byte[0] & (1<<0))             // the four output bits are mapped to the 
    digitalWrite (BitOut0, HIGH);                     // lower nibble of output Byte 0
  else                                                // 
    digitalWrite (BitOut0, LOW);                      // we read each bit and write it
                                                      // to the corrisponding pin
  if (EASYCAT.BufferOut.Byte[0] & (1<<1))             // 
    digitalWrite (BitOut1, HIGH);                     //
  else                                                //
    digitalWrite (BitOut1, LOW);                      // 
                                                      //
  if (EASYCAT.BufferOut.Byte[0] & (1<<2))             //   
    digitalWrite (BitOut2, HIGH);                     //
  else                                                //
    digitalWrite (BitOut2, LOW);                      // 
                                                      //  
  if (EASYCAT.BufferOut.Byte[0] & (1<<3))             // 
    digitalWrite (BitOut3, HIGH);                     //
  else                                                //
    digitalWrite (BitOut3, LOW);                      // 

Jak je tady použit příkaz "if" ? Umím používat "if" ve stylu pokud je splněna podmínka něco udělej. Ovšem já tady žádnou podmínku nevidím.

V návodu opět takový stav nepředpokládají.
https://www.arduino.cc/reference/en/lan ... ucture/if/

Asi bych to rozchodil i bez vysvětlení. Vymažu co se týká "--- test sawtooth generation --- " dva anologové vstupy jsou nachystány a klasické I/O bych snad nějak rozšířil. Pak už je to jen logika. Ovšem rád bych znal i podstatu věci.
LinuxCNC - MESA 7i96
zz912.webnode.cz
StoupaCZ
Příspěvky: 543
Registrován: 2. 6. 2017, 8:12

17. 6. 2020, 9:27

Ahoj,

Kód: Vybrat vše

while(1)
je nekonečný cyklus. V závorkách za while je uvedena podmínka, při jejíž splnění se provede další opakování cyklu. Pokud je tedy true (1 je vyhodnocena jako true), pak se cyklus provede. Čili podmínka bude platná stále a cyklus se bude provádět do nekonečna. Tady nastavuje pin 13 střídavě na 1 a 0 s půlsekundovými intervaly mezi tím, nejspíš nějaké blikání LEDkou?

Kód: Vybrat vše

if (EASYCAT.BufferOut.Byte[0] & (1<<1))
je podmíněné provedení bloku kódu, v závorce je zase výraz, při jehož splnění se blok provede. Takže podmínka tam je, a znamená asi zhruba toto:
  • vem jedničku a proveď bitový posun doleva o 1 pozici (výsledek je tedy 2)
    s tou dvojkou proveď bitovou operaci AND vůči prvnímu byte výstupního bufferu
    pokud je výsledek nenulový, proveď se kód v IF bloku
Neboli zkoumá, zda v tom prvním byte bufferu je nastaven druhý bit zdola.
Sieg SX4, Interkrenn IKD-400, Vernier Minishape 28
Uživatelský avatar
zz912
Příspěvky: 1355
Registrován: 25. 5. 2008, 7:16

18. 6. 2020, 6:27

StoupaCZ píše: 17. 6. 2020, 9:27 pokud je výsledek nenulový, proveď se kód v IF bloku
Co všechno se tedy považuje TRUE ? Cokliv co není 0 ?
StoupaCZ píše: 17. 6. 2020, 9:27 Tady nastavuje pin 13 střídavě na 1 a 0 s půlsekundovými intervaly mezi tím, nejspíš nějaké blikání LEDkou?
Jééé, omlovám se za zbytečný dotaz, už to vidím. Ono opravdu dojde k zacyklení Arduina, ale jen v případě, že se "nedomluví" s EasyCATem. Takže stejně se musí Arduino restartovat.

Jinak díky za popostrčení.
LinuxCNC - MESA 7i96
zz912.webnode.cz
StoupaCZ
Příspěvky: 543
Registrován: 2. 6. 2017, 8:12

18. 6. 2020, 8:11

Co všechno se tedy považuje TRUE ? Cokliv co není 0 ?
Nevím přesně jak to má Arduino programming language (teď narychlo jsem to nenašel), předpokládám, že podobně jako v C. Tam je u int hodnot vše co není nula bráno jako true, 0 pak jako false.
Takže není nutné psát např.

Kód: Vybrat vše

if (value==1)
, stačí napsat

Kód: Vybrat vše

if (value)
Sieg SX4, Interkrenn IKD-400, Vernier Minishape 28
Uživatelský avatar
zz912
Příspěvky: 1355
Registrován: 25. 5. 2008, 7:16

18. 6. 2020, 8:32

StoupaCZ píše: 18. 6. 2020, 8:11 Nevím přesně jak to má Arduino programming language (teď narychlo jsem to nenašel),
Návod co považuji za výchozí, by měl být tento:
https://www.arduino.cc/reference/en/lan ... ucture/if/

V tomto mě Arduino děsně zklamalo. Sežere kdejaký kód, takže si zdroják může napsat každý jak chce, ale zpětně je to pro začátečníka nečitelné.
LinuxCNC - MESA 7i96
zz912.webnode.cz
Uživatelský avatar
Thomeeque
Příspěvky: 8912
Registrován: 30. 1. 2012, 10:20
Bydliště: Mimo ČR

18. 6. 2020, 8:39

Toto jsou celkem základní věci a dřív nebo později by tě to neminulo. Občas je to jenom "frajeřinka", občas je to optimalizace, která výrazně program zrychlí případně ušetří paměť atp. Jsou šílenější jazyky :wink: T.
Naposledy upravil(a) Thomeeque dne 18. 6. 2020, 9:11, celkem upraveno 1 x.
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
Uživatelský avatar
zz912
Příspěvky: 1355
Registrován: 25. 5. 2008, 7:16

18. 6. 2020, 9:03

Thomeeque píše: 18. 6. 2020, 8:39 občas je to optimalizace, která výrazně program zrychlý případně ušetří paměť atp.
Jako chápu, že:

Kód: Vybrat vše

while(1)
ušetří jednu operaci, než kdybych to napsal správně:

Kód: Vybrat vše

while(1>0)
Ovšem že "if" sežere i něco jiného než boolean by mě teda nenapadlo. Když to není v dokumentaci, tak pak musím někoho neustále otravovat a žere to času jak blázen.

Navíc je položit otázku tak, aby tázaný pochopil co vlastně nevím, je taky problém.
LinuxCNC - MESA 7i96
zz912.webnode.cz
Uživatelský avatar
Thomeeque
Příspěvky: 8912
Registrován: 30. 1. 2012, 10:20
Bydliště: Mimo ČR

18. 6. 2020, 9:17

Nejčistěji asi

Kód: Vybrat vše

while(true)
Já se ptám většinou takto https://www.google.com/search?q=while(1) :wink: Buď pozitivní, člověk se to prostě chvilku učí, jako vše, logiku to má a s googlem je to raz dva.
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
Uživatelský avatar
zz912
Příspěvky: 1355
Registrován: 25. 5. 2008, 7:16

18. 6. 2020, 9:43

Asi rok jsem nevědel, že Arduino výstupy mohou fungovat i v režimu "sink". Většina elektroschémat mi nedávala smysl. Nechápal jsem jak na vodiči, kde je PULL UP může někdy nastat logická nula. Googloval jsem kolem PULL UPů jak blázen a nikde nic. Pak mi někdo na Arduino fóru poradil z úplně jiného důvodu, že lze zapjit "ledku" z optronu anodu na 5V a katodu na výstup (kvůli negaci). Pak jsem začal hledat informace o režimech sink/source a najednou vesmír začal dávat smysl.

Tudíž dneska jste mi taky prozradily část tajemství vesmíru, že "if" nežere jen boolean. Zase více věcí začne dávat smysl.

https://www.youtube.com/watch?v=b5EAEDi0LOU
LinuxCNC - MESA 7i96
zz912.webnode.cz
Uživatelský avatar
OompaLoompa
Příspěvky: 459
Registrován: 28. 6. 2017, 1:45
Bydliště: Západný Slovakistan

18. 6. 2020, 10:16

Arduino (softwér) nie je programovací jazyk, ale vývojové prostredie :roll:

Z hladiska spracovania zdrojového kódu funguje ako wrapper pre použitý programovací jazyk (C,C++,assembler), v závislosti od dostupných toolchain-ov pre danú platformu.

Ak sa nemýlim, tak v prípade AVR by to malo byť gcc, a ako jazyk primárne (no nie výlučne) C++

Takže ak sa chceš naučiť základy jazyka, naštuduj si C++ :wink: (a nenadávaj na Arduino :lol:)

Arduino tam pre zjednodušenie:
• pridáva rôzne funkcie (pinMode, digitalWrite a pod.)
• rieši HAL (mapovanie pinov, atď.)
• implementuje setup() a loop()
Uživatelský avatar
zz912
Příspěvky: 1355
Registrován: 25. 5. 2008, 7:16

18. 6. 2020, 10:23

OompaLoompa píše: 18. 6. 2020, 10:16 Takže ak sa chceš naučiť základy jazyka, naštuduj si C++ :wink: (a nenadávaj na Arduino :lol:)
Existuje nějaký oficiální návod k C++ ? Google toho vyhodí mraky.
LinuxCNC - MESA 7i96
zz912.webnode.cz
Uživatelský avatar
OompaLoompa
Příspěvky: 459
Registrován: 28. 6. 2017, 1:45
Bydliště: Západný Slovakistan

18. 6. 2020, 10:33

zz912 píše: 18. 6. 2020, 10:23Existuje nějaký oficiální návod k C++ ? Google toho vyhodí mraky.
A "mraky" nie je dosť? :lol:

Je to hádam najrozšírenejší programovací jazyk na svete. Určite budú aj dáke knihy v českom jazyku.
Nič konkrétne ti ale poradiť neviem, naposledy som také dačo potreboval/študoval takmer 30 rokov dozadu :?
Uživatelský avatar
zz912
Příspěvky: 1355
Registrován: 25. 5. 2008, 7:16

18. 6. 2020, 10:54

OompaLoompa píše: 18. 6. 2020, 10:33 A "mraky" nie je dosť? :lol:
Chtěl jsem vědět, který je oficiální. Abych jich nemusel procházet několik a zkooumat odlišnosti.

Každopádně děkuji za další popostrčení. Až mi nebude něco jasné a nenajdu to na www.arduino.cc , tak budu hledat dál na google s doplněnými slovy c++.

Věděl jsem, že arduino vychází z nějakého C-čka, ale C-ček je prej hodně. C, C++, C# . Původně jsem myslel jsem, že IDE je napsaný od nuly, tudíž jsem myslel, že se naučím https://www.arduino.cc/reference/en a pak si i jako skladník ve šroubárně si mohu přečísti Vergilia v originále.
LinuxCNC - MESA 7i96
zz912.webnode.cz
xener
Příspěvky: 853
Registrován: 2. 3. 2019, 12:48

18. 6. 2020, 12:54

hej, cecok je plna prdel a este je aj kazde ine , klasicke gnu, objektove ++, mrkvosoft sharp a dalsie a dalsie.
kazdopadne sa drz klasickeho linuxoveho C,C++ a netrap sa nad tymi vylepseniami pre graficke prostredia.
Uživatelský avatar
zz912
Příspěvky: 1355
Registrován: 25. 5. 2008, 7:16

18. 6. 2020, 1:15

xener píše: 18. 6. 2020, 12:54 kazdopadne sa drz klasickeho linuxoveho C,C++
A na jaký Web bys mi doporučil chodit pro informace? S ohledem na IDE.
LinuxCNC - MESA 7i96
zz912.webnode.cz
Odpovědět

Zpět na „Ostatní elektronika“