Mam nawijarkę do cewek opublikowaną w Elektronice Praktycznej. Wykonana według tego opisu i z oprogramowaniem zamieszczonym przez Autora wykorzystywałem do nawijania cewek masowych. Zaszła potrzeba nawinięcia cewek warstwowych z przekładkami izolacyjnymi po każdej warstwie i zaczęły się "schody". Nie jestem "biegły" w Bascomie 8051 i nie wiem jak "zmusić" oprogramowanie, by podczas nawijania program zatrzymał się np. na 1 minutę po nawinięciu warstwy i po upływie tego czasu nawijarka kontynuowała wykonywanie programu. Po nawinięciu kolejnej warstwy ponowne zatrzymanie itd.
A może jest możliwość wykorzystania przycisku S4 (on teraz służy do wyjścia z pętli i z podprogramu), by po zatrzymaniu się po nawinięciu jednej warstwy, włożeniu przekładki tym przyciskiem wznowić kontynuowanie wykonywania programu?
Będę wdzięczny za uwagi i podpowiedzi.
A tu jest program:
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $crystal = 11059200
- '$large
- Config Sda = P3.1
- Config Scl = P3.0
- Config Lcd = 16 * 1a
- Cursor Off
- I2csend 112 , 0
- Dim R As Byte
- Dim Directionflag As Bit
- Dim Layers As Byte
- Dim Layer As Word
- Dim Diameter As Byte
- Dim Motor1 As Byte
- Dim Turns As Long
- Dim Turning As Long
- Dim Motor2 As Byte
- Dim Layercount As Word
- Declare Sub 1 Turn
- Declare Sub Programowanie
- Declare Sub Work
- Declare Sub Wybor
- Declare Sub Motor2_right
- Declare Sub Motor2_left
- S1 Alias P3.7
- S2 Alias P3.5
- S3 Alias P3.4
- S4 Alias P3.3
- Cls
- Locate 1 , 4
- Lcd "AVT-896"
- Wait 3
- Cls
- Lcd "Programowanie"
- Wait 2
- Cls
- Turns = 100
- Diameter = 10
- Layer = 10
- Sub Programowanie
- Cls 'wyczyść Ekran Wyświetlacza
- Lcd "Zwoje:" ; 'wyświetl Komunikat Zachęty
- Do
- Locate 1 , 11
- Lcd " "
- Locate 1 , 11
- Lcd Turns 'wyświetl Wartość Zmiennej Rurns Określającej Liczbę Zwojów Do Nawinięcia
- Waitms 250 'zaczekaj 250 ms
- Set S1 'ustaw stan wysoki na przycisku S1
- If S1 = 0 Then 'jeżeli przycisk naci.nięty to:
- Incr Turns 'zwiększ warto.ć zmiennej TURNS
- End If 'koniec warunku
- Set S2 'ustaw stan wysoki na przycisku S2
- If S2 = 0 Then 'jeżeli przycisk naciśnięty to:
- Decr Turns 'zmniejsz warto.ć zmiennej TURNS
- If Turns = 5 Then
- Turns = 6
- End If 'koniec warunku
- End If 'koniec warunku
- Set S4 'ustaw stan wysoki na przycisku S4
- If S4 = 0 Then 'jeżeli przycisk naciśnięty to:
- Exit Do 'wyjdź z pętli i podprogramu
- End If 'koniec warunku
- Loop
- Cls
- Lcd "Warstwa:" ;
- Do
- Locate 1 , 11
- Lcd " "
- Locate 1 , 11
- Lcd Layer
- Waitms 250
- Set S1
- If S1 = 0 Then
- Incr Layer
- End If
- Set S2
- If S2 = 0 Then
- Decr Layer
- If Layer = 5 Then
- Layer = 6
- End If
- End If
- Set S4
- If S4 = 0 Then
- Exit Do
- End If
- Loop
- Cls
- Lcd "Srednica: 0," ;
- Waitms 250
- Do
- Locate 1 , 13
- Lcd " "
- Locate 1 , 13
- Lcd Diameter ; "mm"
- Waitms 250
- Set S1
- If S1 = 0 Then
- Incr Diameter
- If Diameter = 101 Then
- Diameter = 100
- End If
- End If
- Set S2
- If S2 = 0 Then
- Decr Diameter
- If Diameter = 0 Then
- Diameter = 1
- End If
- End If
- Set S4
- If S4 = 0 Then
- Exit Do
- End If
- Loop
- Call Wybor
- End Sub
- Sub Work
- Cls
- Directionflag = 0
- Layercount = 0
- Motor2 = 8
- Lcd "Working..";
- For Turning = 1 To Turns
- Locate 1 , 12
- Lcd Turning
- Call 1turn
- Incr Layercount
- If Layercount = Layer Then
- Directionflag = Not Directionflag
- Layercount = 0
- End If
- Set S4
- If S4 = 0 Then
- Call Wybor
- End If
- Next R
- I2csend 112 , 0
- Call Wybor
- End Sub
- Sub Wybor
- Cls
- Lcd "GO- S4, Prg.- S3"
- Waitms 250
- Do
- Set S4 : Set S3
- If S3 = 0 Then
- Call Programowanie
- End If
- If S4 = 0 Then
- Call Work
- End If
- Loop
- End Sub
- Sub 1turn 'podprogram wykonujący 1 obrót silnika krokowego
- Motor1 = 128 'nadanie Wstępnej Wartości Zmiennej Wysyłanej Do Pcf8574.wykonanie Tej
- 'linii Programu Spowoduje Powstanie Stanu Wysokiego Na Wyjściu D7 Ic3
- For R = 1 To 100 'aby Uzyskać Obrót Silnika O 360 Stopni Należy Poniższe Czynności
- 'powtórzyć Sto Razy:
- I2csend 112 , Motor1 'wyślij Do Pcf8574 Zmienną Motor1
- Waitms 7 'zaczekaj 7 Ms(największa Możliwa Prędkość Obrotowa)
- Shift Motor1 , Right , 1 'przesuń Wartość Zmiennej Motor1 O 1 Bit W Prawo
- If Motor1 = 8 Then 'jeżeli Wartość Zmiennej Motor1 Równa 8 To:
- Motor1 = 128 'zmienna Motor1 Przyjmuje Wartość 8
- End If 'koniec Warunku
- Next R
- If Directionflag = 0 Then 'jeżeli wartość zmiennej pomocniczej DIRECTIONFLAG równa 0 to:
- Call Motor2_right 'wezwij podprogram przesuwania prowadnicy przewodu w prawo
- Else 'w przeciwnym wypadku:
- Call Motor2_left 'wezwij Podprogram Przesuwania Prowadnicy Przewodu W Lewo
- End If 'koniec warunku
- End Sub 'koniec podprogramu
- Sub Motor2_left
- For R = 1 To Diameter
- I2csend 112 , Motor2
- Waitms 7
- Shift Motor2 , Right , 1
- If Motor2 = 0 Then
- Motor2 = 8
- End If
- Next R
- End Sub
- Sub Motor2_right
- For R = 1 To Diameter
- I2csend 112 , Motor2
- Waitms 7
- Shift Motor2 , Left , 1
- If Motor2 = 16 Then
- Motor2 = 1
- End If
- Next R
- End Sub