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

Jak rozdzielić przerwania Timer0 dla dwóch podprogramów w Bascom?

luuckee 22 Sie 2006 21:21 2227 6
REKLAMA
  • #1 2942369
    luuckee
    Poziom 11  
    Posty: 17
    Witam!
    W programie wykorzystuję dwa podprogramy i w każdym z nich przerwania od licznika timer0. Chciałbym gdy wykonywany jest podprogram1 przepelnienie licznika powodowalo przerwanie do przerwania1 a gdy wykonywany jest podprogram2 przepełnienie licznika powodowało przerwanie do przerwania2. Moje pytanie brzmi, czy to jest możliwe, a jeśli tak to jakich instrukcji należy użyć?
    Pozdrawiam
  • REKLAMA
  • #2 2942382
    Granat :)
    Poziom 34  
    Posty: 3043
    Pomógł: 202
    Ocena: 666
    witam
    mógłyś się wyrazić nieco jaśniej :D
    "w każdym z nich przerwanie od timer0"... licznik po przepełnieniu wygeneruje przerwanie bezwzględu na to gdzie w danej chwili jest główny program (jeśli jest odpowiednio skonfigurowany)
    opisz dokładnie co chcesz zrobić :)
    pozdrawiam

    Dodano po 1 [minuty]:

    hmmm chyba załapałem o co chodzi :D
    pomyślmy...

    Dodano po 24 [sekundy]:

    Bascom 8051 czy AVR ?

    Dodano po 9 [minuty]:

    więc tak:
    w bascom 8051 działa tylko co jest zdeklarowane na końcu programu (poprostu to co jest napisane niżej i nie ma znaczenia gdzie to jest, czy w podprogramie itd)
    a w bascom avr wyskakuje błąd i pisze, że już jest zdefiniowane gdzie ma skoczyć program jak timer0 zostanie przepełniony

    oto mój programik testowy:

    Config Timer0 = Timer , Gate = Internal , Mode = 2
    Enable Interrupts
    Enable Timer0
    On Timer0 In1
    Load Timer0 , 250
    Start Timer0
    Dim A As Byte

    Declare Sub Pod1
    Declare Sub Pod2

    Do

    Waitms 50
    Call Pod1
    Waitms 50
    Call Pod2

    Loop
    End

    Sub Pod1
    On Timer0 In2
    Print A
    End Sub

    Sub Pod2
    On Timer0 In1
    Print A
    End Sub

    In1:
    A = 32
    Return

    In2:
    A = 64
    Return

    :D
  • REKLAMA
  • #3 2942450
    luuckee
    Poziom 11  
    Posty: 17
    No więc mają to być przerwania od timer0. Kończąc podprogram1 kończę zliczanie timer0. Jeśli przejde teraz do podprogramu2 to na nowo uruchamiam timer0 ale wtedy chcę aby generował mi przerwanie do przerwania2.
    bascom 8051
  • REKLAMA
  • Pomocny post
    #4 2942463
    Granat :)
    Poziom 34  
    Posty: 3043
    Pomógł: 202
    Ocena: 666
    dobrze,
    a nie lepiej w przerwaniu napisać warunek, że jeśli zmienna bitowa równa się jeden to robi to a jeśli nie to tamto
    końćząc podprogram1 zrobisz SET tej zmiennej a kończąc podprogram2 RESET :D
  • REKLAMA
  • #5 2942484
    luuckee
    Poziom 11  
    Posty: 17
    No właśnie zauważyłem że mi skacze do tego przerwania co jest niżej zadeklarowane. Szkoda że tak nie można zrobić jak sobie wymyśliłem:) W takim razie dziękuje za wyjaśnienie.
    Pozdrawiam
  • #6 2942500
    Granat :)
    Poziom 34  
    Posty: 3043
    Pomógł: 202
    Ocena: 666
    zrób sobie tak jak Ci napisałem wyżej, skutek będzie taki jak tego oczekujesz :)
    próbowałem kiedyś zrobić kilka razy config lcdpin... było dokładnie to samo co z tym przerwaniem u Ciebie :)
  • #7 2942512
    luuckee
    Poziom 11  
    Posty: 17
    Ok zrobie jak mówisz, jeszcze raz dzięki. Pozdrawiam

Podsumowanie tematu

✨ W dyskusji poruszono problem rozdzielenia przerwań od Timer0 w Bascom 8051 dla dwóch różnych podprogramów. Timer0 generuje przerwanie po przepełnieniu niezależnie od aktualnie wykonywanego podprogramu, co uniemożliwia przypisanie osobnych procedur obsługi przerwań (ISR) dla każdego podprogramu. W Bascom 8051 przerwanie Timer0 może być zdefiniowane tylko raz na końcu programu, a próby wielokrotnego przypisania przerwań kończą się błędem lub ignorowaniem wcześniejszych definicji. Zaproponowano rozwiązanie polegające na użyciu warunku w jednej procedurze przerwania, który na podstawie stanu zmiennej bitowej rozróżnia, która część kodu jest aktywna i odpowiednio reaguje. Zmiana stanu tej zmiennej (SET/RESET) odbywa się przy zakończeniu każdego z podprogramów, co pozwala na symulowanie różnych zachowań przerwania Timer0 w zależności od kontekstu wykonania. Takie podejście jest zgodne z ograniczeniami Bascom 8051 i pozwala na efektywne zarządzanie przerwaniami Timer0 w wielowątkowym środowisku programowym.
Wygenerowane przez model językowy.
REKLAMA