AVR, PCF8574, sterowanie Silnikiem unipolarnym ok 1,5A

Opisy sprzetu, modułów, programatorów, pinout itp.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: AVR, PCF8574, sterowanie Silnikiem unipolarnym ok 1,5A

Post autor: Jacek » 25 wrz 2019, 17:20

Witam a używałeś alias'w:
  1.  
  2. kanal_a alias pind.2
  3.  
pozdr. Jacek.
Awatar użytkownika
niveasoft
Posty: 1207
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: AVR, PCF8574, sterowanie Silnikiem unipolarnym ok 1,5A

Post autor: niveasoft » 25 wrz 2019, 18:06

Tak prosto się chyba nie da. Jeśli bity w portach były by po kolei obok siebie tak jak pytałeś to jeszcze można by to ogarnąć kilkoma szybkimi instrukcjami.
Mógłbyś też rozważyć dodanie rejestru przesuwnego np. 74HC595. Właśnie coś na tym skończyłem i nadaję do nich dane szyną @4MHz.
sp3ots
Posty: 42
Rejestracja: 08 wrz 2018, 10:26

Re: AVR, PCF8574, sterowanie Silnikiem unipolarnym ok 1,5A

Post autor: sp3ots » 25 wrz 2019, 20:18

Dziękuję za wiadomość, jeśli w prosty sposób nie da się tego zrobić to przesunę LCD 2x16 na te porty o których pisałem wyżej, a port B w całości wykorzystam do sterowania dwóch silników krokowych.
Cały czas bawię się z przerabianiem KITu Nawijarka.
Wykorzystam ATtiny2313+LCD 2x16+ 8xIRLZ44 i tylko trzy przyciski ( oryginał miał 4 przyciski ).
Pinów w sam raz na taki projekt.
Mam pytanie jak poprawnie w przerwaniach pisać program z przyciskami ?
  1. $regfile = "attiny2313.dat"
  2. $crystal = 8000000
  3. Config Lcdpin = Pin , Db7 = Pd.3 , Db6 = Pd.2 , Db5 = Pa.0 , Db4 = Pa.1 , E = Pd.1 , Rs = Pd.0
  4. Config Lcd = 16 * 2
  5. Cursor Off
  6. Cls
  7. Locate 1 , 1
  8. Lcd "Nawijerka"
  9. Cls
  10. Config Timer0 = Timer , Prescale = 256                      
  11. Config Pind.6 = Input
  12. Portd.6 = 1
  13. Config Pind.5 = Input
  14. Portd.5 = 1
  15. Config Pind.4 = Input
  16. Portd.4 = 1
  17. S3 Alias Pind.6
  18. S2 Alias Pind.5
  19. S1 Alias Pind.4
  20. Dim Licz As Integer
  21. Dim temp_4ms As Bit
  22. On Timer0 Odmierz_czas
  23. Enable Interrupts
  24. Enable Timer0
  25. Load Timer0 , 125
  26. Licz = 0
  27. Do
  28. If temp_4ms = 1 Then
  29. temp_4ms = 0
  30. 'Gosub Wyswietlanie
  31. Gosub Przyciski
  32. End If
  33. Loop
  34. End
  35.  
  36. przyciski:
  37. 'czy wolno, fachowo można tu używać Waitms dla zapobieżenia drganiom styków przycisków ?
  38. 'czy zastosować inne sposoby, jakie ?
  39. return
  40.  
  41. Odmierz_czas:
  42. Load Timer0 , 125                                           '4ms    Timer0 = 131 bo 256-131=125
  43. temp_4ms = 1
  44. Incr Licz
  45. If Licz = 250 Then                                          '4ms x 250= 1000ms = 1sek
  46. Licz = 0
  47. End If
  48. Return
  49.  
Awatar użytkownika
niveasoft
Posty: 1207
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: AVR, PCF8574, sterowanie Silnikiem unipolarnym ok 1,5A

Post autor: niveasoft » 25 wrz 2019, 20:27

Zależy. Na proste pikanie plus minus to zwykłe Debounce nawet może być.
Debounce w pętli nie spowalnia niczego dopóki nie naciśniesz przycisku. Jak się naciska przycisk to samo liczy 25ms i po tym sprawdza stan przycisku. Zapamiętuje też stan przycisku i aż do puszczenia nie uruchomi powtórnie podłaczonego do niego sub`a.
Nie nadaje się więc do przycisków z Autorepeat. Czyli na Debounce nie da się zrobić "przytrzymujesz i samo się dodaje/odejmuje".
Zależy więc co tam masz w planie ;)
sp3ots
Posty: 42
Rejestracja: 08 wrz 2018, 10:26

Re: AVR, PCF8574, sterowanie Silnikiem unipolarnym ok 1,5A

Post autor: sp3ots » 25 wrz 2019, 20:38

Nie ma to być proste pikanie, to ma być mini menu:
-,+, "idź dalej". W czasie pracy silników musi być możliwość "STOP" i wejście do poprawy nastaw.
  1. Przyciski:
  2. Lcd "Zwoje:"
  3. Bitwait S3 , Set
  4. Do
  5. Locate 1 , 11
  6. Lcd "     "
  7. Locate 1 , 11
  8. Lcd Turns
  9. If S1 = 0 Then
  10. Decr Turns
  11. End If
  12. If S2 = 0 Then
  13. Incr Turns
  14. End If
  15. If S3 = 0 Then
  16. Gosub Ilosc_zw_warstwa
  17. End If
  18. 'Locate 2 , 1
  19. 'Lcd "zw=" ; Turns
  20. Waitms 120
  21. Loop
  22. Return
  23.  
  24. Ilosc_zw_warstwa:
  25. Locate 1 , 1
  26. Lcd "Warstwa:"                                              'liczba zwojów w warstwie
  27. 'Waitms 200
  28. Bitwait S3 , Set
  29. Do
  30. Locate 2 , 11
  31. Lcd "     "
  32. Locate 2 , 11
  33. Lcd Layer
  34.  
  35. If S1 = 0 Then
  36. Decr Layer
  37. End If
  38.  
  39. If S2 = 0 Then
  40. Incr Layer
  41. 'If Layer = 5 Then
  42. 'Layer = 6
  43. 'End If
  44. End If
  45.  
  46. If S3 = 0 Then
  47. Locate 1 , 1
  48. Lcd "nawijaj"
  49. Gosub Nawijanie
  50. End If
  51. 'Locate 2 , 7
  52. 'Lcd " zw/war=" ; Layer
  53. Waitms 120
  54. Loop
  55. Return
  56. Nawijanie:
  57. Cls
  58. Bitwait S3 , Set
  59. Do
  60. Locate 1 , 1
  61. Lcd Turns
  62.  
  63. Decr Turns
  64. Motor1 = 128
  65. For R = 1 To 200                                            ' 200          '100
  66. 'Motor3 = 255 - Motor1
  67. Portb = Motor1                                              '3                                              '112
  68. Waitms 100                                                  ' 7
  69. Shift Motor1 , Right , 1
  70. If Motor1 = 8 Then
  71. Motor1 = 128
  72. End If
  73. Next R
  74. If Directionflag = 0 Then
  75. 'Locate 2 , 1
  76. 'Lcd "prawo"
  77. 'Call Motor2_right
  78. Else
  79. 'Locate 2 , 1
  80. 'Lcd "lewo"
  81. 'Call Motor2_left
  82. End If
  83. If Turns < 0 Then Turns = 0
  84. Waitms 200
  85. If Turns = 0 Then Gosub Przyciski
  86. Loop
  87. Return
Taki kod napisałem ( część skopiowałem z oryginału KITu ), on działa nie pewnie ( przyciski ) dodałem tam BITWAITy co nieco poprawiło działanie.
Poprzedni kod jest niepełny brak deklaracji niektórych zmiennych.
Awatar użytkownika
niveasoft
Posty: 1207
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: AVR, PCF8574, sterowanie Silnikiem unipolarnym ok 1,5A

Post autor: niveasoft » 25 wrz 2019, 21:29

Zobacz tak na odwrót. Najpierw musi być zwolniony przycisk żeby skoczył. To już w kolejnym subie raczej nie wyskoczy ;)

BTW. Taki kod z wcięciami chyba sie lepiej czyta co?
Z Twoim zrobiłem tak że w Bascom CTRL+A i potem EDIT->Proper Indent
  1. Przyciski:
  2.    Lcd "Zwoje:"
  3.  
  4.    Do
  5.       Locate 1 , 11
  6.       Lcd "     "
  7.       Locate 1 , 11
  8.       Lcd Turns
  9.       If S1 = 0 Then
  10.          Decr Turns
  11.       End If
  12.       If S2 = 0 Then
  13.          Incr Turns
  14.       End If
  15.       If S3 = 0 Then
  16.        Bitwait S3 , Set                                     'najpierw poczekaj na zwolnienie przycisku
  17.         Waitms 20
  18.         Gosub Ilosc_zw_warstwa
  19.       End If
  20.        'Locate 2 , 1
  21.        'Lcd "zw=" ; Turns
  22.       Waitms 120
  23.    Loop
  24. Return
  25.  
  26. Ilosc_zw_warstwa:
  27.    Locate 1 , 1
  28.    Lcd "Warstwa:"                                              'liczba zwojów w warstwie
  29.     'Waitms 200
  30.  
  31.    Do
  32.       Locate 2 , 11
  33.       Lcd "     "
  34.       Locate 2 , 11
  35.       Lcd Layer
  36.  
  37.       If S1 = 0 Then
  38.          Decr Layer
  39.       End If
  40.  
  41.       If S2 = 0 Then
  42.          Incr Layer
  43.        'If Layer = 5 Then
  44.        'Layer = 6
  45.        'End If
  46.       End If
  47.  
  48.       If S3 = 0 Then
  49.        Bitwait S3 , Set
  50.         Waitms 20
  51.          Locate 1 , 1
  52.          Lcd "nawijaj"
  53.          Gosub Nawijanie
  54.       End If
  55.        'Locate 2 , 7
  56.        'Lcd " zw/war=" ; Layer
  57.       Waitms 120
  58.    Loop
  59. Return
  60.  
  61. Nawijanie:
  62.    Cls
  63.  
  64.    Do
  65.       Locate 1 , 1
  66.       Lcd Turns
  67.  
  68.       Decr Turns
  69.       Motor1 = 128
  70.       For R = 1 To 200                                            ' 200          '100
  71.        'Motor3 = 255 - Motor1
  72.          Portb = Motor1                                              '3                                              '112
  73.          Waitms 100                                                  ' 7
  74.          Shift Motor1 , Right , 1
  75.          If Motor1 = 8 Then
  76.             Motor1 = 128
  77.          End If
  78.       Next R
  79.       If Directionflag = 0 Then
  80.        'Locate 2 , 1
  81.        'Lcd "prawo"
  82.        'Call Motor2_right
  83.       Else
  84.        'Locate 2 , 1
  85.        'Lcd "lewo"
  86.        'Call Motor2_left
  87.       End If
  88.       If Turns < 0 Then Turns = 0
  89.       Waitms 200
  90.       If Turns = 0 Then Gosub Przyciski
  91.    Loop
  92. Return
sp3ots
Posty: 42
Rejestracja: 08 wrz 2018, 10:26

Re: AVR, PCF8574, sterowanie Silnikiem unipolarnym ok 1,5A

Post autor: sp3ots » 25 wrz 2019, 21:40

Dziękuję, jutro sprawdzę jak działa.
Wcięcia, mi obojętne są, zawsze trzeba wiedzieć jak to działa.
Mam 63lata, nie mam pojęcia co to jest BTW.
Awatar użytkownika
niveasoft
Posty: 1207
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: AVR, PCF8574, sterowanie Silnikiem unipolarnym ok 1,5A

Post autor: niveasoft » 25 wrz 2019, 21:52

BTW to skrót od angielskiego 'By The Way" i znaczy tutaj "a tak na marginesie" lub "a tak nie w związku z tematem". Skrót dla tych co nie lubią pisać. Chyba przestanę go używać bo mi klikanie przychodzi z łatwością :D
sp3ots
Posty: 42
Rejestracja: 08 wrz 2018, 10:26

Re: AVR, PCF8574, sterowanie Silnikiem unipolarnym ok 1,5A

Post autor: sp3ots » 25 wrz 2019, 21:53

Ok, rozumiem.
sp3ots
Posty: 42
Rejestracja: 08 wrz 2018, 10:26

Re: AVR, PCF8574, sterowanie Silnikiem unipolarnym ok 1,5A

Post autor: sp3ots » 26 wrz 2019, 9:16

Witam !
Przyciski działają bardzo dobrze,
Zawsze gdy operuję S3 ( wykonaj/zrób) wpisuję tak jak Ty to napisałeś:
  1. If S3 = 0 Then
  2. Bitwait S3 , Set
  3. Waitms 20
  4. Gosub Przyciski
  5. End If
DZIEKUJĘ
Pozostało mi dopracować wyświetlanie na LCD i dodanie fragmentu kodu z podziałem na warstwy.
Ta część programu dla mnie jest nie zrozumiała/nie wiem jak ona działa, ale to POTEM.
W czasie testów zauważyłem brak możliwości korekcji zmiany ilości zwoi gdy jestem w części nastawianie ilości zwojów w jednie warstwie. Ale to wina braku jednego klawisza, właściwie jest jeszcze jeden pin RESET, ale jak go użyję to stracę możliwość programowania USBasp.
Na razie niech tak zostanie.
ODPOWIEDZ