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
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
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
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
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
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
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
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
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
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
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
.
.
.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
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
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
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
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
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
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
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
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
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
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
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 !!
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
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 !!
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
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
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
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 51 gości