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.

Bascom - sterowanie wyjściem z impulsatora

Kaz K 22 Sty 2014 22:13 1530 9
  • #1 22 Sty 2014 22:13
    Kaz K
    Poziom 20  

    Witam. Proszę Kolegów o podpowiedź jak z impulsatora sterować wyjściami : jeśli kręcę w prawo załączony np. portc.1 a w lewo portc.2. Port powinien być w stanie załączenia tylko w momencie kręcenia w danym kierunku , po zaniku ruchu wyjście ma być wyłączone. Oto część kodu wyzwalana przerwaniem:

    Code:

    Impulsator:
    If Pind.4 = 1 Then
    Incr Enkoder
    Gosub Wyc
    End If

    If Pind.4 = 0 Then
    Decr Enkoder
    Gosub Wyc1
    End If
    Return

    Wyc:
    Toggle Portc.1
    Return
        Wyc1:
    Toggle Portc.2
    Return


    wpisałem takie "cos" dla przykładu ale dioda świeci zależnie od stanu impulsatora i nie gaśnie (oczywiście "wait" odpada).

    0 9
  • #2 23 Sty 2014 16:13
    SylwekK
    Poziom 28  

    Należałoby badać w jednostce czasu (np. w ciągu 100ms - i to determinowało by najkrótszy czas załączenia portu) czy wpływają impulsy z enkodera. Bez timera się raczej nie obejdzie.

    0
  • #3 23 Sty 2014 19:23
    emarcus
    Poziom 34  

    Kaz K napisał:
    Witam. Proszę Kolegów o podpowiedź jak z impulsatora sterować wyjściami : jeśli kręcę w prawo załączony np. portc.1 a w lewo portc.2. Port powinien być w stanie załączenia tylko w momencie kręcenia w danym kierunku , po zaniku ruchu wyjście ma być wyłączone. Oto część kodu wyzwalana przerwaniem:

    .......... (oczywiście "wait" odpada).


    Skonfiguruj w programie impulsator/encoder do zliczania impulsów (incr/decr) wykorzystując interrupt reagujący na zbocze; podłączony do dowolnego kanału A lub B..
    Zamiast zliczać impulsy (konkretnie):
    - zamiast incrementować zmienną - zaświeć diodę w PORTC.1 na kilka/kilkanaście msec, i analogicznie:
    - zamiast decrementować zmienną impulsów - zaświeć diode PORTC.2 równiez na kilka milisec.
    Te kilka lub kilkanaście milisec musisz jakoś mierzyc. Jeżeli nie możesz stosować Waitms (softwarowy delay) to zastosuj w tym celu dowolny timer/.

    e marcus

    0
  • #4 25 Sty 2014 14:35
    Kaz K
    Poziom 20  

    emarcus - niestety nawet z waitami przy szybkim kręceniu enkoderem pojawiają się impulsy na na drugim porcie (nie pomagają żadne warunki, itp.). Nie mam już pomysłów jak to zrealizować.

    0
  • #5 25 Sty 2014 17:12
    emarcus
    Poziom 34  

    Kaz K napisał:
    emarcus - niestety nawet z waitami przy szybkim kręceniu enkoderem pojawiają się impulsy na na drugim porcie (nie pomagają żadne warunki, itp.). Nie mam już pomysłów jak to zrealizować.


    Czy stosujesz jakąś formę dla 'debounce' styków tego impulsatora?
    Np. RC network.....

    e marcus

    0
  • #6 25 Sty 2014 19:26
    SylwekK
    Poziom 28  

    Swego czasu ktoś gdzieś tu podał fajny programik do odczytu enkodera, który naprawdę był szybki i praktycznie nie powodował błędów. Jest tu gdzieś na elektrodzie. Nawet sam go zacząłem stosować w początkach programowania, a później już tak zostało - nie chciało mi się własnej obsługi pisać skoro ta spełniła oczekiwania ;)

    0
  • #7 25 Sty 2014 22:13
    Kaz K
    Poziom 20  

    Enkoder chodzi pięknie bez błędów , to nie w tym problem (obsługa w przerwaniu
    + kond. 100n do nożek enkod.). Problemem jest sterowanie 2 wyjść (przekaźniki lewo i prawo) z tego enkodera. Nie może następować nawet chwilowe załączenie drugiego przekaźnika w czasie kręcenia w danym kierunku.

    0
  • #8 26 Sty 2014 10:54
    SylwekK
    Poziom 28  

    To zrób warunek, że każdy przekaźnik możebyć załączony tylko wtedy kiedy drugi jest wyłączony.

    0
  • #9 26 Sty 2014 16:44
    emarcus
    Poziom 34  

    Kaz K napisał:
    Enkoder chodzi pięknie bez błędów , to nie w tym problem (obsługa w przerwaniu
    + kond. 100n do nożek enkod.). Problemem jest sterowanie 2 wyjść (przekaźniki lewo i prawo) z tego enkodera. Nie może następować nawet chwilowe załączenie drugiego przekaźnika w czasie kręcenia w danym kierunku.


    No to w takim razie problem masz w programie..........

    Jeżeli załączenie sygnalizacji (dioda, przekaźnik etc.) reprezentuje/zastępuje z założenia incrementację, to jak podczas spodziewanej tylko tej funkcji masz dekrementację? I to samo w przeciwnym kierunku...

    e marcus

    0
  • #10 29 Mar 2014 13:40
    Kaz K
    Poziom 20  

    Zaadaptowałem kod obsługi impulsatora jednego z Kolegów i teraz działa, winny takiemu działaniu jest oczywiście sam impulsator kupując za 4 zł nie liczcie że będzie działał jak dużo droższy ( już NIGDY nie kupie żadnego taniego !!!, szkoda czasu i nerw)


    code/
    Dim Temp10 As Byte
    Dim Stan_imp As Byte
    Dim Czas As Byte
    Dim Czas0 As Byte
    Dim Wynik As Integer
    'Dim In0 As Bit
    Dim In1 As Bit
    Dim In2 As Bit

    Stan_imp = 5

    Czas0 = 0
    Czas = 128


    Do
    In1 = Pind.3 ' kanał In1 impulsatora
    In2 = Pind.4 'kanał In2 impulsatora
    Select Case Stan_imp
    Case 2:
    If In1 = 1 Then
    Stan_imp = 5
    If Czas > 0 Then ' - licznik
    Czas = Czas - 1
    Gosub (wyskok do podprogramu)
    End If
    End If
    If In2 = 0 Then Stan_imp = 3
    Case 3:
    If In1 = 1 Then Stan_imp = 4
    If In2 = 1 Then Stan_imp = 2
    Case 4:
    If In1 = 0 Then Stan_imp = 3
    If In2 = 1 Then Stan_imp = 5
    Case 5:
    If In1 = 0 Then Stan_imp = 6
    If In2 = 0 Then Stan_imp = 4
    Case 6:
    If In1 = 1 Then Stan_imp = 5
    If In2 = 0 Then Stan_imp = 7
    Case 7:
    If In1 = 1 Then Stan_imp = 8
    If In2 = 1 Then Stan_imp = 6
    Case 8:
    If In2 = 1 Then
    Stan_imp = 5
    If Czas < 255 Then ' + licznik
    Czas = Czas + 1
    Gosub (wyskok do podprogramu)
    End If
    End If
    If In1 = 0 Then
    Stan_imp = 7
    End If
    End Select
    Loop

    code/

    0