HomeMade

Pełna wersja: Sterownik rotora - Bascom
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2 3
A po co Ci jeszcze pasek?

Zmurszeje, przy większej wilgoci będzie się ślizgać. Nie prościej bezpośrednio do wału napędowego reduktora?
Witam - pasek zębaty z kewlaru - chyba nic mu się nie stanie - zredukowanie obrotów silnika - pozdrawiam Jacek.
No oki, ale wydawało mi się, że silnik krokowy plus przekładnia to wystarczające, redukcja obrotów Big Grin
Pasek zębaty i gotowe kółka pasowe (kupuje się to gotowe) pod niego to prosta metoda połączenia krokówki z osią odbiorczą.
Witam - niestety nie mogę zrozumieć Blush przykładu Pawła z obsługa menu.
Przeglądając net znalazłem sposoby z zastosowaniem select case: i wygląda to tak:
Kod:
'program sterownika rotora napędzanego silnikiem krokowym Bascom AVR
'############## Konfiguracja mikroprocesora ###################
'#################################################​#############
$regfile = "m644pdef.dat"                                   'informuje kompilator o typie mikrokontrolera
'$sim
$crystal = 16000000                                         'informuje kompilator
                                                            'o częstotliwości oscylatora                                                            'taktującego mikrokontroler
Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7       'porty mikrokontrolera, do których dołączono wyświetlacz LCD

Config Adc = Single , Prescaler = Auto , Reference = Avcc   'konfiguracja wewnętrznego przetwornika A/C

Config Portd = &B00011111 : Portd = &B11111111
Config Portb = &B11111111 : Portb = &B11110111

Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Przerwtimer0
Enable Interrupts

'Sw_port Alias Pind                                          'przyciski
Up Alias Pind.7                                             'góra
Down Alias Pind.6                                           'dół
Setup Alias Pind.5                                          'wejście/zatwierdzenie
Step_ Alias Pinb.0                                          'Step
Dir_ Alias Pinb.1                                           'Dir
Enab_ Alias Pinb.2                                          'Enable
Buzer Alias Portb.3

Deflcdchar 1 , 31 , 31 , 4 , 4 , 4 , 4 , 4 , 4              ' replace ? with number (0-7)
Deflcdchar 2 , 31 , 31 , 32 , 32 , 32 , 32 , 32 , 32        ' replace ? with number (0-7)
Deflcdchar 3 , 31 , 31 , 4 , 4 , 4 , 32 , 32 , 32           ' replace ? with number (0-7)
Deflcdchar 4 , 4 , 4 , 4 , 4 , 14 , 14 , 31 , 31            ' replace ? with number (0-7)
Deflcdchar 5 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32        ' replace ? with number (0-7)
Deflcdchar 6 , 2 , 6 , 15 , 31 , 15 , 6 , 2 , 32            ' replace ? with number (0-7)
Deflcdchar 7 , 8 , 12 , 30 , 31 , 30 , 12 , 8 , 32          ' replace ? with number (0-7)
Deflcdchar 8 , 32 , 32 , 31 , 31 , 31 , 32 , 32 , 32        ' replace ? with number (0-7)
'#################### Zmienne ##########################
'#################################################​######
Dim Stan_sw As Byte , Sw As Byte , Licznik_sw As Byte       'sw
Dim Wyswietlanie As Byte , Poz_wysw As Byte , Wyswietlono As Bit       'Lcd
Dim Mig As Bit , Poz_ust As Byte
Dim Autosave As Byte
Dim Wart_ac1 As Word                                        'zmienna na wartość odczytaną z przetwornika
Dim Stopnie As Single                                       'zmienna stopni odczyt z przetwornika 'Dim V1 As Single                                                            'podzielony przez 2.841
Dim Azym_odcz As Word                                       'zmienna odczytanego azymutu'Dim V2 As Word
Dim Azym_zad As Word                                        'zmienna zadanego azymutu'Dim V3 As Word
Dim Pomoc1 As String * 14
Dim Pomoc2 As Byte
Dim Pomoc3 As Byte
Dim Dzielnik(3) As Byte
Dim Czas As Byte
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Byte
Dim Flaga_4ms As Bit , Flaga_100ms As Bit , Flaga_200ms As Bit , Flaga_1s As Bit       'flagi przerwań
Dim 0_st As Word
Dim 360_st As Word
Dim 0_st_ee As Word
Dim 360_st_ee As Word
Dim Pam1 As Word                                            'pamięć nastawy 1
Dim Pam2 As Word                                            'pamięć nastawy 2
Dim Pam3 As Word                                            'pamięć nastawy 3
Dim Pam4 As Word                                            'pamięć nastawy 4
Dim Pam5 As Word                                            'pamięć nastawy 5
Dim Start_menu As Byte

Declare Sub Lewo
Declare Sub Prawo
Declare Sub Zatrz
Declare Sub Setup1
Declare Sub Wysw

'####### ustawienia początkowe ############
'##########################################
Cursor Off

Start Adc                                                   'uruchamia wbudowany przetwornik

Wart_ac1 = Getadc(0)                                        'odczytanie wartości z wejści ADC0 mikrokontrolera i przypisanie do zmiennej Wart_ac1
Stopnie = Wart_ac1 / 2.841                                  'zamiana wartości odczytanej z przetwornika'stopnie = Wart_ac1 / 2.841                                       'zamiana odczytanej wartości z A/C na stopnie azymutu
                                                            'na stopnie zaymutu
Azym_odcz = Int(stopnie)                                    'wyciągnięcie części całkowitej ze zmienne "stopnie" Azym_odcz = Int(v1)

Readeeprom Pam1
Readeeprom Pam2
Readeeprom Pam3
Readeeprom Pam4
Readeeprom Pam5

Cls
Wait 1

Locate 1 , 4 : Lcd "STEROWNIK"
Waitms 500
Locate 2 , 6 : Lcd "ROTORA"
Waitms 500
Locate 3 , 4 : Lcd "By  SQ2EER"
Waitms 500
Locate 4 , 5 : Lcd "Wer. 1.0"
Wait 1
Cls

Azym_zad = Azym_odcz

Do

'#################################################​# co 4 ms
If Flaga_4ms = 1 Then
    Flaga_4ms = 0

    Gosub Przyciski
    If Wyswietlono = 1 Then Gosub Wys_lcd
End If

'#################################################​#
'#################################################​# co 100 ms
If Flaga_100ms = 1 Then
    Flaga_100ms = 0

    Gosub Odczyt_adc
End If

'#################################################​#
'#################################################​# co 200 ms                                                                 'początek pętli program
If Flaga_200ms = 1 Then
    Flaga_200ms = 0

    Gosub Sterowanie
End If

'#################################################​#


Loop
End

'#################################################​###########
Przerwtimer0:
  Timer0 = 5
  Set Flaga_4ms
  Incr Dzielnik(1)
  If Dzielnik(1) = 25 Then
    Dzielnik(1) = 0
    Set Flaga_100ms
      Incr Dzielnik(2)
      If Dzielnik(2) = 2 Then
       Dzielnik(2) = 0
       Set Flaga_200ms
         Incr Dzielnik(3)
         If Dzielnik(3) = 5 Then
         Dzielnik(3) = 0
         Set Flaga_1s
         End If
      End If
  End If
Return

'#################################################​############
'###################### Przyciski ############################
Przyciski:

If Up = 0 Then                                              'zwiększanie zadanego azymutu
   Waitms 25
      If Up = 0 Then
      Incr Azym_zad
      Gosub Beep
      'Bitwait Up , Set
         If Azym_zad => 360 Then
         Azym_zad = 360
         End If
      End If
End If

If Down = 0 Then                                            'zmiejszanie zadanego azymutu
   Waitms 25
      If Down = 0 Then
      Decr Azym_zad
      Gosub Beep
      'Bitwait Down , Set
         If Azym_zad <= 0 Or Azym_zad > 360 Then
         Azym_zad = 0
         End If
      End If
End If

If Setup = 0 Then
   Waitms 25
      If Setup = 0 Then
      'Gosub Beep
      'Bitwait Setup , Set                                   'Reset
      'Czas = 5
      'Decr Czas
       '  If Setup = 0 And Czas = 0 Then
            Gosub Beep
            Gosub Menu
            'Gosub Setup1
            'End If
      End If
End If

'#################################################​#################
'#################################################​#################
Wys_lcd:

Locate 1 , 6 : Lcd "Azymut"
Locate 2 , 1 : Lcd Chr(1) ; Chr(2) ; Chr(3) ; Chr(2) ; Chr(1) ; Chr(2) ; Chr(3) ; Chr(2) ; Chr(1) ; Chr(2) ; Chr(3) ; Chr(2) ; Chr(1) ; Chr(2) ; Chr(3) ; Chr(2)
Locate 3 , 2 : Lcd Azym_odcz ; Chr(5) ; "  "
Locate 3 , 9 : Lcd Chr(4)
Locate 3 , 12 : Lcd Azym_zad ; Chr(5) ; "  "

Return
'#################################################​################
'#################################################​################
Odczyt_adc:

Wart_ac1 = Getadc(0)                                        'odczytanie wartości z wejści ADC0 mikrokontrolera i przypisanie do zmiennej Wart_ac1
Stopnie = Wart_ac1 / 2.841                                  'zamiana wartości odczytanej z przetwornika'stopnie = Wart_ac1 / 2.841                                       'zamiana odczytanej wartości z A/C na stopnie azymutu
                                                            'na stopnie zaymutu
Azym_odcz = Int(stopnie)                                    'wyciągnięcie części całkowitej ze zmienne "stopnie" Azym_odcz = Int(v1)

Return
'#################################################​##################
'#################################################​##################
Sterowanie:



Return
'#################################################​##################
'#################################################​##################
Menu:

Start_menu = 0

Cls

Do

If Setup = 0 Then
   Waitms 25
      If Setup = 0 Then
         Bitwait Setup , Set
         Incr Start_menu
         Gosub Beep
         If Start_menu => 5 Then
            Start_menu = 0
         End If
      End If
End If


Select Case Start_menu



   Case 1 :

      Locate 1 , 4 : Lcd "Ustawianie"
      Locate 2 , 6 : Lcd "Rotora"
      Wait 1 : Cls : Gosub Ustaw_rotor
   Case 2 :

      Locate 1 , 2 : Lcd "Programowanie"
      Locate 2 , 6 : Lcd "Pamieci"
      Wait 1 : Cls : Gosub Prog_pamieci

   Case 3 :

      Locate 1 , 1 : Lcd "Zapis parametrow"
      Locate 2 , 6 : Lcd "do eeprom"
      Wait 1 : Cls : Gosub Zapisz_eeprom

   End Select

   Loop Until Start_menu = 4


Return
'#################################################​####################
'######################### Beep ######################################
Beep:

Set Buzer
Waitms 25
Reset Buzer

Return

Ustaw_rotor:


Return

Prog_pamieci:

Return

Zapisz_eeprom:

Return

ale po wejściu w ustawienia LCD mruga - czyli działa nie tak jak powinien
czy taka procedura obsługi menu będzie się sprawdzać - pozdrawiam Jacek.
Masz dziwnie napisaną obsługę menu.

Klawiszem Zatwierdz (alias Setup) wchodzisz do menu, i następne pozycję menu wybierasz też tym klawiszem.

A którym klawiszem zatwierdzasz wejście w wybraną opcję menu?

A powód "mrugania" jest prosty. W liniach od 238 do 274 masz za dużo komend Cls

w 236 lini masz sam Cls do kasowania po wejściu w menu i to jest w porządku.

Ale zaraz po wyświetleniu pozycji menu czekasz sekundę (po co?) robisz Cls i przechodzisz do obsługi tej pozycji.
Kod:
Case 1 :

      Locate 1 , 4 : Lcd "Ustawianie"
      Locate 2 , 6 : Lcd "Rotora"
      Wait 1 : Cls : Gosub Ustaw_rotor
proponuje ci:
1) Wyrzucenie tych Cls-ów w tych pozycji.
2) Przerobić zmianę pozycji menu za pomoca klawiszy Up Down
3) dorobić drugiego Case na obsługę poleceń z menu po naciśnięciu klawisza zatwierdź.

Kilka uwag ogólnych:
1) Niepotrzebnie używasz timer-a, bo twój program poradziłby sobie bez niego
2) Robisz za duże skoków (używaj jak najmniej Gosub)
3) Za dużo tu również Wait-ów - program ma pracować, choćby w kółko, a nie stać jak kołek Big Grin

Zastanawiam się jak go kompilujesz, masz pełną wersję BASCOM AVR?. Kod przekracza już 2k, a jeszcze niewiele robi.

PS. Napisz coś więcej jak ma działać interfejs, bo nie do końca wiem jak program ma działaś.
I jak Jacku?

Udało Ci się coś wskurać?
Witam - Pawle przepraszam że się nie odzywałem tak długi czas - mam wersję Bascom LT kod wynikowy do 8kB.
Próbowałem co nieco naskrobać ale nie mogę jeszcze dojść do ładu z wychodzeniem z podmenu.
Interface ma sterować silnikiem krokowym za pomocą komend step, dir, enable chciałbym aby miał kilka komórek pamięci do zaprogramowania, przetwornikiem położenia anteny ma być potencjometr wieloobrotowy, położenie 0 stopni ma sygnalizować krańcówka, 360 stopni również krańcówka
to tyle - pozdrawiam Jacek.
Jeśli bedziesz miał za czymś klopot podeślij program to Ci chętnie poprawię.
Proponuje zamiast krańcówki dać zerowanie azymutu, w ten sposób nie bedzie trzeba jej montować i w razie jakiegoś luzu na kaszczie lub obrócenia się anteny w łatwy sposób określisz azymyt 0.

Proponuje również dodać punkt "odbicia" czyli azymut którego nie wolno przekroczyć aby nie oberwać przewodów. Szczególnie bedzie to przydatne w razie ustawiania na pozycji z pamięci, sterownik sam bedzie wiedział w która ma się obracać.

Obie wartość oczywiście zapamiętywane w EEPROM-ie a ich wpisanie, ustawienie anteny na danym zaymucie i zapisanie wartości z przetwornika ADC.

PS. BASCOM LT??? - O mile wiem to pierwsza werska ma Win 3.11 i tylko do '51. Może chodzi Ci o te wersję specjalnie dla Polski, ale ona chyba inaczej się nazywała.
Witam - ano właśnie chodzi o wersje dla Polski - dzięki za chęć pomocy - hi na pewno skorzystam - bo jak pisałem stawiam pierwsze kroki w pisaniu programów - przez święta pewnie będzie więcej czasu na nasze hobby - pozdrawiam Jacek.

24.04.2011

Witam - coś się ruszyło Blush w pisaniu:
Kod:
$regfile = "m644pdef.dat"                                   'informuje kompilator o typie mikrokontrolera
'$sim
$crystal = 16000000                                         'informuje kompilator
                                                            'o częstotliwości oscylatora                                                            'taktującego mikrokontroler
Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7       'porty mikrokontrolera, do których dołączono wyświetlacz LCD

Config Portd = &B00000111 : Portd = &B11111111
Config Portb = &B11111111 : Portb = &B11110111

Config Adc = Single , Prescaler = Auto , Reference = Avcc   'konfiguracja wewnętrznego przetwornika A/C

Deflcdchar 1 , 31 , 31 , 4 , 4 , 4 , 4 , 4 , 4              ' replace ? with number (0-7)
Deflcdchar 2 , 31 , 31 , 32 , 32 , 32 , 32 , 32 , 32        ' replace ? with number (0-7)
Deflcdchar 3 , 31 , 31 , 4 , 4 , 4 , 32 , 32 , 32           ' replace ? with number (0-7)
Deflcdchar 4 , 4 , 4 , 4 , 4 , 14 , 14 , 31 , 31            ' replace ? with number (0-7)
Deflcdchar 5 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32        ' replace ? with number (0-7)
Deflcdchar 6 , 2 , 6 , 15 , 31 , 15 , 6 , 2 , 32            ' replace ? with number (0-7)
Deflcdchar 7 , 8 , 12 , 30 , 31 , 30 , 12 , 8 , 32          ' replace ? with number (0-7)
Deflcdchar 8 , 32 , 32 , 31 , 31 , 31 , 32 , 32 , 32        ' replace ? with number (0-7)

Up Alias Pind.7                                             'góra
Down Alias Pind.6                                           'dół
Setup Alias Pind.5                                          'wejście/zatwierdzenie

Dim Ekran As Byte
Dim Pozycja As Byte
Dim Pozycja1 As Byte
Dim Pomoc1 As Byte
Dim Pomoc2 As Byte
Dim Wart_ac1 As Word                                        'zmienna na wartość odczytaną z przetwornika
Dim Stopnie As Single                                       'zmienna stopni odczyt z przetwornika 'Dim V1 As Single                                                            'podzielony przez 2.841
Dim Azym_odcz As Word                                       'zmienna odczytanego azymutu'Dim V2 As Word
Dim Azym_zad As Word

Start Adc                                                   'uruchamia wbudowany przetwornik

Wart_ac1 = Getadc(0)                                        'odczytanie wartości z wejści ADC0 mikrokontrolera i przypisanie do zmiennej Wart_ac1
Stopnie = Wart_ac1 / 2.841                                  'zamiana wartości odczytanej z przetwornika'stopnie = Wart_ac1 / 2.841                                       'zamiana odczytanej wartości z A/C na stopnie azymutu
                                                            'na stopnie zaymutu
Azym_odcz = Int(stopnie)

Ekran = 1
Pozycja = 1
Pomoc1 = 1
Pomoc2 = 1

Cursor Off
Cls
Wait 1
Locate 1 , 4 : Lcd "STEROWNIK"
Waitms 500
Locate 2 , 6 : Lcd "ROTORA"
Waitms 500
Locate 3 , 4 : Lcd "By  SQ2EER"
Waitms 500
Locate 4 , 5 : Lcd "Wer. 1.0"
Wait 1
Cls

Azym_zad = Azym_odcz

Do

If Up = 0 Then
   Bitwait Up , Set
   Ekran = Ekran + 1
   If Ekran => 4 Then Ekran = 3
End If

If Down = 0 Then
   Bitwait Down , Set
   Ekran = Ekran - 1
   If Ekran = 0 Or Ekran => 4 Then Ekran = 1
End If
'Locate 4 , 1 : Lcd Ekran


Select Case Ekran

'Case 0:

Case 1:

Cls
Do

Wart_ac1 = Getadc(0)                                        'odczytanie wartości z wejści ADC0 mikrokontrolera i przypisanie do zmiennej Wart_ac1
Stopnie = Wart_ac1 / 2.841                                  'zamiana wartości odczytanej z przetwornika'stopnie = Wart_ac1 / 2.841                                       'zamiana odczytanej wartości z A/C na stopnie azymutu
                                                            'na stopnie zaymutu
Azym_odcz = Int(stopnie)

Locate 1 , 6 : Lcd "Azymut"
Locate 2 , 1 : Lcd Chr(1) ; Chr(2) ; Chr(3) ; Chr(2) ; Chr(1) ; Chr(2) ; Chr(3) ; Chr(2) ; Chr(1) ; Chr(2) ; Chr(3) ; Chr(2) ; Chr(1) ; Chr(2) ; Chr(3) ; Chr(2)
Locate 3 , 2 : Lcd Azym_odcz ; Chr(5) ; "  "
Locate 3 , 9 : Lcd Chr(4)
Locate 3 , 12 : Lcd Azym_zad ; Chr(5) ; "  "


If Up = 0 Then
   Bitwait Up , Set
   Azym_zad = Azym_zad + 1
   If Azym_zad => 360 Then Azym_zad = 360
End If
If Down = 0 Then
   Bitwait Down , Set
   Azym_zad = Azym_zad - 1
   If Azym_zad = 0 Or Azym_zad => 360 Then Azym_zad = 0
End If
If Setup = 0 Then
   Bitwait Setup , Set
   Pomoc1 = Pomoc1 + 1
   If Pomoc1 => 3 Then Pomoc1 = 2
End If

Loop Until Pomoc1 = 2 : Ekran = 2


Case 2:
Cls
Do
Locate 2 , 1 : Lcd "222"
Locate 3 , 1 : Lcd Pomoc1
Locate 4 , 1 : Lcd Pozycja1
If Up = 0 Then
   Bitwait Up , Set
   Pozycja1 = Pozycja1 + 1
   If Pozycja1 => 4 Then Pozycja1 = 3
End If
If Down = 0 Then
   Bitwait Down , Set
   Pozycja1 = Pozycja1 - 1
   If Pozycja1 = 0 Or Pozycja1 => 4 Then Pozycja1 = 1
End If
If Setup = 0 Then
   Bitwait Setup , Set
   Pomoc1 = Pomoc1 + 1
   If Pomoc1 => 4 Then Pomoc1 = 3
End If

Loop Until Pomoc1 = 3 : Ekran = 3


Case 3:
Cls
Do
Locate 3 , 1 : Lcd "333"
Locate 1 , 1 : Lcd Pomoc1
Locate 4 , 5 : Lcd Pozycja
If Up = 0 Then
   Bitwait Up , Set
   Pozycja = Pozycja + 1
   If Pozycja => 9 Then Pozycja = 9
End If
If Down = 0 Then
   Bitwait Down , Set
   Pozycja = Pozycja - 1
   If Pozycja = 0 Or Pozycja => 10 Then Pozycja = 0
End If
If Setup = 0 Then
   Bitwait Setup , Set
   Pomoc1 = Pomoc1 + 1
   If Pomoc1 => 5 Then Pomoc1 = 4
End If

Loop Until Pomoc1 = 4 : Ekran = 1

End Select

Loop
End

to tak dla testu - pewnie źle napisane ale działa wchodzenie i przechodzenie przez poszczególne ekrany ( ustawienia) - pozdrawiam Jacek.
Stron: 1 2 3
Przekierowanie