Fórum témák
- • Elektromos távirányítós kapunyitó
- • Kondenzátor
- • CNC építése házi alkatrészekből az alapoktól
- • Mosogatógép hiba
- • Transzformátor készítés, méretezés
- • Analóg oszcilloszkóp javítása
- • Arduino
- • LED szalag
- • Villanypásztor
- • Nagyfeszültségű tápegység
- • 3-fázisú Modbus-os teljesítményszabályzó (SCR power controller)
- • Érdekességek
- • Rádióamatőrök topikja
- • Digitális adatátvitel
- • Elfogadnám, ha ingyen elvihető
- • Erősítő mindig és mindig
- • Villanyszerelés
- • TDA7294 végerősítő
- • Számítógép hiba, de mi a probléma?
- • Klíma szervizelés, javítás
- • Klíma beszerelése, fűtés-hűtés házilag
- • Kombikazán működési hiba
- • Általános antennás kérdések, válaszok
- • Dobozolási technikák, műszerdobozok
- • Elektronikai témájú könyvek újságok
- • Elektromos vezérlésű pneumatika
- • Hangszórójavítás (otthon)
- • Internetes rádióvevő
- • Alternativ HE találkozó(k)
- • 3D nyomtatás
- • Felajánlás, azaz ingyen elvihető
- • Akkumulátor töltő
- • Háromfázisú aggregátor
- • Szintetizátor javítás
- • Boombox javítás
- • Sütő javítás
- • Mosógép vezérlők és általános problémáik
- • Laptop javítás, tuning
- • Autós erősítős kérdések, problémák
- • Mikrohullámú sütő javítás, magnetron csere, stb.
- • Villanymotor
- • Vegyes barkácsfogások
- • Digitális óra
- • Hűtőgép probléma
- • TV hiba, mi a megoldás?
- • Szünetmentes táp javítása, élesztése
- • Erősítő építése elejétől a végéig
- • Műhelyünk felszerelése, szerszámai
- • Függvénygenerátor építése
- • SMD, mi a típusa?
- • Hibrid erősítő
- • Suzuki Swift elektronika
- • Videomagnó problémák
- • STK erősítők javítások
- • DC-DC konverter max. kapacitív terhelése
» Több friss téma
|
A klónok CH340 Soros-USB illesztőjének drivere ( Letöltés)
Egyenlőre még nincsen rajta semmi, de azok a lábak is fel vannak használva, ledek lesznek rá kötve.
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
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.
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.
Egy két tizedes pontos számot szeretnék helyiértékekre bontani, de valamiért nem jó ez eredmény:
float szam = 12345.67;
int egeszszam ;
int tizezer; //10000-as helyiérték
int ezer; //1000-es
int szaz; //100-es
int tiz; //10-es
int egy; //1-es
float tizedes_float;
int tizedes;
int tized; //0.1-as helyiérték
int szazad; //0.01-es
void setup() {
Serial.begin(9600);
egeszszam = szam;
tizezer = szam /10000;
ezer = (szam / 1000) - (tizezer * 10);
szaz = (szam /100) - (tizezer * 100) - (ezer * 10);
tiz = (szam / 10) - (tizezer * 1000) - (ezer * 100) - (szaz * 10);
egy = egeszszam % 10;
tized = ( szam - egeszszam ) *10;
tizedes_float = ( szam - egeszszam) *100;
tizedes = tizedes_float;
szazad = tizedes - (tized * 10);
Serial.print("Szam: "); Serial.println(szam);
Serial.print("Tizezer: "); Serial.println(tizezer);
Serial.print("Ezer: "); Serial.println(ezer);
Serial.print("Szaz: "); Serial.println(szaz);
Serial.print("Tíz: "); Serial.println(tiz);
Serial.print("Egy: "); Serial.println(egy);
Serial.print("Tized: "); Serial.println(tized);
Serial.print("Szazad: "); Serial.println(szazad);
Serial.print("Tizedes: "); Serial.println(tizedes);
Serial.print("Egeszszam: "); Serial.println(egeszszam);
}
void loop() {
}
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.
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
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
Már a legelső alkalommal sem működött, de ahogy mondod félre rakom.
float szam = 12345.67;
int egeszszam ;
int tizezer; //10000-as helyiérték
int ezer; //1000-es
int szaz; //100-es
int tiz; //10-es
int egy; //1-es
int tized; //0.1-as helyiérték
int szazad; //0.01-es
float szorzott;
void setup() {
Serial.begin(9600);
szorzott = szam * 100;
tizezer = szorzott /1000000;
ezer = (szorzott - (tizezer * 1000000)) / 100000;
szaz = (szorzott - (tizezer * 1000000) - ( ezer * 100000 )) / 10000;
tiz = (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 1000)) / 100;
egy = (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 1000) - (tiz * 100)) / 100;
tized = (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 1000) - (tiz * 100) - ( egy * 10 )) / 10;
szazad = (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 1000) - (tiz * 100) - ( egy * 10 ) - tized);
Serial.print("Szam: "); Serial.println(szam);
Serial.print("Szorzott: "); Serial.println(szorzott);
Serial.print("Tizezer: "); Serial.println(tizezer);
Serial.print("Ezer: "); Serial.println(ezer);
Serial.print("Szaz: "); Serial.println(szaz);
Serial.print("Tíz: "); Serial.println(tiz);
Serial.print("Egy: "); Serial.println(egy);
Serial.print("Tized: "); Serial.println(tized);
Serial.print("Szazad: "); Serial.println(szazad);
}
void loop() {
}
Szam: 12345.67
Szorzott: 1234567.00
Tizezer: 1
Ezer: 2
Szaz: 3
Tíz: 315
Egy: 0
Tized: 6
Szazad: 61
Még nézegetem mert nagyon fura, de a szorzott az ne float hanem long legyen inkább!
20. sorban rontottad el!
helyette
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
Meg a tiz*100 helyeken is tiz*1000, az egy*10 helyett meg egy*100!
void loop() {
szorzott = szam * 100;
tizezer = szorzott / 1000000;
ezer = (szorzott - (tizezer * 1000000)) / 100000;
szaz = (szorzott - (tizezer * 1000000) - ( ezer * 100000 )) / 10000;
tiz = (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 10000)) / 1000;
egy = (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 10000) - (tiz * 1000)) / 100;
tized = (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 10000) - (tiz * 1000) - ( egy * 100 )) / 10;
szazad = (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 10000) - (tiz * 1000) - ( egy * 100 ) - (tized *10));
Serial.print("Szam: "); Serial.println(szam);
Serial.print("Szorzott: "); Serial.println(szorzott);
Serial.print("Tizezer: "); Serial.println(tizezer);
Serial.print("Ezer: "); Serial.println(ezer);
Serial.print("Szaz: "); Serial.println(szaz);
Serial.print("Tíz: "); Serial.println(tiz);
Serial.print("Egy: "); Serial.println(egy);
Serial.print("Tized: "); Serial.println(tized);
Serial.print("Szazad: "); Serial.println(szazad);
Serial.println("");
szam = szam + 0.01;
}
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
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
float szam = 12345.87;
int egeszszam ;
int tizezer; //10000-as helyiérték
int ezer; //1000-es
int szaz; //100-es
int tiz; //10-es
int egy; //1-es
int tized; //0.1-as helyiérték
int szazad; //0.01-es
long szorzott;
void setup() {
Serial.begin(9600);
}
void loop() {
szorzott = szam * 100;
tizezer = szorzott / 1000000;
ezer = (szorzott - (tizezer * 1000000)) / 100000;
szaz = (szorzott - (tizezer * 1000000) - ( ezer * 100000 )) / 10000;
tiz = (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 10000)) / 1000;
egy = (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 10000) - (tiz * 1000)) / 100;
tized = (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 10000) - (tiz * 1000) - ( egy * 100 )) / 10;
szazad = (szorzott - (tizezer * 1000000) - ( ezer * 100000 ) - (szaz * 10000) - (tiz * 1000) - ( egy * 100 ) - (tized *10));
Serial.print("Szam: "); Serial.println(szam);
Serial.print("Szorzott: "); Serial.println(szorzott);
Serial.print("Tizezer: "); Serial.println(tizezer);
Serial.print("Ezer: "); Serial.println(ezer);
Serial.print("Szaz: "); Serial.println(szaz);
Serial.print("Tíz: "); Serial.println(tiz);
Serial.print("Egy: "); Serial.println(egy);
Serial.print("Tized: "); Serial.println(tized);
Serial.print("Szazad: "); Serial.println(szazad);
Serial.println("");
szam = szam + 0.01;
}
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.
void loop()
{
szorzott = szam * 100;
Serial.print("Szam: "); Serial.println(szam);
Serial.print("Szorzott: "); Serial.println(szorzott);
szam = szam + 0.01;
}
Ez mit csinál?
"Hibázik" :
Szam: 12346.72
Szorzott: 1234672
Szam: 12346.73
Szorzott: 1234673
Szam: 12346.74
Szorzott: 1234673
Szam: 12346.75
Szorzott: 1234674
Bővebben: Link
Esetleg a példában szereplőket betartva működhet. Ha nem, akkor passzolok.
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.." ?
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
Ennyi a redukált kód:
long szorzott;
float szam = 12345.87;
void setup() {
Serial.begin(9600);
}
void loop() {
szorzott = szam * 100.00;
Serial.print("Szam: "); Serial.println(szam);
Serial.print("Szorzott: "); Serial.println(szorzott);
Serial.println("");
szam = szam + 0.01;
}
Szam: 12346.32
Szorzott: 1234631
Szam: 12346.33
Szorzott: 1234632
Szam: 12346.34
Szorzott: 1234633
Úgy néz ki, ez egy Bug. Kár, hogy nem tudom most kipróbálni.
Esetleg még így egy próba:
szorzott = long(szam * 100.00)
A hozzászólás módosítva: 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.”
Azaz próbáld meg double-al.
duble ==> ugyanaz
szorzott = long(szam * 100.00); ==> ugyanaz
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:
szorzott = (szam + 0.005) * 100.00;
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
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.
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...
double egeszresz;
double tortresz;
float ftortresz;
//...
// szorzott = szam * 100.00;
egeszresz = szam; // elvileg már itt egeszre lesz konvertálva
ftort = szam - egeszresz;
// itt ki is lehetne íratni ellenőrzésképpen
Serial.print("Egeszresz: "); Serial.println(egeszresz);
Serial.print("Tortresz: "); Serial.println(ftort);
egeszresz * = 100; // vagy egeszresz = egeszresz * 100; mindegy
tortresz = ftort * 100;
Serial.print("Egeszresz: "); Serial.println(egeszresz);
Serial.print("Tortresz: "); Serial.println(tortresz);
szorzott = egeszresz + tortresz;
Serial.print("Szorzott: "); Serial.println(szorzott);
Na, így gondoltam. Próba! A hozzászólás módosítva: Feb 1, 2019
|
|