Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Silnik krokowy-przerwanie

piotrs
-
-
Posty:48
Rejestracja:29 kwie 2003, o 04:19
Silnik krokowy-przerwanie

Postautor: piotrs » 17 mar 2004, o 03:54

Czesc !
Mam taki maly problem . Napisalem program w ktorym urzywam przerwanie . Wydaje mi sie cos zle robie .W przerwaniu mianowicie mam do wyboru dwa wyjscia , i tu wlasnie jest problem . Gdy urzywam drugiego wyjscia Call sub , przerwanie tak jakby juz nie reagoowalo .
$large
Config Lcd = 16 * 1a
Cursor Off
Declare Sub Mainprogram
Declare Sub Foursteps_left
Declare Sub Foursteps_right
Declare Sub Fourstepsset
Declare Sub Rotationsset
Declare Sub Speedset
Declare Sub Go_on
Declare Sub Ddelay
Declare Sub Direction
Dim T As Byte
Dim R As Word
Dim 4steps As Byte
Dim Rotations As Word
Dim X As Byte
Dim D As Bit
S1 Alias P3.2
S2 Alias P3.5
S3 Alias P3.7
Reset P3.0 : Reset P3.1 : Reset P3.4 : Reset P3.3

Enable Interrupts
'Enable Int0
On Int0 Sto_p
Disable Int0

D = 0
T = 1
4steps = 100
Rotations = 10
Cls
Lcd "press s1"

Do
If S1 = 0 Then
Waitms 250
Call Fourstepsset
End If

Loop

Sub Fourstepsset:

Do
Cls
Lcd "X 4steps:" ; 4steps
Waitms 10
If S2 = 0 And S3 = 1 Then
Waitms 100
Decr 4steps
End If
If S2 = 1 And S3 = 0 Then
Waitms 100
Incr 4steps
End If
If S1 = 0 Then
Waitms 250
Call Rotationsset
End If
Loop
End Sub

Sub Rotationsset:
Do
Cls
Lcd "Turns:" ; Rotations
Waitms 10
If S2 = 0 And S3 = 1 Then
Waitms 100
Decr Rotations
End If
If S2 = 1 And S3 = 0 Then
Incr Rotations
Waitms 100
End If
If S1 = 0 Then
Waitms 250
Call Speedset
End If
Loop
End Sub

Sub Speedset:
Do
Cls
Lcd "Speed:" ; T
Waitms 10
If S2 = 0 And S3 = 1 Then
Waitms 100
Decr T
End If
If S2 = 1 And S3 = 0 Then
Waitms 100
Incr T
End If
If S1 = 0 Then
Waitms 250
Cls
Lcd "Direction:"
Call Direction
End If
Loop
End Sub

Sub Direction:
Do
If D = 0 Then
Locate 2 , 4
Lcd "L"
Else
Locate 2 , 4
Lcd "R"
End If
Waitms 10
If S2 = 0 And S3 = 1 Then
D = 0
End If
If S2 = 1 And S3 = 0 Then
D = 1
End If
If S1 = 0 Then
Waitms 250
Call Go_on
End If
Loop
End Sub

Sub Go_on:
Cls
Lcd "waiting..."
Wait 2
Cls
Lcd "Progress:"
Enable Int0

If D = 1 Then
For R = 1 To Rotations
For X = 1 To 4steps
Call Foursteps_right
Next X
Locate 2 , 4
Lcd R
Next R
Reset P3.0 : Reset P3.1 : Reset P3.4 : Reset P3.3
End If

If D = 0 Then
For R = 1 To Rotations
For X = 1 To 4steps
Call Foursteps_left
Next X
Locate 2 , 4
Lcd R
Next R
Reset P3.0 : Reset P3.1 : Reset P3.4 : Reset P3.3
End If

Disable Int0
Locate 1 , 1
Lcd "Finished :"


Do
If S1 = 0 Then
Cls
Lcd "Please set up"
Wait 1
Call Fourstepsset
End If
Loop
End Sub

Sub Foursteps_left:
Set P3.0 : Reset P3.1 : Reset P3.4 : Reset P3.3
Call Ddelay
Reset P3.0 : Set P3.1 : Reset P3.4 : Reset P3.3
Call Ddelay
Reset P3.0 : Reset P3.1 : Set P3.4 : Reset P3.3
Call Ddelay
Reset P3.0 : Reset P3.1 : Reset P3.4 : Set P3.3
Call Ddelay
End Sub

Sub Foursteps_right:
Reset P3.0 : Reset P3.1 : Set P3.4 : Reset P3.3
Call Ddelay
Reset P3.0 : Set P3.1 : Reset P3.4 : Reset P3.3
Call Ddelay
Set P3.0 : Reset P3.1 : Reset P3.4 : Reset P3.3
Call Ddelay
Reset P3.0 : Reset P3.1 : Reset P3.4 : Set P3.3
Call Ddelay
End Sub



Sub Ddelay:
Waitms T 'X
End Sub

Sto_p: '
Disable Int0
Home
Lcd " Stop "
Wait 1
Do
Home
Lcd "S1-start "
Waitms 250
Home
Lcd "S2-quit "
Waitms 250

If S1 = 0 Then
Waitms 250
Home
Lcd "start "
Wait 2
Home
Lcd "progress:"
Enable Int0
Return
End If

If S2 = 0 Then ' problem jest z tym podprogramem
Wait 1
Call Fourstepsset
End If
Loop
Return


Wedlug mnie to problem jest ztym ,ze brakuje przerwaniu komendy Return
i dlatego ono wciaz jest aktywne . Ale nie jestem pewien i potrzebuje czyjejs rady !
Z gory dzieki

wojwo
-
-
Posty:15
Rejestracja:25 sie 2003, o 15:59

Postautor: wojwo » 17 mar 2004, o 09:25

Prawdopodobnie return powinien być wpisany w pętli warunku IF S2=0 .... W Twoim programie jeśli nie jest spełniony ani warunek pierwszy, ani warunek drugi procek "biega" w kółko w pętli Do Loop.
wedłu mnie powinno być tak

If S2 = 0 Then ' problem jest z tym podprogramem
Wait 1
Call Fourstepsset
return
End If
Loop

pozdrawiam Wojtek

piotrs
-
-
Posty:48
Rejestracja:29 kwie 2003, o 04:19

Postautor: piotrs » 17 mar 2004, o 18:33

Czesc!
Problem jest z tym ze po przejsciu do "Call fourstepset" program nie wraca do programu przerwania i nie przechodzi przez return . No nic ale sprobuje tak jak sugerowales i dam Ci znac! :D
pozdr

piotrs
-
-
Posty:48
Rejestracja:29 kwie 2003, o 04:19

Postautor: piotrs » 18 mar 2004, o 05:23

Sprawdzilem i niestety dzieje sie to samo . Probowalem tez Komendy EXIT
, ale tez nic nie wychodzilo-a moze nie wiem jak jej urzyc . Moze tego nie da sie zrobic -POMOCY! :? :evil: :(

wojwo
-
-
Posty:15
Rejestracja:25 sie 2003, o 15:59

Postautor: wojwo » 18 mar 2004, o 11:05

Po wejściu w procedurę Fourstepsset program nie ma szansy z niej wyjść. "Biega" w kółko w pętli Do Loop (w pozostałych procedurach jest podobnie). Wydaje mi się że powinno to być tak:

Sub Fourstepsset:

Do
Cls
Lcd "X 4steps:" ; 4steps
Waitms 10
If S2 = 0 And S3 = 1 Then
Waitms 100
Decr 4steps
End If
If S2 = 1 And S3 = 0 Then
Waitms 100
Incr 4steps
End If
If S1 = 0 Then
Waitms 250
Call Rotationsset
End If
'**************************
If "warunek" Then 'warunek-coś co musi być spełnione żeby zakończyć procedurę
Exit
End if
'**************************
Loop
End Sub

pozdrawiam Wojtek

piotrs
-
-
Posty:48
Rejestracja:29 kwie 2003, o 04:19

Postautor: piotrs » 19 mar 2004, o 03:38

CZesc !
W sumie to nie o to mi chodzi . Z podprogramu wyjsc to nie ma problemu , bo po prostu program skacze z podprogramu do podprogramu i to jest ok . Problem sie zaczyna od momentu gdy od programu przerwania "Sto_p "wychodzimy urzywajac przycisku s2 . Wtedy program skacze do podprogramu Fourstepsset ., a nastepnie do nastepnych podprogramow az do Go_on Silnik startuje i gdy chcemy przerwac jego prace urzywajac przerwania to ono nie dziala, tak jakby bylo disable.
pozdr

wojwo
-
-
Posty:15
Rejestracja:25 sie 2003, o 15:59

Postautor: wojwo » 19 mar 2004, o 11:14

Czy mógłbyś krótko opisać co program dokładnie ma robić. Co wywołuje przerwanie?Próbuję przegryźć się przez program, ale wydaje mi się że jest trochę "zapętlony", mało przejrzysty, ale narazie się nie poddałem, to musi zacząć działać.

pozdrawiam Wojtek

Awatar użytkownika
gruszek
-
-
Posty:178
Rejestracja:20 lis 2003, o 13:31
Lokalizacja:bytom

Postautor: gruszek » 19 mar 2004, o 19:08

nie moge nic na 100% zagwarantowac ale czytalem cos w jakims pdfie czy helpie ze 8051 jesli "wejdzie" do jakiegos przerwania to pierwsza instrukcja "return" jaka napotka wyrzuca go z tamtad. czyli ze jak masz w przerwaniu cos takiego
.
.
.przerwanie:
zrob cos
zrob cos innego
call LOLO
zrob laske
return
.
.
LOLO:
ble ble
return

to wlezie do lolo powie bleble ale juz nie zrobi laski ;)
czytalem tez zeby unikac bardziej zlozonych procedur w przerwaniach
lepiej w przerwaniach ustawiac tylko jakies swoje bity flagowe a niech
program sobie chodzi tylko w kolko i sprawdza jaka "flaga" jest ustawiona
i w zaleznosci od tego niech podejmuje jakies akcje
czasem to baaardzo pomaga ale w sumie nie zawsze ;)

pzd

piotrs
-
-
Posty:48
Rejestracja:29 kwie 2003, o 04:19

Postautor: piotrs » 21 mar 2004, o 06:35

Czesc!
Napisze jakie sa zalozenia w tym programie .Na samym poczatku program wchodzi w petle DO LOOP i po przycisnieciu S1 program przechodzi do podprogramu FOURSTEPSSET . W programie tym za pomoca S2 i S3 ustawimy ilosc krokow potrzebnych na jeden obrot . Nastepnie przyciskajac S1 skaczemy do ROTATIONSSET . W programie tym za pomoca S2 i S3 ustawiamy ilosc obrotow .Nastepnie przyciskajac S1 skaczemy do SPEEDSET . W programie tym za pomoca S2 i S3 ustawiamy predkosc . Nastepnie przyciskajac s1 skaczemy do DIRECTION . W programie tym za pomoca S2 i S3 ustawiamy kierunek . Nastepnie przyciskajac s1 skaczemy do GO_ON . Program ten steruje juz silnikiem I po skonczeniu gdy przycisniemy S1 program skacze do FOURSTEPSSET , I wszystko mozna nastawic od nowa ( gdy nie przerwiemy programu gdy silnik chodzi to wszystko jest w porzadku . Jednak gdy silnik chodzi to mozemy przerwac jego prace przyciskajac S1 wtedy uruchamiamy przerwanie I silnik staje . Gdy znowu przycisniemy S1 to program znowu wraca do programu sterujacego silnikiem . Mozemy tez w programie przerwania przycisnac S2 I program skacze do FOURSTEPSSET . I wszystko mozemy nastawic od nowa ., jednak z jednym problemem . przerwanie juz nie dziala .-tak jakby bylo DISABLE . Mysle , ze chyba dosc jasno opisalem zasade dzialania .
Czy takie skakanie z podprogramu do podprogramu jest dozwolone ??
Czy w programie przerwania mozna tez skakac do innych podprogramow – czy program musi przejsc przez RETURN ?
pzdr

piotrs
-
-
Posty:48
Rejestracja:29 kwie 2003, o 04:19

Postautor: piotrs » 22 mar 2004, o 05:51

Czesc !
OK zmienilem troche program . Przedewszystkim program wychodzi z przerwania urzywajac return i wywoluje podprogram FINISH ( nowy dodany . Ale to i tak nic nie dalo . Po zrobieniu wszystkich ustawien od nowa i odpaleniu podprogramu w ktorym silnik zaczyna pracowac , przerwanie tak jakby nie istnialo :evil: :x :( :?

Sub Finish 'dodalem FINISH podprogram
Disable Int0
Locate 1 , 1
Lcd "Finished :"
Do
If S1 = 0 Then
Cls
Lcd "Please set up"
Wait 1
Call Fourstepsset
End If
Loop
End Sub

Sub Ddelay:
Waitms T
If Kod = 1 Then 'dodalem to
Call Finish
End If
End Sub

Sto_p:
Disable Int0
Home
Lcd " Stop "
Wait 1
Do
Home
Lcd "S1-start "
Waitms 250
Home
Lcd "S2-quit "
Waitms 250
If S1 = 0 Then
Waitms 250
Home
Lcd "start "
Wait 2
Home
Lcd "progress:"
Enable Int0
Return
End If

If S2 = 0 Then 'zmienilem to
Wait 1
Kod = 1
Return
End If
Loop
Return


Dalej nie chodzi i dalej nic nie wiem
pzdr

wojwo
-
-
Posty:15
Rejestracja:25 sie 2003, o 15:59

Postautor: wojwo » 22 mar 2004, o 12:15

Chyba trzeba zacząć od nowa.Czy napewno musisz korzystać z przerwania?Rozumię że to jest program główny
Do
If S1 = 0 Then
Waitms 250
Call Fourstepsset
End If

Loop

Czyli w pętli czekasz kiedy zostanie wciśnięty S1. Wciśnięcie S1 powoduje równierz wywołanie przerwania Int0(z listingu programu wynika że jest ono nie włączone- 'Enable Int0)W procedurze obsługi przerwania ten sam fragment programu jest wykonywany po spełnieniu warunku wciśnięty S2
Nadal wydaje mi się że program jest dziwnie zapętlony i trudno wyłapać w którym momencie "idzie w krzaki".Nadal nie rozumię jaką rolę ma tu pełnić przerwanie, jeżeli i tak w pętli Do-Loop czekasz na spełnienie warunku S=0?
pozdrawiam Wojtek

piotrs
-
-
Posty:48
Rejestracja:29 kwie 2003, o 04:19

Postautor: piotrs » 22 mar 2004, o 18:27

Czesc !
Akurat nie .W moim zalozeniu , przerwanie ma dzialac tylko w podprogramie Go_on . Jak przeanalizujesz ten podprogram to na poczatku jest tam enableInt0 . Po przycisnieciu S1 wlacza sie przerwanie i wylacza silnik az do momentu ponownego wcisniecia S1( powrot do podprogramu Go_on .Moze i jest tam zamieszane . Zaczynam cos tworzyc w Baskomie i nie zdziwie sie jak cos robie tam zle .
pzdr

piotrs
-
-
Posty:48
Rejestracja:29 kwie 2003, o 04:19

Postautor: piotrs » 23 mar 2004, o 05:11

Czesc !
Ok , zmienilem calkowicie wyglad swojego programu . Teraz juz program nie skacze z podprogramu do podprogramu . Wszystko teraz dszieje sie w petli glownej . Ale co z tego jak dalej nie dziala !! :evil: :evil:

Podaje nowy program :

'$sim
$large
Config Lcd = 16 * 1a 'a
Cursor Off
Declare Sub Foursteps_left
Declare Sub Foursteps_right
Declare Sub Fourstepsset
Declare Sub Rotationsset
Declare Sub Speedset
Declare Sub Ddelay
Declare Sub Direction
Declare Sub Finish
Dim T As Byte
Dim R As Word
Dim 4steps As Byte
Dim Rotations As Word
Dim X As Byte
Dim D As Bit
Dim Kod As Bit

S1 Alias P3.2
S2 Alias P3.5
S3 Alias P3.7
Reset P3.0 : Reset P3.1 : Reset P3.4 : Reset P3.3

Enable Interrupts
Enable Int0
On Int0 Sto_p Nosave
Disable Int0

D = 0
T = 1
4steps = 100
Rotations = 10
Cls
Lcd "SILNIK KROKOWY"
Wait 1
Kod = 0

Do

Call Fourstepsset
Call Rotationsset
Call Speedset
Call Direction

Kod = 0
Cls
Lcd "waiting..."
Wait 2
Cls
Lcd "Progress:"
Enable Int0

If D = 1 Then
For R = 1 To Rotations
If Kod = 1 Then
Exit For
End If

For X = 1 To 4steps
Call Foursteps_right
Next X
Locate 2 , 4
Lcd R
Next R

Reset P3.0 : Reset P3.1 : Reset P3.4 : Reset P3.3
End If

If D = 0 Then
For R = 1 To Rotations
If Kod = 1 Then
Exit For
End If

For X = 1 To 4steps
Call Foursteps_left
Next X
Locate 2 , 4
Lcd R
Next R
Reset P3.0 : Reset P3.1 : Reset P3.4 : Reset P3.3
End If

Call Finish

Loop


' *********** SUB PROGRAMS **************************

Sub Fourstepsset:

Do
Cls
Lcd "X 4steps:" ; 4steps
Waitms 20

If S2 = 0 Then
Waitms 100
Decr 4steps
End If

If S3 = 0 Then
Waitms 100
Incr 4steps
End If

If S1 = 0 Then
Waitms 100
Exit Sub
End If
Loop
End Sub
'----------------
Sub Rotationsset:
Do
Cls
Lcd "Turns:" ; Rotations
Waitms 20

If S2 = 0 Then
Waitms 100
Decr Rotations
End If

If S3 = 0 Then
Incr Rotations
Waitms 100
End If

If S1 = 0 Then
Waitms 250
Exit Sub
End If
Loop
End Sub
'--------------
Sub Speedset:
Do
Cls
Lcd "Speed:" ; T
Waitms 10

If S2 = 0 Then
Waitms 100
Decr T
End If

If S3 = 0 Then
Waitms 100
Incr T
End If

If S1 = 0 Then
Waitms 250
Cls
Lcd "Direction:"
Exit Sub
End If
Loop
End Sub
'----------------
Sub Direction:

Do
If D = 0 Then
Locate 2 , 4
Lcd "L"
Else
Locate 2 , 4
Lcd "R"
End If

Waitms 20

If S2 = 0 Then
Waitms 100
D = 0
End If

If S3 = 0 Then
Waitms 100
D = 1
End If

If S1 = 0 Then
Waitms 100
Exit Sub
End If
Loop
End Sub
'--------------
Sub Foursteps_left:
Set P3.0 : Reset P3.1 : Reset P3.4 : Reset P3.3
Call Ddelay
Reset P3.0 : Set P3.1 : Reset P3.4 : Reset P3.3
Call Ddelay
Reset P3.0 : Reset P3.1 : Set P3.4 : Reset P3.3
Call Ddelay
Reset P3.0 : Reset P3.1 : Reset P3.4 : Set P3.3
Call Ddelay
End Sub
'--------------
Sub Foursteps_right:
Reset P3.0 : Reset P3.1 : Set P3.4 : Reset P3.3
Call Ddelay
Reset P3.0 : Set P3.1 : Reset P3.4 : Reset P3.3
Call Ddelay
Set P3.0 : Reset P3.1 : Reset P3.4 : Reset P3.3
Call Ddelay
Reset P3.0 : Reset P3.1 : Reset P3.4 : Set P3.3
Call Ddelay
End Sub
'--------------
Sub Ddelay:
Waitms T
End Sub
'---------------
Sub Finish
Disable Int0
Locate 1 , 1
Lcd "Finished :"
Do
If S1 = 0 Then
Cls
Lcd "Please set up"
Wait 1
Exit Sub
End If
Loop
End Sub

'***** PRZERWANIE ************

Sto_p:
Disable Int0
Home
Lcd " Stop "
Wait 1
Do
Home
Lcd "S1-start "
Waitms 250
Home
Lcd "S2-quit "
Waitms 250
If S1 = 0 Then
Waitms 250
Home
Lcd "start "
Wait 2
Home
Lcd "progress:"
Enable Int0
Return
End If

If S2 = 0 Then
Wait 1
Kod = 1
Return
End If
Loop
Return


teraz to juz calkiem jestem glupi
pzdr

piotrs
-
-
Posty:48
Rejestracja:29 kwie 2003, o 04:19

Postautor: piotrs » 24 mar 2004, o 05:42

CZesc !
Po paru dniach walki z Bascomem znalazlem problem . Na dobra droge wyprowadzil mnie Polski help do Bascoma. A mianowicie "RETURN" nie moze wystepowac pod warunkiem np IF (w angielskij wersji nie bylo otym wzmianki). U mnie wystepowal on on az dwa razy . Teraz nareszcie moge sie pochwalic , ze moj program jest ok . Jesli kogos interesuje ten program to go zamieszcze na forum
dzieki za pomoc
pzdr

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 15 gości