Prosty program do napisania brama wjazdowa...Bascom

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!
ODPOWIEDZ
cooki13
-
Posty: 5
Rejestracja: 02 sie 2006, 19:26
Lokalizacja: Wrocław

Prosty program do napisania brama wjazdowa...Bascom

Post autor: cooki13 » 21 mar 2008, 18:39

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 pomóc napisać ten program?Naprawde nie wiem jak sie za to zabrać(tzn za tą pętle)

Czy ktoś mógłby wyłapać błędy?

Kod: Zaznacz cały

$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
Obrazek

Awatar użytkownika
malcik
-
Posty: 8
Rejestracja: 23 mar 2008, 15:22
Lokalizacja: Płock
Kontakt:

Post autor: malcik » 23 mar 2008, 15:44

Witaj,
Dokładnie taki sam projekt wykonałem tyle że.. na PLC bodajże S7-200 CPU 221.
Program pisałem w LAD wiec tobie się nie przyda, ale algorytm możesz wykorzystać.
A więc tak..
Brama z założenia ma 4 stany :
0. Stoi zamknięta
1. Otwieranie.
2. Stoi otwarta.
3. Zamykanie.
Dodatkowo licznik liczący do czterech i kilka porównań.
a więc tak :
Poczatek programu :
Licznik - 0 - brama stoi
Naciskasz pilot - dodaje + 1 do licznika
Licznik = 1 - otwieranie bramy.
Gdy brama dojedzie do końca zadziała krańcówka i doda + 1 do licznika.
Licznik = 2 - brama otwarta - krańcówki nie działają, zwiększyć licznik może tylko pilot.
Naciskasz pilot - dodaje +1 do licznika
Licznik = 3 - zamykanie bramy.
Gdy brama się zamknie zadziała krańcówka i doda + 1 do licznika.
Licznik = 4 czyli licznik = 0 - brama stoi zamknięta.

Gdy brama stoi otwarta/zamknięta licznik zwiększyć może jedynie pilot - z wiadomych względów ktoś mógł by podejść nacisnąć krańcówkę i brama by się otworzyła.
a więc zadziałanie krańcówki + blokada kolejnego zadziałania.

Ufff ale zamieszałem. Masz jakieś pytania - pisz. Postaram się wyjaśnić
Pozdrawiam

cooki13
-
Posty: 5
Rejestracja: 02 sie 2006, 19:26
Lokalizacja: Wrocław

Post autor: cooki13 » 23 mar 2008, 17:07

Aktualnie program wygląda tak

Kod: Zaznacz cały

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

Declare Sub Lewo 
Declare Sub Prawo 
Declare Sub Zatrzymaj 
Krancowka1 Alias Pinb.0 
Krancowka2 Alias Pind.7 
Radio Alias Pind.6 
Do 

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


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

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


Loop 

End 

Sub Lewo 
Portc.0 = 1 
If Radio = 0 Then Call Zatrzymaj 
If Krancowka2 = 0 Then Call Zatrzymaj 


End Sub 

Sub Prawo 
Portb.5 = 1 
If Radio = 0 Then Call Zatrzymaj 
If Krancowka1 = 0 Then Call Zatrzymaj 

End Sub 

Sub Zatrzymaj 
Portc.0 = 0 
Portb.5 = 0 
Return 
End Sub
I program jako tako działa czy ktoś mógłby wprowadzić modyfikacje zabezpieczające?np watchdog lub funkcja debounce w celu wyelminowania drgania styków?

Awatar użytkownika
malcik
-
Posty: 8
Rejestracja: 23 mar 2008, 15:22
Lokalizacja: Płock
Kontakt:

Post autor: malcik » 24 mar 2008, 0:34

Rzuć okiem w ten kod.
Nie wiem czy watchdog jest ustawiony poprawnie, reszta działa.

Kod: Zaznacz cały

$regfile = "m8def.dat"
$crystal = 8000000
Config Pinb.0 = Input
Config Pind.7 = Input
Config Pind.6 = Input
Config Pinb.5 = Output
Config Pinc.0 = Output
Config Watchdog = 2048
Start Watchdog


Dim Licz As Byte


Licz = 0

Declare Sub Radio_dodaj_licznik
Declare Sub Krancowka_dodaj_licznik
Declare Sub Wybor

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

   Do
      Debounce Radio , 1 , Radio_dodaj_licznik , Sub
      Debounce Krancowka1 , 1 , Krancowka_dodaj_licznik , Sub
      Debounce Krancowka2 , 1 , Krancowka_dodaj_licznik , Sub

         If Licz = 4 Then
            Licz = 0
         End If

   Reset Watchdog 
   Loop
End


Sub Radio_dodaj_licznik
   Licz = Licz + 1
   Call Wybor
End Sub

Sub Krancowka_dodaj_licznik
   If Licz = 1 Or Licz = 3 Then
      Licz = Licz + 1
      Call Wybor
   End If
End Sub

Sub Wybor
   Select Case Licz
      Case 0 :
         Reset Przekaznik1
         Reset Przekaznik2
      Case 1:
         Set Przekaznik1
      Case 2:
         Reset Przekaznik1
         Reset Przekaznik2
      Case 3:
         Set Przekaznik2
      Case 4:
         Reset Przekaznik1
         Reset Przekaznik2
   End Select
End Sub
Mile widziane wyszczególnione błędy i poprawki.
Pozdrawiam

Post edytowałem. Czy tak jest poprawnie?
Ostatnio zmieniony 24 mar 2008, 13:14 przez malcik, łącznie zmieniany 2 razy.

ZbeeGin

Post autor: ZbeeGin » 24 mar 2008, 8:49

No tak. Watchdog uruchomiony a program podziała te 2 sekundy.
Gdzie instrukcja RESET WATCHDOG?

cooki13
-
Posty: 5
Rejestracja: 02 sie 2006, 19:26
Lokalizacja: Wrocław

Post autor: cooki13 » 24 mar 2008, 11:32

Właśnie jestem po pierwszych testach programu kolegi malcik...Wszystko działa!Dzięki serdeczne za pomoc

[ Dodano: 2008-03-25, 18:26 ]
Mógłby ktoś "rzycić okiem na kod z dodaną obsługą brzęczyka Piezzo?układ działa teraz tak że włacza i wyłacza sie jeden przekaźnik(nie ważne czy włączam układ z radia) następnie wykonuje sie podprogram piezzo

Kod: Zaznacz cały

$regfile = "m8def.dat" 
$crystal = 8000000 
Config Pinb.0 = Input 
Config Pind.7 = Input 
Config Pind.6 = Input 
Config Pinb.5 = Output 
Config Pinc.0 = Output 
Config Pind.1 = Output 
Config Watchdog = 2048 
Start Watchdog 


Dim Licz As Byte 


Licz = 0 

Declare Sub Radio_dodaj_licznik 
Declare Sub Krancowka_dodaj_licznik 
Declare Sub Wybor 
Declare Sub Piezzo 
Przekaznik1 Alias Portb.5 
Przekaznik2 Alias Portc.0 
Krancowka1 Alias Pinb.0 
Krancowka2 Alias Pind.7 
Radio Alias Pind.6 

   Do 
      Debounce Radio , 1 , Radio_dodaj_licznik , Sub 
      Debounce Krancowka1 , 1 , Krancowka_dodaj_licznik , Sub 
      Debounce Krancowka2 , 1 , Krancowka_dodaj_licznik , Sub 

         If Licz = 4 Then 
            Licz = 0 
         End If 

   Reset Watchdog 
   Loop 
End 


Sub Radio_dodaj_licznik 
   Licz = Licz + 1 
   Call Wybor 
End Sub 

Sub Krancowka_dodaj_licznik 
   If Licz = 1 Or Licz = 3 Then 
      Licz = Licz + 1 
      Call Wybor 
   End If 
End Sub 

Sub Wybor 
   Select Case Licz 
      Case 0 : 
         Reset Przekaznik1 
         Reset Przekaznik2 
         Call Piezzo 
      Case 1: 
         Set Przekaznik1 
         Call Piezzo 
      Case 2: 
         Reset Przekaznik1 
         Reset Przekaznik2 
         Call Piezzo 
      Case 3: 
         Set Przekaznik2 
         Call Piezzo 
      Case 4: 
         Reset Przekaznik1 
         Reset Przekaznik2 
         Call Piezzo 
   End Select 
End Sub 


Sub Piezzo 
Sound , Portd.1 , 500 , 500 
Waitms 200 
Sound , Portd.1 , 500 , 800 
End Sub

ODPOWIEDZ