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   509 / 854
(#) Vacok válasza sargarigo hozzászólására (») Jan 31, 2019 /
 
Egyenlőre még nincsen rajta semmi, de azok a lábak is fel vannak használva, ledek lesznek rá kötve.
(#) Kovidivi válasza Vacok hozzászólására (») Jan 31, 2019 /
 
Ha kiolvasod a FUSE biteket, akkor abból kiderül, hogy mi az alapbeállítása az órajelnek. Ha már ISP csatit használsz, a fuse bitekhez is hozzáférsz.
A programozó lábakon levő kis értékű kondi is megakadályozhatja a programfeltöltést!
A hozzászólás módosítva: Jan 31, 2019
(#) Vacok válasza Kovidivi hozzászólására (») Feb 1, 2019 /
 
Sajnos ic csere lett a vége, semmilyen módon nem tudtam semmihez se hozzáférni, a fuse biteket sem értem el, kondik se voltak a programozó lábakon. De az új ic-vel már működik minden.
(#) Kovidivi válasza Vacok hozzászólására (») Feb 1, 2019 /
 
Azért csak rakd félre az IC-t, lehet később fel tudod éleszteni. Valószínűleg valamit elállíthattál, nem hiszem, hogy tönkrement volna.
(#) berkesandor hozzászólása Feb 1, 2019 /
 
Egy két tizedes pontos számot szeretnék helyiértékekre bontani, de valamiért nem jó ez eredmény:
  1. float szam = 12345.67;
  2. int egeszszam ;
  3.  
  4. int  tizezer;                     //10000-as helyiérték
  5. int  ezer;                        //1000-es
  6. int  szaz;                        //100-es
  7. int  tiz;                         //10-es
  8. int  egy;                         //1-es
  9. float tizedes_float;
  10. int tizedes;
  11. int  tized;                       //0.1-as helyiérték
  12. int  szazad;                      //0.01-es
  13.  
  14.  
  15. void setup() {
  16.   Serial.begin(9600);
  17.   egeszszam = szam;
  18.   tizezer = szam /10000;
  19.   ezer = (szam / 1000) - (tizezer * 10);
  20.   szaz = (szam /100) -  (tizezer * 100) - (ezer * 10);
  21.   tiz = (szam / 10) - (tizezer * 1000) - (ezer * 100) - (szaz * 10);
  22.   egy = egeszszam % 10;
  23.   tized = ( szam - egeszszam ) *10;
  24.   tizedes_float = ( szam - egeszszam) *100;
  25.   tizedes = tizedes_float;
  26.   szazad = tizedes - (tized * 10);
  27.    
  28.   Serial.print("Szam: "); Serial.println(szam);
  29.   Serial.print("Tizezer: "); Serial.println(tizezer);
  30.   Serial.print("Ezer: "); Serial.println(ezer);
  31.   Serial.print("Szaz: "); Serial.println(szaz);
  32.   Serial.print("Tíz: "); Serial.println(tiz);
  33.   Serial.print("Egy: "); Serial.println(egy);
  34.   Serial.print("Tized: "); Serial.println(tized);
  35.   Serial.print("Szazad: "); Serial.println(szazad);
  36.   Serial.print("Tizedes: "); Serial.println(tizedes);
  37.   Serial.print("Egeszszam: "); Serial.println(egeszszam);
  38.  
  39. }
  40.  
  41. void loop() {
  42.  
  43.  
  44. }


Ezt adja vissza:
Szam: 12345.67
Tizezer: 1
Ezer: 2
Szaz: 3
Tíz: 4
Egy: 5
Tized: 6
Szazad: 6
Tizedes: 66
Egeszszam: 12345

Arra a gondolok a változó típusok kevernek be, de nem jövök rá miért nem jön ki a helyes válasz.
Ha van erre "elengánsabb" megoldás, azt is szivesen fogadom.
(#) sargarigo válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
A tizedesek is int-ek, azért nem jó. Legyenek float-ok, és jó lesz szerintem.

szerk: Benéztem, azt hittem a csonkolással van gond. Én úgy csinálnám, hogy felszoroznám 100-zal, és mint fentebb ugyanúgy bontanám tényezőkre. Nyilván fejben tartva hogy most már eltoltam a helyiértéket. Mindenesetre az MCU-k jobban szeretnek egésszel számolni mint törtekkel.

szerk2: A tizedes_float-nál van a gond a 24. sorban. Annak 67-nek kellene lenni, nem 66-nak. Érdekes..
A hozzászólás módosítva: Feb 1, 2019
(#) berkesandor válasza sargarigo hozzászólására (») Feb 1, 2019 /
 
Hiába cserélem float-ra, ugyanaz.
Lássuk a kezdetben 100-as szorzást.
A hozzászólás módosítva: Feb 1, 2019
(#) Vacok válasza Kovidivi hozzászólására (») Feb 1, 2019 /
 
Már a legelső alkalommal sem működött, de ahogy mondod félre rakom.
(#) berkesandor válasza sargarigo hozzászólására (») Feb 1, 2019 /
 
  1. float szam = 12345.67;
  2. int egeszszam ;
  3.  
  4. int  tizezer;                     //10000-as helyiérték
  5. int  ezer;                        //1000-es
  6. int  szaz;                        //100-es
  7. int  tiz;                         //10-es
  8. int  egy;                         //1-es
  9. int  tized;                       //0.1-as helyiérték
  10. int  szazad;                      //0.01-es
  11. float szorzott;
  12.  
  13.  
  14. void setup() {
  15.   Serial.begin(9600);
  16.   szorzott = szam * 100;
  17.   tizezer = szorzott /1000000;
  18.   ezer =   (szorzott - (tizezer * 1000000)) / 100000;
  19.   szaz =   (szorzott - (tizezer * 1000000) - ( ezer * 100000 )) / 10000;
  20.   tiz =    (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 1000)) / 100;
  21.   egy =    (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 1000) - (tiz * 100)) / 100;
  22.   tized =  (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 1000) - (tiz * 100) - ( egy * 10 ))  / 10;
  23.   szazad = (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 1000) - (tiz * 100) - ( egy * 10 ) - tized);
  24.  
  25.   Serial.print("Szam: "); Serial.println(szam);
  26.   Serial.print("Szorzott: "); Serial.println(szorzott);  
  27.   Serial.print("Tizezer: "); Serial.println(tizezer);
  28.   Serial.print("Ezer: "); Serial.println(ezer);
  29.   Serial.print("Szaz: "); Serial.println(szaz);
  30.   Serial.print("Tíz: "); Serial.println(tiz);
  31.   Serial.print("Egy: "); Serial.println(egy);
  32.   Serial.print("Tized: "); Serial.println(tized);
  33.   Serial.print("Szazad: "); Serial.println(szazad);
  34.  
  35.  
  36. }
  37.  
  38. void loop() {
  39.  
  40.  
  41. }


Szam: 12345.67
Szorzott: 1234567.00
Tizezer: 1
Ezer: 2
Szaz: 3
Tíz: 315
Egy: 0
Tized: 6
Szazad: 61
(#) sargarigo válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
Még nézegetem mert nagyon fura, de a szorzott az ne float hanem long legyen inkább!
(#) sargarigo válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
20. sorban rontottad el!
  1. (szaz * 1000)

helyette
  1. (szaz * 10000)

Meg az összes többi helyen is
Próba, aztán nézzük tovább!
A hozzászólás módosítva: Feb 1, 2019
(#) sargarigo válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
Meg a tiz*100 helyeken is tiz*1000, az egy*10 helyett meg egy*100!
(#) berkesandor hozzászólása Feb 1, 2019 /
 
  1. void loop() {
  2.   szorzott = szam * 100;
  3.   tizezer = szorzott / 1000000;
  4.   ezer =   (szorzott - (tizezer * 1000000)) / 100000;
  5.   szaz =   (szorzott - (tizezer * 1000000) - ( ezer * 100000 )) / 10000;
  6.   tiz =    (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 10000)) / 1000;
  7.   egy =    (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 10000) - (tiz * 1000)) / 100;
  8.   tized =  (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 10000) - (tiz * 1000) - ( egy * 100 ))  / 10;
  9.   szazad = (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 10000) - (tiz * 1000) - ( egy * 100 ) - (tized *10));
  10.  
  11.   Serial.print("Szam: "); Serial.println(szam);
  12.   Serial.print("Szorzott: "); Serial.println(szorzott);  
  13.   Serial.print("Tizezer: "); Serial.println(tizezer);
  14.   Serial.print("Ezer: "); Serial.println(ezer);
  15.   Serial.print("Szaz: "); Serial.println(szaz);
  16.   Serial.print("Tíz: "); Serial.println(tiz);
  17.   Serial.print("Egy: "); Serial.println(egy);
  18.   Serial.print("Tized: "); Serial.println(tized);
  19.   Serial.print("Szazad: "); Serial.println(szazad);
  20.   Serial.println("");
  21.  
  22.   szam = szam + 0.01;
  23. }


Szam: 12345.90
Szorzott: 1234590
Tizezer: 1
Ezer: 2
Szaz: 3
Tíz: 4
Egy: 5
Tized: 9
Szazad: 0

Szam: 12345.91
Szorzott: 1234590
Tizezer: 1
Ezer: 2
Szaz: 3
Tíz: 4
Egy: 5
Tized: 9
Szazad: 0

Szam: 12345.92
Szorzott: 1234591
Tizezer: 1
Ezer: 2
Szaz: 3
Tíz: 4
Egy: 5
Tized: 9
Szazad: 1

Továbbra is:
A szorzott számot jól bontja fel, csak a szorzat mindig jó.
A hozzászólás módosítva: Feb 1, 2019
(#) sargarigo válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
Ez érdekes. De legalább már félig megoldottuk! A teljes kódot másold már be, mert az ördög mindig a részletekbe bújik bele! A szorzott típusa pl most float vagy long?
A hozzászólás módosítva: Feb 1, 2019
(#) berkesandor válasza sargarigo hozzászólására (») Feb 1, 2019 /
 
  1. float szam = 12345.87;
  2. int egeszszam ;
  3.  
  4. int tizezer;                     //10000-as helyiérték
  5. int   ezer;                        //1000-es
  6. int   szaz;                        //100-es
  7. int  tiz;                         //10-es
  8. int  egy;                         //1-es
  9. int  tized;                       //0.1-as helyiérték
  10. int  szazad;                      //0.01-es
  11. long szorzott;
  12.  
  13.  
  14. void setup() {
  15.   Serial.begin(9600);
  16.  
  17.  
  18.  
  19. }
  20.  
  21. void loop() {
  22.   szorzott = szam * 100;
  23.   tizezer = szorzott / 1000000;
  24.   ezer =   (szorzott - (tizezer * 1000000)) / 100000;
  25.   szaz =   (szorzott - (tizezer * 1000000) - ( ezer * 100000 )) / 10000;
  26.   tiz =    (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 10000)) / 1000;
  27.   egy =    (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 10000) - (tiz * 1000)) / 100;
  28.   tized =  (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 10000) - (tiz * 1000) - ( egy * 100 ))  / 10;
  29.   szazad = (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 10000) - (tiz * 1000) - ( egy * 100 ) - (tized *10));
  30.  
  31.   Serial.print("Szam: "); Serial.println(szam);
  32.   Serial.print("Szorzott: "); Serial.println(szorzott);  
  33.   Serial.print("Tizezer: "); Serial.println(tizezer);
  34.   Serial.print("Ezer: "); Serial.println(ezer);
  35.   Serial.print("Szaz: "); Serial.println(szaz);
  36.   Serial.print("Tíz: "); Serial.println(tiz);
  37.   Serial.print("Egy: "); Serial.println(egy);
  38.   Serial.print("Tized: "); Serial.println(tized);
  39.   Serial.print("Szazad: "); Serial.println(szazad);
  40.   Serial.println("");
  41.  
  42.   szam = szam + 0.01;
  43. }
(#) sargarigo válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
Hát a felbontás most már ki lehet szervezni egy függvénybe, és kérdés csak az marad, hogy a loopban ha növeled egy float változó értékét, akkor ha értékül adod egy long-nak a 100*szorosát, akkor miért számolja rosszul.
  1. void loop()
  2. {
  3.   szorzott = szam * 100;
  4.   Serial.print("Szam: "); Serial.println(szam);
  5.   Serial.print("Szorzott: "); Serial.println(szorzott);
  6.   szam = szam + 0.01;
  7. }


Ez mit csinál?
(#) berkesandor válasza sargarigo hozzászólására (») Feb 1, 2019 /
 
"Hibázik" :


Szam: 12346.72
Szorzott: 1234672
Szam: 12346.73
Szorzott: 1234673
Szam: 12346.74
Szorzott: 1234673
Szam: 12346.75
Szorzott: 1234674
(#) eSDi válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
Bővebben: Link

Esetleg a példában szereplőket betartva működhet. Ha nem, akkor passzolok.
(#) berkesandor válasza eSDi hozzászólására (») Feb 1, 2019 /
 
Azt irja, hogy néha furcsa eredmények jönnek ki, és a számolások nem pontosak.
Magyarul nyugodjak bele és kész?
"Ez ilyen.." ?
(#) eSDi válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
Próbáld ki, hogy .00-át teszel a szorzók mögé is. Hátha. És esteleg használd az int(x) függvényt a konverzióhoz.
A hozzászólás módosítva: Feb 1, 2019
(#) berkesandor válasza eSDi hozzászólására (») Feb 1, 2019 /
 
Ennyi a redukált kód:

  1. long szorzott;
  2. float szam = 12345.87;
  3.  
  4. void setup() {
  5.   Serial.begin(9600);
  6. }
  7. void loop() {
  8.  
  9.   szorzott = szam * 100.00;
  10.   Serial.print("Szam: "); Serial.println(szam);
  11.   Serial.print("Szorzott: "); Serial.println(szorzott);
  12.   Serial.println("");
  13.   szam = szam + 0.01;
  14. }


Szam: 12346.32
Szorzott: 1234631

Szam: 12346.33
Szorzott: 1234632

Szam: 12346.34
Szorzott: 1234633
(#) eSDi válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
Úgy néz ki, ez egy Bug. Kár, hogy nem tudom most kipróbálni.

Esetleg még így egy próba:
  1. szorzott = long(szam * 100.00)
A hozzászólás módosítva: Feb 1, 2019
(#) KoblogPerGyok válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
Remélem rosszul látom...:

Bővebben: Link

Idézet:
„Floats have only 6-7 decimal digits of precision. That means the total number of digits, not the number to the right of the decimal point. Unlike other platforms, where you can get more precision by using a double (e.g. up to 15 digits), on the Arduino, double is the same size as float.”
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Feb 1, 2019 /
 
Azaz próbáld meg double-al.
(#) berkesandor válasza KoblogPerGyok hozzászólására (») Feb 1, 2019 /
 
duble ==> ugyanaz
szorzott = long(szam * 100.00); ==> ugyanaz
(#) benjami válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
Mivel 24 bit jut a floatnál a számjegyeknek, ez behatárolja a pontosságot. Ráadásul az átváltásoknál jó eséllyel fixen lefelé kerekít.
A fix lefelé kerekítés okozta hiba megszüntetésére pedig ezt alkalmaznám:
  1. szorzott = (szam + 0.005) * 100.00;
(#) sargarigo válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
A poén kedvéért próbáld már ki három tizedesre is!

Lehet érdemes lenne megpróbálni egy másik régebbi fordítóval is, hátha csak ez szívat.
A hozzászólás módosítva: Feb 1, 2019
(#) sargarigo válasza sargarigo hozzászólására (») Feb 1, 2019 / 1
 
Van még ötletem!
Legyen egy egész rész, meg legyen egy tört! Az egész rész 100 szorosához add hozzá a tört rész száz szorosát! Így nem mész ki az érték tartományból.
(#) KoblogPerGyok válasza sargarigo hozzászólására (») Feb 1, 2019 /
 
Jó ötlet!

Nagyot csalódnék, ha ekkora hibaszázalékkal számol... Ez azért már nem kis hiba lenne, de attól tartok ez bizony ilyen lesz...
(#) sargarigo válasza sargarigo hozzászólására (») Feb 1, 2019 /
 
  1. double egeszresz;
  2. double tortresz;
  3. float ftortresz;
  4. //...
  5.  
  6.  
  7. // szorzott = szam * 100.00;
  8.   egeszresz = szam; // elvileg már itt egeszre lesz konvertálva
  9.   ftort = szam - egeszresz;
  10. // itt ki is lehetne íratni ellenőrzésképpen
  11.   Serial.print("Egeszresz: "); Serial.println(egeszresz);
  12.   Serial.print("Tortresz: "); Serial.println(ftort);
  13.  
  14.   egeszresz * = 100; // vagy egeszresz = egeszresz * 100; mindegy
  15.   tortresz = ftort * 100;
  16.   Serial.print("Egeszresz: "); Serial.println(egeszresz);
  17.   Serial.print("Tortresz: "); Serial.println(tortresz);
  18.  
  19.   szorzott = egeszresz  + tortresz;
  20.   Serial.print("Szorzott: "); Serial.println(szorzott);


Na, így gondoltam. Próba!
A hozzászólás módosítva: Feb 1, 2019
Következő: »»   509 / 854
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