Strona 4 z 4
Re: AVR, PCF8574, sterowanie Silnikiem unipolarnym ok 1,5A
: 26 wrz 2019, 12:37
autor: niveasoft
Jak to nie problem i możesz/chcesz to wrzuć ten kod w jednym kawałku to może coś tu wspólnie poprawimy
Re: AVR, PCF8574, sterowanie Silnikiem unipolarnym ok 1,5A
: 26 wrz 2019, 12:58
autor: sp3ots
Witam !
O to chodzi że kopiuję z oryginału który przerobiłem na AVR i kolejno wklejam/przerabiam program.
W oryginale nie ma przerwań.
W oryginale są podprogramy SUB nie mam pojęcia jak działają SUBy, gdzie program idzie po wyjściu z SUBa ? to dla mnie magia.
dlatego przerabiam na podprogramy np: gosub przyciski i wiem dokąd pójdzie program.
Przyciski:
"kod
return
Na razie nie dam kodu, sam będę próbował. Przynajmniej mam jakieś zajęcie.
Bardzo dziękuję za chęć pomocy, jak się "zatnę" w przerabianiu na pewno tu napiszę.
Re: AVR, PCF8574, sterowanie Silnikiem unipolarnym ok 1,5A
: 17 sie 2020, 10:35
autor: sp3ots
Witam po przerwie !
Kilka dni temu uszkodzeniu uległ silnik pompy spustowej w mojej pralce, nawijarka nie skończona i musiałem sobie poradzić w inny sposób. ( silnik miał przerwę uzwojenia )
Z trzech kawałków "łat 40x50" skręciłem prowizoryczną nawijarkę, odwinąłem część przerwanego uzwojenia, nawinąłem z powrotem ten sam drut, złożyłem i pralka działa.
Miał bym niej pracy gdybym miał ukończoną nawijarkę, dlatego powróciłem do poprawiania programu.
Oto obecny program:
'16.08.2020
$regfile = "attiny2313.dat"
$crystal = 8000000
Config Lcdpin = Pin , Db7 = Pd.3 , Db6 = Pd.2 , Db5 = Pa.0 , Db4 = Pa.1 , E = Pd.1 , Rs = Pd.0
Config Lcd = 16 * 2
Cursor Off
Cls
Locate 1 , 1
Lcd "Nawijerka 16.08"
Wait 1
Cls
Config Portb = Output
Config Pind.6 = Input
Portd.6 = 1
Config Pind.5 = Input
Portd.5 = 1
Config Pind.4 = Input
Portd.4 = 1
S3 Alias Pind.6 'Enter
S2 Alias Pind.5 'plus
S1 Alias Pind.4 'minus
Dim R As Byte
Dim Directionflag As Bit 'flaga kierynkowa
Dim Layers As Byte 'warstwy
Dim Zw_1war As Word 'ile zwojow w jednej warstwie
Dim Srednica As Byte 'srednica
Dim Motor1 As Byte
Dim Turns As Long 'zamienia siÄ™
Dim Turning As Long 'obracenie
Dim Motor2 As Byte
Dim Layercount As Word 'ilosc nawinietych zwojow w warstwie
Dim Zwoje As Word 'zmienna pomocnicza do liczenia w dol‚ do zera
Dim Ile_warstw As Word
Zwoje = 6
Zw_1war = 2
Srednica = 5
Locate 2 , 1
Lcd "--->"
Do
Gosub Programowanie
Loop
End
Programowanie:
Turns = Zwoje
Portb = &B00000000
Locate 1 , 1
Lcd "Zwoje:"
Do
Locate 1 , 11
Lcd " "
Locate 1 , 11
Lcd Turns
If S1 = 0 Then
Decr Turns
End If
If S2 = 0 Then
Incr Turns
End If
Zwoje = Turns 'zwoje
If S3 = 0 Then
Bitwait S3 , Set
Waitms 20
Gosub Ilosc_zw_warstwa
End If
Waitms 120
Loop
Return
Ilosc_zw_warstwa:
Cls
Lcd "zw_1war:" 'liczba zwojĂłw w warstwie
Do
'Locate 1 , 11
'Lcd " "
Locate 1 , 11
Lcd Zw_1war
Waitms 250
If S1 = 0 Then
Decr Zw_1war
End If
If S2 = 0 Then
Incr Zw_1war
End If
If S3 = 0 Then
Bitwait S3 , Set
Waitms 20
Gosub Srednica_drutu
End If
Loop
Return
Srednica_drutu:
Cls
Lcd "Srednica: 0," ;
Waitms 250
Do
'Locate 1 , 13
Lcd " "
Locate 1 , 13
Lcd Srednica ; "mm"
Waitms 250
If S1 = 0 Then
Decr Srednica
If Srednica = 101 Then
Srednica = 100
End If
End If
If S2 = 0 Then
Incr Srednica
If Srednica = 0 Then
Srednica = 1
End If
End If
If S3 = 0 Then
Bitwait S3 , Set
Waitms 20
Gosub Work
End If
Loop
Return
Work:
Cls
Directionflag = 0 'flaga kierunkowa
Layercount = 0 'liczba warstw ?
Motor2 = 8
Locate 1 , 1
Lcd "Nawija..."
For Turning = 1 To Turns 'turning-obracanie =1 to turns- zmienia siÄ™
Locate 1 , 12
Lcd Turns ' Turning
Incr Layercount 'liczba warstw ???
If Layercount = Zw_1war Then '
Directionflag = Not Directionflag 'flaga kierunkowa
Layercount = 0
End If
Gosub 1_obrot
Next
Return
1_obrot:
Decr Zwoje 'zwoje do nawinięcia
Locate 2 , 12
If Zwoje < 10 Then
Lcd " "
Elseif Zwoje < 100 Then
Lcd " "
Elseif Zwoje < 1000 Then
End If
Lcd Zwoje
Ile_warstw = Zwoje / Zw_1war
Ile_warstw = Ile_warstw + 1
If Zwoje = 0 Then Ile_warstw = 0
Locate 2 , 6
If Ile_warstw < 10 Then
Lcd " " 'zmniejszyć o jedną spację
End If
Lcd Ile_warstw
If Zwoje = 0 Then Gosub Programowanie
Motor1 = 128
For R = 1 To 200
Portb = Motor1
Waitms 10 ' 7
Shift Motor1 , Right , 1
If Motor1 = 8 Then
Motor1 = 128
End If
If S3 = 0 Then 'zatrzymuje nawijanie
Bitwait S3 , Set
Waitms 20
Gosub Programowanie
End If
Next R
Locate 2 , 1
If Directionflag = 0 Then ' flaga kierunkowa
Lcd "--->"
Gosub Motor2_prawo
Else
Lcd "<---"
Gosub Motor2_lewo
End If
Return
Motor2_lewo:
Motor2 = 8
For R = 1 To Srednica
Portb = Motor2
Waitms 5 '50 '200
Shift Motor2 , Right , 1
If Motor2 = 0 Then
Motor2 = 8
End If
Next R
Return
Motor2_prawo:
Motor2 = 1
For R = 1 To Srednica
Portb = Motor2
Waitms 5 '50
Shift Motor2 , Left , 1
If Motor2 = 16 Then
Motor2 = 1
End If
Next R
Return
Testowałem program bez silników z ośmioma LEDami.
Sterowanie silników jest ok, ale chciałbym poprawić zapis na LCD
tak aby wartość zmiennej "Turns" nie zerowała się po skończeniu nawijania.
Druga sprawa to "odchudzenie" kodu jeśli to możliwe.
Pozdrawiam. Stefan
Re: AVR, PCF8574, sterowanie Silnikiem unipolarnym ok 1,5A
: 17 sie 2020, 11:34
autor: niveasoft
Niestety Tiny2313 ma tylko 2KB Flash a sama obsługa wyświetlacza zajmuje około 1KB. Stąd to obciążenie.
Jeśli podłączyłbyś LCD do jednego portu to mógłbyś skorzystać z biblioteki LCD4.LIB
https://wiki.mcselec.com/bavr/LCD4.LIB i oszczędzić sporo miejsca.
Tak na szybko udało mi się oryginalny program odchudzić z 99% do 97%.
Potem sprawdziłem jeszcze jeden myk. Jesli nie potrzebujesz nawijać więcej niż 65535 zwojów to możesz zamiast Long użyć Word i wtedy użyć biblioteki $lib "mcsbyteint.lbx"
W ten sposób kod maleje do 87%
O tym zerowaniu zmiennej zapomniałem. Napisz dokładniej o co chodzi. Zajrzę później.
'16.08.2020
$regfile = "attiny2313.dat"
$crystal = 8000000
$swstack = 8
$hwstack = 14
$framesize = 24
Const 65535_only = 1
#if 65535_only
$lib "mcsbyteint.lbx"
Dim Turns As Word 'zamienia siÄ™
Dim Turning As Word 'obracenie
#else
Dim Turns As Long 'zamienia siÄ™
Dim Turning As Long 'obracenie
#endif
Config Lcdpin = Pin , Db7 = Portd.3 , Db6 = Portd.2 , Db5 = Porta.0 , Db4 = Porta.1 , E = Portd.1 , Rs = Portd.0
Config Lcd = 16x2
Cursor Off
Cls
Locate 1 , 1 : Lcd "Nawijerka 16.08"
Wait 1
Cls
Config Portb = Output
'Portd.6 = 1
'Portd.5 = 1
'Portd.4 = 1
Portd = Portd Or &B0111_0000
S3 Alias Pind.6 'Enter
S2 Alias Pind.5 'plus
S1 Alias Pind.4 'minus
Dim R As Byte
Dim Directionflag As Byte 'flaga kierynkowa
Dim Layers As Byte 'warstwy
Dim Zw_1war As Word 'ile zwojow w jednej warstwie
Dim Srednica As Byte 'srednica
Dim Motor1 As Byte
Dim Motor2 As Byte
Dim Layercount As Word 'ilosc nawinietych zwojow w warstwie
Dim Zwoje As Word 'zmienna pomocnicza do liczenia w dol‚ do zera
Dim Ile_warstw As Word
Zwoje = 6
Zw_1war = 2
Srednica = 5
Locate 2 , 1 : Lcd "--->"
Do
Gosub Programowanie
Loop
End
Programowanie:
Turns = Zwoje
Portb = &B00000000
Locate 1 , 1
Lcd "Zwoje:"
Do
Locate 1 , 11 : Lcd " "
Locate 1 , 11 : Lcd Turns
If S1 = 0 Then
Decr Turns
End If
If S2 = 0 Then
Incr Turns
End If
Zwoje = Turns 'zwoje
If S3 = 0 Then
Bitwait S3 , Set
Waitms 20
Gosub Ilosc_zw_warstwa
End If
Waitms 120
Loop
Return
Ilosc_zw_warstwa:
Cls
Lcd "zw_1war:" 'liczba zwojĂłw w warstwie
Do
'Locate 1 , 11
'Lcd " "
Locate 1 , 11
Lcd Zw_1war
Waitms 250
If S1 = 0 Then
Decr Zw_1war
End If
If S2 = 0 Then
Incr Zw_1war
End If
If S3 = 0 Then
Bitwait S3 , Set
Waitms 20
Gosub Srednica_drutu
End If
Loop
Return
Srednica_drutu:
Cls
Lcd "Srednica: 0," ;
Waitms 250
Do
'Locate 1 , 13
Lcd " "
Locate 1 , 13
Lcd Srednica ; "mm"
Waitms 250
If S1 = 0 Then
Decr Srednica
If Srednica = 101 Then
Srednica = 100
End If
End If
If S2 = 0 Then
Incr Srednica
If Srednica = 0 Then
Srednica = 1
End If
End If
If S3 = 0 Then
Bitwait S3 , Set
Waitms 20
Gosub Work
End If
Loop
Return
Work:
Cls
Directionflag = 0 'flaga kierunkowa
Layercount = 0 'liczba warstw ?
Motor2 = 8
Locate 1 , 1 : Lcd "Nawija..."
For Turning = 1 To Turns 'turning-obracanie =1 to turns- zmienia siÄ™
Locate 1 , 12 : Lcd Turns ' Turning
Incr Layercount 'liczba warstw ???
If Layercount = Zw_1war Then
If Directionflag = 0 Then Directionflag = 1 Else Directionflag = 0 'flaga kierunkowa '
Layercount = 0
End If
Gosub 1_obrot
Next
Return
1_obrot:
Decr Zwoje 'zwoje do nawinięcia
Locate 2 , 12
Select Case Zwoje
Case Is < 10 : Lcd " "
Case Is < 100 : Lcd " "
End Select
Lcd Zwoje
Ile_warstw = Zwoje / Zw_1war
Incr Ile_warstw
If Zwoje = 0 Then Ile_warstw = 0
Locate 2 , 6
If Ile_warstw < 10 Then
Lcd " " 'zmniejszyć o jedną spację
End If
Lcd Ile_warstw
If Zwoje = 0 Then Gosub Programowanie
Motor1 = 128
For R = 1 To 200
Portb = Motor1
Waitms 10 ' 7
Shift Motor1 , Right , 1
If Motor1 = 8 Then
Motor1 = 128
End If
If S3 = 0 Then 'zatrzymuje nawijanie
Bitwait S3 , Set
Waitms 20
Gosub Programowanie
End If
Next R
Locate 2 , 1
If Directionflag = 0 Then ' flaga kierunkowa
Lcd "--->"
Gosub Motor2_prawo
Else
Lcd "<---"
Gosub Motor2_lewo
End If
Return
Motor2_lewo:
Motor2 = 8
For R = 1 To Srednica
Portb = Motor2
Waitms 5 '50 '200
Shift Motor2 , Right , 1
If Motor2 = 0 Then
Motor2 = 8
End If
Next R
Return
Motor2_prawo:
Motor2 = 1
For R = 1 To Srednica
Portb = Motor2
Waitms 5 '50
Shift Motor2 , Left , 1
If Motor2 = 16 Then
Motor2 = 1
End If
Next R
Return
Re: AVR, PCF8574, sterowanie Silnikiem unipolarnym ok 1,5A
: 17 sie 2020, 11:50
autor: sp3ots
Dziękuję za poprawki.
Dziękuję za odchudzenie, w moim Bascomie DEMO 2079 program zajmuje 87% pamięci.
Program do zakończenia nawijania działa poprawnie, ( liczenie w dół ilość zwojów =0, liczenie w dół ilość warstw=0, zwoje do nawinięcia =0, to chciałem aby po nawinięciu pozostało ). Do tej pory program działa dobrze.
Pokazują się same zera przedtem była możliwość wpisania kolejnych zwojów do nawinięcia, od zera można dodać ilość zwojów, ale kiedy nacisnę S3 aby przejść do zmiany nastawy ilości zwojów w warstwie, na LCD górna linia robi się cała czarna, dół bez napisów, przyciski nie reagują.
Re: AVR, PCF8574, sterowanie Silnikiem unipolarnym ok 1,5A
: 17 sie 2020, 18:24
autor: sp3ots
Tak miał działać program:
Włączenie:
na LCD pojawia się Zwoje: ilość wstępnie zapisana w programie.
S1 zmniejsza ilość zwojów, S2 zwiększa
S3 wchodzi kolejno w zmiany ilości zwojów w każdej warstwie
S1 zmniejsza ilość zwojów w jednej warstwie, S2 zwiększa
S3 wchodzi do zmiany ustawień średnicy drutu
S1, S2 jak wyżej
S3 kończy zmiany i rozpoczyna nawijanie.
W czasie nawijania wciśnięcie S3 powoduje zatrzymanie pracy nawijarki i wejście do MENU.
Można wtedy modyfikować wszystkie trzy parametry.
S3 włącza nawijanie.
Po skończonej pracy nawijarki na LCD pojawiają wszystkie parametry wyzerowane.
Na LCD widoczne są kierunki nawijania kolejnych warstw ( strzałki - prawo/lewo ).
Chciałbym aby parametr zwoje pozostał, w tej chwili zeruje się razem z pozostałymi parametrami.
LCD jest na różnych portach.
Zaremowałem tą linię:
$lib "mcsbyteint.lbx"
teraz program działa, kod zajmuje 93% pamięci ATTiny2313.
Re: AVR, PCF8574, sterowanie Silnikiem unipolarnym ok 1,5A
: 07 gru 2022, 21:14
autor: sp3ots
Dobry wieczór po dwóch latach !
Powróciłem do "nawijarki":
Zmiana koncepcji, dwa silniki bipolarne, dwa sterowniki TB6600, oto "program":
$regfile = "attiny2313.dat"
$crystal = 8000000 'wewnętrzny oscylator 8MHz
$swstack = 8
$hwstack = 14
$framesize = 24
Config Lcdpin = Pin , Db7 = Pb.2 , Db6 = Pb.3 , Db5 = Pb.4 , Db4 = Pb.5 , E = Pb.6 , Rs = Pb.7
'Config Lcdpin = Pin , Db7 = Pd.3 , Db6 = Pd.2 , Db5 = Pa.0 , Db4 = Pa.1 , E = Pd.1 , Rs = Pd.0
Config Lcd = 16 * 2
Cursor Off
Cls
Locate 1 , 1
Lcd "Naw 07.12.22"
'Wait 1
Cls
Config Pind.0 = Output
Dir_1 Alias Portd.0
Config Pind.1 = Output
Pul_1 Alias Portd.1
Config Pind.2 = Output
Pul_2 Alias Portd.2
Config Pind.3 = Output
Ena_1 Alias Portd.3
Config Pina.1 = Output
Dir_2 Alias Porta.1
Config Pind.6 = Input
Portd.6 = 1
Config Pind.5 = Input
Portd.5 = 1
Config Pind.4 = Input
Portd.4 = 1
S3 Alias Pind.6 'Enter
S2 Alias Pind.5 'plus
S1 Alias Pind.4 'minus
Dim Licz As Integer
Dim R As Integer 'Byte
Dim Directionflag As Bit 'flaga kierynkowa
Dim Layers As Byte 'warstwy
Dim Zw_1war As Word 'ile zwojow w jednej warstwie
Dim Srednica As Byte 'srednica
Dim Motor1 As Byte
Dim Turns As Word 'Long 'zamienia siÄ™
Dim Turning As Word 'obracenie
Dim Motor2 As Byte
Dim Layercount As Word 'ilosc nawinietych zwojow w warstwie
Dim Zwoje As Word 'zmienna pomocnicza do liczenia w dol‚ do zera
Dim Ile_warstw As Word
Dim Zwoje_lcd As Word
Zwoje = 10
Zw_1war = 2
Srednica = 5
'Locate 2 , 1
'Lcd "--->"
Do
Gosub Programowanie
Loop
End
'Zwoje_lcd = Zwoje
Programowanie:
'Zwoje_lcd = 0
Turns = Zwoje
'Portb = &B00000000
Locate 1 , 1
Lcd "Zwoje:"
Do
Locate 1 , 11
If Turns < 10 Then Lcd " "
If Turns < 100 Then Lcd " "
If Turns < 1000 Then Lcd " "
Lcd Turns
If S1 = 0 Then
Decr Turns
End If
If S2 = 0 Then
Incr Turns
End If
Zwoje = Turns 'zwoje
If S3 = 0 Then
Bitwait S3 , Set
Waitms 20
Gosub Ilosc_zw_warstwa
End If
Waitms 200
Loop
Return
Ilosc_zw_warstwa:
Cls
Lcd "zw_1war:" 'liczba zwojĂłw w warstwie
Do
Locate 1 , 11
If Zw_1war < 10 Then Lcd " "
Lcd Zw_1war
If S1 = 0 Then
Decr Zw_1war
End If
If S2 = 0 Then
Incr Zw_1war
End If
If S3 = 0 Then
Bitwait S3 , Set
Waitms 20
Gosub Srednica_drutu
End If
Waitms 200
Loop
Return
Srednica_drutu:
Cls
Lcd "Srednica: 0,"
Do
'Locate 1 , 13
Lcd " "
Locate 1 , 13
Lcd Srednica ; "mm"
If S1 = 0 Then
Decr Srednica
If Srednica = 101 Then
Srednica = 100
End If
End If
If S2 = 0 Then
Incr Srednica
If Srednica = 0 Then
Srednica = 1
End If
End If
If S3 = 0 Then
Bitwait S3 , Set
Waitms 20
Gosub Work
End If
Waitms 200
Loop
Return
Work:
Cls
Directionflag = 0 '0 'flaga kierunkowa
Layercount = 0 'liczba warstw ?
Motor2 = 8
Locate 1 , 1
Lcd "Nawija..."
Locate 2 , 1
Lcd "--->"
For Turning = 1 To Turns 'turning-obracanie =1 to turns- zmienia siÄ™
Locate 1 , 11
If Turns < 10 Then Lcd " "
If Turns < 100 Then Lcd " "
Lcd Turns ' Turning
Incr Layercount 'liczba warstw ???
If Layercount = Zw_1war Then '
Directionflag = Not Directionflag 'flaga kierunkowa
Layercount = 0
End If
Gosub 1_obrot
Next
Return
1_obrot:
'Decr Zwoje
Incr Zwoje_lcd
Locate 2 , 11
If Zwoje_lcd < 10 Then Lcd " "
Lcd Zwoje_lcd
If Zwoje_lcd = Zwoje Then
Zwoje_lcd = 0
'End If
Gosub Programowanie
End If
Ile_warstw = Zwoje / Zw_1war
'Ile_warstw = Ile_warstw + 1
If Zwoje = 0 Then Ile_warstw = 0
Locate 2 , 6
If Ile_warstw < 10 Then Lcd " " 'zmniejszyć o jedną spację
Lcd Ile_warstw
If Zwoje = 0 Then Gosub Programowanie
Motor1 = 128
For R = 1 To 800 '0
Toggle Pul_1
'Dir_1 = 1
'Portb = Motor1
Waitms 1 ' 7
'Shift Motor1 , Right , 1
'if Motor1 = 8 Then
'Motor1 = 128
'End If
If S3 = 0 Then 'zatrzymuje nawijanie
Bitwait S3 , Set
Waitms 20
'Gosub Ilosc_zw_warstwa ' Programowanie
Gosub Programowanie
End If
Next R
Locate 2 , 1
If Directionflag = 0 Then ' flaga kierunkowa
Lcd "--->"
Gosub Motor2_prawo
Else
Lcd "<---"
Gosub Motor2_lewo
End If
Return
Motor2_lewo:
'Dir_2 = 0
Motor2 = 0 '8
For R = 1 To Srednica
Incr Licz
'For Licz = 1 To 800 '0
Licz = 0
Toggle Pul_2
'Next Licz
'If Motor2 = 0 Then
'Toggle Pul_2
Waitms 10
'Portb = Motor2
'Waitms 500 '50 '200
'Shift Motor2 , Right , 1
'If Motor2 = 0 Then '0
'Motor2 = 8 '8
'End If
Next R
Return
Motor2_prawo:
'Dir_2 = 1
Locate 2 , 1
Lcd "--->"
Motor2 = 1 '1
For R = 1 To Srednica
Incr Licz
'For Licz = 1 To 800 '0
'Licz = 0
Toggle Pul_2
Waitms 10
'Next Licz
'Portb = Motor2
'Waitms 500 '50
'Shift Motor2 , Left , 1
'If Motor2 = 16 Then '16
'Motor2 = 0 '1
'End If
Next R
Return
Silnik nr. 1 odpowiada za nawijanie - ta część programu działa poprawnie.
Silnik nr. 2 odpowiada za posuw lewo/prawo - tu mam problem, nie umiem zmusić sterownika TB6600 aby silnik wykonał jeden obrót.
Sterowniki ustawione na krok 200.
Proszę o pomoc.
W programie są pozostawione, zaremowane fragmenty sterowania silnikami unipolarnymi przez klucze tranzystorowe.
Pozdrawiam. Stefan
Re: AVR, PCF8574, sterowanie Silnikiem unipolarnym ok 1,5A
: 07 gru 2022, 22:08
autor: niveasoft
Stefan czy Jacek?
Re: AVR, PCF8574, sterowanie Silnikiem unipolarnym ok 1,5A
: 07 gru 2022, 22:12
autor: Jacek
Witam - nie mój temat
pozdrawiam Jacek.