Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[ATmega8][Bascom] - Timer0 w miejsce Waitms

yokoon 27 Sep 2014 15:12 912 7
  • #1
    yokoon
    Level 29  
    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.

    Code: basic4gl
    Log in, to see the code


    Czy tak można zastosować Timer0 w miejsce Waitms 750 ?
  • Helpful post
    #2
    ZbeeGin
    Level 39  
    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.
  • Helpful post
    #3
    xury
    Automation specialist
    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.
  • #4
    yokoon
    Level 29  
    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ć ?
  • Helpful post
    #5
    ZbeeGin
    Level 39  
    yokoon wrote:
    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 wrote:
    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 wrote:
    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.
  • Helpful post
    #6
    xury
    Automation specialist
    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ł".
  • Helpful post
    #7
    zumek
    Level 39  
    xury wrote:
    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
  • #8
    yokoon
    Level 29  
    Dziękuję Panowie za podpowiedzi. Zacznę się do nich stosować.