Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Co wpływa na szybkość wykonywania programu - czego unikać?

mariansq 09 Maj 2011 13:35 4185 34
  • #1 09 Maj 2011 13:35
    mariansq
    Poziom 15  

    Witam.
    Chciałbym się poradzić bardziej doświadczonych kolegów czego unikać w kodzie aby program działał szybciej.
    Nie mam tu na myśli instrukcji "waitms" - zakładamy, że tej instrukcji nie używamy w pętli głównej.
    Bardziej chodzi mi o to czy: ilość skoków do podprogramów, jeśli jest ich wiele może spowolnić program.Czy lepiej instrukcje zawierać w mniejszej ilości podprogramów jeśli to możliwe? Czy raczej to nie ma żadnego wpływu?

    Na pewno pętla fo..to z duża ilością cykli może spowolnić.

    Pewnie tez przerwanie może mieć wpływ w zależności od tego co pod nim będzie.
    Ja z reguły ograniczam się tylko do sprawdzenia przycisków i wystawienia flagi, a reszta w głównym programie.

    Ale mimo wszystko zastanawia mnie czego unikać aby przysłowiowo nie "zamulić" programu. Moze są ogólne rady.
    Dzięki wielkie.
    Pozdrawiam.

    0 29
  • #2 09 Maj 2011 13:41
    tadzik85
    Poziom 38  

    To wszystko wynika raczej z praktyki i doświadczenia. TO co powiedziałeś to najważniejsze rzeczy których należy unikać. No i to co powiedziałeś tworzenie krótkich funkcji. Szczególnie np przy obsłudze peryferiów. Niektóre warto tworzyć jako inline. Ale to naprawdę krótkie muszą być gdzie czas wywołania funkcji i powrotu z niej będzie dłuższy od jej wykonania, ale wadą tego może być większy kod wynikowy. Umiejętność wykorzystywania i pisania obsługi przerwań jest najistotniejsza. unikanie waitów i tak dalej ale to już wiesz.

    0
  • #3 09 Maj 2011 14:32
    tmf
    Moderator Mikrokontrolery Projektowanie

    Temat rzeka. Przede wszystkim jaki język i jaki kompilator? Bo wiele z tych rzeczy kompilator potrafi robić automatycznie - np. inlinowanie funkcji, optymalizacja pętli itd. Nie ma sensu go w tym wyręczać. W takiej sytuacji należy się raczej zastanowić jak przekazać kompilatorowi wszystkie informacje o danej funkcji/bloku programu - np. w C atrybuty const, pure, volatile itd. Kewstia pewnych kosztownych funkcji - np. dynamiczna alokacja pamięci (malloc/free, new/delete), inicjacji zmiennych itd. Całe książki o tym można napisać, więc sprecyzuj nieco problem, chociażby odpowiadając na moje pytanie.
    Natomiast prawda uniwersalna - każdy procesor może zamulić fatalny algorytm lub fatalna implementacja nawet najlepszego alborytmu.

    Dodano po 1 [minuty]:

    I druga prawda uniwersalna - nie optymalizuj czegoś co optymalizacji nie wymaga.

    0
  • #5 09 Maj 2011 14:44
    dondu
    Moderator Mikrokontrolery Projektowanie

    Skoro doszedłeś już do momentu kiedy masz problem jak w tytule tematu, to może jednak czas, aby nie brnąć dalej w język eskimosów tylko przesiąść się na C. Lepiej zrobić to wcześniej niż później :)

    0
  • #6 09 Maj 2011 15:20
    tmf
    Moderator Mikrokontrolery Projektowanie

    No właśnie, jaki ma sens kombinowanie z optymalizacją, która da ci dużym wysiłkiem raptem parę %, jeśli jednym ruchem można zyskać kilkadziesiąt-kilkiaset %?

    0
  • #7 10 Maj 2011 00:25
    asembler
    Poziom 32  

    Alez to bardzo dobre pytanie. Proponuje pobawic sie i napisać program (taki stoperek) sprawdzający które instrukcje zamulają bardziej a w dajszej kolejnosci sprawdzic wieksze fragmenty programu stosując rózne istrukcje ale zachowując tożsamośc działania. A to już niedaleko do pisania wydajnych programów nawet na Antarktydzie.

    0
  • #8 10 Maj 2011 00:45
    mirekk36
    Poziom 42  

    mariansq napisał:
    Ale mimo wszystko zastanawia mnie czego unikać aby przysłowiowo nie "zamulić" programu. Moze są ogólne rady.


    Zakładając, że nie korzystamy z wait czy waitms w pętli głównej to widać, że już jakieś doświadczenie masz w programowaniu, i powoli jak mówią koledzy wyżej dochodzisz - jak każdy zresztą- niestety do kresu możliwości Bascoma.

    Tzn można z niego jeszcze od tego moemntu dużo albo nawet bardzo dużo wycisnąć, przyśpieszyć i zoptymalizować ale jest tylko jedna droga - wstawki asemblerowe, które dosyć łatwo się pisze do Bascoma. Niestety na dłuższą metę jak sam się przekonasz to także ślepy i ciemny zaułek a jak dojdziesz do jego końca to znowu pukniesz się twarzą w ścianę w ciemności .... uznasz, że dalej się tak nie da. Ja swego czasu bascoma już używałem tylko jako pudełka a w środku prawie wszędzie żywy asembler - ale co ? to był znowu powrót to żmudnego testowania, długiego uruchamiania projektów no i opóźnień w realizacji zadań - tak to jest przecież z pisaniem programów nawet w czystym asemblerze, dlatego przecież sięgamy po języki wyższego rzędu.

    Bascom - to w sumie fajne narzędzie ale do czasu jak widzisz. Chcesz się o tym przekonać dobitniej ??? zrób proste porównanie:

    sprawdź ile zajmuje w asemblerze puste przerwanie w Bascomie, ew wsadzając tam jedną prostą instrukcję - gdy porównasz to z prologiem i epilogiem przerwania po kompilacji w C to gwarantuję ci że już z tego powodu zrobi ci się gorąco ze złości, że już wcześniej nie zacząłeś myśleć np o C - ja też tak miałem ;) ... ale na szczęście nigdy na C nie jest za późno.

    Druga sprawa - sam zacznij pisać jakieś proste przerwania w Bascomie ale za pomocą wstawki w asemblerze dodając parametr NOSAVE przy jego inicjalizacji. Można ten parametr podać gdy się samemu dba o prolog i epilog czyli o odłożenie używanych w nim rejestrów. Zdziwisz się - jak wiele rzeczy ci przyśpieszy i to jak znacznie ....

    niestety im dalej w las tym więcej drzew, więc gdyby tak podać tu sposoby na porównanie kolejnych rzeczy jak są robione w Bascomie a jak można zrobić w C to to jak mówiłem robi się gorąco ;) .... ale wiadomo - coś za coś - Bascom wydaje się prostszy w użyciu na początek - bo przecież aby wyświetlić coś na LCD wystarczy JEDNA instrukcja a nie zaraz tam jakieś pisanie własnej obsługi ....

    .... ale czy w dzisiejszych czasach Bascom jest prostszy do nauki niż C ???? ja śmiałbym w to wątpić ..... "dzisiaj" jest już inaczej więc polecam ...

    no chyba, że jeszcze jakiś czas zdecydujesz się faszerować Bascoma wstawkami asemblerowymi jak dobrą kaszę skwarkami - wtedy jeszcze sporo na nim pociągniesz jak pisałem wcześniej.

    Miłego wyboru - co dalej...

    0
  • #9 10 Maj 2011 01:08
    asembler
    Poziom 32  

    Od faszerowanego BAS blizej do ASM niż do C
    No ale jak już sie powiedziało B to czas powiedzieć C a nawet A
    Nie przejmuj się C też można faszerować żeby działał szybciej

    Smacznego

    0
  • #10 10 Maj 2011 01:25
    janbernat
    Poziom 38  

    Nieprawdą jest że doświadczeni programiści piszą w C.
    Niedoświadczeni też.
    Czego ja mogę być przykładem.
    Bascom mnie zaczął irytować gdy okazało się że w config nie moge wpisać działania timerów adc itp. tak jak chciałem- a wiedziałem że można.
    No to na piechotę zacząłem wpisywać do rejestrów- i działało.
    Potem- że wszystko trzeba napisać w jednym pliku- a chciałem mieć "czarne skrzynki" funkcji gdzie coś na wejściu- coś na wyjściu- i zamknąć to w jakąś funkcję.
    No i te błędy- czasem poprawiane w następnych wersjach a czasem nie- za to nowe błędy.
    Z całym szacunkiem dla Marka Albertsa i jego zasług dla przybliżenia programowania procesorów pod strzechy- ale On nad tym chyba już przestaje panować.
    No a gcc- to jest tworzone, poprawiane i testowane przez dużą grupę zażartych entuzjastów.
    I wszelkie błędy są dość szybko wyłapywane.
    Chociaż spotkałem się na elektrodzie z porównaniem szybkości i wielkości programu pisanego w gcc i w komercyjnym kompilatorze- różnica była spora- ale parę lat temu.
    No ale coś za coś- albo darmo albo drogo.
    Może ktoś znajdzie ten link porównujący kompilatory- gdzieś zgubiłem.
    No i to było parę lat temu- teraz nawet w ARM gcc stosują w jakimś IDE.

    0
  • #11 10 Maj 2011 01:33
    asembler
    Poziom 32  

    No tożeś mnie przybliżył do C. Jak ja mam sie jeszcze przejmować błedami kompilatorów co poprawia "żrejąca grupa eutanastów" to chyba zostane przy ASM tutaj nie ma prawa kompilator sie pomylić, a błedy będą tylko moje i nikomu nie oddam.

    0
  • #12 10 Maj 2011 01:54
    janbernat
    Poziom 38  

    Asembler- jesteś dogmatykiem języka wysokiego poziomu jakim jest asembler.
    Ostatecznie jeszcze występują w przyrodzie czytniki taśm perforowanych ośmiobitowych.
    No i w czymś takim wyperforuj kod.
    A C- to jest makroasembler.
    A Bascom i inne Basic-e to są języki wysokopoziomowe.
    Podobnie jak Pascal i inne.
    Ze wszystkimi zaletami i wadami takich języków.
    To co ktoś zrobił lepiej- mozna zastosować.
    To co gorzej- poprawić.
    To co sam- albo geniusz albo od wynalazku koła i ognia zaczyna.
    P.S.
    Jak nop wstawić do kwarcu?
    Za każdym taktem?
    To kwarc będzie dwa razy wolniej działał.
    Może na drugi overtone go zestroić?

    0
  • #14 10 Maj 2011 09:44
    mirekk36
    Poziom 42  

    asembler napisał:
    "żrejąca grupa eutanastów" .


    Sorki, za pytanie, ale mnie ciekawość zżera - a skoro zżera to może i ja się do tej grupy zaliczam ? Tzn generalnie chodzi mi o to co to oznacza ??? (bo żrejąca to rozumiem, że coś od właśnie żarcia) - ale "eutanaści"??? hmmmm to ktoś od eutanazji ??? ..... eeeh człowiek się uczy całe życie a nadal nie zna pewnych terminów - więc proszę o wytłumaczenie.

    0
  • #15 10 Maj 2011 10:04
    asembler
    Poziom 32  

    janbernat napisał:

    Jak nop wstawić do kwarcu?
    Za każdym taktem?
    To kwarc będzie dwa razy wolniej działał.
    Może na drugi overtone go zestroić?

    Widze że połaczyłes dwa wątki - przeciez widać na pierwszy rzut oka że w tamtym wątku dołączyłem do grona kolegów czepiających sie słowek i jaja sobie robie.

    Eutanaści - grupa osób zabijających chęć używania czegokolwiek (patz wyżej - nie w sufit):-)

    Mirek nie obraź sie ale odpowiem w stylu elektrody: Google cię żre? - tu w sensie domestosa raczej

    0
  • #16 10 Maj 2011 10:46
    mirekk36
    Poziom 42  

    Ależ nie obrażam się, jak mówię człowiek uczy się całe życie a szczególnie nowego żargonu bo eutanasta to tak jak myślałem zwolennik eutanazji a nie to co ty piszesz wg - googla ;) .... które mnie żre jak piszesz

    a co do czepiania się słówek, to po prostu nie rozumiem (zresztą jak widać nie tylko ja tej gry słów i właśnie może przez niezrozumienie - bo o ile przyjmuję nowe (twoje) znaczenie "eutanastów" to nadal nie wiem co to jest "żrejący" a szczególnie "żrejący eutanasta" - więc też się zaraz nie obrażaj, że dopytuję bo robię to bez żadnej ironii. Jak mówię - stary człowiek to się jeszcze może nowych słów nauczy od młodszych i potem będę może kiedyś mógł zaszpanować przed młodym. Byle bym wiedział co to znaczy.

    I też bez urazy, ale w ogóle nie rozumiem nawet tego całego zdania, w odpowiedzi dla kolegi janbernat

    asembler napisał:
    Jak ja mam sie jeszcze przejmować błedami kompilatorów co poprawia "żrejąca grupa eutanastów"


    Nie musisz tego tłumaczyć oczywiście jeśli irytuje cię moja dociekliwość, ale uwierz, że nie chodzi mi o żadne przytyki czy ironizowanie z twoich wypowiedzi.

    0
  • #17 10 Maj 2011 12:14
    mariansq
    Poziom 15  

    Zatem nieswiadomie:-) zaczynam siegać kresu mozliwości BASCOM'a ;-) - Myslę, że jeszcze ten jeden temat zakończe w BASCOM. Ale koledzy narobiliscie mi "ochoty" na tego C;-)

    Przyznam , ze programista ze mnie jak z koziej d....., ale coś tam potrafie naskrobać. Generalnie jestem Hardware'owcem i BASCOM rozszerzył mi troche loty. Niestety w C nigdy nic nie robiłem, nawet nie stałem obok:-)
    pisze tylko w BASCOM i Visual Basic tudzież VBA.

    Myslę , że moze jednak trzeba sie odwazyc i zacząć programować w C.

    Czy do języka C są jakieś "fajowskie" środowiska programistyczne czy skrobiemy w przysłowiowym notatniku i kompilujemy? Pytam bo naprawde o C nic nie wiem.

    I jeszcze pytanie dla słabszych- lepiej zadeklarowac tablice 8 elementowa typu single czy 8 zmiennych typu single z puktu widzenia zajetości ram w odniesieniu do uPC? Ciekawi mnie tez szybkosc działania programu jesli wykonuje działania na 8 zmiennych lub na tablicy posługujac sie indeksami.

    0
  • #18 10 Maj 2011 12:25
    tadzik85
    Poziom 38  

    Tablica jeśli możliwe jest jej wykorzystanie zawsze jest optymalniejszym rozwiązaniem a to przez sposób adresowania zmiennych. Ogólnie temu tematowi jest poświęcona własna dziedzina "algorytmy i struktury danych" nawet przedmiot na studiach taki jest.

    0
  • #19 10 Maj 2011 12:33
    McMonster
    Poziom 32  

    mariansq napisał:

    Czy do języka C są jakieś "fajowskie" środowiska programistyczne czy skrobiemy w przysłowiowym notatniku i kompilujemy? Pytam bo naprawde o C nic nie wiem.


    Dowolny IDE obsługujący C, np. CodeBlocks, a ja polecam Eclipse z wtyczką do AVR, bo współpracuje bezpośrednio z avrdude (przez GUI Eclipse, nie trzeba ręcznie klepać poleceń) i ma wygodny edytor fuesbitów plus kilka innych bajerów.

    0
  • #20 10 Maj 2011 12:53
    dondu
    Moderator Mikrokontrolery Projektowanie

    mariansq napisał:
    Czy do języka C są jakieś "fajowskie" środowiska programistyczne czy skrobiemy w przysłowiowym notatniku i kompilujemy? Pytam bo naprawde o C nic nie wiem.

    Tutaj wszystko co trzeba: http://mikrokontrolery.blogspot.com/2011/04/kompilator-i-srodowisko-programistyczne.html
    Za niedługo będzie także nowa wersja AVR Studio nr 5 - na razie w wersji Beta.

    0
  • #21 10 Maj 2011 17:57
    piotr5000
    Poziom 21  

    A ja jeszcze wrócę do Bascoma ( nie dlatego że jestem ortodoksyjnym wyznawcą , ale dlatego że na moje potrzeby wystarcza więc nie widzę potrzeby nauki innego języka)
    W Bascomie dużo miejsca i czasu zajmuje obsługa wyświetlacza 2x16 zn
    Zamiast używać CLS / kasowanie ekranu/ stosuje wpisywanie pustego stringu ośmioznakowego ( ' ')
    Najczęściej wyswietlam 4 zmienne i odświeżam tylko tą która uległa zmianie
    wcześniej nadpisując spacjami poprzednią wartość

    Należy unikać zmiennej typu single.
    Obliczenia i porównania robić na liczbach całkowitych i tylko do wyświetlenia formatować jako część całkowitą i ułamkową

    Lepiej porównywać 345 i 234 niż 3,45 i 2,34

    Zamiast mnożyć y=3*2,51 ( 7,53 )
    lepiej :
    p=3*251 ( 753 )
    y=p/100 ( wynik 7 - część całkowita )
    y=y*100 ( 700 )
    y=p-y ( 53 - część ułamkowa)

    0
  • #22 10 Maj 2011 22:24
    janbernat
    Poziom 38  

    piotr5000- te zasady można i należy stosować programująć w dowolnym języku mikroprocesory.
    One jednak są małe, arytmetyka zmiennoprzecinkowa jest za to pamięciożerna, wyświetlacze są wolne i CLS zawsze jest wolne- podobnie jak HOME.
    Dodam jeszcze że należy zapomnieć o _delay() i wait.
    Też w dowolnym języku to z reguły demoluje program.
    Zarówno w pętli głównej jak i w przerwaniu.
    A program powinien być "pseudo wielowątkowy"- co można osiągnąć zarówno w Bascomie jak i w C.
    O tym pisał mirekk36 jako o "round robin".
    Wpadłem na to i tak pisałem programy zanim o tym przeczytałem- ale teraz wiem jak się to nazywa.
    Bo w dowolnym języku można napisać program działający ale uniemożliwiający dodanie jakiejkolwiek funkcjonalności.
    W C też można pisać źle- na złą koncepcję nie uodparnia żaden język.
    Bascom podsuwa "gotowce"- ale nikt nie musi z nich korzystać- ostatecznie do rejestrów można się dostać i z Bascoma i z C- w przypadku C koniecznie a w przypadku Bascoma dobrze jest config ustawić jak się chce a nie tylko te opcje które Bascom daje.
    P.S.
    W zasadzie- witaj w C- nie dziś to za jakiś czas.

    0
  • #23 11 Maj 2011 08:51
    jarekz_2
    Poziom 15  

    piotr5000 napisał:
    (...)Obliczenia i porównania robić na liczbach całkowitych i tylko do wyświetlenia formatować jako część całkowitą i ułamkową(...)

    Trafiłeś w sedno.
    Ja powszechnie używam formatów stałoprzecinkowych, z tym że reprezentowane wielkości mnożę przez 256 lub 65536 a nie przez 100, np:
    3,45 * 256 = 883 = 0373 hex = 03,73 hex
    2,34 * 65536 = 153354 = 0002570A hex = 0002,570A hex
    Wtedy część całkowita zajmuje górny/e bajt/słowo, a ułamkowa - dolny/e. A potem dzielimy i mnożymy nie przez 100 czy inną potęgę 10 (co jest czasochłonne), lecz przez 256 albo 65536 (czyli używamy górnych połówek słów), co radykalnie ułatwia i przyspiesza obliczenia i konwersje.
    Inną metodą przyspieszenia obliczeń jest zastąpienie dzieleń przez stałe, mnożeniami przez odwrotności tych stałych. Przykład z programu mojego kolegi: y = x/1.3 (x i y całkowite) zostało zamienione na y = (x*50412)>>16, co na procesorze STM32F103 zajmuje raptem kilkadziesiąt nanosekund...
    W moich programach obliczenia liczb „przecinkowych“ są ciągiem mnożeń i przesunięć liczb całkowitych. Zysk czasowy względem obliczeń zmiennoprzecinkowych może być nawet kilkudziesięciokrotny.

    0
  • #24 11 Maj 2011 10:03
    tmf
    Moderator Mikrokontrolery Projektowanie
  • #25 11 Maj 2011 10:04
    mariansq
    Poziom 15  

    A jak to jest z przerwaniem pod BASCOM petli do...Loop?

    załóżmy, że przycisk.0 to zmienna zawierajaca info o tym czy przycisk został wciśniety czy nie, a sprawdzenie tego faktu robi nam Timer0 i teraz:

    Code:


    Do
     
    jakies innstrukcje

    if przycisk.0 =0 then
       Exit Do
    end if
    Loop


    W powyzszym kodzie miałem problem z wyjsciem z petli Do...Loop nieraz kilkakrotnie trza było klikac lu przytrzymac a w przykładzie poniżej problemów nie było

    Code:

    Do

    jakis kodzik

    Loop until przycisk.0=0



    Apropo tych działan na liczbach to ciekawe - coś tez kombinuje w tym kierunku

    0
  • #26 11 Maj 2011 10:24
    mirekk36
    Poziom 42  

    mariansq napisał:


    Code:

    Do

    jakis kodzik

    Loop until przycisk.0=0



    to jest niestety najgorsze z możliwych rozwiązań nawet pod Bascomem.

    To już prędzej poradziłbym ci skorzystanie z Bascomowej funkcji Debounce, dzięki której będziesz sobie spokojnie obsługiwał klawisze a jednocześnie pętla główna nie będzie blokowana.

    Pomyśl sobie w tym kodzie powyżej ten "jakiś kodzik" wykonuje się tylko raz i dalej to czeka na wciśnięcie przycisku. NIC innego nie może być w tym czasie realizowane (w pętli głównej oczywiście) .... a to gigantyczna strata przecież.

    Czyż nie fajnie by było, gdyby w tzw "jednym czasie" mógł się wykonywać np:

    "jakiś kodzik1"
    "jakiś kodzik2"
    "jakiś kodzik3"
    "obsługa klawiszy" (nie jednego klawisza)

    wbrew pozorom to nie jest trudne i nawet w Bascomie można to spokojnie realizować chociaż troszkę gorszymi narzędziami ale można.

    Tylko właśnie trzeba zmienić podejście o 180st ..... bo pisałeś wcześniej że nie używasz poleceń typu wait czy waitms a tymczasem takie oczekiwanie w nieskończonej pętli na wciśnięcie klawisza to milion razy gorsza rzecz.

    dlatego jeszcze raz przypomnę - jeśli już nadal Bascom - to zaprzyjaźnij się na początek przynajmniej z funkcją Debounce zamiast robić taką obsługę przycisku jak wyżej.

    0
  • #27 11 Maj 2011 10:37
    mariansq
    Poziom 15  

    Zapomniałem dopisac , że to nie jest petla główna tylko petla menu konfiguracyjnego. Petli potrzebuje coby tylko zmienic zmienna +/- i zatwierdzic zmiane i wyjscie z ustawien czyli z Do loop.

    A w takim przypadku jak opisałeś mirek36, to fakt

    A przyciski obsługuje pod Timer0 - odczytuje cały port i sprawdzam 4 bity pod którymi mam klawisze.

    Code:

    Przyciski:

    Load Timer0 , 200
    If Beck = 0 Or Menu = 0 Or Enter = 0 Or Nexxt = 0 Then

      If Bufor = Pinb Then
         Przycisk = Pinb
         ' flaga ustawiona ma wartosc zero  tak jak wcisniety przycisk tylko na stałe
         Flaga1 = Przycisk.0
         Flaga2 = Przycisk.1
         Flaga3 = Przycisk.2
         Flaga4 = Przycisk.3

                                                 ' zapisanie do zmiennej przycisk wartosci portu B
      Else
         Przycisk = Pinb And &B00001111
         Bufor = Pinb                                           ' zapisanie do bufora wartosci portu b z wcisnietym przyciskiem

      End If
    Else

      Przycisk = Pinb Or &B00001111

    End If



    Incr Licz
    If Licz = 8 Then
       Licz = 0
       Set Flaga_200ms
    End If

    Incr Licz1

    If Licz1 = 19 Then
         Flaga_500ms = 0
         Licz1 = 0
    End If

    Return

     


    Ale furtka Exit Do z pierwszego przypadku nazwijmy to sobie "pod petlą" Do loop nie bardzo smigała. I jeszcze raz zaznaczam ze na mysli nie nie miałem petli głównej tylko pod petlę konfigracyjną- w czasie ustawień nie "spieszy mi sie" :-)
    Zastanawiałem sie tylko czemu furtka exit do nie smigała za każdym razem skoro zmienna przycisk.0 zmieniana jest przerwaniem, natomiast drugi wariant jak po maśle:-)



    ================================
    12 maja 2011
    ================================

    No i utknołem:-)

    tak energicznie unikam waitms'ów, że w przypadku obsługi 1WIRE pojawiły sie na problemy. Z tego co poczytałem na naszym forum przysparza to wielu kłopotów-przynajmniej tym którzy pierwszy raz idą ta drogą:-)

    Wiem, że najlepiej wystawic flage odliczajaca czas i wyłaczyc przerwania na czas obsługi 1 WIRE, ale mimo wszytko coś mi nie smiga. Wyswietla mi 85 st zamiast 24 - wystarczy, ze dam nieszczesnego wait'a i wynik ok wiec cosik z odliczeniem czasu w przerwaniu moze nie tak. ponizej robocza procedurka na odczyt temp i podprogram przerwania.





    procedura odczytu temp:
    Code:

    Sub Obliczenia_temp()


    Disable Timer0

    1wreset
    1wwrite &HCC
    1wwrite &H44

    If Flaga_0 = 0 Then


       1wreset
       1wwrite &HCC
       1wwrite &HBE

       Temperatura(1) = 1wread(2)
       1wreset
      Flaga_0 = 27' opóznienie ok 1 s
    End If

       If Temperatura(2) > 0 Then
          Temperatura(1) = 256 - Temperatura(1)
       End If
       Temperatura(1) = Temperatura(1) / 2



    Enable Timer0
    End Sub



    podprogram przerwania od timer0:
    Code:

    Przyciski:

    Load Timer0 , 200
    If Beck = 0 Or Menu = 0 Or Enter = 0 Or Nexxt = 0 Then

      If Bufor = Pinb Then
         Przycisk = Pinb
         ' flaga ustawiona ma wartosc zero  tak jak wcisniety przycisk tylko na stałe
         Flaga1 = Przycisk.0
         Flaga2 = Przycisk.1
         Flaga3 = Przycisk.2
         Flaga4 = Przycisk.3

                                                 ' zapisanie do zmiennej przycisk wartosci portu B
      Else
         Przycisk = Pinb And &B00001111
         Bufor = Pinb                                           ' zapisanie do bufora wartosci portu b z wcisnietym przyciskiem

      End If
    Else

      Przycisk = Pinb Or &B00001111

    End If



    Incr Licz
    If Licz = 8 Then
        Flaga_200ms =0
        licz=0
    End If

    Incr Licz1

    If Licz1 = 19 Then
         Flaga_500ms = 0
         Licz1 = 0
    End If

    if flaga_0>0 then
    decr flaga_0
    end if
    Return


    0
  • #28 13 Maj 2011 22:04
    mariansq
    Poziom 15  

    Tak kombinuje z tym aby program mógł działać szybciej, ze wyłożyłem sie na obsłudze ds'a w przerwaniu.
    Pozwoliłem sobie odpowiedzieć na własnego posta w celu odswiezenia tematu.

    Ponizej mój kod na obsługe ds'a w przerwaniu od Timer0. Troche sie dzis naczytałem na naszym forum o tym ale chyba cos knoce:-(

    Przykładowa procedura testowa

    Code:

    Sub Obliczenia_temp()


    Disable Interrupts

    policz_flagi = policz_flagi + flaga_ds  ' odlicza ilosc flag po 26ms
    flaga_ds = 0

    1wreset
    1wwrite &HCC
    1wwrite &H44 ' start pomiaru i rozpoczecie konwersji pomiaru

    Enable Interrupts

    If policz_flagi = 39 Then ' ok 1 sek czyli 26ms * 39 = 1014ms

    Disable Interrupts

       1wreset
       1wwrite &HCC
       1wwrite &HBE

       Temperatura(1) = 1wread(2)
       '1wreset

       flaga_ds=0
       policz_flagi = 0

    Enable Interrupts

       If Temperatura(2) > 0 Then
          Temperatura(1) = 256 - Temperatura(1)
       End If
          Temperatura(1) = Temperatura(1) / 2
    End If

    End Sub
    ====================================================

    Przerwanie: '  co 26ms od timer0 i takie co 26ms ma zostać

    flaga_ds = 1

    return



    Co prawda jeden z kolegów mi radził aby to w j. C zrobić i pewnie miał racje. Ale to temat na potem. W tym momencie potrzebuje dokonczyc program w BASCOM.
    I zwracam sie z prośbą do wszystkich Bascomowców o pomoc w rozwikłaniu problemu.


    W tym momencie wynik z ds'a to 85 stopni - gdy wywale wszystko co zwiazane z przerwaniem i włoże waita tego co go nikt nie lubi to odczyt temp prawidłowy.
    Cos nie moge ogarnac tych przerwan przy obsłudze ds'a:-(
    Pozdrawiam

    0
  • #29 15 Maj 2011 07:49
    Wojtek75
    Poziom 23  

    Robisz prosty błąd ustawiasz tylko jedną flagę przez co tak naprawdę nie dajesz czujnikowi odpowiedniej ilości czasu na konwersje. Do tego potrzebne ci są dwie flagi.

    Pseudo kod:

    Code:
    Jezeli flaga1 = 1 to
    
    flaga1 = 0
    CLI
    1wreset
    1wwrite &HCC
    1wwrite &H44 ' start pomiaru i rozpoczęcie konwersji pomiaru
    SEI

    Jezeli flaga2 = 1 to
    flaga2 = 0
    CLI
       1wreset
       1wwrite &HCC
       1wwrite &HBE

       Temperatura(1) = 1wread(2)
    SEI


    Ustawianie flag w przerwaniu np. tak:

    Code:
    Przerwanie: 'umownie przerwanie co około 26ms
    
     incr jakas_zmienna
     select case jakas_zmienna
     case 1:
     SET Flaga1
     case 39:
     SET flaga2
     jakas_zmienna = 0
    return

    0
  • #30 15 Maj 2011 09:00
    asembler
    Poziom 32  

    A nie lepiej start konwersji przeniesc na koniec odczytu i wystarczy jedna flaga ustawiana co ok. T konwersji. Oczywiście negatywem takiego rozwiazania jest to że pierwszy oddczyt bedzie 85 ale temu tez mozna zaradzic dając dodatkowy start konwersji na poczatku programu i wykonywany tylko raz zaraz po resecie.
    Mam nadzieję że samą obsługę odczytu flagi umieścisz w programie głównym a nie w przerwaniu.

    0