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.
|
|||
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.
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.
Jakie postępy z programem
Witaj . Bardzo ciekawy projekt kolega wymyślił . Mam pytanie co dalej z pracami nad projektem , broszę bardzo o wiadomość .