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

[ATmega8][Bascom] - Timer0 w miejsce Waitms

27 Wrz 2014 15:12 765 7
  • Poziom 28  
    Witam.
    Czytałem wiele na ten temat, ale nie rozwiło to moich wątpliwości co do zastosowania timera0 w miejsce Waitms.

    Oto część programu w którym chcę wykorzystać Timer0:
    Oczywiści to tylko przykład.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Czy tak można zastosować Timer0 w miejsce Waitms 750 ?
  • Pomocny post
    Poziom 38  
    Nie bardzo jest co komentować, bo najważniejszej procedury (ISR) nie pokazałeś.

    Jedno jest pewne: Taka konstrukcja i wywołanie procedury 800_ms zakończy się opóźnieniem programu głównego o parę mikrosekund i tyle. Zmienna Licz_8ms będzie się inkrementować tzw. "sobie a muzom".
    Co więcej, nawet jakbyś poprawnie skonstruował tą procedurę to dalej zamiana Waitms 750 na Call 800_ms nie ma większego sensu. W dalszym ciągu program będzie blokowany na prawie 1s, a nie o to w stosowaniu przerwań chodzi.
  • Pomocny post
    Poziom 39  
    Istotą projektowania programu jest taka konstrukcja by nie przerywać działania, a jedyne odpytywać wtedy kiedy potrzeba. Da się to zrobić, ja kiedyś tu gdzieś pokazywałem taką konstrukcję kodu.
    Jak kolega powyżej uważam, że zamiana siekierki na kijek nie ma sensu.
  • Poziom 28  
    Dziękuję Panowie za ustosunkowanie się do mego problemu.
    W jaki inny sposób przeczekać czas konwersji skoro jest niezbędna ?
    Ja podałem przykład z jednym DS'em a jak będzie więcej w układzie.

    Waitms'y występują także w innych programach jak je zastąpić ?
  • Pomocny post
    Poziom 38  
    yokoon napisał:
    W jaki inny sposób przeczekać czas konwersji skoro jest niezbędna ?

    Zainicjuj pomiar. Program może w tym momencie zająć się czym innym. Jak upłynie już wymagany czas to program może odczytać sobie pomiar jak będzie miał na to "chwilę wolnego".

    yokoon napisał:
    Ja podałem przykład z jednym DS'em a jak będzie więcej w układzie.

    To postąpisz w ten sam sposób. Trzeba inicjować pomiary i potem sobie je przeczytać w wolnej chwili. Oczywiście nie hurtowo, bo podczas wykonywania polecenia CONVERT T jednego czujnika nie jest zalecana inna transmisja na szynie.

    yokoon napisał:
    Waitms'y występują także w innych programach jak je zastąpić ?

    To zależy jakie Waitms'y. Szczególnie długie nie są pożądane i jeśli są wymagane to trzeba odpowiednio skonstruować program, by go nadmiernie nie wstrzymywały.
    Walka z każdym Waitms czy Waitus albo @genus() w programie to jak walka z wiatrakami. Nie zawsze jest sensowna.
  • Pomocny post
    Poziom 39  
    Nie musisz czekać. Musisz zacząć trochę inaczej myśleć niż "linijka po linijce"
    Wykonaj konwersję i wystartuj timer. Pozwól programowi biec dalej. Odczytaj temperaturę, gdy timer odliczy te 800 ms.
    Pamiętaj, że program główny to zazwyczaj pętla. Niech nawet sobie bezproduktywnie biega w koło do czasu zanim nie będzie można odczytać temperatury. Później możesz coś dodać by się robiło w tym czasie, by się procesor "nie marnował".
  • Pomocny post
    Poziom 39  
    xury napisał:
    Nie musisz czekać. Musisz zacząć trochę inaczej myśleć niż "linijka po linijce"...

    Dokładnie i nie jest to wcale takie proste :cry:
    Inaczej będzie to wyglądać dla prostego 'termometru', a zdecydowanie inaczej jeśli 'w tle' pracuje kilka przerwań, które rozwalą komunikację na 1wire na amen.

    Zerknij co kiedyś wykoncypowałem :D , żeby przerwanie obsługujące 4 wyświetlacze LED nie rozwaliło transmisji na 1wire.
    https://www.elektroda.pl/rtvforum/viewtopic.php?p=7897196#7897196
  • Poziom 28  
    Dziękuję Panowie za podpowiedzi. Zacznę się do nich stosować.