Prośba o sprawdzenie kodu - Attiny2313

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
katomasz
-
Posty: 7
Rejestracja: 10 maja 2010, 7:13
Lokalizacja: łódź

Prośba o sprawdzenie kodu - Attiny2313

Post autor: katomasz » 10 maja 2010, 7:22

Na początek wyjaśnienie działania programu.

Sterowanie odbywa się poprzez dwie prędkości silnika. Jest to wolne otwieranie, otwieranie oraz zamykanie i domykanie na wolnych obrotach. Pozycja ustalana jest poprzez zmienną pozycja, i tak pozycja 11 to brama zamknięta, pozycja 12 to brama uchylona gotowa do otwierania, pozycja 22 brama otwarta oraz pozycja 21 brama gotowa do domknięcia.
Sterowanie poprzez alias switch, który zmienia zmienną stan. Jeżeli zmienna stan ma wartość 0 możliwe jest sterowanie, jeżeli ma wartość 1 nie jest możliwe sterowanie. W przypadku zadziałania bariery oraz jednocześnie ruchu bramy w pozycji zamykanie, brama ma zacząć się otwierać. Dodatkowo jeżeli zadziała przeciążenie silnika następuje zatrzymanie programu ze zmianą kierunku pozycji.
Oto kod:

Kod: Zaznacz cały

Wolne_otwieranie Alias Pind.0
Wolne_zamykanie Alias Pind.1
otwieranie Alias Pind.2
Zamykanie Alias Pind.3

Kran_close Alias Pinb.0
Kran_middle Alias Pinb.1
Kran_open Alias Pinb.2
Switch Alias Pinb.3
Bariera Alias Pinb.4
Przeciazenie Alias Pinb.5

$regfile = "Attiny2313.dat"
$crystal = 1000000


Config Portb = Input
   Portb = &B00000000
Config Portd = Output
   Portd = &B0000000
   Pinb.5 = 1

Dim Pozycja As Integer
Dim Stan As Bit
Pozycja = 11
Stan = 0
Do
   If Switch = 1 And Stan = 0 And Przeciazenie = 1 Then
      Stan = 1

      If Pozycja = 21 And Wolne_zamykanie = 1 Then
         Wolne_zamykanie = 0
         Pozycja = 11
      Elseif Pozycja = 21 And Wolne_zamykanie = 0 Then
         Wolne_zamykanie = 1
         Cls
      Elseif Pozycja = 11 And Wolne_otwieranie = 1 Then
         Wolne_otwieranie = 0
         Pozycja = 21
      Elseif Pozycja = 11 And Wolne_otwieranie = 0 Then
         Wolne_otwieranie = 1
      Elseif Pozycja = 12 And Otwieranie = 1 Then
         Otwieranie = 0
         Pozycja = 22
      Elseif Pozycja = 12 And Otwieranie = 0 Then
         Otwieranie = 1
      Elseif Pozycja = 22 And Zamykanie = 1 Then
         Zamykanie = 0
         Pozycja = 12
      Elseif Pozycja = 22 And Zamykanie = 0 Then
         Zamykanie = 1
      End If
   Elseif Kran_close = 1 And Wolne_zamykanie = 1 Then
      Wolne_zamykanie = 0
      Pozycja = 11
   Elseif Kran_open = 1 And Otwieranie = 1 Then
      Otwieranie = 0
      Pozycja = 22
   Elseif Pozycja = 11 And Kran_middle = 1 And Wolne_otwieranie = 1 Then
      Wolne_otwieranie = 0
      Waitms 500
      Otwieranie = 1
      Pozycja = 12
   Elseif Pozycja = 22 And Kran_middle = 1 And Zamykanie = 1 Then
      Zamykanie = 0
      Waitms 500
      Wolne_zamykanie = 1
      Pozycja = 21
   Elseif Bariera = 1 And Pozycja = 22 And Zamykanie = 1 Then
      Zamykanie = 0
      Waitms 500
      Otwieranie = 1
      Pozycja = 12
    End If
    If Switch = 0 Then
      Stan = 0
    End If
    If Przeciazenie = 0 Then
      If Pozycja = 11 And Wolne_otwieranie = 1 Then
         Wolne_otwieranie = 0
         Pozycja = 21
      Elseif Pozycja = 12 And Otwieranie = 1 Then
         Otwieranie = 0
         Pozycja = 22
      Elseif Pozycja = 21 And Wolne_zamykanie = 1 Then
         Wolne_zamykanie = 0
         Pozycja = 11
      Elseif Pozycja = 22 And Zamykanie = 1 Then
         Zamykanie = 0
         Pozycja = 12
      End If
    End If
Loop

End

Robert0409
-
Posty: 18
Rejestracja: 03 kwie 2009, 9:33
Lokalizacja: Włwa

Post autor: Robert0409 » 10 maja 2010, 19:40

Kolego, napisałeś sobie programik to go sprawdź sam jak działa. Jeśli będziesz miał problem z jego działaniem to wtedy opisz objawy, a na pewno uzyskasz pomoc. Zrobiłeś chociaż płytkę do tego sterownika? Będziesz miał "żywy organizm" i schemat będzie łatwiej i Tobie i innym na tym Forum.

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 10 maja 2010, 22:51

Witam.
Masz tu sporo błędów nie sprawdzałem całego ale już w pierwszych liniach widać.
Wejścia powinny być na odwrót czyli stan wysoki normalnie i zwieranie do masy ty masz wyłączone Pull upy.
Pinb.5=1 to jest źle pin sprawdza stan końcówki portu.
Wszystkie te ify i else ify, hm nie widzę tego, np Krańcówki powinny być na przerwaniach a nie na stanie pinu i to jeszcze z opóźnieniami typu waitms.
Robert0409, nie wnosisz nic do tematu.

katomasz
-
Posty: 7
Rejestracja: 10 maja 2010, 7:13
Lokalizacja: łódź

Post autor: katomasz » 11 maja 2010, 12:07

OK, dzięki Pikczu.
Więc początek wyglądałby tak?

Kod: Zaznacz cały

Wolne_otwieranie Alias Portd.0
Wolne_zamykanie Alias Portd.1
otwieranie Alias Portd.2
Zamykanie Alias Portd.3

Kran_close Alias Pinb.0
Kran_middle Alias Pinb.1
Kran_open Alias Pinb.2
Switch Alias Pinb.3
Bariera Alias Pinb.4
Przeciazenie Alias Pinb.5

$regfile = "Attiny2313.dat"
$crystal = 1000000


Config Portb = Input
   Portb = &B11111111
Config Portd = Output
   Portd = &B0000000

Dim Pozycja As Integer
Dim Stan As Bit
Pozycja = 11
Stan = 0 
I sprawa pinb.5, jak w takim razie sprawdzić zadziałanie bezpiecznika?
I jeszcze obługa przerwań dla krańcówek. Mógłbym prosić o przykład jak to obsłużyć?

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 11 maja 2010, 18:09

Witam.
Postaram się skrobnąć coś ale później.
Dopiero co z pracy wróciłem.
----------------------------------------------- 22:15--------------------------
Witam ponownie.
Dziś już nic raczej nie wymyśle, jeśli możesz narysuj jakiś schemat
rozmieszczenia tych krańcówek.
Będzie łatwiej.
druga sprawa w jaki sposób będziesz miał wykonany układ wykrywania przeciążenia???
czy wystarczy jak procek będzie reagował na zmianę stanu ?

katomasz
-
Posty: 7
Rejestracja: 10 maja 2010, 7:13
Lokalizacja: łódź

Post autor: katomasz » 12 maja 2010, 5:59

Najpierw druga sprawa. Będzie założony bezpiecznik C8, który, gdy już nastąpi przeciążenie, zostanie rozłączony i trzeba będzie ręcznie go załączyć (pozwoli to sprawdzić, co jest przyczyną).
A teraz pełny schemat.
Złącza X4 to zasilanie linią 12V. Złącza X3 to wyjście na silnik. X1 - zasilanie procesora, X3 - zasilanie przekaźników. Złącza X2 to wyjścia na krańcówki, barierę, bezpiecznik oraz switch - docelowo ma być tam podłączony układ zdalnego sterowania.
I do tego pytanie - czy w związku ze zmianą stanów pinb X2-7 podłączamy do masy?
Załączniki
schemat_bramy.png

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 12 maja 2010, 12:26

A możesz powiedzieć jakim konkretnie silnikiem chcesz sterować?? Bo zabezpieczenie w postaci popularnego eSa C8 (8A) sugerowało by że będzie to sporej mocy silnik. Wtedy raczej nie przełączał bym go zwykłymi przekaźnikami lutowanymi na PCB, tylko stycznikami z cewką 24V.

katomasz
-
Posty: 7
Rejestracja: 10 maja 2010, 7:13
Lokalizacja: łódź

Post autor: katomasz » 12 maja 2010, 13:31

Będzie to najzwyklejszy silnik od wycieraczek samochodowych 12v z dwoma prędkościami. A bezpiecznik jest taki, ponieważ przy starcie prąd dochodzi do 8A, w trakcie pracy jest ok 1A, ale przy zablokowaniu przekracza 8A, dlatego bezpiecznik typu C.

Awatar użytkownika
haterkmp
Użytkownik
Posty: 652
Rejestracja: 08 sie 2008, 11:47
Lokalizacja: Wałbrzych

Post autor: haterkmp » 12 maja 2010, 15:51

pamiętaj tylko żeby ścieżki na pcb były grube. możesz nawet "wzmocnić" je lutując do ścieżek kawałki drutu 0,75-1,25mm.
a zastanawiałeś się nad użyciem transoptorów? dodatkowe zabezpieczenie kontrolera i możliwość zastosowania odrębnego obwodu sterowania silnikiem i przekaźnikami.

[ Dodano: 2010-05-12, 16:54 ]
a ten kondensatorek 100nF daj jak najbliżej procka a nawet od strony druku pcb bezpośrednio do nóżek procesora.

[ Dodano: 2010-05-12, 16:58 ]
a przy ledach zamiast tych kondensatorków nie powinny być rezystorki? myslę że świecidełka szybko pójdą z dymem przy pierwszym rozłączaniu cewki przekaźnika. gdybyś zastosował transoptory to mogłyby być wpięte w szereg i wtedy mały rezystor ograniczający prąd dwóch diod i po problemie. bo jak rozumiem służą optycznej identyfikacji włączonego przekaźnika.

katomasz
-
Posty: 7
Rejestracja: 10 maja 2010, 7:13
Lokalizacja: łódź

Post autor: katomasz » 12 maja 2010, 17:25

Ścieżki są grube - tam gdzie dało radę są 0.5, a reszta do silnika to 0.4. obód do sterowania silnikiem tak naprawdę jest osobny. Kondensator jest ok 2 mm od procka. Przy ledach tak naprawdę będą rezystory, ale schemat robiłem na szyko i potrzebowałem tak naprawdę odpowiedni odstęp na pinach 10mm, a to było pod ręką. Eagle mam w takiej starej wersji i żeby coś tam znaleźć, to trzeba wszystko przejrzeć.

Awatar użytkownika
haterkmp
Użytkownik
Posty: 652
Rejestracja: 08 sie 2008, 11:47
Lokalizacja: Wałbrzych

Post autor: haterkmp » 12 maja 2010, 17:35

aha
no to nie powinno być problemów które sygnalizowałem.
ściągnij sobie bibliotekę special2 do eagla najlepeiej ze strony. tam masz dość duzo popularnych standardowych elementów.

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 12 maja 2010, 20:32

Witam właśnie wróciłem z pracy i mam chwile żeby coś wydumać.
Pasuje wszytko przerobić zamienić porty miejscami bo potrzebne będą wejścia PD.2 i PD.3
do przerwań i jakieś z portu B jako PCINT (PIN change interrupt) ale to wyjdzie w praniu.
Na Pewno barierę trzeba dać na jedno z przerwań proponuję INT0 portd.2
Można wykorzystać port szeregowy czy to do testów a może i nawet do zdalnego sterowania.

Czy zmiana prędkości będzie wyzwalana krańcówką gdzieś pod koniec drogi ?
Jak to wygląda czy wolne zamykanie to włączenie od dzielnego uzwojenia w silniku tym od wycieraczek czy dwóch uzwojeń jednocześnie???

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 12 maja 2010, 22:48

to i ja się przyłączę. kiedyś w czasach gdy nie miałem programatora popełniłem taki sterownikm że tak powiem na sucho. nie był sprawdzany z płytką tylko w symulacji gdzie działał. oto kod. trzeba to przerobić bo wiele jest niepotrzebne.
poza tym pisane to było jak jeszcze mało się na tym rozumiełem i do wszystkiego używałem IF...THEN.

Kod: Zaznacz cały

'$sim
'sterownik bramy na tiny 2313
$regfile = "2313def.dat"
$crystal = 8000000
dim x as byte
dim wspza as Bit                   'zmienne pomocnicze zapisu stanu silnikow
dim wslza as Bit
dim wspot as Bit
dim wslot as Bit
config INT0 = FALLING
config int1 = falling
Enable Interrupts
Enable Int0
enable INT1
on int0 czujka
on int1 brama_stop

Config pind.0 = input
config pind.1 = input
config pind.2 = input
config pind.3 = input
config pinb.2 = input
config pinb.3 = input
config pinb.6 = input
config pinb.7 = input
config portb.0 = output
config portb.1 = output
config portb.4 = output
config portb.5 = output

spot Alias portb.0                 'silnik prawy otwiera
spza Alias portb.1                 'silnik prawy zamykla
cpot Alias pinb.2                  'wejscie czujka prawa otwarta brama
cpza Alias pinb.3                  'wejscie czujka prawa zamknieta brama
slot Alias portb.4                 'silnik lewy otwiera
slza Alias portb.5                 'silnik lewy zamyka
clot Alias pinb.6                  'wejscie czujka prawa otwarta brama
clza Alias pinb.7                  'wejscie czujka prawa zamknieta brama
licznik alias pind.0
czujnik alias pind.1
portb = 255
portd = 255


x = 0                              'zmienna pomocnicza ustawiona na zero
licznik = 1
czujnik = 1
set pinb.2
set pinb.3
set pinb.6
set pinb.7
gosub zamykam


    do
      if licznik = 0 then
        waitms 50
        gosub wybor
      end if
    loop

wybor:                             'zlicza ile razy nacisnieto przycisk na pilocie
incr x
        if x = 1 then              'jesli raz to wezwij program do zamykania bramy
         gosub otwieram
        end if
        if x = 2 then              'jesli drugi raz nacisnieto to zatrzymuje brame
         gosub stopuje
        end if
        if x = 3 then              'jesli nacisnieto trzeci raz to wzywam podprogram zamykania beamy
         gosub zamykam
        end if
        if x = 4 then              'jesli przycisk nacisniety poraz czwarty to zatrzymuje brame
         set spza
         set slza
         x = 0
        end if
return


otwieram:                          'poprogram otwierania bramy
do
 if clot = 0 then                  'sprawdzam czy lewa połowa bramy otworzyla sie
  set slot                         'wylaczam otwieranie lewej polowy
   else
   set slza
  reset slot                       'w przeciwnym razie zalaczam go
 end if
 if cpot = 0 then                  'sprawdzam czy prawa polowa otworzyla sie
  set spot                         'i wylaczam otwieranie prawej polowy
   else
  wait 1
  set spza
  reset spot                       'w przeciwnym razie zalaczam otwieranie
 end if
 if licznik = 0 then               'jesli nacisnieto przycisk nr1 na pilocie
  gosub wybor                      'licz ile razy?
  exit do
 end if
  set clza                         'ustawiam czujki zamknietej bramy do odczytu
  set cpza
 if clot = 0 and cpot = 0 then     'jesli obie polowy bramy otworzyly sie to
   set slot                        'wylaczam silniki otwierania
   set spot
   incr x
   exit do                         'wychodze z petli
 end if
loop
return


zamykam:                           'podprogram zamykania bramy
do
 if clza = 0 then                  'sprawdzam czy lewa połowa bramy zamknela sie
  set slza                         'wylaczam zamykanie lewej polowy
   else
  reset slza                       'w przeciwnym razie zalaczamgo
 end if
 if cpza = 0 then                  'sprawdzam czy prawa polowa zamknela sie
  set spza                         'i wylaczam zamykanie prawej polowy
   else
  wait 1
  reset spza                       'w przeciwnym razie zalaczam zamykanie
 end if
  set clot                         'ustawiam czujki otwarcia bramy do odczytu
  set cpot
 if licznik = 0 then               'jesli nacisnieto przycisk nr1 na pilocie
  gosub wybor                      'licz ile razy?
  exit do
 end if
 if clza = 0 then                  'jesli obie polowy bramy zamknely sie to
  if cpza = 0 then
   set slza                        'ustawiam czujki zamknietej bramy do odczytu
   set spza
   exit do                         'i wychodze z petli
  end if
 end if
loop
x = 0
return



stopuje:                           'podprogram zatrzymywania silnikow
wait 1
if slot = 0 then                   'sprawdzam czy silnik lewej polowy dziala i jesli tak
 set slot                          'to zatrzymuje go
 wait 1
end if
if spot = 0 then                   'i tak kolejno sprawdzam wszystkie silniki
 set spot
 wait 1
end if
if slza = 0 then
 set slza
 wait 1
end if
if spza = 0 then
 set spza
 wait 1
end if
set licznik
return

brama_stop:                        'podprogram zatrzymywania bramy na zyczenie
set licznik
wspza = spza                       'zapamietuje stany poszczegolnych silnikow
wslza = slza
wslot = slot
wspot = spot
 if spza = 0 then                  'jesli silnik prawej polowy zamyka sie
  set spza                         'to go zatrzymuje
 end if
 if slza = 0 then                  'jesli silnik lewej polowy zamyka sie
  set slza                         'to zatrzymuje go
 end if
 if slot = 0 then                  'jesli silnik lewej polowy otwiera sie
  set slot                         'to zatrzymuje go
 end if
 if spot = 0 then                  'kesli silnik prawej polowy otwiera sie
  set spot                         'to zatrzymuje go
 end if
        do
         if licznik = 0 then       'jesli uzytkownik chce wlaczyc ponownie brame
           spza = wspza            'to odczytuje wartosci silnikow ktore wczesniej zapisalem
           spot = wspot            'i wartosci te nadaje ospowiednim silnikom
           slza = wslza
           slot = wslot
           set licznik
           exit do
         end if
        loop
return

czujka:                            'czujka przedmiotu znajdujacego sie w bramie
 disable INT0                      'zatrzymuje zezwolenie na przerwania w tym INT0
 disable INTERRUPTS
  if clza <> 0 then                'jesli przedmiot znajduje sie w bramie
   if cpza <> 0 then               'a polowki bramy jeszcze nie zamkneły sie to
    set slza                       'wylaczam silniki zamykajace brame
    wait 1
    set spza
   end if
  end if
  do
   if licznik = 0 then             'sprawdzam czy nacisnieto przycisk nr1 na pilocie
    wait 1
    reset slot
    reset spot
   end if
   if clot = 0 then                'sprawdzam czy lewa połowa bramy otworzyla sie
    set slot                       'wylaczam otwieranie lewej polowy
   end if
   if cpot = 0 then                'sprawdzam czy prawa polowa otworzyla sie
    set spot                       'i wylaczam otwieranie prawej polowy
   end if
   if czujnik <> 0 then            'jesli przedmiotu nie ma juz w bramie to
    if clot = 0 then
     if cpot = 0 then
      set czujnik
      wait 4
      exit do                      'wychodze z petli
     end if
    end if
   end if
  loop
 enable INTERRUPTS                 'zezwalam na przerwanie w tym INT0
 enable INT0
 x = 2
return

katomasz
-
Posty: 7
Rejestracja: 10 maja 2010, 7:13
Lokalizacja: łódź

Post autor: katomasz » 18 maja 2010, 7:12

OK. Wracam do tematu.
Na chwilę obecną tak to wygląda.

Kod: Zaznacz cały

$regfile = "attiny2313.dat"
$crystal = 1000000

Config Portd.0 = Output            ' portd.0 dla wolnego otwierania
Config Portd.1 = Output            ' portd.1 dla wolnego zamykania
Config Portd.4 = Output            ' portd.4 dla otwierania
Config Portd.5 = Output            ' portd.5 dla zamykania

Config Pinb.0 = Input               ' pinb.0 dla krancówki zamknięcia
Config Pinb.1 = Input               ' pinb.1 dla krancówki pośredniej
Config Pinb.2 = Input               ' pinb.2 dla krancówki otwarcia
Config Pinb.3 = Input               ' pinb.3 dla przycisku
Config Pinb.5 = Input               ' pinb.5 dla bezpiecznika


Dim Pozycja As Integer            ' pozycja do określenia aktualnej pozycji 'bramy, jeżeli
                                       'do wolnego otwierania to 11, jeżeli do otwierania to 12,
                                   'jeżeli do zamykania to 22, jeżeli do wolnego zamykania to 21
Dim Stan As Bit                        ' stan dla określenia stanu przycisku, jeżeli 'wciśnięty
                                              ' stan=1, jeżeli puszczony stan=0
Dim Silnik As Bit                      ' silnik dla określenia stanu silnika, jeżeli 'pracuje
                                              ' to stan=1, jeżeli stoi to stan=0
Pozycja = 11                           ' określenie pozycji do wolnego otwierania
Stan = 0                                 ' przycisk nie wciśnięty
Silnik = 0                                ' silnik stoi

Wolne_otwieranie Alias Portd.0         ' przypisywania aliasów
Wolne_zamykanie Alias Portd.1
Otwieranie Alias Portd.4
Zamykanie Alias Portd.5

Kran_close Alias Pinb.0
Kran_middle Alias Pinb.1
Kran_open Alias Pinb.2
Switch Alias Pinb.3
Przeciazenie Alias Pinb.5

Set Portb.0                                     ' ustawienie stanów linii
Set Portb.1
Set Portb.2
Set Portb.3
Set Portb.5

Do                                                 ' początek nieskończonej pętli

   If Switch = 0 And Stan = 0 And Przeciazenie = 0 Then   ' jeżeli wciśnięto przycisk, 
                                                            'a nie był wciśnięty wcześniej
                                                            'oraz bezpiecznik załączony
      Stan = 1                     ' stan przycisku - przycisk jest włączony, 'jeżeli nic się nie 
                                         'zmieni w następnej pętli nie wchodź w ten warunek
      If Pozycja = 11 And Silnik = 0 Then       ' jeżeli pozycja do wolnego otwierania i silnik stoi
         Set Wolne_otwieranie                    ' uruchom wolne_otwieranie
         Silnik = 1                                     ' ustaw stan silnika na pracuje

      Elseif Pozycja = 11 And Silnik = 1 Then  ' jeżeli pozycja do wolnego otwierania i silnik pracuje
         Reset Wolne_otwieranie                             ' wyłącz wolne otwieranie
         Silnik = 0                                         ' ustaw stan silnika na stoi
         Pozycja = 21                                       ' przełącz pozycję do wolnego zamykania

      Elseif Pozycja = 21 And Silnik = 0 Then    ' jeżeli pozycja do wolnego zamykania i silnik stoi
         Set Wolne_zamykanie                                ' uruchom wolne zamykanie
         Silnik = 1                                         ' ustaw stan silnika na pracuje

      Elseif Pozycja = 21 And Silnik = 1 Then  ' jeżeli pozycja do wolnego zamykania i silnik pracuje
         Reset Wolne_zamykanie                              ' wyłącz wolne zamykanie
         Silnik = 0                                         ' ustaw stan silnika na stoi
         Pozycja = 11                                       ' przełącz pozycję do wolnego otwierania

      Elseif Pozycja = 12 And Silnik = 0 Then     ' jeżeli pozycja do otwierania i silnik stoi
         Set Otwieranie                                     ' włącz otwierania
         Silnik = 1                                         ' ustaw stan silnika na pracuje

      Elseif Pozycja = 12 And Silnik = 1 Then     ' jeżeli pozycja do otwierania i silnik 'pracuje
         Reset Otwieranie                                   ' wyłącz otwieranie
         Silnik = 0                                         ' ustaw stan silnika na stoi
         Pozycja = 22                                       ' przełącz pozycję do zamykanie

      Elseif Pozycja = 22 And Silnik = 0 Then       ' jeżeli pozycja do zamykania i silnik 'stoi
         Set Zamykanie                                      ' włącz zamykanie
         Silnik = 1                                         ' ustaw stan silnika na pracuje

      Elseif Pozycja = 22 And Silnik = 1 Then  ' jeżeli pozycja do zamykania i silnik 'pracuje
         Reset Zamykanie                                    ' wyłącz zamykanie
         Silnik = 0                                         ' ustaw stan silnika na stoi
         Pozycja = 12                                       ' przełącz pozycję do otwierania

      End If
   End If                                          ' koniec operacji przełączania stanu silnika 'przyciskiem

   If Kran_close = 0 And Silnik = 1 Then   ' jeżeli zadziałała krańcówka zamknięcia, a silnik pracuje
                                                            ' (co oznacza, że jest wolne zamykanie)
      Reset Wolne_zamykanie                                 ' wyłącz wolne zamykanie
      Silnik = 0                                            ' ustaw stan silnika na stoi
      Pozycja = 11                                          ' przełącz pozycję do wolnego otwierania

   Elseif Kran_open = 0 And Silnik = 1 Then   ' jeżeli zadziałała krańcówka otwarcia, a silnik pracuje
                                                            ' (co oznacza, że jest otwieranie)
      Reset Otwieranie                                      ' wyłącz otwieranie
      Silnik = 0                                            ' ustaw stan silnika na stoi
      Pozycja = 22                                          ' przełącz pozycję do zamykania

   Elseif Kran_middle = 0 And Silnik = 1 Then    ' jeżeli zadziałała krańcówka pośrednia, 
                                                       'a silnik pracuje (co oznacza, że jest 
                                                       'albo wolne otwieranie, albo zamykanie)
      If Wolne_otwieranie = 1 Then                          ' jeżeli jest wolne otwieranie
         Reset Wolne_otwieranie                             ' wyłącz wolne otwieranie
         Waitms 200                                         ' poczekaj 200 ms
         Set Otwieranie                                     ' uruchom otwieranie
         Pozycja = 12                                       ' przełącz pozycję na otwieranie

      Elseif Zamykanie = 1 Then                             ' jeżeli jest zamykanie
         Reset Zamykanie                                    ' wyłącz zamykanie
         Waitms 200                                         ' poczekaj 200 ms
         Set Wolne_zamykanie                                ' uruchom wolne zamykanie
         Pozycja = 21                                       ' przełącz pozycję na wolne zamykanie
      End If

   End If

   If Switch = 1 Then                                       ' jeżeli puszczony przycisk
      Stan = 0                                              ' ustaw stan przycisku na wyłączony
   End If

   If Przeciazenie = 1 And Silnik = 1 Then    ' jeżeli zadziałało przeciążenie - 
                                                               'wyłączony bezpiecznik i silnik pracuje

      Silnik = 0                                           ' ustaw stan silnika na stoi

      If Pozycja = 11 Then                           ' jeżeli pozycja do wolnego otwierania
         Reset Wolne_otwieranie                    ' wyłącz wolne_otwieranie
         Pozycja = 21                                   ' przełącz pozycję do wolnego zamykania

      Elseif Pozycja = 12 Then                     ' jeżeli pozycja do otwierania
         Reset Otwieranie                             ' wyłącz otwieranie
         Pozycja = 22                                  ' przełącz pozycję do zamykania

      Elseif Pozycja = 22 Then                    ' jeżeli pozycja do zamykania
         Reset Zamykanie                           ' wyłącz zamykanie
         Pozycja = 12                                 ' przełącz pozycję do otwierania

      Elseif Pozycja = 21 Then                   ' jeżeli pozycja do wolnego zamykania
         Reset Wolne_zamykanie                ' wyłącz wolne zamykanie
         Pozycja = 11                                ' przełącz pozycję do wolnego otwierania

      End If
   End If

Loop

End
Teraz jak dodać portd.2 do bariery? Czy wywołuje się to tak jak podałeś - int0 portd.2?
Zmiana prędkości będzie pod sam koniec drogi. Będzie to zarówno dociągnięcie bramy do zamknięcia jak i odciągnięcie, kiedy jest mały ruch bramy przy tym samym posuwie. W silniku wycieraczek chyba nie ma osobnego uzwojenia, lecz jest układ obniżający obroty - teoretycznie można by to uzyskać przez obniżenie napięcia w układzie z prockiem, lecz skoro jest to już zrealizowane w silniku, to chcę to wykorzystać.[/b]

Awatar użytkownika
marcing
Użytkownik
Posty: 868
Rejestracja: 14 lut 2006, 14:13
Lokalizacja: z pociągu...
Kontakt:

Post autor: marcing » 18 maja 2010, 15:12

Taka "drobna" prośba moderatora:

Proszę umieszczać długie listingi w formie załączników - zwiększy to czytelność tematu, a dodatkowo od razu można wczytać program do odpowiedniego kompilatora.
W formie listingów pomiędzy znacznikami [code] oraz [/code] proszę zamieszczać krótkie przykłady, rozwiązania problemu itp.

ODPOWIEDZ