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

Atmega16 i Bascom - Przerwania

BoB11111 16 Lip 2010 21:24 2145 15
REKLAMA
  • #1 8299846
    BoB11111
    Poziom 10  
    Mam pytanie czy z przycisków w porcie A można zrobić przerwania wywoływane zboczem narastającym...
    chodzi o to czy np mając podpięty przycisk do portu A.1 mogę z tego wywołać przerwanie tak żeby po wciśnięciu przycisku zaczął się wykonywać jakiś program np załączenie jakiegoś silnika na 20 sec. ale żeby w tym samym czasie można było też załączyć inny silnik za pomocą innego przycisku lub też zatrzymać ten pierwszy...
    Wie ktoś jak to zrobić prosiłbym o przykładowy program :)
  • REKLAMA
  • #2 8299941
    tadzik85
    Poziom 38  
    Port a nie ma przerwań, ale jeśli to ma być obsługo przycisku można wykorzystać przerwanie timera co np 50ms. przy 2 wykryciu stanu niskiego wykonujesz odpowiednie działanie. przy 2 bo dzięki temu od razu wyeliminujesz drgania styków.
  • #3 8300039
    BoB11111
    Poziom 10  
    chodzi o to że mam coś takiego narazie :

    $regfile = M161def.dat 'deklaracja kwarca i uP
    $crystal = 2457600

    Config Portc = Output 'deklaracje wejść i wyjść
    Config Pinc.6 = Input
    Config Porta = Input
    Config Pinb.0 = Input
    Config Pinb.1 = Input
    P_gora Alias Pinb.0
    P_dol Alias Pinb.1
    Kran1 Alias Pina.6
    Kran2 Alias Pina.5
    Ped1 Alias Pina.4
    Ped2 Alias Pina.3
    Silnik1 Alias Pinc.2
    Silnik2 Alias Pinc.1
    Sens Alias Pinc.6

    Do

    If Kran1 = 0 Then
    Reset Silnik1
    End If

    If Kran2 = 0 Then
    Reset Silnik2

    Loop

    i chodzi o to że po wciśnięciu Ped1 ma się włączyć silnik1 i ma iść przez 20 sec no chyba że na Sens pojawi się 0 lub na Kran1 pojawi się 0 to silnik ma się wyłączyć. A Ped2 ma włączyć tylko Silnik2 a Kran2 ma go wyłączyć. Silnik2 ma iść przez czas który ma być ustawiony przyciskami P_1 i P_2...

    Da się coś takiego zrobić ??
  • #4 8300152
    tadzik85
    Poziom 38  
    da można w pętli albo tak jak napisałem. Jeśli chcesz coś innego robić jeszcze z tym zrobić.

    Tworzysz flagi odpowiadające sygnałom sterującym. Przerwanie np co 50ms. Jeśli jest sygnał sterujący ustaw flagę, w kolejnym kroku jeśli flaga i odpowiedni sygnał sterujący wykonaj akcje włącz wyłącz silnik. . Inni licznik będzie odliczał czas włączenia silnika,
  • REKLAMA
  • #5 8300173
    BoB11111
    Poziom 10  
    A jak się tworzy te flagi ?? Jeśli mógłbyś napisać przykład do P_1 że po jego włączeniu włącza się silnik 1 i 2 z tym że pierwszy idzie 20 sec a drugi po czasie ustalonym przez przyciski się wyłącza to byłbym wdzięczny
  • #6 8300211
    tadzik85
    Poziom 38  
    flaga to zmienna bitowa.

    pseudokod:

    przerwanie co 50ms:
    if P1 =1
       if flaga_P1 =1 start silnik zacznij odliczanie 20sek
       else flaga_P1=1
    else flaga_P1 = 0

    kolejny sygnal...........
  • REKLAMA
  • #7 8300255
    BoB11111
    Poziom 10  
    Nie bardzo to rozumiem da się jakoś jaśniej ??
  • #8 8300284
    tadzik85
    Poziom 38  
    ustawiasz licznik tak by generował przerwanie co 50ms

    w tym przerwaniu sprawdzasz swoje sygnały (przyjmijmy ze wyzwalanie jest zerem)

    w przerwaniu sprawdzasz czy sygnał jest = 0 jeśli tak ustawiasz sobie jakaś zmienna bitową flagę (znak ze sygnał jest).
    w następnym przerwaniu (flaga ustawiona) sprawdzasz znów sygnał jeśli jest 0 np włącz silnik.

    dodatkowym atutem będzie dodanie warunku który będzie testował ten sygnał tylko jeśli silnik jest wyłączony.

    użycie flagi eliminuje drgania styków bo jak zrozumiałem będziesz używał przycisków.
  • #9 8300334
    BoB11111
    Poziom 10  
    A jak ustawić ten licznik żeby generował takie przerwania ??
  • #10 8300341
    tadzik85
    Poziom 38  
    wujek google pomoże, help do bascoma również.
  • #11 8303685
    BoB11111
    Poziom 10  
    A da się zrobić tak żeby włączyć jakiś licznik tak że po włączeniu silnika 1 ten licznik sobie policzy 20 sec i wyłączy silnik 1 a reszta programu będzie w tym czasie obsługiwana ??
  • REKLAMA
  • #12 8304039
    tadzik85
    Poziom 38  
    oczywiście po to są timery
  • #13 8304046
    ShEvU_elektro
    Poziom 25  
    No to kolega u góry właśnie coś takiego Ci proponuje :) Szukaj pod jakże kluczowym hasłem "Timer" :)
  • #14 8304978
    BoB11111
    Poziom 10  
    A tak to by to zadziałało ??


    Config Timer0 = Timer , Prescale = 64
    Config Timer1 = Timer , Prescale = 64

    Dim W As Byte

    W = 10


    Do

    If P_gora = 0 Then
    Incr W
    End If

    If P_dol = 0 Then
    Decr W
    End If


    If Ped1 = 1 Then
    Start Timer0
    Start Timer1
    Set Silnik1
    Set Silnik2
    End If


    If Ped2 = 1 Then
    Set Silnik2
    End If


    If Sens = 0 Then
    Reset Silnik1
    End If

    If Kran1 = 0 Then
    Reset Silnik1
    End If

    If Kran2 = 0 Then
    Reset Silnik2
    End If

    If Timer0 = 20 Then
    Reset Silnik1
    Reset Timer0
    End If

    If Timer1 = W Then
    Reset Silnik2
    Reset Timer1
    End If



    Loop
  • #15 8311014
    BoB11111
    Poziom 10  
    albo wie chociaż ktoś jak ustawić timer żeby odliczał np 1 sec i wtedy coś się działo i żeby to można było wtedy zmienić w jednym miejscu ten czas na 2 sec lub 5 itd... ??
  • #16 8312573
    landy13
    Poziom 31  
    BoB11111 napisał:
    A tak to by to zadziałało ??
    Nie zadziała. Przynajmniej tak, jak tego oczekujesz. Przy kwarcu 2,4576MHz i prescalerze 64 Timer0 przekręca się co ok. 6,7ms a Timer1 co ok. 1,7s.


    BoB11111 napisał:
    jak ustawić timer żeby odliczał np 1 sec i wtedy coś się działo
    1. Zdefiniować co się ma wykonać w przerwaniu
    2. Włączyć przerwania od timera
    3. Włączyć globalne zezwolenie na przerwania

    Wszystko to jest w Helpie.

    Do obliczania timerów wypróbuj ten programik.
REKLAMA