Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
ATmega168 7-Segmentni Display
Odlicno, sad sledi CMakeLists.txt da se napravi i da se potera rucno prevodjenje programa sa nekim GNU prevodiocem.
To je pravi put da se cela ta prica oko C/C++ zaokruzi, jezik je odlican ali su mu jos bolji alati koji idu oko njega i ne mozes da znas zasto su dobri i kako rade dok ih ne poteras rucno.
Svi ovi spomenuti GUI rade upravo to samo "skoljeno" od korisnika ali poznavanje toga je vrlo bitno i vrlo mocan alat u rukama programera.
Kad to prodjes onda ce te biti bas priga za proizvodjaca kompajlera jer ako tebi radi GNU verzija i znas da je koristis to je dovoljno dobar alat prakticno za sve zivo sto moze da se programira na ovoj planeti!

Skoro sam poceo da koristim CMake, sada mi je krivo sto nisam to pre koristio ali nema veze, bitno da sam makar probao i odmah se odusevio, ima brdo opcija, tek izucavam, zavrsio mi je posao za par nekih stvarcica i tu me je dobio ...
Reply
Probao sam danas u simulatoru vojinilicov asm kod za HEX2BCD i ako sam dobro vidio program se izvrsi za 787 ciklusa sto mi izgleda mnoogooo....razumijem da AVR nema HW DIV mnemonik pa mora da ide softwerski a to podrazumijeva Left Bit Shifting sa Bazom 2 (2x2x2x2x2...) i to zahtjeva puno ciklusa...ja sam malo stavio sa stranu C jezik i sinula mi danas ideja zasto nebi npr broj:

867 rastavio dijeljenjem na tri znamenke pomocu ove formule:

867 / 100 = 8,67 (uzmi 8 i pohrani ga u registar R23) R23 => 08
Uzmi ostatak 67 i podijeli ga sa 10 = 6,7 (uzmi 6 i pohrani ga u registar R24)
Uzmi ostatak 7 i pohrani ga u registar R25

R23 => 08
R24 => 06
R25 => 07

Naletim na ovu stranicu:

https://sites.google.com/site/avrasmintr...basic-math

9. DIVIDING TWO 16-BIT NUMBERS

Stavim kod u simulator, i vidim da mi uzima cijeli broj i ostatak...onda isao prouciti kod..skuzio kako radi bit shifting, i dopisao svoj kod u DONE: macro i dodao EXIT: macro...pokrenuo simulator i gle cuda...u registrima bas vrijednosti kako sam gore naveo....fantasticno....korak blize ASM i AVR-u Smile

Mnozenje sa AVR je jako lako jer ima HW mnemonik..dok za dijenjenje nema pa mora preko SW...nije mi jasno kako inzinjeri u ATMELU nisu to mogli da dodaju? Pa i digitron pored mnozenja ima i dijeljenje i zato mi nije jasno kako su mogli tako bitnu stvar da izostave....korisnici asm pica zanima me dali pic ima HW DIV i MUL mnemonik?

I sad mi jos sinula jedna ideja..posto HW mnemonik MUL u ASM uzima 2ciklusa jeli moguce ovo da se uradi? Mislim da je nemoguce da se uradi ali da pitam:

867 x 0,01= 8,67
  67 x 0,1  = 6,7

R23 => 8
R24 => 6
R25 => 7

Dobi se isto a izvrsavanje bi trebalo da bude oko 30-40ciklusa...dok za meni gore SW dijeljenje treba tocno 492 ciklusa ili tocnije receno na 18,432MHz quarzu to je 26,69uS sto mi se cini mnogooo....a sa ovim MUL ako bi se dalo bilo bi to na 40ciklusa 2,17uS sto bi bio ogromni benchmark...cak sam nasao na forumu da su se ljubitelji PIC-a nasli na forumu i isli raditi division na PICu u optimizaciju routina i dosli do takve optimizacije da su dosli blizu HW izvrsavanja mnemonika da postoji u njemu.

Evo koda i ako moze da se brzina poboljsa molim da se modificira i posta ovdje jer mi se ASM nekako najvise svidja...(nije ni C losi ali u asm kako da kazem moram da znam kako HW funckionira i onda pisem tocno tako nema kao u C pozoves interupts.h i imas tu sve vec rjeseno a u asm moras da pozivas interrupts adrese i da tocno tznas kakko timer i interrupt radi da bi to proradilo....)

Vidio sam i atmelov:

ftp://www.inf.fh-dortmund.de/pub/contrib...AVR200.PDF

fantastican dokument...kako ako se radi kratki kod ciklusi se povecavaju zbog nekih mnemonika (rjmp, brne...) koji zauzimaju 2 ciklusa....a ako se pise linija po linija..registar po registar upise compare ispis shifting dobi se cca 40% brze izvodjenje naspram kratkog koda...uz placanje cijene zauzimanje vise WORD-a u AVR-u tj FLASHa...ali posto je flash u avru ogroman nemogu ga ja bas tako lako napuniti....sada sam na nekvih 125Worda za 7seg display i to izadje 250byta flasha..sto je malo nasptam 32K....

Evo i programa pa molim vase komentare...pocenik sam ali sam uporan..i ASM je must way to go...


.rar   divider16bit.rar (Size: 1,12 KB / Downloads: 1)
Reply
(04-16-2018, 09:00 PM)ronovar Wrote: I sad mi jos sinula jedna ideja..posto HW mnemonik MUL u ASM uzima 2ciklusa jeli moguce ovo da se uradi? Mislim da je nemoguce da se uradi ali da pitam:

867 x 0,01= 8,67
  67 x 0,1  = 6,7

R23 => 8
R24 => 6
R25 => 7

Ovo ne može a kad budeš došao do toga da treba da radiš sa float u asm tek će te boleti glava Big Grin
Ima načina da se skrati ali bi morao da napišeš rutinu za deljenje dvobajtnog broja jednobajtnim DIV168. S obzirom da već imaš DIV1616 to i nije tako teško ali ne vodi nečemu posebno.
Reply
Naletio na ovaj kod na forumu...jako pametan nacin...clan foruma je radio prvo HW MUL pa onda isto kao i ja dijelio sa 10 uzeo prvi broj i ostatak i strpao u registre...ja cu morati malo promjeniti kod jer je on radio konverziju u ASCII a meni treba samo digit..ali cim skuzim kako radi kod postavljam ovjde i posebno obratiti paznju:

https://www.avrfreaks.net/forum/smallest...n?page=all

; code size without loop
; 58 *2 = 116 byte
; speed without loop update
; best case : 67 clk
; worst case : 69 clk

A ja ocekujem po ovom kodu za 3 digite 25-30clka posto je njegov kod za 5digita...ako ovo uspijem i ja tako da dobim onda je ovo vise nego 500% povecanje brzine nego sam ja gore dobio i kako atmelov datasheet pise Smile

HW MUL ima 2clka znaci sa njime bi to bilo 5-10clka max ali dobro 25-30clka ako dobijem je vec ogromni napredak...nego da pitam zasto nema AVR i HW DIV?

To ti je kao da kupis auto koji ima GAS (MUL) a nema KOČNICU (DIV) pa onda moras da bacas utege(SOFTWERSKI DIV) da bi auto počeo da koči...meni ovo nikako neide u glavu....jel moguce da nisu imali mjesta u AVR RISC arhitehkturi kad su radili dizajn AVR-a? Vidim citam mada nepoznajem PIC ove ali ni oni nemaju HW DIV....heh....
Reply
Evo malo da podgrijemo temu nakon fenomenalnog otkrica..autoru iz susjednog foruma sparrow2 treba da se da nobelova nagrada za ovo a evo i zasto:

Dijeljenje na AVR-u je znanstvena fantastika..i to kako su majstori bolji od mene rekli (vojinic, gorankg...) nije nimalo lak zadatak ako nisi u ASM bas na ti. I tako ja lista forume i nasao na info da AVR ima HW MUL mnemonik kojemu je potrebno 2 ciklusa na napravi mnozenje...probam ja to u simulatoru pogledam cikluse i ostanem iznenadjen...samo 2 ciklusa...fenomenalnoo...

Onda sam dosao na ideju...hey pa zasto nebi mogao da iskoristim MUL HW mnemonik sa 2 ciklusa da podijelim 3 znamenkasti broj na svaku cifru kad ono neznam kako jer za to sluzi djelejenje a djeljenje moze samo Softwerski tj preko leftshiftinga (kojeg sam detaljno procio iz atmelovog gore primjera) i mogu reci da je to samo gubljenje CPU vremena...totalno da budem malo grub amaterizam iz atmela... i onda naidjem na fantasticnu stranicu:

https://www.avrfreaks.net/comment/443404#comment-443404

Iz 2009 godine malo sam kod preradio ali moram definitivno da ga jos proucim jer se za isti rezultat ciklusi sa sadasnjih 56 sto dobivam is simulatora mogu da se snize na 25-30ciklusa...naspram 492 ciklusa koji rade softwerski djelejenj epomocu left shiftinga...ovo je ogroman napredak...clan foruma sparrow2 je lijepo iskoristio HW MUL mnemonik i dobio manji broj ciklusa pomocu matematicke formule....evo i koda koji sam testirao sa 432 decimalno i stvarno u registrima imam 4 3 i 2...zato kapa dolje njemu..mozda bude od ove koristi i majstorimima u programiranju na ovom forumu ili ako imaju volje da ga jos vise optimiziraju...jest da je kod brzi od softwerskog djelenja i to za skoro 9x ali je jos uvijek spori od HW dijeljenjakad bi imao bilo bi mu potrebno 2 ciklusa..sto je sa ovom izvedbom nemoguce da se izvede....znaci prije 492 ciklusa je trebalo cca 27uS a sada mi treba 3uS na 18,432MHz sto je ogroman napredak...kladim se da ni g.vojinic i g gorankg nisu znali za ovaj kod Smile

Trebalo bi ga preraditi na manje cikluse jer je ovo za 5 znamenki a ja koristim 3 pa ako moze vi koji se razumijete bolje od mene ako mozete da to malo skockate..ja proucavam kod jasniji mi je ali koji god kod da uzem proc funkcija vise ne radi kako treba...tako da iskreno neznam kako bi smanjio broj ciklusa...


.rar   HWDiv.rar (Size: 902 bytes / Downloads: 1)
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)