60 nap alatt Arduino #13 - PWM, analogWrite
Re: 60 nap alatt Arduino #13 - PWM, analogWrite
Felfele/lefele: mi az a +/- 15?
Simán azzal is túlcsordulsz. pl. 14-15 = 255!
Simán azzal is túlcsordulsz. pl. 14-15 = 255!
Re: 60 nap alatt Arduino #13 - PWM, analogWrite
Ha már két bájtos helyet foglalsz és mondjuk előjeles, akkor alkalmas lehet arra, hogy vizsgáld az értékét 0 és 255 közöttire, a növelés vagy csökkentés után.
Ha növelénél átlépi a 255, akkor megütközteted 255-ön, míg csökkentés esetén ha 0 alá megy akkor 0-án megütközteted.
Ha Robi által felvetett 1 bájton ábrázolod, (mert nagyobb a fényerő úgysem lehet) akkor a növelés vagy csökkentés előtt meg kell vizsgálnod, hogy a változtatás bele fér-e.
Kell egy vizsgálat ami megnézi, hogy a pillanatnyi fényerő és a max fényerő (255), vagy csökkentésnél a min fényerő (0) különbsége vagyobb-e mint a növelési, vagy csökkentési lépés. Ha igen, akkor mehet a növelés, vagy csökkentés az eredeti nagyságban, ellenkező esetben csak annyival növelheted, vagy csökkentheted amennyi a különbség a max vagy min értékig. Így nem fog átfordulni sem felfelé, sem lefelé.
Ha növelénél átlépi a 255, akkor megütközteted 255-ön, míg csökkentés esetén ha 0 alá megy akkor 0-án megütközteted.
Ha Robi által felvetett 1 bájton ábrázolod, (mert nagyobb a fényerő úgysem lehet) akkor a növelés vagy csökkentés előtt meg kell vizsgálnod, hogy a változtatás bele fér-e.
Kell egy vizsgálat ami megnézi, hogy a pillanatnyi fényerő és a max fényerő (255), vagy csökkentésnél a min fényerő (0) különbsége vagyobb-e mint a növelési, vagy csökkentési lépés. Ha igen, akkor mehet a növelés, vagy csökkentés az eredeti nagyságban, ellenkező esetben csak annyival növelheted, vagy csökkentheted amennyi a különbség a max vagy min értékig. Így nem fog átfordulni sem felfelé, sem lefelé.
Re: 60 nap alatt Arduino #13 - PWM, analogWrite
Más megközelítésben körüljárva: viewtopic.php?f=34&t=1952 (lezárt téma)
http://www.tavir.hu - a gazda
Re: 60 nap alatt Arduino #13 - PWM, analogWrite
Elvi szintű kérdésről van szó. Rengeteget szórakoztam Commodore 64-gyel és egyéb 8-bites gépekkel és kijelenthetem, hogy a 8 bit abnormális gondolkodásra sarkallja az embert. Veszel egy egészséges 32 bites processzort és hirtelen összeáll minden a legnagyobb rendbe. Érthető kód, gyors működés,... Nem az emberben van a probléma, hanem az architektúrában. Hidd el, bőven eleget kotortam a szmötyit C64 alatt ahhoz, hogy beleundorodjak az egészbe.Igaz, hogy Windowson nevelkedet, programozók nem ismerik a 8 bites gépet!
És gondtalanul elhasználnak 2 Bytet 1 Byte helyett!
És még ostobán tanítják is!???
Nem kell 1 byte-ot spórolni. Legyen a rutin 2 bájt, viszont érthető. A fordító olyanra fordítja, amilyenre neki tetszik. Ha meg kevés a memória processzort cserélsz. Nem kell partnernek lenni az elfuserált 8 bites arhitektúrákban. Amint kilépsz a beszűkült világukból, rögtön megszületik az értelmes megoldás a problémára:
Kód: Egész kijelölése
#define PWM_TOP 256
uint16_t softpwm = 0;
const uint16_t pwm = 10;
void loop()
{
if( ++softpwm >= PWM_TOP )
softpwm = 0;
if( softpwm < pwm )
digitalWrite(LED_PIN, true);
else
digitalWrite(LED_PIN, false);
}
Re: 60 nap alatt Arduino #13 - PWM, analogWrite
Annyit még hozzátennék, hogy egy 32 bites gépen az int8 és int16 lassabb, mint az int32. Folyamatosan dolgozni kell a processzornak, hogy int8-t és int16-t csináljon az int32-ből.
Ennek ellenére Arduino környezetben jó gyakorlat az, hogy olyan típust használsz, amire szükséged van. Jelen esetben a számláló 256-ig megy, ami int16 típust igényel.
Értelemszerűen az ESP8266 többet fog dolgozni egy int8-cal, mintha mezei int32 lenne, viszont egy AVR-t az int32 nagyon komolyan kiütne. Az Arduino lib-ek is akkora típust használnak, amekkorára szükség van. Ennek ára, hogy az ESP8266 hajszálnyival lassabb lesz, de ez elfogadható.
Ennek ellenére Arduino környezetben jó gyakorlat az, hogy olyan típust használsz, amire szükséged van. Jelen esetben a számláló 256-ig megy, ami int16 típust igényel.
Értelemszerűen az ESP8266 többet fog dolgozni egy int8-cal, mintha mezei int32 lenne, viszont egy AVR-t az int32 nagyon komolyan kiütne. Az Arduino lib-ek is akkora típust használnak, amekkorára szükség van. Ennek ára, hogy az ESP8266 hajszálnyival lassabb lesz, de ez elfogadható.
Re: 60 nap alatt Arduino #13 - PWM, analogWrite
Ezzel a nyilatkozattal megmagyaráztad, hogy miért is fordít az arduino többször akkora kódot mint, egyéb más AVR-re irt alkalmazás!
Elrejti a felhasználó elöl a HW. működési elvét, ezáltal azt hiszik végtelen erőforrások állnak rendelkezésükre. Majd jön a meglepetés, hogy nem férnek bele az adott prociba!
Lehet, hogy te meg én már utáljuk a 8 bitest!
De még mindig nagyon sokan ezzel kezdenék az ismerkedést!
Mert a 32 bitesbe beépített rengeteg + HW lehetőség megértéséhez, neked is az alap 8 bitesn át vezetett az út.
Elrejti a felhasználó elöl a HW. működési elvét, ezáltal azt hiszik végtelen erőforrások állnak rendelkezésükre. Majd jön a meglepetés, hogy nem férnek bele az adott prociba!
Lehet, hogy te meg én már utáljuk a 8 bitest!
De még mindig nagyon sokan ezzel kezdenék az ismerkedést!
Mert a 32 bitesbe beépített rengeteg + HW lehetőség megértéséhez, neked is az alap 8 bitesn át vezetett az út.
Re: 60 nap alatt Arduino #13 - PWM, analogWrite
Értem amit mondasz, viszont a másik oldalra is rávilágítanék. Nekem évekbe tellett az, hogy elfelejtsem a C64 alatti nagyon rossz beidegződéseket.
Mi az a 256? Egy szám. A 319 is egy szám, a 82 is egy szám és a 100 is egy szám. A te példádban csak 256-ig számolhatsz, az én kódomban átírhatom a 256-ot 319-re és azzal is tökéletesen megy. ESP8266 tekintetében a 256 és a 499 ugyanolyan számok, semmi különbség nincs közöttük.
A te fejedben az él, hogy a 256 valami mágikus csoda. Írsz egy kódot, ami kizárólag 256-ig tud számolni. Ez AVR-en a leggyorsabb megoldást adja, ESP8266-on már egyáltalán nem, mert folyamatosan kasztolnia kell uint8-ra. Emellett, aki olvassa, az nem érti, hogy hogyan lesz PWM amikor mindig csak növeled a számlálót. Olvashatatlan kód, ami 32 bites rendszeren még csak nem is optimális, mert gyorsabb lenne if (softpwm==256)-tal, ami ráadásul érthető is.
Írtál egy kódot, ami kizárólag 8 bites rendszeren értelmezhető, 32 bites rendszeren katyvasz. És ez regény folytatódik végestelen végig: lefoglalsz 2048 bájtot, miközben egy internetes csomag max 1.5 kbyte lehet, és így tovább. Vedd észre, hogy ez korlát, saját magadat korlátozod le kettes számrendszerbe, miközben mindez csak a te fejedben él, de a valóságban nem. Annyi bájtot foglalsz le, amennyi jólesik. Addig számolsz, ameddig szeretnél.
Túlpörgetsz egy számlálót, mert nyersz vele 1 byte-ot, utána rájössz, hogy jobb lenne 300-ig számlálni és átírhatod az egész kódot, amivel vesztesz egy napot. Én meg hátradőlök és átírom az #define-ban a 256-ot 300-ra.
Ez az, amit végig próbálok megvilágítani. Ne korlátozd a tudatodat 8 bitre, mert több 10 éves tapasztalat azt mutatja, hogy kizárólag rosszul járhatsz vele. Logikus érthető és tiszta kódot kell írni és elfelejteni a mágikus varázsszámokat. A 10, 256, 323, 512, 1111 számok, melyek közül egyik sem hordoz többet a másiknál.
Mi az a 256? Egy szám. A 319 is egy szám, a 82 is egy szám és a 100 is egy szám. A te példádban csak 256-ig számolhatsz, az én kódomban átírhatom a 256-ot 319-re és azzal is tökéletesen megy. ESP8266 tekintetében a 256 és a 499 ugyanolyan számok, semmi különbség nincs közöttük.
A te fejedben az él, hogy a 256 valami mágikus csoda. Írsz egy kódot, ami kizárólag 256-ig tud számolni. Ez AVR-en a leggyorsabb megoldást adja, ESP8266-on már egyáltalán nem, mert folyamatosan kasztolnia kell uint8-ra. Emellett, aki olvassa, az nem érti, hogy hogyan lesz PWM amikor mindig csak növeled a számlálót. Olvashatatlan kód, ami 32 bites rendszeren még csak nem is optimális, mert gyorsabb lenne if (softpwm==256)-tal, ami ráadásul érthető is.
Írtál egy kódot, ami kizárólag 8 bites rendszeren értelmezhető, 32 bites rendszeren katyvasz. És ez regény folytatódik végestelen végig: lefoglalsz 2048 bájtot, miközben egy internetes csomag max 1.5 kbyte lehet, és így tovább. Vedd észre, hogy ez korlát, saját magadat korlátozod le kettes számrendszerbe, miközben mindez csak a te fejedben él, de a valóságban nem. Annyi bájtot foglalsz le, amennyi jólesik. Addig számolsz, ameddig szeretnél.
Túlpörgetsz egy számlálót, mert nyersz vele 1 byte-ot, utána rájössz, hogy jobb lenne 300-ig számlálni és átírhatod az egész kódot, amivel vesztesz egy napot. Én meg hátradőlök és átírom az #define-ban a 256-ot 300-ra.
Ez az, amit végig próbálok megvilágítani. Ne korlátozd a tudatodat 8 bitre, mert több 10 éves tapasztalat azt mutatja, hogy kizárólag rosszul járhatsz vele. Logikus érthető és tiszta kódot kell írni és elfelejteni a mágikus varázsszámokat. A 10, 256, 323, 512, 1111 számok, melyek közül egyik sem hordoz többet a másiknál.
Re: 60 nap alatt Arduino #13 - PWM, analogWrite
Eddig én is a 256-ot tekintettem optimálisnak.
Ezek szerint nem csak hogy lazíthatok a szorításán, hanem kötelező esp-nél?
Ez jó hír.
Ezek szerint nem csak hogy lazíthatok a szorításán, hanem kötelező esp-nél?
Ez jó hír.
Re: 60 nap alatt Arduino #13 - PWM, analogWrite
Az ESP az annyira 32 bites, hogy 8 bittel ki is lehet fagyasztani.
Tudni kell, hogy int-et nem tud csak 4-gyel osztható memóriacímről kiolvasni. Megvannak a maga rigolyái.
Kód: Egész kijelölése
uint8_t buf[5];
buf[0]=1;
buf[1]=2;
buf[2]=3;
buf[3]=4;
buf[4]=5;
// azt várnád, hogy 0x02030405-öt ad vissza, miközben fagyni fog
int p = *(int*)(buf+1);
Re: 60 nap alatt Arduino #13 - PWM, analogWrite
Mondjuk nekem a mintád nem fagy. teszi a dolgát.
84148994
84148994
Re: 60 nap alatt Arduino #13 - PWM, analogWrite
Ne örülj azért, mert a fordító kihúzta a hiba méregfogát. Gondolom a gcc trükközött valamit, hogy ne legyen baj.
Futtasd le a következő kódot (nálam megbízhatóan fagy rögtön a második pointer írásnál, négyesével növelve a pointert megy):
Olvasásnál is fagyizik rendesen.
Futtasd le a következő kódot (nálam megbízhatóan fagy rögtön a második pointer írásnál, négyesével növelve a pointert megy):
Kód: Egész kijelölése
void setup() {
Serial.begin(115200);
uint8_t buf[1000];
for(int i=0; i < 996; i++)
{
int * ptr = (int *)(buf + i);
Serial.print("Próba:");
Serial.println((int)ptr, HEX);
delay(1000);
*ptr = i;
}
Serial.println("OK");
}
void loop() {
}
Re: 60 nap alatt Arduino #13 - PWM, analogWrite
A forum címe: 60 nap alatt Arduino - Házi feladatok!
Itt Mostmár hanyagoljátok az ARM-os támákat!!
Itt Mostmár hanyagoljátok az ARM-os támákat!!
Re: 60 nap alatt Arduino #13 - PWM, analogWrite
Igenis.
Úgy is későn van (vagy korán?) a problémára pedig fény derült és igaznak bizonyult így kár is lenne rá több szót fecsérelni.
Megjegyeztük, okultunk, továbblépünk.
Úgy is későn van (vagy korán?) a problémára pedig fény derült és igaznak bizonyult így kár is lenne rá több szót fecsérelni.
Megjegyeztük, okultunk, továbblépünk.
Re: 60 nap alatt Arduino #13 - PWM, analogWrite
Az ESP8266 nem is ARM.kapu48 írta:Itt Mostmár hanyagoljátok az ARM-os támákat!!
Re: 60 nap alatt Arduino #13 - PWM, analogWrite
Látom beálltál a sorba, kedden már te is csak virgácsot kapsz.vargham írta:Az ESP8266 nem is ARM.