logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[mega8][BASCOM AVR] Za dlugi program 115% co zrobić?

fiskusmati 23 Sie 2009 21:31 2223 25
  • #1 6926780
    fiskusmati
    Użytkownik obserwowany
    Witam

    Moj projekt powstał z potrzeby chwili, kiedy procenty rosły cieszyłem się że mega bedzie miała co robic i ze umiem tyle napisac teraz sie nie ciesze a jestem zawiedziony, bo nigdy nie przypuszczałem ze będe potrafił zapisać 100% pamieci atmegi a tu proszę 115%.

    Nic nie chce zmieniac skracac itd, poprostu chciałbym częsc programu przenieść do eeprom tak zeby miec max 95% w flash room.

    Proszę o jakies wskazówki co wstawić w kodzie i jak zapisac na eeprom.



    Pozdrawiam
  • Pomocny post
    #2 6926812
    zumek
    Poziom 39  
    fiskusmati napisał:

    Proszę o jakieś wskazówki ...

    Zmień M8 na M168, a o tym co chciałeś zrobić, najlepiej zapomnij.
  • #3 6926853
    fiskusmati
    Użytkownik obserwowany
    ?

    Jak mam zmienic wszytko na pcb siedzi zamknięte w obudowie ktoej raczej nie chce otwierac. :-) I tak sie ciesze ze to działa, moze jakis zew flash?
  • Pomocny post
    #4 6926861
    PawelecXX
    Poziom 11  
    Może jak pokażesz program to da się go jakoś skrócić.
  • #5 6926872
    fiskusmati
    Użytkownik obserwowany
    Moge ale sie troche wstydze bo sie będziecie pewnie ze mnie śmiać :-) Bo to cały program jest napisany na if then :-) Pewnie sie da skrócic ale to juz nie bedzie moj projekt i ja sie w tym nie połapie.
  • Pomocny post
    #6 6926905
    Mat_91
    Poziom 25  
    No to pora pocwiczyc programowanie:) A jak nie chcesz żadnych zmian w programie to zrób tak jak radzi zumek. Zmienisz tylko procka na takiego z wiekszą ilością flasha- dużo prostsze rozwiązanie niż zewnetrzne pamięci (dla których i tak musiałbyś rozbierać obudowę żeby to jakoś podłączyć i wymagały by dużych zmian w programie) :p
  • Pomocny post
    #7 6926906
    mirekk36
    Poziom 42  
    tak jak mówił zumek - zapomnij o jakimś wrzucaniu kodu programu do eeprom lub zewnętrznej pamięci flash - bo to (powiedzmy) niemożliwe ;)

    tak więc zostają ci tylko 2 drogi:

    1. Optymalizacja kodu - czyli poskracanie pewnych rzeczy. Zamiast pokazywać cały kod - pokaż może niektóre fragmenty, które sam uważasz że już dałoby się jakoś może poskracać - tylko sam jeszcze nie wiesz jak

    2. podmiana procesora na żywca - ATmega168 ma taki sam PINOUT czyli spokojnie możesz ją podmienić - w nagłówku Bascoma zmienić definicję z Atmega8 na Atmega168 - przekompilować i bez najmniejszego bólu nie dość że się zmieści to jeszcze będziesz miał prawie drugie tyle pamięci na swoje dalsze szaleństwa programistyczne ;) - Atmega168 ma 16kB
  • #8 6926959
    fiskusmati
    Użytkownik obserwowany
    Ok, Pokazuje cały kod. Tylko proszę się nie śmiać, nie mówić ze to jest źle, albo ze zegar nie dokładny bo jest dokładny, cholernie dokładny, dokładniejszy niż rtc bo przez 2 tyg. pracy bez żadnej ingerencji jest 0 sekund opóźnienia.

    A niestety nie mogę zbytnio chyba podmienić procesorów bo płytka jest przyklejona od strony ścieżek do obudowy i nie jest na podstawce tylko bezpośrednio wlutowane w płytkę.

    Nie pytać sie po co to i dlaczego, jak wiecie jak zmienić kawałek programu tak żeby w jego działaniu nic sie nie zmieniło to proszę. 1200 bajtów do usunięcia.

    Zamieszczony przydługi kod, zamieniłem na załącznik.
    [zumek]
  • Pomocny post
    #9 6927094
    wader_669
    Poziom 28  
    Po co za kazdym razem szukasz czujnikow? za kazdym wlaczeniem procesora je zmieniasz?
    Nie dziwie sie, ze kod ci zajmuje 115% kod jest slabo napisany.
    Jest miliard bledow, nie pros mnie zebym ci je wszystkie pokazal. Zanim dal bym rade je wszystkie wypisac to ty bys juz umial dobrze programowac.
    Ja osobiscie tez bym zgloscil niektore twoje posty do moda, bo nie umiesz podstaw. Helpa, ksiazki i kursy czytac!
  • Pomocny post
    #10 6927101
    manekinen
    Poziom 29  
    Fiskusmati, długi kod można dać w załącznik dla wygodniejszego przeglądania forum. Co do kodu, kompilowałem bascomem w wesji 1.11.9.0 z opcją optymalizacji, bez żadnej ingerencji uzyskałem 107% - czyli tylko 640 bajtów ponad wymiar :) Zaraz spróbujemy coś poskracać.
  • #11 6927130
    fiskusmati
    Użytkownik obserwowany
    Dzięki manekinen :-) Gdzie zaznaczyc ta opcje optymalizacji :D?


    a co do bardzo pomocniczego postu wadera, to mowilem ze dopiero zaczyna programowac i zeby sie nie czepiać. Program do odczytu temp z czujników dostałem od innego zaawansowanego usera forum ktory w nicku ma liczbę 512, ci ktorzy go znają wiedzą o kogo chodzi :-)
  • Pomocny post
    #12 6927231
    m.bartczak
    Poziom 16  
    Nie ma takiego kodu którego by się nie dało skrócić :P

    Przykład:

    Masz kod poniższy parę razy w źródle:
    
    If Sek = 60 Or Sek > 60 Then
       Sek = 0
       Incr Minu
       End If
    
       If Minu = 60 Or Minu > 60 Then
       Minu = 0
       Incr Hou
       End If
    
       If Hou = 24 Or Hou > 24 Then
       Minu = 0
       Sek = 0
       Hou = 0
       End If
    


    Zrób z niego podprocedurę, albo pomyśl czy nie można by przechowywać wszystkiego w sekundach i potem odpowiednio dzielić przy wyświetlaniu.
  • #14 6927281
    fiskusmati
    Użytkownik obserwowany
    dzieki!
    miałem to zrobić tzn ta podprocedure
    pozdro

    Dodano po 10 [minuty]:

    Jeszcze jedno małe pytanko. Połacze 2 procesory ze sobą poprzez sprzętówke rs232 tzn rxd do tdx i txd do rxd czyli na odwrót. Ale zasadnicze pytanie to jak odebrać zmienną? Co sekunde zegarek wyśle aktualną godzine minutę sekunde, temperature wewn, zewn. Na począku myslałem zeby w układzie "master" czyli w tym w ktorym bedzie generowany czas i temp Poprostu w pęli gdzies zrobić print hou ; minu ; sek ; t ; t1 ale jak to ma odebrac ten procesor slave? Poprostu input hou ; minu ; sek ; t ; t1 ?
  • #15 6927911
    robin_pl
    Poziom 12  
    fiskusmati napisał:
    Ok, Pokazuje cały kod.


    Jeżeli mogę kilka uwag ;)

    a) nie ma GODZINY 24 i MINUTY 60 ;) masz ten błąd w kilku miejscach
    b) błąd przy sprawdzaniu CZASOWNIK - wiersz 225 :D - niby może być 0-255 - ale w IF'ie masz 225 - literówka zapewne ?
    c) wiersze 333, 338, 343, itd. - zrób "> 23" i "> 59" - przy pkt. a) też możesz tak zrobić
    d) zrób funkcje z wyświetlania czasu i funkcje do zerowania czasu - to już częściowo zrobił Ci hose2 ;) - tyle, że można wywołać "Zwiekszams" w jeszcze jednym miejscu - wiersze 663 do 678 (w nowym kodzie)
  • #16 6927925
    OldSkull
    Poziom 28  
    Najlepiej wysyłaj określoną ramkę, np.:

    0xFF
    hou
    minu
    sek
    t
    t1 (odpowiedni typ, jeśli nie jest 8 bitowy to go musisz "pociąć")
    0xFF

    Odbierasz do tablicy w której elementy się przesuwają i co odbiór sprawdzasz czy pierwsza odebrana i 7. odebrana są 0xFF i w takim wypadku przepisujesz odpowiednie elementy tablicy do odpowiednich zmiennych. Da się to zrobic lepiej, ale to jest najprostsze rozwiązanie.
  • #17 6941963
    fiskusmati
    Użytkownik obserwowany
    moze nie zauwazyles ale nie ma u mnie godziny 24 ani minuty 60 jest if godzia = 24 then godzina = 0 wiec nigdy nie wyswietli mi sie 24

    taksamo mam z minutami i skeundami

    niezauwazyles, pozdro
  • #18 6942112
    rpal
    Poziom 27  
    Wiem że mogę rozpętać niepotrzebną dyskusję ale przy okazji optymalizacji kodu, zmieniłbym język np. na C.
  • #19 6942153
    robin_pl
    Poziom 12  
    fiskusmati napisał:
    moze nie zauwazyles ale nie ma u mnie godziny 24 ani minuty 60 jest if godzia = 24 then godzina = 0 wiec nigdy nie wyswietli mi sie 24
    taksamo mam z minutami i skeundami
    niezauwazyles, pozdro


    To sie zdecyduj czy piszesz "nie zauważyłeś" czy "niezauważyłeś" ;) i popraw literówki i pisz używając PLiterek - może się czepiam, ale pare moich postów poszło do kosza bo nie pisałem "po polsku" i zgdonie z regulaminem ... w końcu nie piszesz na czas, więc przed wysłaniem posta możesz go przeczytać i poprawić błędy

    A co do sedna sprawy - chodzi o warunki porównywania:
    If Hou >= 24 Or Hou < 0 Then

    jest mocno nieoptymalne - szybsze będzie
    If Hou > 23 Or Hou < 0 Then

    bo masz tylko sprawdzenie "czy większe" a nie "czy większe lub równe" + oczywiście "czy mniejsze"

    tak samo jak nieoptymalne jest:
    If Sek = 60 Or Sek > 60 Then

    bo równie dobrze mógłbyś zapisać
    If Sek => 60 Then

    a najlepiej i tak by było:
    If Sek > 59 Then
  • #20 6942495
    rpal
    Poziom 27  
    Kolego robin_pl masz pewność że tak jak autor napisał to jest nieoptymalnie ?
    W prawdzie to co zamieszczę poniżej dotyczy C ale kompilator Basica pewnie też dobrze napisany pod kątem optymalizacji. Zobacz sobie co zostanei wpisane w pamięć procesora w wyniku porównywania >= oraz >. Ilość intrukcji taka sama, podobnie jak czas wykonywania instrukcji liczony w cyklach. Może pod kątem stylu nie jest to ładnie ale efekt dokładnie ten sam. Nie dzielmy więc włosa na czworo. Poniżej efekt kompilacji.
    
             ;       8 if(a>=20 ||   b<=10){
    00005d 3104      	CPI  R16,20
    00005e f418      	BRSH _0x4
    00005f e0ea      	LDI  R30,LOW(10)
    000060 17e1      	CP   R30,R17
    000061 f008      	BRLO _0x3
              _0x4:
             ;       9 	c=12;
    000062 e02c      	LDI  R18,LOW(12)
             ;      10 }
             ;      11 
             ;      12     
             
             ;      13 if(a>30 ||   b<30){
              _0x3:
    000063 e1ee      	LDI  R30,LOW(30)
    000064 17e0      	CP   R30,R16
    000065 f010      	BRLO _0x7
    000066 311e      	CPI  R17,30
    000067 f408      	BRSH _0x6
              _0x7:
             ;      14 	c=22;
    000068 e126      	LDI  R18,LOW(22)
             ;      15 }
             ;      16 }
    
  • #21 6942579
    robin_pl
    Poziom 12  
    rpal napisał:
    Kolego robin_pl masz pewność że tak jak autor napisał to jest nieoptymalnie ?
    W prawdzie to co zamieszczę poniżej dotyczy C ale kompilator Basica pewnie też dobrze napisany pod kątem optymalizacji. Zobacz sobie co zostanei wpisane w pamięć procesora w wyniku porównywania >= oraz >. Ilość intrukcji taka sama, podobnie jak czas wykonywania instrukcji liczony w cyklach. Może pod kątem stylu nie jest to ładnie ale efekt dokładnie ten sam. Nie dzielmy więc włosa na czworo. Poniżej efekt kompilacji.


    Ok - a mógłbyś sprawdzić co będzie z warunku:
    IF A = 10 or A > 10 THEN

    bo efekt
    IF A > 9 THEN

    już podałeś.

    No i trzeba by sprawdzić jak się zachowuje BASCOM ...
  • #22 6942772
    rpal
    Poziom 27  
    Odsyłam do intruksji sprawdzających assemblera, w pierwszym przypadku nic innego nie będzie w drugim może ubędzie jedna instrukcja. Poza tym czy to warto się w tym temacie doktoryzować ? Zdaje się że bascom dolinkowuje sporo śmieci i to głownie pozera pamięć, tutaj w prawdzie mogę się mylić bo nigdy się nim nie zajmowałem :)
  • #23 6942834
    robin_pl
    Poziom 12  
    rpal napisał:
    Odsyłam do intruksji sprawdzających assemblera, w pierwszym przypadku nic innego nie będzie w drugim może ubędzie jedna instrukcja. Poza tym czy to warto się w tym temacie doktoryzować ? Zdaje się że bascom dolinkowuje sporo śmieci i to głownie pozera pamięć, tutaj w prawdzie mogę się mylić bo nigdy się nim nie zajmowałem :)

    ok ok ;) tylko musisz przyznać, że zapis
    IF A > 9 THEN

    jest o wiele bardziej "prawidłowy" niż
    IF A = 10 or A > 10 THEN

    świadczy o programiście ;) dodatkowo - kompilator nie musi nic optymalizować ;)
  • #24 6943317
    rpal
    Poziom 27  
    fakt to co nieco bez sensu. Pyszałek jednak może powiedzieć że nie myli się i jest w ogóle OK. Kolega się uczy więc błędy się zdażają. W sumie nie widziałem żadnego podręcznika jak zrobić błędy w programowaniu tylko o tym jak programować aby nie robić błedów. Może to byłaby jakaś metoda, takie sklasyfikowanie wszystkich możliwych byków :)
  • #25 6943350
    robin_pl
    Poziom 12  
    rpal napisał:
    Kolega się uczy więc błędy się zdażają.


    Z pierwszego posta wątkodawcy wynika coś trochę innego ;) Nie ma ochoty poprawiać tylko upchnąć ;) Chociaż szybciej by upchnął gdyby poprawił kod, zamiast pisać posta na forum ;)
  • #26 6943385
    rpal
    Poziom 27  
    Nie chcę nikogo oceniać ani się wymadrzać ale z programowaniemjest jak ze wszystkim czyli zwraca się uwagę wtedy kiedy coś się "wykrzacza", kiedy działa raczej nie analizuje się istoty działania. Zwrócił dopiero uwagę na byki kiedy zbrakło pamięci. Założę się że jeśli miałby do dyspozycji atmega128 wówczas w ogóle nie kłopotałby się jakąś tam optymalizacją. Na moje oko przydałoby się większości kolegów np. cofnięcie się o 20 lat i mała przesiadka na atari albo commodora aby zacząć szanować ilość pamięci :) Może zakónczmy te pisanine bo zaraz admin się dobierze do skóry i wywali to do kosza.
REKLAMA