60 nap alatt Arduino #13 - PWM, analogWrite

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
Avatar
Robert
Elektronbűvölő
Hozzászólások: 9934
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

HozzászólásSzerző: Robert » 2016. március 28. hétfő, 17:31

Felfele/lefele: mi az a +/- 15?
Simán azzal is túlcsordulsz. pl. 14-15 = 255!

Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00
Tartózkodási hely: Budapest

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

HozzászólásSzerző: SzLacus » 2016. március 29. kedd, 12:54

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é.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9934
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

HozzászólásSzerző: Robert » 2016. december 2. péntek, 6:48

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 :)

Avatar
csabeszq
Bitfaragó
Hozzászólások: 672
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

HozzászólásSzerző: csabeszq » 2016. december 2. péntek, 7:11

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!???


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.

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);
}



Maga a 8 bites gép a probléma. Egyszerűen nem vagyok partner a 8 bites beszűkült bitfusizásban. Emberi módon programozom őket és teszek rá, hogy milyen hosszú kódra fordul az egész. Bőven elég volt nekem C64 alatt idétlenkedni a bitekkel, ha lehet nem kérek 2016-ban ebből. Még egyszer ugyanabba a folyóba nem lépek be.

Avatar
csabeszq
Bitfaragó
Hozzászólások: 672
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

HozzászólásSzerző: csabeszq » 2016. december 2. péntek, 8:05

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ó.

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3249
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

HozzászólásSzerző: kapu48 » 2016. december 2. péntek, 13:37

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.

Avatar
csabeszq
Bitfaragó
Hozzászólások: 672
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

HozzászólásSzerző: csabeszq » 2016. december 2. péntek, 20:57

É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.

Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1027
Csatlakozott: 2009. február 28. szombat, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

HozzászólásSzerző: SanyiSay » 2016. december 2. péntek, 21:22

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. :D

Avatar
csabeszq
Bitfaragó
Hozzászólások: 672
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

HozzászólásSzerző: csabeszq » 2016. december 2. péntek, 21:55

Az ESP az annyira 32 bites, hogy 8 bittel ki is lehet fagyasztani. :)

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);


Tudni kell, hogy int-et nem tud csak 4-gyel osztható memóriacímről kiolvasni. Megvannak a maga rigolyái.

Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1027
Csatlakozott: 2009. február 28. szombat, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

HozzászólásSzerző: SanyiSay » 2016. december 2. péntek, 22:34

Mondjuk nekem a mintád nem fagy. teszi a dolgát.
84148994

Avatar
csabeszq
Bitfaragó
Hozzászólások: 672
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

HozzászólásSzerző: csabeszq » 2016. december 2. péntek, 23:57

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):

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() {
}


Olvasásnál is fagyizik rendesen.

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3249
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

HozzászólásSzerző: kapu48 » 2016. december 3. szombat, 0:32

A forum címe: 60 nap alatt Arduino - Házi feladatok!

Itt Mostmár hanyagoljátok az ARM-os támákat!!

Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1027
Csatlakozott: 2009. február 28. szombat, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

HozzászólásSzerző: SanyiSay » 2016. december 3. szombat, 0:38

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.

vargham
Chipgyilok
Hozzászólások: 250
Csatlakozott: 2014. január 8. szerda, 8:32
Kapcsolat:

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

HozzászólásSzerző: vargham » 2016. december 3. szombat, 6:07

kapu48 írta:Itt Mostmár hanyagoljátok az ARM-os támákat!!

Az ESP8266 nem is ARM. ;-)

Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1027
Csatlakozott: 2009. február 28. szombat, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: 60 nap alatt Arduino #13 - PWM, analogWrite

HozzászólásSzerző: SanyiSay » 2016. december 3. szombat, 6:34

vargham írta:Az ESP8266 nem is ARM.

Látom beálltál a sorba, kedden már te is csak virgácsot kapsz. :lol:


Vissza: “60 nap alatt Arduino - Házi feladatok”

Ki van itt

Jelenlévő fórumozók: KZN valamint 1 vendég