[51] Jak sie komus nudzi - procedurka

Jan 21, 2004 31 Replies

Zamiana A na string dziesiętny (dla wartości 0-255, wyświetla z zerami nieznaczącymi) z wysłaniem na LCD



mov b,#0ah div ab mov r7,b mov b,#0ah div ab add a,#030h acall wyslijdane xch a,b add a,#030h acall wyslijdane mov a,r7 add a,#030h acall wyslijdane



...gdzie ''wyślijdane'' wysyła A jako daną na LCD (adres jest już ustawiony i zwiększa się automatycznie po wysłaniu danej).



I teraz mały konkursik bez nagród - kto zna lepiej/szybciej/ładniej?


U¿ytkownik "Janko Muzykant" snipped-for-privacy@wp.pl napisa³ w wiadomo¶ci news:buml8q$n5u$ snipped-for-privacy@korweta.task.gda.pl...

Proste ... (fragment mojego sprzedanego programu):

goto_row_column(1,1);

printf("Postaæ dziesiêtna:%2bD\r\n", byte_var);

1) du¿o czytelniej, 2) du¿o ³adniej, 3) wygasza zera nieznacz±ce, 4) du¿o szybciej osi±gniête ... Napisz mi to samo dla hexa, oktala i bina ... bo ja tylko zmieniê format printfa !

Nie podniecaj siê assemblerem, chyba ¿e nie planujesz wracaæ do programu po 5 latach. Wtedy jeste¶ usprawiedliwiony.

Po kilku latach z assemblerami zrozumiesz co daje jêzyk wy¿szego poziomu. Ale bêdzie Ci ³atwiej, bo znasz assembler i bêdziesz sobie optymalizowa³ s³abe miejsca kompilatora.

Czyli idziesz prawid³ow± ¶cie¿k± :-)

Pozdrawiam,

Marek

E, tam, nie problem ;)

clr f0 mov b, #0ah div ab mov r7, b mov b, #0ah div ab jnz konwersja31 setb f0 mov a, #0f0h konwersja31: add a, #30h acall wyslijdane xch a, b jnz konwersja32 jnb f0, konwersja32 mov a, #0f0h konwersja32: add a, #30h acall wyslijdane mov a, r7 add a, #30h acall wyslijdane

Przy okazji zwracam uwagę na sierotę - fo w psw - przydaje się jako znacznik ''na chwilę''...

No fakt, trzeba posiedzieć z pięć minut ;)

Zgadzam się jak najbardziej, ale są pewne ale...

1) program mi się nie wyrobi - rzeczy dzieją się równolegle podczas czekania na konwersję A/D. (przyspieszanie zegara nic nie zmieni bo znowu nie wyrobi mi się z peryferiami - czasy dostępu). Stąd 70 cykli do zagospodarowania na np. ową procedurkę. 2) dobrze mi z tym asemblerkiem - mam sporo procedur jeszcze po czasach, kiedy 51 miały okienka a o basicu na nie nikt nie słyszał... Naumiałem się wtedy i tak mi zostało. VisualBasica (dla dosa) też mam w miarę opanowanego (jak się skompiluje to nawet w miarę hula) ale jakoś _na_razie_ nie chce mi się zabrać za basica czy c na 51... może jak będzie wiecej roboty.

Poza tym problem zwykle tkwi w zmyślnym algorytmie - niezależnie od poziomu języka.

Mam nadzieję ;)

Tak .. tylko ile printf zajmuje w kodzie ? A nie mowimy o pececie z 64MB RAM tylko czyms z kilkoma KB na program.

A raz napisane moze sluzyc w nastepnych programach.

I .. czy doliczyles czas poswiecony na nauke C :-)

J.

Zgoda, 1-2kB to mo¿e byæ ale i tu mo¿na sporo upro¶ciæ.

To by³ wspania³y, niepowtarzalny czas poznawania nowego i sp³aca siê do dzi¶ ... mam kilka takich sterowników, ¿e napisanie ich w assemblerze by³oby PRAKTYCZNIE niemo¿liwe. Pisanie w C zajê³o

1/2 roku, to ile trwa³oby w assemblerze ? 3 lata ? 5 ? A wprowadzanie pó¼niej zmian ... brrr ...

Pzdr,

Marek

Tylko wiesz - przez czas poswiecony poznawaniu opcji control stringu printfa mozna sobie napisac pare procedurek w assemblerku i uzyskac zalozony wynik :-)

Przy dobrze prowadzonym projekcie i doswiadczeniu .. 1 rok ?

Pamietaj ze ocenia sie iz programista pisze rzedu 100 linijek dziennie :-)

Przy dobrze prowadzonym projekcie ..

ale za to przejscie na inny procesorek .. brr :-)

J.

Janko Muzykant napisa³ w wiadomo¶ci: ...

linie add a, #30h przeniesc do "wyslijdane". Co wygralem ?

btw - sztuka dla sztuki...

entrop3r

Pomysł dobry ale wtedy... trzeba zrobić ''wyslijdane1'' :) (z procedury ''wyślijdane'' korzystają także inne dobra, którym akurat akumulator pasuje jaki jest).

A tak w ogóle myślałem o bcd, ale o ile sprawdza sie przy wartościach do

99 to przy trzech cyfrach procedura jest podobnie złożona. Chyba, że... konkursik trwa ;)

Janko Muzykant napisa³ w wiadomo¶ci: ...

otoz to. To byl po prostu przyklad "zamiatania pod dywan" - tutaj mozna ujac a gdzie indziej trzeba dodac, ale za to ladnie wyglada. Jestem wielkim (i coraz bardziej osamotnionym) zwolennikiem optymalizacji kodu (zostalo mi z czasow pamieci 2716), ale nie zawsze takie zabawy maja sens - jesli napisales program, ktory zajmuje 98% RAM-u, ROM-u i nie zostaje mu nic czasu na swobodne pobieganie w glownej petli, to Twoja radosc jest przedwczesna i za chwile okaze sie, ze musisz przechodzic na wiekszy procesor.

entrop3r

Albo korzystać z ramu.. wyświetlacza lcd. Tyle dobra sie tam marnuje... ;)

To robisz: wyslijcyfre: add a,#30h wyslijdane: .... ... ret

:-)

J.

... ale wtedy będzie 2x acall i 1x ret a wtedy siwy dym i jasne capy ;) A znowuż acall - add a,#30h - ret jest trochę optymalizacją... na zaliczenie przedmiotu ;) No, chyba, że Atmel planuje wypuścić coś na 4 nogach z 64 bajtami romu...

wyslijdane1: add a,#48

wyslijdane: ...

i jesteś 4 bajty do przodu.

w.

"Marek" snipped-for-privacy@wp.pl wrote in news:buo6vc$bl8$ snipped-for-privacy@nemesis.news.tpi.pl:

programisci w Indiach pisza takie cos w 3-4 tygodnie, poprostu jestes leniwy :)

Pozdrawiam.

Tak, i jest siê skazanym do koñca ¿ycia na assembler :-) A ja w tej chwili swobodnie w miarê pos³ugujê siê kilkoma assemblerami, C, Pascalem, Delphi i jeszcze paroma innymi. I aplikacjê na Windows piszê sobie sam, nie jestem zale¿ny od programisty, ktory jak ognia boi siê mikrokontrolerów, a has³o "assembler" przyprawia go o zawrót g³owy :-)

No to policzmy ... 7000 linii w C51 (sterownik przemys³owy), razy ile ? 10 linii assemblera na jedn± liniê C chyba nie bêdzie przesad± ? No dobra ... 7 ....

7000 * 7 = 49 000 linii assemblera ... co by siê zgadza³o plus minus bo do 64kB zosta³o mi kilkaset bajtów ... 49 000 / 100 = 490 dni ... rok roboczy ma ich jakie¶ 240 ... czyli jednak 2 lata :-)

Ale napisanie takich algorytmow, jakie wycisn±³em z C51 (biblioteki procedur wykonawczych, biblioteki typów wyj¶æ, programy swobodnie konstruowane przez u¿ytkownika z procedur, wy¶wietlanie LCD, do¶æ ... nie zamierzam siê chwaliæ :-) ) by³oby w praktyce niemo¿liwe w assemblerze i musia³oby zaj±æ 3-4 lata.

Przy 40-50 000 linii w assemblerze, wystarczy ¿e g³ówny programista odejdzie i le¿ysz, czy Ci siê to podoba czy nie ...

Ano w³a¶nie, a ja swobodnie przesiadam siê z 51' na AVR, bo tu i tu i tak u¿ywam g³ównie C ... Choæ assemblerem nie gardzê, bo oczywi¶cie pozwala optymalizowaæ krytyczne punkty programu.

OK !!! Osi±gn±³em zamierzony efekt, czyli bujn± dyskusjê. EOT !!!

:-)

Pzdr,

Marek

U¿ytkownik "RusH" snipped-for-privacy@kiti.pulse.pdi.net> napisa³ w wiadomo¶ci news:Xns9478D5CBA657FRusHcomputersystems@193.110.122.80...

Zaskoczê Ciê ... tu siê zgadzam ... programi¶ci w Indiach pisz±:

"To by³ wspania³y, niepowtarzalny czas poznawania nowego i sp³aca siê do dzi¶ ... mam kilka takich sterowników, ¿e napisanie ich w assemblerze by³oby PRAKTYCZNIE niemo¿liwe. Pisanie w C zajê³o

1/2 roku, to ile trwa³oby w assemblerze ? 3 lata ? 5 ? A wprowadzanie pó¼niej zmian ... brrr ... "

rzeczywi¶cie przez 3-4 tygodnie :-)

Praw fizyki nie da siê zmieniæ: 370 kB tekstu programu, pisanego przez 4 tygodnie, 6 dni w tygodniu, 10 godzin dziennie ( to moja leniwa dawka) daje jeden znak co 2 sekundy ... hehehe

W ten sposób to mo¿na napisaæ statut Samoobrony, uzasadnienie n/t wy¿szo¶ci jednorêkich bandytów nad dwurêcznymi bandytami z SLD, reformê s³u¿by zdrowia w/g ³apiñskiego (celowo pisany z ma³ej litery), wyst±pienia Jolki i komentarze polityczne Olka.

Ale niestety sensownego programu to w ten sposób nie da siê pisaæ :-)

Pzdr,

Marek

On Behalf Of Marek

Przepraszam, czy możesz mi wskazać jakiś sterownik przemysłowy zbudowny na '51? Oczywiscie pomijam tu sterowniki budowane na indywidualne zamówienia. Ale coś takiego budowanego seryjnie i używanego. No i oczywiście program pisany w Keil'u 51.

pzdr Artur

On Behalf Of Marek

Sorki, ale czy jesteś najlepszy na świecie? Zdażało mi się pisać i po 600kB tekstu programu z minimalnymi komentarzami w ciągu miesiąca i to bynajmniej nie po 12 lub więcej godzin dzienie. a i tak po czasie znajdowałem o niebo lepsze rozwiązania, zajmujące

1/4 pamięci i wykonujące się pięć razy szybciej. Proszę, więcej pokory.

Oczywiście wiekszość napisałem wcześniej i wystarczyło tylko kopiowianie. Ale ... każde takie kopiowanie wymagało przemyślenia - wejść, wyjść, wspólnych zmiennych itd. A jestem w 100% pewny, że przynajmniej jest 1.000.000 lepszych niż ja.

pzdr Artur

U¿ytkownik "Janko Muzykant" snipped-for-privacy@wp.pl napisa³ w wiadomo¶ci news:buot41$hbs$ snipped-for-privacy@korweta.task.gda.pl...

Po mojemu 1xacall i 1xret - bez dymu:-)

zamiast:

add a,#30h acall wyslijdane

jeno:

acall wyslijcyfre

Pozdrawiam Jarek

A tośmy do tego już doszli wcześniej ;) Ale generalnie chodziło mi o inny algorytm a nie o skracanie...

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required