Prośba o pomoc w uruchomieniu programu


Witam jestem nowy na forum więc proszę o wyrozumiałość
Zacząłem pisać program na Atmegę8 na podstawie różnych informacji z internetu wszystko wg mnie jest ok aż do momentu gdzie utknąłem i nie potrafię ruszyć z miejsca szukam po internecie i nic nie mogę znaleźć możliwe że nie właściwie szukam ale pomysłu nie mam jak to ruszyć
Problem polega na tym że nie potrafię wymodzi w kodzie żeby program
ustawił 1 na Portd.6 poczekać 3 sekundy i ustawić 1 na Portb.0 chcę to zrobić na Timer0 i jeśli chodzi o konfigurację timera to chyba zrobiłem dobrze ale nie potrafię zrobić aby program ustawił 1 po tym czasie komenda "Wait xx" odpada bo powoduje zwolnienie programu
załączam kod prosiłbym bardzo o pomoc

$regfile = "m8def.dat"
$crystal = 8000000
Declare Sub Przycisk
Declare Sub Otworz
Declare Sub Zamknij
Dim J As Byte
 
On Timer0 Przerwanie_co_2_ms
Dim Licznik As Integer
Config Pind.6 = Output
Config Pind.5 = Output
Config Pind.7 = Output
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.3 = Input
Config Pinb.5 = Input
Config Pinc.0 = Input
Reset Portd.6
Reset Portd.5
Set Portb.3
Set Portb.5
Set Portc.0
Licznik = 0
Enable Timer0
Enable Interrupts
Config Timer0 = Timer , Prescale = 64
Timer0 = 6
 
J = 0
Do
Debounce Pinb.3 , 0 , Przycisk , Sub
 
 
 Select Case J
 
 Case 0
 
 Reset Portd.6
 Reset Portd.5
 Reset Portb.0
 Reset Portd.7
 
 Case 1
 Gosub Otworz
 
 Case 2
 Reset Portd.6
 Reset Portd.5
 Reset Portb.0
 Reset Portd.7
 
 
 Case 3
 Gosub Zamknij
 
 End Select
 
 
 
 Loop
 
 Sub Przycisk:
 
Incr J
      If J = 4 Then J = 0
End Sub
 
Sub Otworz
Set Portd.6
If Pinb.5 = 0 Then Reset Portd.6
 Reset Portd.5
 Reset Portd.7
'po tym ma się po czasie 3 sekund
'załączyć Portb.0
 
 If Pinc.0 = 0 Then Reset Portb.0
 
 If Pinb.5 = 0 And Pinc.0 = 0 Then J = J + 1
 End Sub
 
Sub Zamknij
  Set Portd.7
 Reset Portd.6
 Reset Portb.0
'po tym ma się po czasie 3 sekund
'załączyć Portd.5
 
 End Sub
 
 Przerwanie_co_2_ms:
 Counter0 = Counter0 + 6
 Incr Licznik
 If Licznik = 1500 Then
 Toggle   Portb.0
   End If
   Licznik = 0
    Return
 
 End




Portret użytkownika matrix

Re: Prośba o pomoc w uruchomieniu programu

Dajesz config timera tak:

Config Timer0 = Timer , Prescale = 8
Timer0 = 156 'to powinno dać przerwanie co 0,0001s
             'jeśli nie to load timer0, 156

Dorzucasz zmienna single i liczysz ją w przerwaniu do 10 000 co da Ci 1 sekundę, odpowiednio 2 sekundy liczysz do 20 000 i 3 sekundy do 30 000. Następnie zerujesz zmienną.
Więcej tłumaczyć chyba nie trzeba ?

Portret użytkownika EDC

Na przykład dodaj sobie w

Na przykład dodaj sobie w zmiennych trzy Flagi np Dim Fl_1 as Bit itd.. , dwie ustawiane przez te Sub Zamknij/Otwórz i trzecią ustawiana przez licznk, czyli po napełnieniu Twojej zmiennej Licznik - Set np. Fl_1
Teraz po wejściu do Sub: Otwórz ,najpierw zerujesz flagę Fl_1,potem Twoje set/reset port i na wyjściu ustaw Flagę Fl_2.
Teraz w pętli głownej po End Select daj tak - If Fl_2=1 and Fl_1 =1 then Set Portb.0 co nie nastąpi dopóki nie ustawi się flaga Fl_1 którą skasowałeś, program czeka na jej ustawienie przez licznik.
W wejściu do innego podprogramu możesz już zresetować flagę fl_2
Analogicznie w Sub zamknij zeruj F1 i ustaw F3..a w pętli głównej Jeśli F3=1 and f1=1 to...
Ps. chyba masz zerowanie zmiennej licznik za IF`em co znaczy że zawsze jest zerowana a nie tylko jak Licznik=1500. nigdy nie wykona się Toggle bo ciągle masz zerowana zmienną Licznik i nigdy nie bedzie miał 1500

Edytowane:

Dim F1 as Bit, F2 as Bit, F3 as Bit
 
...
 
Do
Select Case J
...
End Select
 
If F1=1 and F2=1 Then Set Portd.0
If F1=1 and F3=1 Then Set Portb.5
Loop
End
 
Zamknij:
Reset F1  ' kasujesz licznik 3 sec
Reset F3  ' wyłaczasz warunek z pętli głównej 
Set   F2  ' tu ustawiasz to co sprawdza pętla główna
 
...
Return
 
Otworz:
Reset F1 'znow kasujesz 3 sec
Reset F2 'kasujesz poprzednio ustawiona
Set   F3
 
...
 
Przerwanie:
Incr Licznik
  If Licznik = 1500 then
  Set F1  ' po minięciu określonego czasu ustaw flagę F1
  Licznik =0   ' licznik liczy nieprzerwanie ale flaga ustawiona
  end if
Return

Dobrze wylicz sobie timer możesz z gotowych kalkulatorów np wbudowany w mkAVCalkulator

Flagi możesz resetować w Case 0 i 2

-

BARTek
Moja strona

Portret użytkownika kisoft

pomoc

zmień sposób pisania programów np na taki,

$regfile = "m8def.dat"
$crystal = 8000000
 
Dim Flaga_2ms As Bit , Flaga_500ms As Bit , Flaga_1s As Bit 'te zmienne musisz zadeklarować w programie
Dim Stan_sw As Byte , Sw As Byte , Licznik_sw As Byte       'te zmienne musisz zadeklarować w programie
Dim Y As Byte , Dim Z As Byte
 
Config Timer0 = Timer , Prescale = 64                       'ustawiania konf. timera 0
 Enable Interrupts :                                        'globalne odblokowanie przerwań
 Enable Timer0                                              'odblokowanie timera0
  On Timer0 Sek                                             ' deklaracja obsługi przerwańia (etykieta sek)
 
Do
 If Flaga_2ms = 1 Then
     Flaga_2ms = 0
     Gosub Przyciski
 
   If Flaga_500ms = 1 Then
      Flaga_500ms = 0
       Gosub Program_1
        Gosub Program_2
If Flaga_1s = 1 Then
      Flaga_1s = 0
       End If
      End If
      End if
Loop
END  
 Sek:                                                      'proceduea obsługi przerwania
 Timer0 = 6                                                 'przy takim podziale prescale=64 i wartości początkowej
                                                             ' 6 timera0 przerwanie wystąpi dokładnie co 2ms
  Flaga_2ms = 1
  Incr Y
   If Y = 250 Then
     Y = 0
      Set Flaga_500ms                                       'tutaj masz przerwanie co 500ms
       Incr Z
        If Z = 2 Then
         Z = 0
         Set Flaga_1s                                       'tutaj przerwanie co 1 sek
 
'*******************************************************************************
'opis podprogramu przyciski znajduje się w na tej stronie w dziale kody źródłowe
'********   Obsługa Klawiatury Wieloprzyciskowej *******************************
 
Przyciski:
Sw = Pind And &B11110000                                    'maskowanie nieużywanych pinów
 
If Sw <> &B11110000 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
        Case &B01110000:
           'tutaj to co będzie po kliknięciu S1
        Case &B10110000:
           'tutaj to co będzie po kliknięciu S2
        Case &B11010000:
           'tutaj to co będzie po kliknięciu S3
        Case &B11100000:
           'tutaj to co będzie po kliknięciu S4
        Case &B00110000:
           'tutaj to co będzie po kliknięciu S1 i S2 razem
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 80
  End If
Return

W odpowiednij instrukcji case dopisz procedury z wykorzystaniem zmiennej Flaga_1s np
if flaga_1s = 0 then
incr H
Portd.6=1
end if
if H = 3 Then
Portb.0 = 1
H = 0
end if
Ustaw stany spoczynkowe portów na 1 lub 0 lepiej na 1 ale wtedy stan aktywny to 0 i napisz jeszcze przy jakiej procedurze program ma zmieniać stany tych portów

Portret użytkownika grzesio.px

Witam przepraszam że

Witam przepraszam że odpowiadam z opóźnieniem ale chwilowo mam inne zajęcie (nowe dziecka w drodze :-)) więc odp na pytanie kolegi kisoft-a
Algorytm ma wygadać w ten sposób
Po naciśnięciu Pinb.3 ma się wykonać odpowiednia procedura jedna z 4 określona w SELECT CASE (po kolejnym naciśnięciu przycisku kolejny wybór i tak dalej w kółko) i to mi działa ale ni cholery nie potrafię sprawić żeby w PODPROGRAMIE OTWÓRZ (tak samo w ZAMKNIJ tyle że inne porty ustawiane)
po Set Portd.6 ma się po czasie 3 sekund ustawić Portb.0 oczywiście nie wiem jak użyć do tego Timer0 kolega EDC podpowiedział jak ale coś chyba robię nie tak bo kurde nie chce działać a funkcja Wait spowalnia program dlatego Timer0

Portret użytkownika gosc

pomoc cd.

Witam kisoft z tej strony
przerwanie zrób tak jak podałem ci wyżej

Config Timer0 = Timer , Prescale = 64                       'ustawiania konf. timera 0
 Enable Interrupts :                                        'globalne odblokowanie przerwań
 Enable Timer0                                              'odblokowanie timera0
  On Timer0 Sek                  
 do 
loop
end
 Sek:                                                      'proceduea obsługi przerwania
 Timer0 = 6 
Flaga_2ms = 1
  Incr Y
   If Y = 250 Then
 
 
     Y = 0
      Set Flaga_500ms                                       'tutaj masz przerwanie co 500ms
       Incr Z
        If Z = 2 Then
         Z = 0
         Set Flaga_1s                                       'tutaj przerwanie co 1 sek

po co w case 1 robisz gosub otwórz niech procedura w podprogramie otwórz wykona się od razu w case 1
i np tak

case 1:
Set Portd.6
If Pinb.5 = 0 Then Reset Portd.6
 Reset Portd.5
 Reset Portd.7
 if flaga_1s = 1 then
    flaga_1s =0
    incr h
 if h>3 then
    h=0
  set Portb.0
  end if
  end if

to samo dla case 3 i podprogramu

Portret użytkownika gosc

Witam po przerwie udało mi

Witam po przerwie udało mi się wygospodarować chwile więc się wziąłem za mój "projekt" po podpowiedziach "kisoft'a" skleciłam coś takiego

$regfile = "m8def.dat"
$crystal = 8000000
Declare Sub Przycisk
Dim J As Byte
Dim H As Byte , F2 As Bit , F3 As Bit
On Timer0 Sek
Dim Y As Byte
Dim Z As Byte
Dim Flaga_2ms As Byte
Dim Flaga_500ms As Byte
Dim Flaga_1s As Byte
Dim Licznik As Integer
Config Pind.6 = Output
Config Pind.5 = Output
Config Pind.7 = Output
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.3 = Input
Config Pinb.5 = Input
Config Pinc.0 = Input
Reset Portd.6
Reset Portd.5
Set Portb.3
Set Portb.5
Set Portc.0
Licznik = 0
Enable Timer0
Enable Interrupts
Config Timer0 = Timer , Prescale = 64
Timer0 = 6
 
J = 0
Do
Debounce Pinb.3 , 0 , Przycisk , Sub
 
 Select Case J
 
 Case 0
 
 Reset Portd.6
 Reset Portd.5
 Reset Portb.0
 Reset Portd.7
 
 Case 1
 
Set Portd.6
If Pinb.5 = 0 Then Reset Portd.6
 Reset Portd.5
 Reset Portd.7
 
 If Pinc.0 = 0 Then Reset Portb.0
 
 If Pinb.5 = 0 And Pinc.0 = 0 Then J = J + 1
 
  If Flaga_1s = 1 Then
    Flaga_1s = 0
    Incr H
 If H > 3 Then
    H = 0
  Set Portb.0
  End If
  End If
 
 
 
 Case 2
 Reset Portd.6
 Reset Portd.5
 Reset Portb.0
 Reset Portd.7
 
 
 Case 3
 
   Set Portd.7
 Reset Portd.6
 Reset Portb.0
 
 End Select
 
 Loop
 
 Sub Przycisk:
 
Incr J
      If J = 4 Then J = 0
End Sub
 
Sek:                                                        'proceduea obsługi przerwania
 Timer0 = 6
Flaga_2ms = 1
  Incr Y
   If Y = 250 Then Y = 0
      Set Flaga_500ms                                       'tutaj masz przerwanie co 500ms
       Incr Z
        If Z = 2 Then
         Z = 0
         Set Flaga_1s                                       'tutaj przerwanie co 1 sek
 
      End If
 
 Return
 End

I kurcze dalej robię coś nie tak gdyż dalej Portb.0 nie załącza się po czasie tylko praktycznie wraz z Portd.6 z minimalnym opóźnieniem Panowie poratujcie i proszę powiedzieć co robię nie tak bo zaczynam tracić cierpliwość a ja z reguły jestem bardzo cierpliwy z góry dziękuję za ewentualne zainteresowanie

Portret użytkownika EDC

Różnica w zapisie

Błąd, kolego jest chyba w zapisie warunku w obsłudze przerwania
Też tak miałem jak się uczyłem. Jest różnica.
Jeśli warunek jest spełniony i ma zostać wykonana tylko jedna "sprawa" to możesz to zapisac w jednej linii.
Np.

If Y = 250 Then Y = 0

I niestety nic wiecej już procesor za tym Ifem nie obchodzi. Te Twoje Set Flaga 500ms jest już poza ifem i jest ustawiane co przerwanie. Prawidłowo, jeśli po IF ma być więcej komend zostawiasz samo THEN i w następnych linijkach komendy.
If Y = 250 Then
 Y = 0
Set Flaga_500ms
Incr Z
itd...

Po prostu jeśli tylko jedna komenda za if to można w jednej linii i to kiedyś "doszło" do Bascoma
Jeśli w jednej linii za Then postawisz coś to tak jakbyś napisał End If

W Twoim przypadku po prostu spróbuj przenieść Y = 0 linię niżej i to tak na pierwszy rzut oka. Pozdrawiam.. Jak cos dopatrzę to dodam.

-

BARTek
Moja strona

Portret użytkownika gosc

Wielkie dzięki EDC za pomoc

Witam dzięki EDC za pomoc, po poprawkach, które Ty zasugerowałeś mój program zaczął wreszcie prawie działać jak trzeba Prawie bo niestety zaczęły się kolejne jaja tzn coś jakby zakłócało pracę instrukcji "Debounce" gdyż układ zachowuje się od czasu do czasu jakby przechodziły drgania styków ale co ciekawe nie za każdym razem i co lepsze dochodzi do tego jeszcze to że program przeskakuje w instrukcji select case o np 1 blok albo załącza oba porty jednocześnie zamiast wg programu poczekać ten czas co jest ustawiony wygląda że ta obsługa przerwań coś mu miesza gdyż jak jej nie było to program "przeskakiwał" wg założenia załączam program może ktoś mi odpowie co jest nie tak

$sim
$regfile = "m8def.dat"
$crystal = 8000000
Declare Sub Przycisk
Dim J As Byte
Dim H As Byte
On Timer0 Sek
Dim Y As Byte
Dim Z As Byte
Dim Flaga_2ms As Byte
Dim Flaga_500ms As Byte
Dim Flaga_1s As Byte
 
Config Pind.6 = Output
Config Pind.5 = Output
Config Pind.7 = Output
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.3 = Input
Config Pinb.5 = Input
Config Pinc.0 = Input
Reset Portd.6
Reset Portd.5
Set Portb.3
Set Portb.5
Set Portc.0
 
Enable Timer0
Enable Interrupts
Config Timer0 = Timer , Prescale = 64
Timer0 = 6
 
J = 0
Do
Debounce Pinb.3 , 0 , Przycisk , Sub
 
 Select Case J
 
 Case 0
 
 Reset Portd.6
 Reset Portd.5
 Reset Portb.0
 Reset Portd.7
 
 Case 1
 
Set Portd.6
If Pinb.5 = 0 Then Reset Portd.6
 Reset Portd.5
 Reset Portd.7
 
 If Pinc.0 = 0 Then Reset Portb.0
 
 If Pinb.5 = 0 And Pinc.0 = 0 Then J = J + 1
 
  If Flaga_1s = 1 Then
    Flaga_1s = 0
    Incr H
 If H > 4 Then
    H = 0
  Set Portb.0
  End If
  End If
 
 
 
 Case 2
 Reset Portd.6
 Reset Portd.5
 Reset Portb.0
 Reset Portd.7
 
 
 Case 3
 
   Set Portd.7
 Reset Portd.6
 Reset Portb.0
 If Flaga_1s = 1 Then
    Flaga_1s = 0
    Incr H
 If H > 4 Then
    H = 0
    Set Portd.5
    End If
    End If
 
 End Select
 
 Loop
 
 Sub Przycisk:
 
Incr J
      If J = 4 Then J = 0
End Sub
 
Sek:                                                        'proceduea obsługi przerwania
 Timer0 = 6
Flaga_2ms = 1
  Incr Y
   If Y = 250 Then
    Y = 0
      Set Flaga_500ms                                       'tutaj masz przerwanie co 500ms
       Incr Z
        If Z = 2 Then
         Z = 0
         Set Flaga_1s                                       'tutaj przerwanie co 1 sek
 
      End If
       End If
 Return
 End

Portret użytkownika EDC

Uwag mam kilka :)

Szkoda że nie wiemy co "to" ma robić bo może program napisało by się jeszcze inaczej. Prosząc o pomoc staraj się w komentarzach do tego przeznaczonych w listingu programu opisać co i po co.
Przypuszczam że mało komu chce się rozkminiac co to robi i wtedy mniejsza szansa że ktoś Ci pomoże mimo że wie. Nawet aliasy do portów już by coś wniosły.
Teraz Twój program..
W liniach

If H > 4 Then
   H = 0
   itd..
starasz się utrzymać wartość zmiennej H po zakończeniu odliczania 3 sekund jako 0 by przy wejściu w innym Case znów zaczeło liczyć od zera ALE! nie robisz tego świadomie wychodząc z Case poprzez dodanie 1 do J
If Pinb.5 = 0 And Pinc.0 = 0 Then J = J + 1

Jeśli coś ci tam wykonało sie szybciej (jakaś krańcówka czy coś) to opuszczajac pętle powinieneś wyzerowac sekundy licznika z którego korzystać bedzie inna Case bo wartośc może być juz np 2 i wtedy po jednej już sekundzie port Ci się załącza (lub od razu). Powinno to więc wygladac tak
If Pinb.5 = 0 And Pinc.0 = 0 Then
 J = J + 1
 H = 0
End If

I warunek ten postawić trzeba za Incrase żeby jeszcze 1 Ci nie dobiło :D do licznika...

Następna sprawa to :
To samo tyczy się przejścia do innej Case wymuszonego przyciskiem.. Jeśli wejdziesz do Case1 i naciśniesz przycisk zanim licznik H się przepełni to i tak juz coś w nim jest. Czyli znów przepełnienie go nastąpi szybciej niż chciane 3 sec. Trzeba więc dopisac w procedurze Przycisk H = 0

 Sub Przycisk:
H = 0
Incr J
If J = 4 Then J = 0
End Sub
Teraz kazde naciśnięce przycisku zeruje czas..

Sprawa trzecia:
Nie wiem czy masz jeszcze klapki na oczach i nie widzisz możliwości a jedynie przepisujesz i sklecasz różne kody.. Każdy tak zaczynał ale zawsze warto sie rozglądac jak można zoptymalizowac kod nawet przez kogoś napisany.
Zmienna Z to bajt więc może spokojnie zmieścić wartość do 255. Nie trzeba więc odliczać w każdej Case zmiennej H bo może ją pomieścić zmienna Z po prostu razy 3. Jako że Flagi 500ms nie używasz to możesz z niej zrezygnowac w deklaracjach i obsłudze przerwania, a flage 1s przemianować na Flaga_3s
Przerwanie będzie wyglądac tak

Sek:                                                        'proceduea obsługi przerwania
 Timer0 = 6
Flaga_2ms = 1
  Incr Y
   If Y = 250 Then
    Y = 0
      Incr Z
        If Z = 6 Then
         Z = 0
         Set Flaga_3s                                       'tutaj przerwanie co 3 sek
 
      End If
       End If
 Return

Analogicznie zmienić musisz wtedy ze IF Flaga_3s = 1 Then ustawianie Portd.5 albo Portb.0 i teraz kasować w podprogramie Przycisk, zamiast zmiennej H, flagę Flaga_3s by przy każdej zmianie Case liczyło od zera.

Powinno się też zachować kolejnośc , najpierw skonfigurowac Timer a dopiero potem go włączyć i zezwolic na obsługe przerwań.

To pewnie nie wszystko co można tu zmienić. Opis specjalnie dłuższy i nie z końcowym od razu wynikiem by pokazać że procesor robi dokładnie to co mu kazesz ale tez nic więcej ani mniej. Myśleć za niego musisz Ty. Kazdy program tak naprawde najpierw pracuje w głowie (ile my mamy RAMu :D )więc jeśli coś nie działa to zobacz o czym Ty zapomniałeś..Jeśli przedtem działało Ci to na instrukcji Debounce to może te liczniki tam sprawe rozwiążą. Jesli nie to jest jeszcze ConfigDebounce bo to instrukcja czasowa. Lepiej byłoby zastosowac sprawdzone rozwiązanie opisane tu na stronie. Staraj się nie powtarzac instrukcji i upychac je w jedną. Dla przykładu : zmienna H można było tez każdorazowo zerowac w Case0 i Case2 , a zerowana jest już w Przycisk...

Pozdrawiam, jak coś jeszcze mi się rzuci w oczy to doedytuje.

-

BARTek
Moja strona

Portret użytkownika grzesio.px

Witam dzięki za uwagi co do

Witam dzięki za uwagi co do tego co to ma być to jak się uda :-) to będzie sterownik do bramy uchylnej dwuskrzydłowej
i porty Portd.6 Portd.5 Portb.0 Portd.7 załączają przekaźniki które odpowiednio włączają silniki i zamieniają obroty silników brakuje jeszcze obsługi krańcówek tzn jedna jest a resztę dopiszę jak się uporam z tym czasem załączania portów, wiem że układów tego typu jest wiele ale coś zrobione samodzielne jest bezcenne i do tego się można czegoś nauczyć zdaję sobie sprawę że sposób pisania przeze mnie programu jest chaotyczny ale nie do końca jeszcze wiem jak to ma wyglądać i dla tego zlepiam to co mi ktoś podpowie to co udało mi się samodzielnie wykombinować jest trochę za mało żeby działo wg mojego pomysłu Pozdrawiam

Portret użytkownika gosc

pomoc

Witam
kisoft z tej strony
na samym początku podałem Ci sposób na twoje problemy . Zamierzasz zbudować centralkę sterującą bramą, przeanalizuj dokładnie sposób obsługi przycisków z tamtego postu krańcówki to też przyciski ew. bariera podczerwieni też przycisk i wreszcie sygnał otwierania i zamykania bramy z pilota to też przycisk ( i jeszcze dodatkowy przycisk otwir. i zamk. w domu). Jak widzisz same przyciski. Mirley opisał to bardzo dokładnie i skorzystaj z tego sposobu bo jest idealny dla Ciebie
Jezeli chodzi o to co zrobiłeś do teraz to wywal to wszystko z pętli głównej i zrób skok do etykiety przyciski ( w pętli głównej tak jak w pierwszym poście.

Portret użytkownika EDC

Sterownik bramy dwuskrzydłowej

Witam. Z braku czasu odpisuję dopiero teraz. Przemyśleń jest jednak więcej.
Tak jak kolega juz napisal - nie ma pomysłu jak to ma działać. To jednak podstawa do budowy takiego urządzenia.
1 Po pierwsze trzeba wiedzieć jakie będą silniki. Jesli stałoprądowe na niskie napięcia (popularne z wycieraczek) to prądy na stykach przekaźników będą duże i podnosi to "awaryjność" i poradziłbym zastosowac zamiast nich tranzystory MOSFET (popularne BUZ10 lub IRF za wzmacniaczy caraudio).
2 Skrzydła bramy to nie dyskoteka i albo się zamykaja albo otwieraja obydwa (lub jedno w funkcji Furtka) więc przekaźnik zmiany kierunku może być jeden i przełaczany zanim tranzystory włączą prąd przez co nie iskrzą styki (pzekaźnik podwójny w stanie zwolnionym już łączy w jednym kierunku a tylko włączony zamienia przewody) Tak to jest rozwiązane w pralkach automatycznych (lewo-prawo najpierw klapnięcie przekaźnika a potem włącza prąd tyrystor). Odpada tez od razu możliwość włączenia dwóch kierunków naraz wiadomo że kończące sie zwarciem.
3 Jeśli uparcie zostanie kolega przy przekaźnikach to nalezy przewidzieć możliwość zawieszenia się kontrolera i wystawienie np. stanów wysokich na wszystko. Przekaźniki w automatyce przemysłowej mają do tego styki pomocnicze które np rozłaczaja zasilanie cewki drugiego przekaźnika uniemożliwiając właczenie go naprzemiennie ten drugi może rozewrzeć kolegę obok.
4Może to i na wyrost ale krańcówki w każdym poważniejszym sprzęcie są zdublowane i do tego niezależne. Znaczyto na jednym przykładzie : Krańcówka zamknięcia bramy to sygnał dla mikrokontrolera by wyłączyć prąd zamykania ale gdyby coś poszło nie tak to druga krańcówka też na zamykaniu przerwie obwód przekaźnika już niejako czysto elektrycznie. Tak na wszelki wypadek ale coś może lodem obrosnać, coś nie łczyć, coś zostać zgniecone..
5 W programie powinno sie też przewidzieć czas na otworzenie się i zamkniecie bramy tak że po 20 zec "akcja zamykanie" jest juz nieaktualna. To pomoże ochronić silniki przed przegrzaniem gdy np, snieg stanie na drodze w jakiejś szczelinie i krańcówka nie da sygnału że brama jest juz na miejscu.
6 Przydałoby się oprogramować też zabezpieczenie pradowe. Jeśli coś ztanie na drodze Twojej bramy (samochód którego jeszcze nie widzi laser/bariera podczerwieni, albo co gorsze dziecko w wózku, czyjaś kończyna) To mierząc spadek napięcia na zasilaniu silników wewnetrznym ADC możesz odkryć spadek napiecia poniżej akceptowalnego.

7 Powyższe zabezpieczenia są wbudowane w układy sterujące szybami w samochodach. Wpisz w google automotive motor driver ic i masz wbudowane lewo/prawo, badanie przeciążenia. Dedykowany układ do sterowania silnikiem będzie chyba lepszym rozwiązaniem. Procesorowi zostaw tylko czas i obsługę logiki zamknij/stój/otwórz. Do tego pilot. Te do bram sa drogie bo maja większy zasięg niż te z alarmów. Wyjściem jest zakup na giełdzie samochodowej pilota z Webasto (zasięg kilometr :D )

Jak widac takie sterowniki to nieprosta na drugi rzut oka sprawa. Procesor w poczatkowej fazie przed resetem ma stany na portach nieustalone więc teoretycznie może włączyć prad w obydwu kierunkach.
Bardzo chętnie pomoge przy tym rozwiązaniu. Sam siadam dziś do sterowania silnikiem z wycieraczek z malucha. Mam układ dedykowany ale jeszcze pomyślę bo mi potrzebne jego precyzyjne pozycjonowanie.

PS. Piszac układ miałem na myśli scalony driver. Ja mam taki BTS 781GP z szyb Volvo.

-

BARTek
Moja strona

Portret użytkownika grzesio.px

Witam w odpowiedzi na post

Witam w odpowiedzi na post kolegi EDC o to że nie wiem jak ma działać sterownik do bramy to tak się składa że doskonale wiem jak działają takie sterowania gdyż kilka lat temu byłem monterem takich sterowań jak również domofonów i innego tego typu spraw ale to nie ważne.
Wg mojego założenia to ma być tak
- Start - ma się jako pierwszy załączyć przekaźnik włączający duże trafo (po co ma doić na prądzie jałowym skoro może działać na czas otwierania/ zamykania) po dajmy na to 1,5 sek ma się załączyć np umownie otwieranie pierwszego skrzydła (opóźnienie wymyśliłem po to że jeśli włączyło by się jednocześnie i przekaźnik od trafa i od silnika mogłoby to tworzyć dodatkowe zakłócenia chociaż co do tego to do końca nie jestem pewien) po czasie np 3 sek (dobrane doświadczalnie) otwiera się drugie skrzydło wynika to z tego że jedno skrzydło ma opór ale to rzecz oczywista. Otwieranie / zamykanie bramy ma się zakończyć po dojechaniu do krańcówek. Marzeniem jest ale to nieosiągalne żeby działało to bez krańcówek tylko tak jak jest zrobione w oryginalnych sterowaniach NICE że bramę uczy się po prostu czasu po jakim czasie ma otworzyć / zamknąć (na przemiennie) dane skrzydło i otwieranie i zamykanie jest bez krańcówek tylko brama ma czas żeby dojechać dojeżdża i się zatrzymuje ale to mówię wyższa szkoła jazdy. Dobrze by było żeby po zadziałaniu fotokomórki (w sumie to tylko wystarczy żeby działała za zamykaniu) brama zatrzymała się na np 2 sek (żeby silnik nie cierpiał gdyby momentalnie dostał drugich obrotów) i po czasie tych 2 sek ma się otworzyć do końca.

1. Silniki fajnie by było żeby były na 230v ale niestety takie są drogie :-(. Więc wersja nisko napięciowa musi wystarczyć.
2. Nie uparłem się na te przekaźniki tylko wynika to z tego że w założeniu było żeby sterownie było jak najmniejszym kosztem a przekaźniki mam w domu w sumie to nie pomyślałem o tym pomyśle z tranzystorami trafna uwaga.
3. Wiem o tym że styczniki mają styk pomocniczy żeby można było na nim zrobić blokadę (ja to nazywam "głupoto odporność")
4. Zdaję sobie z tego sprawę że "może pójść coś nie tak mikroprocesorowi" i niestety boli mnie to ale kurde nie bardzo jest jak wykonać żeby i jedno i drugie (chce wykorzystać gotowe siłowniki z allegro w sumie nie jestem z nich do końca zadowolony gdyż są to po prostu siłowniki które dawniej były wykorzystywane do obracania anten satelitarnych zapewne mała wytrzymałość i te siłowniki maja tylko jedna parę krańcówek) działo razem
5. Fakt zapomniałem o tym czasie (może nie tyle zapomniałem o ile nie bardzo mam wiedze jak to zrobić )
6. Co do zabezpieczenia nad prądowego to gdzieś w głowie jest taka sprawa ale jeszcze do tego nie doszedłem.
Fajnie to jest rozwiązane (moim zdaniem) w kicie AVT 5341 nie wiem czy kolega widział opis (mam w domu kod źródłowy). Wersja niskonapięciowa a do 230 to odpowiednie termiki automaty + kod w procesorze załatwia sprawę
7. Co do zdalnego sterowania to są na allegro fajne Radiolinie 2 kanałowe ładne piloty za 59 zł z wysyłka działa wyśmienicie gdyż montowałem kilka i znajomi są zadowoleni z zasięgu i ceny zresztą też.
Pomysł kolegi z tym driverem do szyb fajny ale koszty rosną (układ kosztuje 30 pln) a moje założenie było żeby się zmieścić do 100 ze zdalnym sterowaniem i by się udało ale przerosło mnie niestety oprogramowanie tego wszystkiego w całość coś tam mam niby działa ale oczywiście nie do końca tak jak powinno

Portret użytkownika EDC

Re. Brama

No i gitara :D Będzie dobrze. Coś się na to napisze. Ja własnie czekam na części i powinny być jutro. Też chcę sterować serwem poważnym i zmieniłem koncepcję z drivera na 4x tranzystor MOSFET z wykrywaniem przeciążenia przez mikroprocesor. Z tym drugim trafo dałeś mi do myślenia.. Najlepiej oprogramuję najpierw mój :D , ale nic nie stoi na przeszkodzie żebyś coś próbował pisać.

-

BARTek
Moja strona

Portret użytkownika grzesio.px

Witam jeśli chodzi o te

Witam jeśli chodzi o te tranzystory to mam rozumieć że chodzi o mostek H tyle że zrobiony na mosfetach?
Pomysł ok tylko że ja już polutowałem płytkę na gotowo właśnie z przekaźnikami ale to jak to bywa w prototypie zrobi się drugą wersje tylko robota idzie jak krew z nosa pod górę bo coś mi sie podziało z programatorem na usb nie chce działać AVR dude i muszę mocować się z programatorem na lpt który mam w komputerze stacjonarnym a nie jest to zbyt wygodne ale trudno jakoś trzeba dawać radę Pozdrawiam Grzesiek

Portret użytkownika EDC

Re. brama

Witam. Pech chciał żebym wszystkich części nie dostał :D
W lispolu brakowało kilku potrzebnych mi rzeczy z dłuższej listy i zamówiłem wszystko w sklep.avt... Zamówiłem w niedzielę,a paczka przyszła wczoraj i ..brakuje własnie tych tranzystorów mimo że widnieją na paragonie :D Na reklamację zareagowali tym, że wysłali mi je dzisiaj priorytetem :D
Ale dosyc o mnie Hihi :D Mam trochę czasu więc napisz: czy krańcówki mają styk zwierny czy jaki
Jeśli masz płytkę to opisz które wyprowadzenie do czego. Jedni rozwiązują krzyżówki albo sudoku a ja lubie w wolnych chwilach takie łamigłówki :D
I jeśli mógłbyś napisać na czym polega uczenie tej bramy czasu otwarcia (uczysz ją Ty w jakimś trybie nauki czy sama taka sprytna z czujnikiem przeciążenia) Napisz też przyblizony czas otwarcia się tych skrzydeł.

Edytowano
I co z wyuczonym czasem jak podczas zamykania/otwierania zanik napięcia? Po wznowieniu zasilania kontynuuje coś?

-

BARTek
Moja strona

Portret użytkownika EDC

Brama dwuskrzydłowa - program :)

To po części pasujący pod Twoje hardware program. Skorzystałem z Aliasów żebyś mógł dowolnie zmienić konfiguracje pinów tylko pamiętaj o poprawnym ustawieniu w Config Port i potem w Port.X = na początku programu.
Program powinien działać następujaco:
Przy otwieraniu włącza przekaźnik główny i po sekundzie włącza otwieranie pierwszego skrzydła. Po trzech sekundach włącza drugie skrzydło. Kończy kazdym skrzydłem osobno dojeżdżając do krańcówek. Jeśli obydwa skrzydła otwarte wyłącza przekaźnik główny.
Przy zamykaniu analogicznie z tą różnicą że jeśli w tym trybie zadziała bariera foto to automatycznie przechodzi do otwierania. Zeruje zmienne czasu więc dopiero po sekundzie zacznie się otwierać skrzydło i po trzech drugie.
Na czas prazy silników miga kogut :D taki bajer :P

Program można rozbudowywać o naukę czasu bram i takie tam :D

$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = &B10010111 : Portb = &B01101000
Config Portc = &B11111100 : Portc = &B00000011
Config Portd = &B11111110 : Portd = &B00000001
 
Ip Alias Pinb.3                                             'przycisk lub pilot
Glowny Alias Portd.6                                        'przek. glowny
L_otw Alias Portb.1                                         'przek. lewego skrzydla otwier
P_otw Alias Portd.7                                         'przek.prawego skrzydla otwier
P_zam Alias Portd.5                                         'przek.prawego skrzydla zam
L_zam Alias Portb.2                                         'przek. lewego skrzydla zam
L_kr_ot Alias Pinc.0                                        'lewa krancowka otw
P_kr_ot Alias Pinb.5                                        'prawa krancowka otw
L_kr_za Alias Pinc.1                                        'lewa krancowka zam
P_kr_za Alias Pinb.6                                        'prawa krancowka zam
Bariera Alias Pind.0                                        'wejscie bariery fot.
Kogut Alias Portd.2                                         'wyjscie migania na czas pracy
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Zegar
 
Dim Dzielnik(3) As Byte , Flaga_4ms As Bit , Flaga_500ms As Bit , Flaga_1s As Bit , Flaga_15s As Bit
Dim Ip As Bit , Licznik_sw As Byte
Dim Tryb As Byte , Czas_l As Byte , Czas_r As Byte
Dim Mig As Bit
 
Tryb = 0
Enable Interrupts
 
Do
 
If Flaga_4ms = 1 Then                                       'co 4ms
   Flaga_4ms = 0
   Gosub Przycisk                                           'skanowanie przyciskow
End If
 
If Flaga_1s = 1 Then                                        'co sekunde
   Flaga_1s = 0
   Gosub Sterowanie
End If
If Flaga_500ms = 1 Then
   Flaga_500ms = 0
   Mig = Not Mig
 If Glowny = 1 And Mig = 1 Then
 Set Kogut
 Else
 Reset Kogut
 End If
End If
 
If Flaga_15s = 1 Then
Tryb = 0                                                    'globalny stop po czasie 15sec
Reset Czas_l
Reset Czas_r
End If
 
Loop
 
Sterowanie:
 
Select Case Tryb
''''''''''''''''''''''''''''''''
Case 0 :                                                    'all stop
 Reset Glowny
 Reset L_zam
 Reset P_zam
 Reset L_otw
 Reset P_otw
''''''''''''''''''''''''''''''''
Case 1 :                                                    'otwieranie
  Set Glowny
  Incr Czas_l
  Incr Czas_r
   If L_kr_ot = 1 Then                                      'jesli nie zwarta jeszcze krancowka
    If Czas_l > 2 Then Set L_otw                            'i minelo 2 sec
   End If
   If P_kr_ot = 1 Then
    If Czas_r > 5 Then Set P_otw
   End If
 
   If P_kr_ot = 0 Then Reset P_otw                          'jesli dojechalo skrzydlo to wyłacz
   If L_kr_ot = 0 Then Reset L_otw                          'jesli dojechało drugie
 
   If P_kr_ot = 0 And L_kr_ot = 0 Then                      'jesli obydwa skrzydla otwarte
   Tryb = 2
   Reset Czas_l
   Reset Czas_r
   End If
 
Case 2 :                                                    'all stop
 
 Reset Glowny
 Reset L_zam
 Reset P_zam
 Reset L_otw
 Reset P_otw
 
Case 3 :                                                    'zamykanie
   Set Glowny
   Incr Czas_l
   Incr Czas_r
    If L_kr_za = 1 Then
     If Czas_l > 2 Then Set L_zam
    End If
    If P_kr_za = 1 Then
     If Czas_r > 5 Then Set P_zam
    End If
 
    If L_kr_za = 0 Then Reset L_zam
    If P_kr_za = 0 Then Reset P_zam
 
    If P_kr_ot = 0 And L_kr_ot = 0 Then
    Tryb = 0
    Reset Czas_l
    Reset Czas_r
    End If
 
    If Bariera = 0 Then
    Tryb = 1
    Reset Czas_l
    Reset Czas_r
    End If
 
End Select
Return
 
 
Przycisk:
 If Ip = 0 Then
   Incr Licznik_sw
   If Licznik_sw = 68 Then
   Licznik_sw = 0
   Reset Flaga_15s
   Incr Tryb
    If Tryb = 4 Then Tryb = 0
   Else
   Licznik_sw = 60
   End If
   Reset Czas_l
   Reset Czas_r
 End If
Return
 
Zegar:
 Timer0 = 132
 Set Flaga_4ms
 Incr Dzielnik(1)
  If Dzielnik(1) = 125 Then
  Dzielnik(1) = 0
  Set Flaga_500ms
  Incr Dzielnik(2)
   If Dzielnik(2) = 2 Then
   Dzielnik(2) = 0
   Set Flaga_1s
   Incr Dzielnik(3)
    If Dzielnik(3) = 15 Then
    Dzielnik(3) = 0
    Set Flaga_15s
    End If
   End If
  End If
Return

Nietestowane więc błąd mógł się wkraść. Niemniej jednak życzę miłej eksploatacji :D Uwagi co do funkcjonalności mile widziane.

-

BARTek
Moja strona

Portret użytkownika gosc

sterownik bramy

witam Kisoft

Siłowniki mają krańcówki w sobie, włączone szeregowo w śilnik, dlatego najlepiej uruchomić przetwornik i mierzyć prądy.Tym sposobem można realizować też funkcje przeciążeniowe

Portret użytkownika grzesio.px

Wielki dzięki za pomoc

Witam dziękuję bardzo za zainteresowanie i pomoc szczególnie podziękowania dla EDC jak tylko znajdę wolną chwile to przeanalizuję kod i poprzerabiam na moje wyprowadzenia i odezwę się jak działa jeszcze raz dzięki

Portret użytkownika EDC

Brama dwuskrzydłowa - errata :D

Coś innego dziś skrobałem i błysnęło mi że mogłem zapomnieć o tym :
W Case3 przy opuszczaniu jej z powodu zadziałania bariery foto trzeba dopisac resetowanie przekaźników.

 If Bariera = 0 Then
    Tryb = 1
 
    Reset L_zam
    Reset P_zam
 
    Reset Czas_l
    Reset Czas_r
    End If


Program napisany pod cztery przekaźniki + główny, ale możesz go przerobić na trzy + główny. Jeden przekaźnik podwójny odwracajacy zasilanie na styki dwóch pozostałych. Ten zmieniajacy kierunek uruchamiasz tylko w Case3 a w Case1 i Case3 uruchamiasz po czasie te same przekaźniki.

-

BARTek
Moja strona

Portret użytkownika grzesio.px

Witam jak na razie nie

Witam jak na razie nie doszedłem do programowania układu bo chwilowo brakło czasu przerobiłem nr portów pod moja płytkę więc dzięki z góry za dalsze zainteresowanie tematem jak się ogarnę to postaram się wpakować program do procka i napiszę o wynikach działania pozdrawiam Grzesiek