Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Bascom-silnik- błąd w rozumowaniu- c.d.

20 Sty 2010 18:37 1130 6
  • Poziom 38  
    No i następnej sprawy nie rozumiem.
    Dlaczego ten licznik liczy do 99999 a nie "po bożemu" do 65535?
    Przynajmniej tak się wyświetla.
    I z 1000 przy decr "zmniejsza" się na 9999?

    Code:

    'Program do sterowania małych silników krokowych za pomocą ATMega8 i układu L6219 lub LB1845
    'sterowanie ćwierćrokowe, zasilanie 30V
    'set i reset zastosowałem w celach poglądowych- można- a nawet należy zastąpić to np.PortB=&B00001100 itp.

    $regfile "m8def.dat"
    $crystal = 4915200
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db7 = Portc.0 , Db6 = Portc.1 , Db5 = Portc.2 , Db4 = Portc.3 , E = Portc.4 , Rs = Portc.5
    Ddrb = &HFF
    sei

    Config Timer0 = Timer , Prescale = 8       ' teraz da ok. 0.417us- ale może skrócić
    Enable Ovf0
    On Ovf0 Step_delay
    Config Portd = Input
    Set Portd.2
    'Config Pind.4 = Output
    'Config Debounce = 1800

    Dim Kier As Byte
    Dim Temp0 As Byte
    Dim Opoznienie_odczytu As Byte


    Ph1 Alias Portb.0   'kierunek przepływu prądu w uzwojeniu Ph1
    Ph2 Alias Portb.1   'kierunek przepływu prądu w uzwojeniu Ph2
    I01 Alias Portb.2   'napięcie dostarczane do uzwojeń- 1 , 2/3 lub 1/3 Imax
    I11 Alias Portb.3
    I02 Alias Portb.4
    I12 Alias Portb.5

    Set I01             ' na początek ustawiamy mały prąd
    Set I11
    Set I02
    Set I12

    Dim Next_step As Byte
    Next_step = 0
    Dim Flaga As Byte
    Flaga = 0
    Dim Liczba_krokow As Word
    Liczba_krokow = 0
    Kier = 0
    Cls
    Cursor Off
    Locate 1 , 1
    Lcd "ustal kierunek "



    Do

       If Flaga = 1 Then       'gdy jest przerwanie od Timer0- co 237us
         If Pind.2 = 0 Then       'i jest wciśnięty przycisk PIND.2
             Incr Opoznienie_odczytu       'no bo przycisk ma drgania dłużej niż 237us- niech zwiększy
                                            'to sprawdzanie powtórne do 17ms

             If Opoznienie_odczytu >= 70 Then       'dajmy mu na wygaszenie drgań 17ms

                If Temp0 = 0 Then       ' i jest zezwolenie na zmianę stanu
                   Gosub Ustawianie
                   Temp0 = 1       ' zablokuj zezwolenie na zmianę stanu
                End If

                Opoznienie_odczytu = 0       'Jak już ustawił kierunek to pozwolimy mu liczyć od początku-
                                              'po powtórnym naciśnięciu PIND.2
              End If

          Else
             Temp0 = 0  'zezwalaj na zmiany
             Opoznienie_odczytu = 0
          End If

          If Kier = 1 Then
             Gosub Kier_prawo
          End If

          If Kier = 2 Or Kier = 0 Then
             Gosub Kier_stop
          End If

          If Kier = 3 Then
             Gosub Kier_lewo
          End If

          Flaga = 0
          'Toggle Portd.4       'to jest tylko do pomiaru

       End If

       'If Pind.3 = 0 Then
          Debounce Pind.3 , 0 , Ustaw_liczba_krokow
       'End If


    Loop
    End


    Step_delay:
       Timer0 = 90      '110     'no to skracamy- ten silnik się jeszcze kręci- ale na jakimś innym moze to trzeba zmienić
                         'tu jest ok.237us obliczone a 248us zmierzone- procesor jednak coś wolno liczy
       Flaga = 1
          Incr Next_step
             If Next_step >= 16 Then
                Next_step = 0
          End If

    Return


    Ustawianie:

          Select Case Kier
             Case 0
               Locate 1 , 1
               Lcd "kierunek- lewo " ; Kier
             Case 1
               Locate 1 , 1
               Lcd "kierunek- stop " ; Kier
             Case 2
               Locate 1 , 1
               Lcd "kierunek- praw " ; Kier
             Case 3
               Locate 1 , 1
               Lcd "kierunek- stop " ; Kier

           End Select

        Incr Kier
         If Kier >= 4 Then
           Kier = 0
         End If

    Return


    Kier_prawo:
       'Incr Liczba_krokow

        Select Case Next_step

             Case 0
                Reset Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Set I02
             Case 1
                Reset Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Reset I02
             Case 2
                Reset Ph1 : Reset I11 : Set I01 : Reset Ph2 : Reset I12 : Set I02
             Case 3
                Reset Ph1 : Set I11 : Reset I01 : Reset Ph2 : Reset I12 : Reset I02
             Case 4
                Set Ph1 : Set I11 : Set I01 : Reset Ph2 : Reset I12 : Reset I02
             Case 5
                Set Ph1 : Set I11 : Reset I01 : Reset Ph2 : Reset I12 : Reset I02
             Case 6
                Set Ph1 : Reset I11 : Set I01 : Reset Ph2 : Reset I12 : Set I02
             Case 7
                Set Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Reset I02
             Case 8
                Set Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Set I02
             Case 9
                Set Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Reset I02
             Case 10
                Set Ph1 : Reset I11 : Set I01 : Set Ph2 : Reset I12 : Set I02
             Case 11
                Set Ph1 : Set I11 : Reset I01 : Set Ph2 : Reset I12 : Reset I02
             Case 12
                Reset Ph1 : Set I11 : Set I01 : Set Ph2 : Reset I12 : Reset I02
             Case 13
                Reset Ph1 : Set I11 : Reset I01 : Set Ph2 : Reset I12 : Reset I02
             Case 14
                Reset Ph1 : Reset I11 : Set I01 : Set Ph2 : Reset I12 : Set I02
             Case 15
                Reset Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Reset I02


          End Select

    Return

    Kier_lewo:
      'Incr Liczba_krokow

          Select Case Next_step

             Case 0
                Reset Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Set I02
             Case 1
                Reset Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Reset I02
             Case 2
                Reset Ph1 : Reset I11 : Set I01 : Set Ph2 : Reset I12 : Set I02
             Case 3
                Reset Ph1 : Set I11 : Reset I01 : Set Ph2 : Reset I12 : Reset I02
             Case 4
                Set Ph1 : Set I11 : Set I01 : Set Ph2 : Reset I12 : Reset I02
             Case 5
                Set Ph1 : Set I11 : Reset I01 : Set Ph2 : Reset I12 : Reset I02
             Case 6
                Set Ph1 : Reset I11 : Set I01 : Set Ph2 : Reset I12 : Set I02
             Case 7
                Set Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Reset I02
             Case 8
                Set Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Set I02
             Case 9
                Set Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Reset I02
             Case 10
                Set Ph1 : Reset I11 : Set I01 : Reset Ph2 : Reset I12 : Set I02
             Case 11
                Set Ph1 : Set I11 : Reset I01 : Reset Ph2 : Reset I12 : Reset I02
             Case 12
                Reset Ph1 : Set I11 : Set I01 : Reset Ph2 : Reset I12 : Reset I02
             Case 13
                Reset Ph1 : Set I11 : Reset I01 : Reset Ph2 : Reset I12 : Reset I02
             Case 14
                Reset Ph1 : Reset I11 : Set I01 : Reset Ph2 : Reset I12 : Set I02
             Case 15
                Reset Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Reset I02


          End Select

    Return

    Kier_stop:          'stop ma zachować aktualne położenie wirnika

    Return

    Ustaw_liczba_krokow:          [b]'tu się zaczyna problem[/b]

    Cls
    Lcd "liczba krokow:"
    Do
      If Pind.5 = 0 Then
        Waitms 20
          If Pind.5 = 0 Then
            Incr Liczba_krokow
              Waitms 1
              If Liczba_krokow >= 65535 Then       'i tu rośnie do 99999 a potem zmienia się na 10000
                Liczba_krokow = 65535
              End If
            'Lowerline
            Locate 2 , 2
            Lcd "-> " ; Liczba_krokow
          End If
      End If

      If Pind.6 = 0 Then
        Waitms 20
          If Pind.6 = 0 Then
            Decr Liczba_krokow
            Waitms 1
              If Liczba_krokow <= 0 Then       'a tu maleje z 10000 na 99999
                Liczba_krokow = 0
              End If
            'Lowerline
            Locate 2 , 2
            Lcd "<- " ; Liczba_krokow
          End If
      End If

    Debounce Pind.4 , 0 , Kier_stop

    Loop

    Return
    [b]
  • Pomocny post
    Poziom 26  
    Zgodnie z definicją Dim Liczba_krokow as Word zmienna ta ma rozmiar 2 bajtów czyli maksymalnie 65535 zwiększenie spowoduje wyzerowanie. Najlepiej sprawdzić tą wartość przed zwiększeniem/zmniejszeniem.
    Code:
            
    
    If Liczba_krokow < 65535 Then
       Incr Liczba_krokow
    End If

    podobnie
    Code:
            
    
    If Liczba_krokow > 0  Then
       Decr Liczba_krokow
    End If
  • Poziom 38  
    No- nieco pomogło.
    Nie spada poniżej 0.
    Gdy dojdę do 100 i zmniejszę to wyświetla 999
    Gdy zmniejszam z 1000 to daje mi 9999.
    To znaczy liczy do 999 i wyświetla trzy cyfry.
    Potem powyżej 1000 4 cyfry.
    Zmniejszam- też cztery cyfry ale z 1000 przechodzi na 9999.
    Zwiększam do 10000.
    Zmniejszam- teraz 5 cyfr ale 99999.
  • Pomocny post
    Poziom 43  
    Code:
    Lcd "<- " ; Liczba_krokow ; "    "
  • Poziom 38  
    No dzięki- działa.
    Wyświetlałem poprzednią cyfrę- jak ten kretyn.
    Jesteś genialny atom.
    Ale gdzie to jest w helpie albo gdzie indziej?
    P.S.
    Jedna spacja działa- " ".
    Tak jak kilka spacji.
    Bez spacji- nie działa.
    Locate 1,2- nie działa.
    Locate 2,2- działa.
    Lowerline- też działa.
  • Pomocny post
    Poziom 43  
    Nie ma tego w Helpie bo to nie jest żadna funkcja czy komenda.
    Po prostu to narysuje spacje na poprzednim texcie jeżeli przypadkowo napis by się skrócił. Bez tego po skróceniu napisu nowy napis będzie wyświetlony dobrze, ale na LCD pozostanie trochę starego napisu co da wrażenie wyświetlania większej liczby.
    Ale to jest sposób pośredni.
    Najlepiej użyć funkcji Format która wyrówna text:
    Code:

    Text = Str(Liczba_krokow)
    Text = Format(Text, "     ")
    Locate 1, 1
    LCD Text


    W nawiasie jest podane 5 spacji i to spowoduje wyrównanie długości textu do 5-ciu. Nawet jak cyfra będzie jedna to text będzie miał 5 znaków bo będzie dopełniony spacjami.
    Poprzedni wersja też dowalała spacje ale zawsze ich było 5. Ta dowali tyle ile trzeba.

    Dodano po 5 [minuty]:

    Acha. U Ciebie w tej poprzedniej wersji wystarczała jedna spacja bo text zmieniał się zawsze o jedną cyfrę. Gdyby jednak mógł zmienić się o więcej cyfr (np. z 65535 na 0) to potrzeba by było już 4 spacje. Ale zapominamy o tym bo Format jest lepsze.
  • Poziom 38  
    Ten program należy całkiem przerobić- wykorzystać rotate.