logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

janbernat 20 Sty 2010 18:37 1280 6
REKLAMA
  • #1 7564951
    janbernat
    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?

    
    '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]
  • REKLAMA
  • Pomocny post
    #2 7565289
    Krauser
    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.
            
    If Liczba_krokow < 65535 Then
       Incr Liczba_krokow
    End If 

    podobnie
            
    If Liczba_krokow > 0  Then
       Decr Liczba_krokow
    End If 
  • REKLAMA
  • #3 7565826
    janbernat
    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
    #4 7565903
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #5 7566314
    janbernat
    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.
  • REKLAMA
  • Pomocny post
    #6 7566662
    Konto nie istnieje
    Poziom 1  
  • #7 8244692
    janbernat
    Poziom 38  
    Ten program należy całkiem przerobić- wykorzystać rotate.
REKLAMA