Sterownik silnika krokowego STEP, DIR, ENABLE


Witam - pisze program sterownika silnika krokowego - sterownik generuje sygnały STEP, DIR, ENABLE - program wygląda na tą chwile tak:

'enkoder 1000imp/obrót
'--------------------------------------------------------------
' AUTONOMICZNY STEROWNIK NAPĘDU PINOLI
' WIERTARKO FREZARKI TS 7016
'----------------------------------
$regfile = "m32def.dat"                                     'mikrokontroler
$crystal = 16000000                                         'kwarc
'$sim
'$baud = 19200
$hwstack = 64
$swstack = 32
$framesize = 64
$lib "glcd.lib"
'---------------------------------------
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
 
Config Timer1 = Timer , Prescale = 1
Enable Timer1 : On Timer1 Odmierz_1s
'Config Timer1 = Timer , Prescale = 1024
'On Timer1 Czas_przycisku_8ms
Enable Interrupts
'------------------------------------
'konfiguracja LCD
'------------------------------------
Config Graphlcd = 240 * 128 , Dataport = Porta , Controlport = Portc , Ce = 5 , Cd = 6 , Wr = 3 , Rd = 4 , Reset = 7 , Fs = 10 , Mode = 6
 
'Szybki sposób na cyferki:
'1. Wyłącz wygładzanie czcionek w systemie Windows (Zaawansowane ustawienia systemu -> Zaawansowane -> Wydajność -> Efekty wizualne -> Wygładź krawędzie czcionek ekranowych)
'2. Uruchom WordPad'a, wybierz rozmiar i rodzaj czcionki, napisz 0 1 2 3 4 5 6 7 8 9 Wink
'3. zrób zrzut ekranu klawiszem Print Screen.
'4. Uruchom GIMP'a i wklej obraz.
'5. ustaw rozmiar siatki na 8x8, wyświetl siatkę.
'6. powiększ obszar pracy np. 400% (nie chodzi mi o przeskalowywanie obrazu)
'7. metodą wytnij, kopiuj i wklej porozstawiaj cyfry tak żeby wszystkie miały tą samą szerokość i wysokość (wielokrotność 8). Na przykładowym obrazku widać cyfry zajmują obszar 5 na 6 (40x48).
'8. Jeżeli cyferki są już porozstawiane, wytnij pojedynczo cyferki i wklej jako nowe obrazy, wszystkie cyfry mają mieć ten sam rozmiar (rozmiar ma być wielokrotnością liczby 8)
'9. Jeżeli tło jest czarne a cyfry białe to zrób inwersje (Kolory->Inwersja)
'10. Zrób konwersje do trybu indeksowanego (Obraz -> Tryb -> Indeksowany.. -> paleta czarno-biała 1 bitowa)
'11. Zapisz jako BMP, w Bascomie zrób konwersje na BGF
'12. Można też zapisać cyfrę w formacie Obraz PBM *.pbm (binarny), i po usunięciu nagłówka w hex edytorze, mamy czystą bitmapę np. dla wyświetlacza T6963.
 
'Nagłówek pliku PBM ma różne długości, kończy się rozmiarem bitmapy np. 240x128:
'Kod:
'P4, 0x0A
'# CREATOR: GIMP PNM Filter Version 1.1, 0x0A
'240, 0x0A
'128, 0x0A
'------------------------------------
' konfiguracja portów
'----------------------------------
Config Portb = &B10000100 : Portb = &B01111111
Config Portc = &B11111100 : Portc = &B11111111
Config Portd = &B01110011 : Portd = &B11111111
'------------------------------
'******************  Zmienne *******************
'***********************************************
Dim Stan_sw As Byte , Sw As Byte , Licznik_sw As Byte       'sw
Dim Stan_kr As Byte , Kr As Byte , Licznik_kr As Byte
Dim Wyswietlanie As Byte , Poz_wysw As Byte , Wyswietlono As Bit       'Lcd
Dim Poz_ust As Byte
Dim Autosave As Byte , Autopowrot As Byte , Autolight As Byte
Dim Dzielnik(2) As Byte                                     'dzielniki timera
Dim Flaga_4ms As Bit , Flaga_500ms As Bit , Flaga_1s As Bit 'flagi przerwa?
 
'przypisanie zmiennych
Dim Licz_4ms As Byte                                        'zmienna TIMER0
Dim E As Long                                               'zmienna odczytu z enkodera lewy wskaźnik
Dim F As Long                                               'zmienna odczytu z enkodera prawy wskaźnik                                               'zmiennna pomocnicz odczytu enkodera
Dim B As Single                                             'zmienna pomocnicza odczytu z enkodera do wyświetlania wartości liczbowych
Dim C As Single                                             'zmienna pomocnicza odczytu z enkodera do wyświetlania wartości liczbowych
Dim Zadana_ As Long                                         'zmienna do ustawianaia zadanej
Dim Zadana_1 As Single                                      'zmienna do wyświetlania zadanej na lcd
Dim Z As String * 30                                        'zmienna do formatowania wyniku odczytu z enkodera
Dim X As String * 30                                        'zmienna do formatowania wyniku zadanej
Dim Str_lewa_pom As Word                                    'Integer                                 'zmienna wskaźnika położenia pozycji zadanej
Dim Str_prawa_pom_2 As Integer                              'zmiena pomocnicza do obliczenia położenia wskaźnika zadanej
Dim Str_prawa_pom As Integer                                'zmienna wskaźnika położenia pozycji odczytanej z enkodera
Dim Str_prawa_pom_1 As Integer                              'zmienna pomocnicza wskaźnika zadanej
Dim Auto_man_pom As Bit                                     'zmienna pomocnicza automatycznie/ręcznie
'--------------------------------------
'nowo dodane zmienne
Dim Jednostki As Byte                                       'zmienna ustawiania zadanej - jednostki reprezentacja w postaci cyfrowej
Dim Jednostki_txt As String * 10                            'zmienna ustawiania zadanej - jednostki reprezentacja w postaci tekstu
Dim Dziesiatki As Byte                                      'zmienna ustawiania zadanej - dziesiątki reprezentacja w postaci cyfrowej
Dim Dziesiatki_txt As String * 10                           'zmienna ustawiania zadanej - dziesiątki reprezentacja w postaci tekstu
Dim Setki As Byte                                           'zmienna ustawiania zadanej - setki reprezentacja w postaci cyfrowej
Dim Setki_txt As String * 10                                'zmienna ustawiania zadanej - setki reprezentacja w postaci tekstu
Dim Tysiace As Byte                                         'zmienna ustawiania zadanej - tysiące reprezentacja w postaci cyfrowej
Dim Tysiace_txt As String * 10                              'zmienna ustawiania zadanej - tysiące reprezentacja w postaci tekstu
Dim Pomoc_set As Byte                                       'zmienna do ustawiania znacznika przy ustawianiu zadanej
Dim Suma_txt As String * 10                                 'zmienna do łączenia zmienych jednostek, dzisiatek, setek, tysięcy przekształconych na postać tekstu
Dim Pomoc_set2 As Byte                                      'zmienna do ustawiania znacznika ustawiania zadanej
Dim Pozycja_wys As Byte                                     'zmiena pomocnicza ustawianej zadanej
Dim Wynik As Integer                                        'zmienna ustawionej zadanej przetworzona ze zmiennej tekstowej przetworzona na postac cyfrową
Dim Zadana_pom As Single                                    'zmienna która przechowuje wynik podziału zmiennej wynik przez 1000
Dim Zadana As String * 10
Dim Gora_ster As Word
Dim Dol_ster As Bit
Dim Up_pic As Bit
Dim Down_pic As Bit
Dim Zad1 As Integer
Dim Stan_home As Bit
Dim Stan_limit As Bit
 
'-------------------------------
'alasy portów
'------------------------------
Sw_port Alias Pinb
Down Alias Pinb.3                                           'wejście przycisku DOWN (dół)
Up Alias Pinb.4                                             'wejście przycisku UP (góra)
Set_ Alias Pinb.5                                           'wejście przycisku SET (zatwierdzanie)
Zero_ Alias Pinb.6                                          'wejście przycisku ZERO (zerowanie bazy)
Beep_ Alias Portb.7                                         'wyjście sygnału na biper
Home_ Alias Pinc.0                                          'wejście krańcówki HOME (góra)
Limit_ Alias Pinc.1
Led_dol Alias Portd.0
Led_gora Alias Portd.1                                      'wejście krańcówki LIMIT (dół)
Kanal_a Alias Pind.2                                        'wejście kanału A enkodera
Kanal_b Alias Pind.3                                        'wejście kanału B enkodera
Step_ Alias Portd.4                                         'wyjście sygnału STEP
Enable_ Alias Portd.5                                       'wyjście sygnału ENABLE
Dir_ Alias Portd.6                                          'wyjście sygnału DIR
'------------------------------- 'obsługa enkodera
Config Int0 = Falling                                       '
   On Int0 Enkoder
Enable Interrupts
   Enable Int0
'------------------------------
E = 0
F = 0
Zadana_ = 0
Zadana_pom = 0
Str_lewa_pom = E
Str_prawa_pom = 0
Auto_man_pom = 0
Gora_ster = 0
Dol_ster = 0
Led_dol = 1
Led_gora = 1
Up_pic = 0
Stan_home = 0
Stan_limit = 0
Enable_ = 0
 
Stop Timer1
Cursor Off
 
Cls
'-------------------------------------------------
 
''''**************  Petla glowna ******************
''''***********************************************
Do
'***********************************************   co 4ms
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
    Gosub Przyciski
    Gosub Wysw
    'Gosub Enkoder
    Gosub Ustawienia
    Gosub Krancowki
  End If
'***********************************************
 
'***********************************************   co 500ms
  If Flaga_500ms = 1 Then
    Flaga_500ms = 0
 
End If
'***********************************************
 
'***********************************************   co 1s
  If Flaga_1s = 1 Then
    Flaga_1s = 0
 
 
 
End If
'***********************************************
 
Loop
End
'************ Petla glowna Koniec **************
'************ Przerwanie timer 0 ***************
'***********************************************
Prztimer0:
  Timer0 = 5
  Set Flaga_4ms
  Incr Dzielnik(1)
  If Dzielnik(1) = 125 Then                                 '125
    Dzielnik(1) = 0
    Set Flaga_500ms
    Incr Dzielnik(2)
    If Dzielnik(2) = 2 Then
      Dzielnik(2) = 0
      Set Flaga_1s
    End If
  End If
Return
'******** Przerwanie timer 0 Koniec ************
Odmierz_1s:
   Timer1 = 5
   Toggle Step_
Return
 
'***********************************************
'*****************  Przyciski     **************
 
Przyciski:
Sw = Pinb And &B01111000                                    'maskowanie nieużywanych pinów
 
If Sw <> &B01111000 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw                                   'przycisk dół
        Case &B01110000:
          Reset Up_pic
          Set Down_pic
          Dir_ = 0
          Start Timer1
 
        Case &B01101000:                                    'przycisk góra
           Set Up_pic
           Reset Down_pic
           Dir_ = 1
           Start Timer1
 
 
 
        Case &B01011000:                                    'przycisk set
 
 
        Case &B01111000:
            Reset Up_pic
            Reset Down_pic
            Enable_ = 1
            Stop Timer1
 
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 80
 
  End If
 
Return
 
'-----------------------------------------------------------
Wysw:
If Up_pic = 1 Then
   Showpic 0 , 0 , Up_inv
   Else
   Showpic 0 , 0 , Up_nor
   End If
If Down_pic = 1 Then
   Showpic 31 , 0 , Down_inv
   Else
   Showpic 31 , 0 , Down_nor
   End If
 
Locate 15 , 1 : Lcd "STAN_HOME " ; Stan_home
Locate 16 , 1 : Lcd "STAN_LIMIT " ; Stan_limit
Locate 4 , 15 : Lcd ; Z ; "mm  "
Locate 4 , 30 : Lcd ; X ; "mm  "
Locate 6 , 31 : Lcd "F " ; F ; "    "
Locate 7 , 32 : Lcd "SPEED"
Locate 8 , 30 : Lcd "100mm/min"
Locate 14 , 29 : Lcd ; Str_lewa_pom ; " >_L_POM"
Locate 15 , 29 : Lcd ; Str_prawa_pom ; " <_P_POM"
Locate 13 , 29 : Lcd "zad_pom " ; Zadana_pom
Locate 10 , 29 : Lcd ; E ; " E    "
Locate 9 , 29 : Lcd ; Str_lewa_pom ; " >_L_pom"
'Showpic 0 , 0 , Up_nor
'Showpic 31 , 0 , Down_nor
Showpic 0. , 31 , Set_zero_nor
Showpic 33 , 31 , Set_speed_nor
Showpic 0 , 62 , Set_point_nor
Showpic 31 , 62 , Go!_nor
Showpic 86 , 5 , Current_position
Showpic 176 , 5 , Setpoint_position
Line(174 , 21) -(227 , 21) , 0
Showpic 150 , 6 , Skala5
Showpic 145 , Str_lewa_pom , Str_lewa
Showpic 167 , Str_prawa_pom_2 , Str_prawa
Line(82 , 3) -(140 , 3) , 1
Line(81 , 2) -(141 , 2) , 1
Line(140 , 3) -(140 , 33) , 1
Line(141 , 2) -(141 , 34) , 1
Line(82 , 3) -(82 , 33) , 1
Line(82 , 33) -(140 , 33) , 1
Line(81 , 34) -(141 , 34) , 1
Line(81 , 2) -(81 , 34) , 1
Line(171 , 3) -(230 , 3) , 1
Line(171 , 3) -(171 , 33) , 1
Line(171 , 33) -(230 , 33) , 1
Line(230 , 3) -(230 , 33) , 1
Line(170 , 2) -(231 , 2) , 1
Line(170 , 2) -(170 , 34) , 1
Line(231 , 2) -(231 , 34) , 1
Line(171 , 34) -(231 , 34) , 1
 
B = E / 1000
C = B
Str_lewa_pom = F / 500
 
Str_prawa_pom_1 = Str_prawa_pom * 2
 
Str_prawa_pom_2 = Str_prawa_pom_1 / 1000
 
If Str_lewa_pom = 0 And Str_lewa_pom => 100 Then
   Str_lewa_pom = 0
End If
 
If Str_lewa_pom > 100 Then
   Str_lewa_pom = 100
End If
 
 
Z = Str(c)
Z = Fusing(c , "#.###")
 
X = Str(zadana_1)
X = Fusing(zadana_1 , "#.###")
 
 
Return
 
 
 
 Dol_:
Reset Enable_
Reset Dir_
Showpic 31 , 0 , Down_inv
 
 
Return
 
Gora_:
Reset Enable_
Set Dir_
 
 
 
Return
 
Stop_:
Set Enable_
Return
'-----------ENKODER-------------------------------
Enkoder:
 
Disable Int0
'Waitms 1
If Kanal_a = 0 Then
   If Kanal_b = 0 Then
   Incr E
   Decr F
   Else
   Decr E
   Incr F
   End If
End If
Enable Int0
 
Return
'-----------USTAWIENIA ZADANE----------------------
Ustawienia:
 
'If E => 1000 Then
'Gosub Stop_
'End If
 
Return
'-----------KRAŃCÓWKI----------------
Krancowki:
 
If Home_ = 0 Then
   Toggle Stan_home
End If
 
If Limit_ = 0 Then
   Toggle Stan_limit
End If
 
Return
'-------STEROWANIE----------------
Sterowanie:
 
If Stan_home = 0 Then
   Gosub Stop_
End If
 
If Stan_limit = 0 Then
   Gosub Stop_
End If
 
 
 
'--------------------------------------------------------------
 
 
Setpoint_inv:
$bgf "setpoint_position_inv.bgf"
 
Current_position:
$bgf "current_position.bgf"
 
Setpoint_position:
$bgf "setpoint_position.bgf"
 
Skala5:
$bgf "skala5.bgf"
 
Str_lewa:
$bgf "str-lewa.bgf"
 
Str_prawa:
$bgf "str-prawa.bgf"
 
Str_g1:
$bgf "str-G1.bgf"
 
Str_g2:
$bgf "str-G2.bgf"
 
Str_g3:
$bgf "str-G3.bgf"
 
Set_speed_nor:
$bgf "set-speed-nor.bgf"
 
Set_speed_inv:
$bgf "set-speed-inv.bgf"
 
Set_zero_nor:
$bgf "set-zero-nor.bgf"
 
Set_zero_inv:
$bgf "set-zero-inv.bgf"
 
Set_point_nor:
$bgf "set-point-nor.bgf"
 
Set_poin_inv:
$bgf "set-point-inv.bgf"
 
Go!_nor:
$bgf "go!-nor.bgf"
 
Go!_inv:
$bgf "go!-inv.bgf"
 
Znacz:
$bgf "znacz3.bgf"
 
Up_nor:
$bgf "up-nor.bgf"
 
Up_inv:
$bgf "up-inv.bgf"
 
Down_nor:
$bgf "down-nor.bgf"
 
Down_inv:
$bgf "down-inv.bgf"

Mój problem - po naciśnięciu przycisku UP lub DOWN silnik rusz i się kręci natomiast gdy puszczę przycisk silnik nie zatrzymuje się - gdzie robię błąd - proszę o pomoc - pozdrawiam Jacek.
P.S. - link do filmiku na YouTube jak to działa
http://www.youtube.com/watch?v=53cJp6hLsbY&feature=c4-overview&list=UULT6aqK-Da3GeLua4Bc4F4A




Portret użytkownika mirley

Re; Silnik

Komendy do stopu silnika powinny być chyba w else obsługi przycisków jak chcesz żeby po puszczeniu przycisków cos sie stało, np zatrzymał silnik.... Ciężko się czyta ten program bo masz mnóstwo poleceń od wyświetlania ikonek i ciężko znaleźć gdzie jest właściwy kod od silnika

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

Witam - w tej chwili robię

Witam - w tej chwili robię reorganizację "szeku" jak się uporam to się odezwie i wstawię poprawiony program - dzięki za odezwanie się - pozdrawiam Jacek.

Portret użytkownika gosc

Jakie postępy z programem

Witaj . Bardzo ciekawy projekt kolega wymyślił . Mam pytanie co dalej z pracami nad projektem , broszę bardzo o wiadomość .