Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   302 / 867
(#) kapu48 válasza RoliNyh hozzászólására (») Dec 13, 2016 /
 
Beszólás helyett!
Inkább legyél tisztába az alapokkal!

Ha nem érted a Bináris számokkal végzendő alapműveleteket?
Gyorsan pótoljad a lemaradást!
Bővebben: Link
Binary Numbers Tutorial
Bővebben: Link

Binary Arithmetic
A hozzászólás módosítva: Dec 13, 2016
(#) RoliNyh válasza kapu48 hozzászólására (») Dec 13, 2016 /
 
Pardon, nem tudom mit vettél annak, de semmit nem annak szántam.
Ha mégis úgy érezted, akkor biztos rosszul fogalmaztam...
(#) jany1966 hozzászólása Dec 15, 2016 /
 
Sziasztok
Hogy lehet összeállítani byte-ot bemenetekből és jelzőbitekből.
Köszi
(#) szeg76 válasza jany1966 hozzászólására (») Dec 15, 2016 /
 
Legyen pl B 7. bitje a 11. port állásának függvénye:

byte B;

if( digitalRead(11) ) B = B | b1000000; else B=B & b01111111;
A hozzászólás módosítva: Dec 15, 2016
(#) jany1966 hozzászólása Dec 15, 2016 /
 
Ez így ok de ha több bemenetet akarok akkor mindnek új függvényt kell írnom?
pl ha van 3 bemenetem + a millis-nél eltelt 10 sec / ez ad egy jelzőbitet/ ezt kellene egy byte-ba berakni és aztán csak ezt figyeljem és ha változás van akkor vizsgáljam meg hogy hol.
(#) szeg76 válasza jany1966 hozzászólására (») Dec 15, 2016 /
 
A függvényt nem mint C programozási fogalmat értettem

Elég egy-egy új feltételt (és 2-2 új bitmaszkot) írni az egyes bitek kiértékeléséhez.
(#) jany1966 hozzászólása Dec 15, 2016 /
 
Lenne 4-5 vagy még több bemenet és 3 vagy 4 jelzőbit ?
(#) Medve válasza jany1966 hozzászólására (») Dec 15, 2016 /
 
Minden egyes jelzőbithez hozzárendelni a kettő egyik hatványát, majd összeadni őket. (max 8-at) Igy kijön egy byte, ha jól értelmezem a problémát.
(#) jany1966 hozzászólása Dec 15, 2016 /
 
Azt szeretném hogy a byte első értéke legyen a bemenet értéke (1 vagy 0) a második a bemenet 2 stb plussz a 4 5 6 a jelzőbitek értéke
(#) szeg76 válasza jany1966 hozzászólására (») Dec 15, 2016 /
 
(#) jany1966 hozzászólása Dec 15, 2016 /
 
Így nem lehet hogy
byte=portb1,portb2,portb3,jezbit1,jelzbit2,jelzbit3
Vagy valami hasonló módon?
(#) szeg76 válasza jany1966 hozzászólására (») Dec 15, 2016 /
 
Ha van a polcon egy C/C++ programozási könyved, lapozd fel a struktúrák, unionok és bitmezők témakörnél.
Létrehozhatsz olyan adattípust, aminek minden bitjéhez egyszerű értékadással közvetlenül hozzáférhetsz, de az egészet is módosíthatod egyben.
(#) Panhard válasza jany1966 hozzászólására (») Dec 15, 2016 /
 
Nem biztos, hogy jól értem, de így:?

  1. if(digitalRead(5)){bitSet(valami,0);}else{bitClear(valami,0);}
  2.  if(digitalRead(6)){bitSet(valami,1);}else{bitClear(valami,1);}
  3.  if(digitalRead(7)){bitSet(valami,2);}else{bitClear(valami,2);}
  4.  if(digitalRead(8)){bitSet(valami,3);}else{bitClear(valami,3);}

...és így a többire is.
(#) kapu48 válasza Panhard hozzászólására (») Dec 16, 2016 /
 
  1. //Ez általában úgy történik, hogy
  2. //a választott bitpozícióknak megfelelően egy maszk-készletet definiálnak, mint
  3. #define PIN1 01   //  A számoknak kettő hatványainak kell lenniük.
  4. #define PIN2 02
  5. #define JEL1 04
  6. #define JEL2 08
  7. //...
  8.  
  9. uint16_t flags = 0;
  10.  
  11.  
  12. void setup()
  13. {
  14.  
  15.   flags &= ~(PIN1 | JEL1);  // bitReset
  16.   if ((flags &(PIN1 | JEL1)) == 0){  } //igaz, ha mindkét bit nulla.  
  17.  
  18.   flags = PIN1 | JEL1;   // bitset
  19.   if ((flags &(PIN1 | JEL1)) == (PIN1 | JEL1)){ }//igaz, ha mindkét bit egy.
  20.  
  21.  
  22. }
  23.  
  24. void loop()
  25. {
  26.  
  27. }
A hozzászólás módosítva: Dec 16, 2016
(#) Panhard válasza kapu48 hozzászólására (») Dec 16, 2016 /
 
Ezt biztos nekem akartad írni?
(#) kapu48 válasza Panhard hozzászólására (») Dec 16, 2016 /
 
Azt hiszem eltévedtem a hozzászólások között!
A választ jany1966-nak szántam: Bővebben: Link
kérdésére.
(#) Panhard válasza kapu48 hozzászólására (») Dec 17, 2016 /
 
Igazából én is arra válaszoltam. De úgylátszik nem nagyon érdekli a kérdezőt a segítség.
(#) jany1966 hozzászólása Dec 17, 2016 /
 
De érdekel a dolog és köszönöm a segítséget. Nem tudom ti hogy vagytok vele de nekem néha dolgozni is kell a /hobbim fedezése miatt is/ Napi 10-12 órát:
A bitmezős megoldás jónak tűnik.

struct bitmezo {
int mezo_1 : 1,
mezo_2 : 2;
unsigned mezo_3 : 8,
mezo_4 : 8;
int : 0,
mezo_5 : 2;
} bm;

Egy szóba kerülnek a mezo_1, a mezo_2 és a mezo_3. A mezo_4 már nem fér itt el, ezért új szóban helyezkedik el. A mezo_5 is elférne még ugyanitt, de a 0 szélességû bitmezõ használatával azt egy harmadik szóba kényszerítettük. Példák bitmezõk használatára:

bm.mezo_3 = 'X'; bm.mezo_5 = bm.mezo_2;
bm.mezo_4 = bm.mezo_1 ? 0 : bm.mezo_3;

Ha így össze rakok egy byte-ot akkor azt hogy tudom figyelni?
Tehát az lenne a lényeg, hogy a bemenetekből és a jelzőbitekből csinálok egy byte-ot és csak ezt figyelném és ha változás van akkor megvizsgálnám hogy melyik bemeneten vagy jelzőbitnél ha nincs akkor csinálna mást az arduino.
(#) szeg76 válasza jany1966 hozzászólására (») Dec 17, 2016 /
 
Igazából bármelyik eddig adott megoldás jó. Valakinek vagy valaminek az egyes állapotok függvényében be kell állítani az állapotbyte bitjeit.

Kétféle bitmaszkolgatós megoldás:

  1. byte  allapot, elozo_allapot;
  2.  
  3. void  setup()
  4. {
  5.   Serial.begin(9600);
  6. }
  7.  
  8. void loop()
  9. {
  10. // Maszkolós megoldás 1  
  11. /*  
  12.  allapot=( digitalRead(A0) ? B00000100 : B00000000 ) | (digitalRead(12) ? B00000010 : B00000000) \
  13.          | ((millis()>4000) ? B00000001 : B00000000 ) ;
  14. */
  15.  
  16.  
  17. // Maszkolós megoldás 2
  18.  
  19.   allapot=0;
  20.  
  21.   if( digitalRead(A0) ) allapot|=0x04;
  22.   if( digitalRead(12) ) allapot|=0x02;
  23.   if( millis()>4000 )  allapot|=0x01;
  24.  
  25.  
  26.          
  27.  
  28.  if(allapot!=elozo_allapot)
  29.    {
  30.      Serial.println(allapot, BIN);
  31.      elozo_allapot=allapot;
  32.    }
  33.  
  34. }




Ugyanazt az eredményt adó bitmezős-unionos:
  1. struct  stat_tipus
  2.   {
  3.     byte  Bemenet_1:  1;    
  4.     byte  Bemenet_2:  1;
  5.     byte  Letelt4mp: 1;
  6.  
  7.   };
  8.  
  9. union  ustat_tipus
  10.   {
  11.     stat_tipus  bitek;
  12.     byte        egesz;
  13.   } allapotbyte;
  14.  
  15.  
  16. byte  elozo_allapot;
  17.  
  18.  
  19. void  setup()
  20. {
  21.   Serial.begin(9600);
  22. }
  23.  
  24. void  loop()
  25. {
  26.   allapotbyte.bitek.Bemenet_1=digitalRead(A0);
  27.   allapotbyte.bitek.Bemenet_2=digitalRead(12);
  28.   allapotbyte.bitek.Letelt4mp= (millis()>4000)? 1 : 0;
  29.  
  30.   if(allapotbyte.egesz != elozo_allapot)
  31.     {
  32.     Serial.println(allapotbyte.egesz, BIN);      
  33.     elozo_allapot=allapotbyte.egesz;
  34.     }
  35. }
(#) jany1966 hozzászólása Dec 17, 2016 /
 
Köszönöm a második megoldás jobban tetszik, vagy számomra érthetőbb.
Azt viszont nem tudtam, hogy így is lehet arduinot programozni, mert minden hol azt írják, hogy egy C-hez hasonlító saját nyelvezete van.
(#) szeg76 válasza jany1966 hozzászólására (») Dec 17, 2016 /
 
Az más kérdés, hogy melyik megoldás gyorsabb.

Valószínűleg a gyári bitSet/bitClear/bitWrite a leglassabb, mivel univerzális függvény, feltételvizsgálatokkal, ciklusokkal, érvénytelen paraméterek kiszűrésével, a mezei bitmaszkolás pedig a leggyorsabb.

Az olvashatóságon lehet javítani a 0x04 és B00000100-félemágikus számok helyett szöveges konstansok használatával.
Pl:
  1. #define BITMASZK_BEMENET1  0x04
  2. ...
  3.  if( digitalRead(A0) ) allapot|=BITMASZK_BEMENET1;


A két példaprogram eredménye mégis eltér, mivel fölcseréltem a bitek sorrendjét.
(#) Panhard válasza szeg76 hozzászólására (») Dec 17, 2016 /
 
Ez ugyanazt az eredményt adja, csak egyszerűbb:

  1. byte allapot;
  2. byte elozo_allapot;
  3.  
  4. void setup() {
  5.    Serial.begin(9600);
  6. }
  7.  
  8. void loop() {
  9.  
  10.  if(!digitalRead(A0)){bitSet(allapot,0);}else{bitClear(allapot,0);}
  11.  if(!digitalRead(A1)){bitSet(allapot,1);}else{bitClear(allapot,1);}
  12.  
  13.   if(allapot != elozo_allapot){
  14.         Serial.println(allapot, BIN);  
  15.         elozo_allapot = allapot;  
  16.   }
  17. }


Egyébként a bitSET, bitClear függvény sem lassú, lemértem, 12millisec ahogy a fenti kódban van használva 4-szer. Ha kihagyom őket, és sima értékadással (allapot=1; ) helyettesítem, akkor is ugyan ennyit mértem. Amúgy nem tudom milyen projekthez kell ez, de gondolom nem egy atomórát fog vezérelni, szóval belefér az a pár nanosec, amíg a függvény lefut.
(#) Kovidivi válasza Panhard hozzászólására (») Dec 17, 2016 /
 
Ez nem frankó:
Idézet:
„lemértem, 12millisec ahogy a fenti kódban van használva 4-szer. Ha kihagyom őket, és sima értékadással (allapot=1; ) helyettesítem, akkor is ugyan ennyit mértem.”

Gondolom serial.print-et használtál. A bitclear fv. többszörösen lassabb, mint a sima értékadás, vagy egy bitművelet. 12mS alatt 192000 órajel van 16MHz-en...
(#) Panhard válasza Kovidivi hozzászólására (») Dec 17, 2016 /
 
Hát igen, lassabb mert több utasítás van a függvényben, de még így sincs egy microsec az ideje. Gondolom azért mértem ugyanannyit.
Egyébként hol találhatóak ezek a bitmanipulálós függvények? Megnézném mit csinálnak.
(#) jany1966 hozzászólása Dec 17, 2016 /
 
Köszönöm mindenkinek.
Valóban nincs jelentősége a pontos időnek.
Egyébként csatorna mosók vezérlésére kellene, kompresszor, vízszivattyú, hidraulika.
Pl ha a vízszivattyút bekapcsolom akkor a víznyomást csak bizonyos idő után lehessen kapcsolni.
Viszont ha a tiszta víz tartályban (3-4 ezer liter) a vízszint egy bizonyos szint alá csökken akkor a programban beállított idő után kapcsolja le a vízszivattyút (100-150liter/perc 150-200bar) a szárazon futás elkerülése miatt.
(#) szeg76 válasza Panhard hozzászólására (») Dec 17, 2016 /
 
Linuxon: /usr/share/arduino/hardware/arduino/cores/arduino/Arduino.h

Visszavonom a lassúság vádját, ez egészen puritán kódot ad.

  1. #define bitRead(value, bit) (((value) >> (bit)) & 0x01)
  2. #define bitSet(value, bit) ((value) |= (1UL << (bit)))
  3. #define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
  4. #define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))



  1. elotte=micros();
  2. for(i=0;i<10000;i++)
  3.   BitSet(all, 3);
  4. utana=micros();

7584us alatt fut le.
A hozzászólás módosítva: Dec 17, 2016
(#) Panhard válasza szeg76 hozzászólására (») Dec 17, 2016 /
 
Én is így mértem a micros(); függvénnyel, csak a hozzászólásomban rosszul írtam. 12 microsec-et akatram írni, nem millisec-et. Akkor viszont nálad nagyon lassan futott le valamiért, a 7584us az sok, nem?
(#) szeg76 válasza Panhard hozzászólására (») Dec 17, 2016 /
 
Az a 10000-es for ciklus egészére vonatkozik, unsigned long ciklusváltozó esetén.

Most egy kicsit jobban tisztelem a rendszert, mint előtte
(#) Panhard válasza Panhard hozzászólására (») Dec 17, 2016 /
 
Lemértem megint, most csak a bitClear függvényt. Előbb benne volt a mérésben a digitalRead() is. Úgy volt 12.
Most csak a bitClear, és 4microsec. De a micros fügvénnyel nem lehet lemérni.

Így:
  1. void loop() {
  2.   delay(1000);
  3.   mic_elozo = micros();
  4.   bitClear(allapot,0);
  5.   mic = micros();
  6.   Serial.println(mic-mic_elozo);      
  7.   }


és így is:

  1. void loop() {
  2.   delay(1000);
  3.   mic_elozo = micros();
  4. //  bitClear(allapot,0);
  5.   mic = micros();
  6.   Serial.println(mic-mic_elozo);      
  7.   }


Mindkét esetben 4 microsec az eredmény.
(#) Panhard válasza szeg76 hozzászólására (») Dec 17, 2016 /
 
Úgy már értem.
Következő: »»   302 / 867
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem