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

Prosty program do napisania brama wjazdowa...Bascom

Cooki13 16 Mar 2008 18:39 9995 72
  • #1 16 Mar 2008 18:39
    Cooki13
    Poziom 21  

    Witam nie jestem programistą jednak musze zrobić układ do bramy wjazdowej.Idea jest prosta.Mam moduł radiowy(odbiorczy firmy Benica) który ma niestety jeden przekaźnik naciśnięcie przycisku na pilocie powoduje jego załączenie.I chciałem go wykorzystać do bramy która posiada dwie krańcówki.
    Pinb.0 = krańcówka
    Pind.7 = krańcówka
    Pind.6 = przekaźnik z modułu radiowego
    Pinb.5 =przekaźnik do silnika
    Pinc.0 = przekaźnik do silnika
    Płytke już wytrawiłem dla mikrokontrolera Atmega8 działająca na wewnętrznym kwarcu.Silnik jest prądu stałego.w zależności od stanu pinu do przekaźników silnik kręci sie w lewo lub w prawo
    Program wygląda następująco
    Po zwarciu chwilowym styków przekaźnika z modułu radiowego mikrokontroler załacza jeden z przekaźników i utrzymuje ten stan dopóki nie zostanie załączona jedna z krańcówek lub przekaźnik z modułu radiowego sie jeszcze raz nie załączy (w tym wypadku nie ma znaczenia która krańcówka zadziała).Ponowne załączenie przekaźnika z modułu radiowego jeżeli brama stoi powoduje zadziałanie drugiego przekaźnika w celu zmiany kierunku obrotu silnika i tak jak poprzednio dopóki nie załączy sie któraś z krańcówek lub nie zostanie załączony przekaźnik z modułu radiowego
    Czy ktoś mógłby mi napisać taki prosty program?Jest to zapewne dla was 5 min a mnie troche zaoszczędzi nerwów...

    0 29
  • Relpol
  • #2 16 Mar 2008 21:43
    szun
    Poziom 19  

    A co będzie jak oblodzenie będzie i brama się zablokuje

    0
  • #3 16 Mar 2008 21:48
    darrrrek
    Poziom 22  

    program to nie problem chetnie bym pomogl ale brak czasu (studia), przydalo by sie jeszcze zrobic zabezpieczenie jezeli jakas osoba (dziecko) pojawilo sie na linii zamykającej bramy. Takie zabezpieczenie wydaje mi sie jest istotne.

    0
  • Relpol
  • #4 16 Mar 2008 21:49
    Cooki13
    Poziom 21  

    Źle sie wyraziłem układ jest przeznaczony do bramy garażowej i będzie w pomieszczeniu ogrzewanym wiec żadnego oblodzenia nie będzie
    Na szybko napisałem taki program czy jest on napisany poprawnie?

    Code:

    $regfile = "m8def.dat"
    Config Pinb.0 = Input
    Config Pind.7 = Input
    Config Pind.6 = Input
    Config Pinb.5 = Output
    Config Pinc.0 = Output
    Dim Pulses As Word , Periods As Word

    Pulses = 10000 : Periods = 10

    Dim Pulses1 As Word , Periods1 As Word

    Pulses1 = 5000 : Periods1 = 10

    Przekaznik1 Alias Portb.5
    Przekaznik2 Alias Portc.0
    Krancowka1 Alias Portb.0
    Krancowka2 Alias Portd.7
    Radio Alias Portd.6
    Speaker Alias Portd.1
    Do

    Debounce Radio , 0 , Ruch1
    Debounce Radio , 0 , Ruch2

    Loop

    End

    Ruch1:
    Przekaznik1 = 1
    If Krancowka1 = 0 Then
    Przekaznik1 = 0
    Sound Speaker , Pulses , Periods
    Wait 1
    Sound Speaker , Pulses1 , Periods1
    Wait 1
    Else
    Przekaznik1 = 1
    End If
    If Krancowka2 = 0 Then
    Przekaznik1 = 0
    Sound Speaker , Pulses , Periods
    Wait 1
    Sound Speaker , Pulses1 , Periods1
    Wait 1
    Else
    Przekaznik1 = 1
    End If

    Ruch2:
    Przekaznik2 = 1
    If Krancowka1 = 0 Then
    Przekaznik2 = 0
    Sound Speaker , Pulses , Periods
    Wait 1
    Sound Speaker , Pulses1 , Periods1
    Wait 1
    Else
    Przekaznik2 = 1
    End If
    If Krancowka2 = 0 Then
    Przekaznik2 = 0
    Sound Speaker , Pulses , Periods
    Wait 1
     Sound Speaker , Pulses1 , Periods1
    Wait 1
    Else
    Przekaznik2 = 1
    End If

    Sygnał brzęczyka będe dobierał doświadczalnie

    0
  • Pomocny post
    #5 16 Mar 2008 22:00
    slawko_k
    Poziom 33  

    Cytat:
    Krancowka1 Alias Portb.0
    Krancowka2 Alias Portd.7
    Radio Alias Portd.6

    powinno być raczej ..... ALIAS PINB. ....

    Cytat:
    Debounce Radio , 0 , Ruch1
    Debounce Radio , 0 , Ruch2


    to już w ogóle nie ma sensu

    0
  • #6 16 Mar 2008 22:10
    Cooki13
    Poziom 21  

    napisałem pierwszy program mając do dyspozycji tylko Helpa i tam przy Alias było polecenie PORT i na tym sie wzorowałem
    A jak poprawić program aby w czasie ruchu można by zatrzymać brame i następnie zmienić kierunek obrotów?Tak aby nie trzeba było czekać aż brama dotknie krańcówki

    0
  • #7 16 Mar 2008 23:16
    slawko_k
    Poziom 33  

    np:

    do
    debounce radio,0,ruch
    loop

    ruch:
    kierunek = not kierunek

    if kierunek =1 then
    instrukcje w prawo
    else
    instrukcje w lewo
    endif

    nie wiem jakie masz to radio ale może można pokombinowac jeszcze coś z krótkim długim naciśnięciem przycisku w pilocie

    co do aliasa to nie ma on nic wspólnego z portem
    po prostu wpisując daną do portu ładujesz ją do rejestru portx a chcąc ją odczytać sprawdzasz rejestr pinx

    0
  • #8 16 Mar 2008 23:29
    Cooki13
    Poziom 21  

    Niestety moduł jest jednokanałowy i musze zrealizować ruch w lewo lub w prawo mając do dyspozycji jeden kanał

    0
  • #9 17 Mar 2008 07:21
    slawko_k
    Poziom 33  

    no to to ci wyżej napisałem.

    mówię tylko że może jeśli moduł to umożliwia uzależnić jeszcze działanie od krótkiego/długiego naciśnięcia.

    0
  • #10 17 Mar 2008 10:58
    darrrrek
    Poziom 22  

    mozna tez sprawdzac czy w ciągu sekundy wystapily dwa nacisniecia pilota czy jedno i odpowiednio wykonac zdarzenie

    0
  • #11 17 Mar 2008 22:25
    Cooki13
    Poziom 21  

    Witam ponownie wystarczy mi opcja że za każdym kliknięciem silnik będzie ruszał sie raz w prawo raz w drugą strone.
    troche zmodyfikowałem program i wygląda tak

    Code:
    $regfile = "m8def.dat"
    
    Config Pinb.0 = Input
    Config Pind.7 = Input
    Config Pind.6 = Input
    Config Pinb.5 = Output
    Config Pinc.0 = Output
    Declare Sub Beep
     Beep:
     Sound Portd.1 , 3800 , 10
       Wait 1
      Sound Portd.1 , 5000 , 10
      Wait 1
     End


    Przekaznik1 Alias Portb.5
    Przekaznik2 Alias Portc.0
    Krancowka1 Alias Pinb.0
    Krancowka2 Alias Pind.7
    Radio Alias Pind.6
    Do

    Debounce Radio , 0 , Ruch1
    Debounce Radio , 0 , Ruch2

    Loop

    End

    Ruch1:
       Przekaznik1 = 1
          If Krancowka1 = 0 Then
             Przekaznik1 = 0
                Call Beep
                   Else
                      Przekaznik1 = 1
                         End If
    If Krancowka2 = 0 Then
       Przekaznik1 = 0
          Call Beep
             Else
                Przekaznik1 = 1
                   End If
    If Radio = 0 Then
       Przekaznik1 = 0
          Call Beep
             Else
                Przekaznik1 = 1
                   End If

    Ruch2:
       Przekaznik2 = 1
          If Krancowka1 = 0 Then
             Przekaznik2 = 0
                   Call Beep
                      Else
                         Przekaznik2 = 1
                            End If
    If Krancowka2 = 0 Then
       Przekaznik2 = 0
          Call Beep
                Else
                   Przekaznik2 = 1
                      End If
    If Radio = 0 Then
             Przekaznik2 = 0
                   Call Beep
                         Else
                            Przekaznik2 = 1
                               End If

    Bascoma ucze sie od wczoraj i tylko po to aby zrobić ten sterownik.Układ zaprogramowałem poprzez ponyprog ustawiając rezonator na wew 8mhz wg takiej tabelki
    CKSEL3 - ptaszek
    CKSEL2 - bez ptaszka
    CKSEL1 - ptaszek
    CKSEL0 - ptaszek
    Niestety układ nie działa:/
    Napięcie zasilające do mikrokontrolera jest i na inne układy problem tkwi w programie będe wdzięczy za pomoc[/quote]

    0
  • #12 18 Mar 2008 07:18
    slawko_k
    Poziom 33  

    Cytat:
    Do

    Debounce Radio , 0 , Ruch1
    Debounce Radio , 0 , Ruch2

    Loop


    to nie ma sensu.

    0
  • #13 18 Mar 2008 07:27
    Cooki13
    Poziom 21  

    w takim razie na co to zmienić?

    0
  • #14 18 Mar 2008 08:52
    slawko_k
    Poziom 33  

    nie wiem na co zmienić bo nie wiem co chcesz zrobić ale po co robić sprawdzanie tej samej nóżki za pomocą 2 instrukcji debounce.

    skąd wiesz w którą wejdzie program jak naciśniesz guzik w pilocie skoro obie są sprawdzane jedna pod drugą w pętli.

    twój program na logikę jest taki:

    jak zobaczysz kupę na ulicy to ją omiń
    jak zobaczysz kupę na ulicy to ją przeskocz

    i skąd masz wiedzieć w końcu co masz robić??

    tak samo i procek. wykona którąś instrukcję bo musi ale którą to nie wiadomo (tą która w chwili pojawienia się sygnału z pilota będzie aktualnie sprawdzana czyli losowo) ale raczej pierwsza

    0
  • #15 18 Mar 2008 11:16
    Cooki13
    Poziom 21  

    Cytat:
    nie wiem na co zmienić bo nie wiem co chcesz zrobić ale po co robić sprawdzanie tej samej nóżki za pomocą 2 instrukcji debounce.


    Program ma zaragować na wcisnięcie przycisku.Następnie zmienić stan na wysoki dla jednego przekaźnika nr1 po następnym wciśnięciu jeżeli jeszcze brama nie złapała krańcówki ma sie zatrzmać czyli stan niski dla przekaźnika nr1 po 3 przycisku zmienić stan na porcie dla przekaźnika nr2 na wysoki i analogicznie jak poprzednio

    0
  • Pomocny post
    #16 18 Mar 2008 12:04
    slawko_k
    Poziom 33  

    no to napisałem ci to w ok. połowie tego wątku

    0
  • #17 21 Mar 2008 17:35
    Cooki13
    Poziom 21  

    A czy ktoś mógłby mi pomóc napisać ten program?Naprawde nie wiem jak sie za to zabrać(tzn za tą pętle)

    Code:
    $regfile = "m8def.dat"                                      ' specify the used micro
    

    $crystal = 8000000                                          ' used crystal frequency

    Config Pind.6 = Input
    Config Pind.7 = Input
    Config Pinb.0 = Input
    Config Pinc.0 = Output
    Config Pinb.5 = Output

    Radio Alias Pind.6
    Krancowka1 Alias Pind.7
    Krancowka2 Alias Pinb.0

    Set Portd.6
    Set Portd.7
    Set Portb.0

    Reset Pinc.0
    Reset Pinb.5
    Do
    Debounce Radio , 0 , Ruch , Sub

    I co dalej dopisać?

    0
  • #18 21 Mar 2008 19:15
    Anonymous
    Użytkownik usunął konto  
  • #19 21 Mar 2008 20:55
    Cooki13
    Poziom 21  

    Witam nie nie musi być to napisane w Bascomie może być język dowolny.A dlaczego Atmega8? Bo taki miałem w szufladzie:) i dla niego zaprojektowałem i wykonałem płytke.Wiem że jest to przerost formy nad treścią jednak brałem to co miałem pod ręką.Układ korzysta z kwarcu wew Atmegi.Dzięki serdeczne za zainteresowanie sie tematem.Na Pinie PD.1 jest jeszcze zamontowany przetwornik Piezzo

    0
  • #20 22 Mar 2008 17:30
    Cooki13
    Poziom 21  

    Powoli staram sie pisać program krok po kroczku i jednak dzieje sie coś nieprzewidzianego a mianowicie czy jest coś złego w pracy tego programu?

    Code:
    $regfile = "m8def.dat"                                      ' specify the used micro
    

    $crystal = 8000000                                          ' used crystal frequency

    Config Pind.6 = Input
    Config Pind.7 = Input
    Config Pinb.0 = Input
    Config Pinc.0 = Output
    Config Pinb.5 = Output

    Radio Alias Pind.6
    Krancowka1 Alias Pind.7
    Krancowka2 Alias Pinb.0

    Set Portd.6
    Set Portd.7
    Set Portb.0


    Reset Pinc.0
    Reset Pinb.5
    Do
    Debounce Radio , 0 , Ruch , Sub
    Loop

    Ruch:
    While Pind.7 <> 0 Or Pinb.0 <> 0
    Portc.0 = 1
      Wend

    a dokładnie o podprogram


    Ruch:
    While Pind.7 <> 0 Or Pinb.0 <> 0
    Portc.0 = 1
    Wend

    czyli dopóki krańcówki(PD7 lub PB0) nie są zwarte niech przekaźnik (PC0 będzie w stanie aktywnym
    .I program nie działa na płytce

    0
  • Pomocny post
    #21 22 Mar 2008 19:57
    gromleon
    Poziom 32  

    A może szybciej i wygodniej bedzie całe sterowanie zrobic na przekaźnikach?Jestem pewnien ze sie da to zrobić. Widziałem u mnie w firmie
    dzwi od komory chłodniczej sterowane własnie w ten sposób a sterowane tylko jednym przyciskiem wraz z krańcówkami. A przycisk można zastapić omawianym w pierwszym poście przekaźnikiem z odbiornika.

    0
  • #22 22 Mar 2008 22:35
    Cooki13
    Poziom 21  

    Kolega Gromelon przesłał taki program.Czy ktoś mógłby wyłapać błędy?

    Code:
    $regfile = "m8def.dat"
    
    Config Pinb.0 = Input
    Config Pind.7 = Input
    Config Pind.6 = Input
    Config Pinb.5 = Output
    Config Pinc.0 = Output

    Dim A As Bit
    Dim B As Bit
    A = 0
    B = 0
    Declare Sub Lewo
    Declare Sub Prawo
    Declare Sub Zatrzymaj
    Przekaznik1 Alias Portb.5
    Przekaznik2 Alias Portc.0
    Krancowka1 Alias Pinb.0
    Krancowka2 Alias Pind.7
    Radio Alias Pind.6
    Do

    If Radio = 0 Then If Krancowka1 = 0 Then If A = 0 Then Call Lewo


    If Radio = 0 Then If Krancowka2 = 0 Then If B = 0 Then Call Prawo

    If Radio = 0 Then If Krancowka1 = 1 Then If Krancowka2 = 1 Then Call Lewo


    Loop

    End

    Sub Lewo
    A = 1
    Set Przekaznik1
    If Radio = 0 Then If A = 1 Then Call Zatrzymaj
    If Krancowka2 = 0 Then Call Zatrzymaj


    End Sub

    Sub Prawo
    B = 1
    Set Przekaznik2
    If Radio = 0 Then If B = 1 Then Call Zatrzymaj
    If Krancowka1 = 0 Then Call Zatrzymaj

    End Sub

    Sub Zatrzymaj
    Reset Przekaznik1
    Reset Przekaznik2
    A = 0
    B = 0
    Return
    End Sub

    Prosty program do napisania brama wjazdowa...Bascom

    0
  • #23 22 Mar 2008 22:42
    Balu
    Poziom 38  

    Code:
    Sub Prawo
    
    B = 1
    Set Przekaznik2
    If Radio = 0 Then If B = 1 Then Call Zatrzymaj
    If Krancowka1 = 0 Then Call Zatrzymaj

    Tutaj jest imo niepotrzebny warunek z B=1 zwłaszcza, że kawałeczek wcześniej jest ustawiany - imo będzie zawsze prawdziwe.

    Poza tym krańcówki nie na przerwaniach to dramat:>

    Dodano po 1 [minuty]:

    I Nie mam w chwili obecnej bascoma pod ręką, ale jest niekonsekwencja jeszcze, w Zatrzymaj masz na końcu return i end sub, w pozostałych procedurach nie masz returna.

    Dodano po 2 [minuty]:

    Pozatym chyba stos rozsypujesz:>:
    Cytat:

    Subroutines must be ended with a related RETURN statement.

    Interrupt subroutines must also be terminated with the Return statement.

    0
  • Pomocny post
    #24 23 Mar 2008 08:45
    gromleon
    Poziom 32  

    Returna nie ma w pozostałych podprogramach celowo tak aby wyjscie do petli głownej zawsze odbywało sie przez podprogram "zatrzymaj", Rzeczywiscie krańcówki nie są na przerwaniach, no ale lepszy taki kod niż zaden, każdy tylko wytyka a nikt jeszcze nie napisał programu chocby najprostszego jak mój (dopiero sie ucze bascoma). Warunek "b" jak i "a" rzeczywiśie nie jest potrzebny.

    0
  • #25 23 Mar 2008 10:12
    Balu
    Poziom 38  

    Ja swojego czasu spłodziłem coś takiego *byłem współpłodzącym* na bramę i garaż z siecią:> Ale nie w bascomie;)

    No jeśli nie masz tam returna celowo to rozrównoważasz stos;)
    Już Ci powiem czemu:)

    Masz główny program
    robisz call lewo ->1adres na stos
    w lewo robisz call zatrzymaj->2 adres na stos
    w zatrzymaj ret'asz JEDEN raz do lewo -> ściągnięty adres ze stosu
    i jesteś teraz powiedzmy w lewo lub w prawo
    I teraz jesli jestes w prawo, to potem zapewne wykona sie zatrzymaj drugi raz i zdejmie retem drugi adres ze stosu...
    i wroci do petli glownej:)
    A jak jesteś w lewo to najpierw wykona w prawo a potem dopiero zatrzymaj, czyli reasumując jednak nie zepsujesz stosu ale śmierdzi tak napisany program bardzo...

    0
  • Pomocny post
    #26 23 Mar 2008 11:50
    gromleon
    Poziom 32  

    oczywiście są błędy w tym kodzie nie bedę przeczył i tu zaczyna się rola kolegów bardziej doświadczonych w programowaniu aby go poprawić kolega Cooki13 specjalnie go opublikował aby wspolnymi siłami go zoptymalizować i doprowadzić do satnu uzywalności a ze nikt się nie garnął do napisania kodu to wyrwałem się pierwszy.

    0
  • #27 23 Mar 2008 12:11
    Balu
    Poziom 38  

    Tzn, czego oczekujesz?
    Podstawy algorytmiki tutaj są potrzebne jedynie:>

    0
  • #29 23 Mar 2008 13:07
    Balu
    Poziom 38  

    Może niech ktoś ładnie napisze co ma się robić kiedy co się zrobi i przypuszczam, że wtedy prędzej ktoś to napisze:>

    0