ASM minták?

Rendszerközeli nyelv(ek) tippjei, alkalmazásai
Avatar
etwg
Pákabűvész
Hozzászólások: 213
Csatlakozott: 2011. február 7. hétfő, 7:00

Re: ASM minták?

Hozzászólás Szerző: etwg »

kapu48 írta:Szerintem ez zsákutca!

Az 60-al osztás pontatlansága miatt nem kapod vissza a helyes eredményt.
Inkább tárold 2 bájton: perc, másodperc az értékeidet.

Tegnap és ma siikerült nagyon elegánsan megoldani a feladatot.

A word-öt ami a másodperceket tartalmazza ( max 3599 -azaz majdnem - ora) egyenként elöször 600-l csökkentem, ahányszor kijön, annyi a percek 10-s száma. A maradékot ugyanilyen elven 60-l csökkentem, ami a percek számát adja meg, azaz megvan a két hely : MM
Ezután a maradékot 10-seivel csökkentem, ahányszor ez kijön a másodpercek tizesei, a maradék meg az utolso helyre megy, azaz SS.
Miután gyakran kell ez a számolás egy kicsit megszivtam a makroval, mert nem olyan egyszerü két wordöt összeadni meg kivonni, de sikerült, és jol megy. Egy kicsit szivtam a kondicioval, az elején automatizálni akartam azt is, hogy makro döntse el melyik algoritmust használja, ha az oszto > mint 255, azaz word (600), meg amikor az oszto csak 1 byte (60). Ez sajnos nem sikerült ( nem tudom miért), igy két fajta makroim vannak, bytera és wordre. :D

(Közben már kiderült miért nem ment a feltétel...... Word-öt nem lehet csak ugy összehasonlitani egy konstanssal :mrgreen: )
Éljenek a vonatok!

http://www.youtube.com/playlist?list=PLF2674BF4E3765682
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: ASM minták?

Hozzászólás Szerző: csabeszq »

Hát, az osztást én igencsak ellazázom:

A/60 = A * (65536/60) / 65536

Magyarul, az osztást szorzással cseréled fel, a végeredményt meg 16-tal shifteled.

(1093-vel szorzod 1092.26 helyett, ha kicsit több, akkor 60/60 remélhetőleg nem 0 lesz)
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: ASM minták?

Hozzászólás Szerző: csabeszq »

kapu48, informatikában igen ravasz dolgok megvalósíthatóak eszméletlen gyorsan.
A 60-as osztás nem tartozik a megoldhatatlan feladatok közé.

A vicc kedvéért leírom a rutint, amivel effektív értéket számoltam. Bár C-ben van, de szükség esetén átírható.

Négyzetgyökvonás:

Kód: Egész kijelölése

uint32 isqrt3(uint32 n)
{
   uint32 root = 0, bit, trial;
   bit = (n >= 0x10000) ? 1<<30 : 1<<14;
   do
   {
      trial = root+bit;
      if (n >= trial)
      {
         n -= trial;
         root = trial+bit;
      }
      root >>= 1;
      bit >>= 2;
   } while (bit);
   return root;
}
Avatar
etwg
Pákabűvész
Hozzászólások: 213
Csatlakozott: 2011. február 7. hétfő, 7:00

Re: ASM minták?

Hozzászólás Szerző: etwg »

csabeszq írta:Hát, az osztást én igencsak ellazázom:

A/60 = A * (65536/60) / 65536

Magyarul, az osztást szorzással cseréled fel, a végeredményt meg 16-tal shifteled.

(1093-vel szorzod 1092.26 helyett, ha kicsit több, akkor 60/60 remélhetőleg nem 0 lesz)

Szerintem az én rutinom még ettöl is egyszerübb:



Oszt4:
Ldi a,$2f
Oszt4a:
Inc a
Subiww x,600
Brcc oszt4a
Subiww x,-600
Rcall writea

A subiww subrutin csak az osztot (600) rakja az x-be
Az a tartalmazza az eredményt
A writea meg kiirja a display megfelelö helyére (4 innen az oszt4 rutin)

.
Éljenek a vonatok!

http://www.youtube.com/playlist?list=PLF2674BF4E3765682
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: ASM minták?

Hozzászólás Szerző: csabeszq »

Hát, ciklusban osztani 60-nal, nem tudom.

Miközben a szorzó 2 órajelciklus alatt lefut, aközben ciklus helyett simán C-t is használhatnál, mert az is rövidebb idő alatt megcsinálja, mint egyesével kivonogatni.

Működni működik, csak ugye miért kell az assembly, amikor Bascomtól C-ig mindenki gyorsabban számolja ki az egészet, mint az általad megírt kód.
Avatar
etwg
Pákabűvész
Hozzászólások: 213
Csatlakozott: 2011. február 7. hétfő, 7:00

Re: ASM minták?

Hozzászólás Szerző: etwg »

Ezt egy kicsit kétlem mert pl. Kivonni 5x 600-t nagyon gyors és már meg is van az 5-s a displayre ( ráadásul sem a C-nyelvet sem a Bascomot nem igen ismerem. Nagyon jol megy, nincs semmi gond ezzel a koddal.

Mással viszont van.

A gombnyomásra az 1. meg a 3. sor végére kell kiirni egy-egy karaktert, majd a 2. sor elejére kell ugrani a kurzornak. Amikor lassan léptetem (F11, F10 stb.) remekül megy, de ha betöltöm a prociba, akkor a 2 karaktert egymás után a 4. sor végére irja, a kurzor meg az 1. sor elsö helyére ugrik. Képtelen vagyok kideriteni mi a kinja. ( mintha tul gyors lenne a gombok beolvasása, már beraktam késleltetést is).
Éljenek a vonatok!

http://www.youtube.com/playlist?list=PLF2674BF4E3765682
Avatar
etwg
Pákabűvész
Hozzászólások: 213
Csatlakozott: 2011. február 7. hétfő, 7:00

Re: ASM minták?

Hozzászólás Szerző: etwg »

Egy kérdés:
Több változóm van, a méreteik word (2 byte) ill. 1 byte.

Ha ugy olvasom be öket, amilyen a meretük .dw ill. .db formában a feldolgozo rutinok egy kicsit megzavarodnak.
Mi történik ha mindet .dw - nek definiálom, akkor is, ha csak 1 byte a változo. Mi lesz a másik byte helyén?
Éljenek a vonatok!

http://www.youtube.com/playlist?list=PLF2674BF4E3765682
Avatar
etwg
Pákabűvész
Hozzászólások: 213
Csatlakozott: 2011. február 7. hétfő, 7:00

Re: ASM minták?

Hozzászólás Szerző: etwg »

Egy ujabb kérdés, hátha jár erre valaki:

A léptetö motorra egy fordulatra 10000t impulzus kell küldeni (áttétel van rajta, így jön ki ez az impulzusszám), ami 200 lépésnek felel meg.

A motort 2 határérték között akarom vezérelni.
A leggyorsabb fordulat 10 sec alatt 1, azaz 00:10 sec 200 lépés = 10000 impulzus = ebböl 5 Hz-es alapjel jön ki. (5x10x200=10000)
A leglassubb mozgás 1 ford/24 ora
A leglassubb mozgást felbontottam 96 x 15 perces (900 sec) intervallumokra, s hogy megmaradjon a 200 mint 1 fordulat kijelzése, ez azt jelenti, hogy 100 x ismétlem az egy fordulat (200 lépés) 1/100-át.
Ebböl ha jól számolom 0,056 Hz alapfrekvencia jön ki:
15:00perc 2 lépés 100x ismételve

0,056Hzx900x2x100=10080 imp

Mit javasoltok hogyan lehetne ezt a feladatot a legegyszerübben megoldani. Azaz az egyik (vagy több timer) frekvenciáját kellene 0,056-5 Hz-es tartományban (azaz az átfogás kb 1:100)
Keresek egy olyan közös változot, amivel a timert lehetne szabályozni.
Kösz
Éljenek a vonatok!

http://www.youtube.com/playlist?list=PLF2674BF4E3765682
Avatar
etwg
Pákabűvész
Hozzászólások: 213
Csatlakozott: 2011. február 7. hétfő, 7:00

Re: Eeprom preset

Hozzászólás Szerző: etwg »

Már régen voltam itt, igaz közben a gépem müködik, most egy kicsit miniatürizáltam (mert az eredeti egy kicsit nagy meg nehéz lett). Itt ott javitgattam a programot is. Sajnos itt becsuszott egy kis hiba. Korábban amikor az AVR Studio 4-l programoztam mindig megjelent egy ablak, hogy töltsem be az eepromba a kiindulasi adatokat. ( valami eep fájl is van). Valamit rosszul nyomtam meg és azota nem jelenik meg ez az ablak (Load eeprom). Ha a Studioban kiválasztom az eepromnak az eep fájlat, akkor hibát ad mert hex-t szeretne.
Maga a program megy, csak a 8 kétbájtos adat most össze vissza jelenik meg a displayen (véletlenszerü tartalom vagy 255). A programbol természetesen át tudom irni, csak jobb lenne ha megint induláskor az optimális tartalom jelenne meg az eepromok megfelelö helyein.
Szoval egy eeprom preset-t kellene csinálnom csak nem tudom hogyan kell. (Ezzel indujon a berendezés bekapcsolás után)
Éljenek a vonatok!

http://www.youtube.com/playlist?list=PLF2674BF4E3765682
Válasz küldése