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

[Attiny2313][bascom] Jak można zapisać inaczej te waruneki??

dracomithril 17 Lut 2011 01:03 1532 4
REKLAMA
  • #1 9162549
    dracomithril
    Poziom 2  
    Witam jestem początkującym programista w bascomie. Napisałem program do sterowania 2 silnikami krokowymi. Nie mogę zamieścić całej treści programu ponieważ zamierzam go wykorzystać do pracy dyplomowej. Program działa ale potrzebuję dodatkowego miejsca w pamieci na kilka instrukcji.

    oto część kodu:
     
         $regfile = "ATtiny2313.dat"
          $crystal = 4000000
          Dim Wa As Byte
    
          Config Portb = Output
          Config Portd = Input
    
           Wa = 99
           Portd = &B1111
    
    
      Lus:
          
           'silniki
          If Pind.0 = 0 And Pind.1 = 1 And Pind.2 = 1 And Pind.3 = 1 Then Gosub Ff       'do przodu
          If Pind.0 = 1 And Pind.1 = 0 And Pind.2 = 1 And Pind.3 = 1 Then Gosub Bb       'do tylu
          If Pind.0 = 1 And Pind.1 = 1 And Pind.2 = 0 And Pind.3 = 1 Then Gosub Rr       'prawo w miejscu
          If Pind.0 = 1 And Pind.1 = 1 And Pind.2 = 1 And Pind.3 = 0 Then Gosub Ll       'lewo w miejscu
          If Pind.0 = 0 And Pind.1 = 1 And Pind.2 = 0 And Pind.3 = 1 Then Gosub Fr       'przod prawo
          If Pind.0 = 0 And Pind.1 = 1 And Pind.2 = 1 And Pind.3 = 0 Then Gosub Fl       'przod lewo
          If Pind.0 = 1 And Pind.1 = 0 And Pind.2 = 0 And Pind.3 = 1 Then Gosub Br       'tyl prawo
          If Pind.0 = 1 And Pind.1 = 0 And Pind.2 = 1 And Pind.3 = 0 Then Gosub Bl       'tyl lewo
    
          Goto Lus
    'dalej znajdują się funkcje od każdego rodzaju obrotu
    


    do uP podłaczone sa cztery przełaczniki odpowiedzialne za podanie sygnału ruchu.

    Moje pytanie brzmi czy jest możliwość zastąpienia tych funkcji:
    If Pind.0 = 0 And Pind.1 = 1 And Pind.2 = 1 And Pind.3 = 1 Then Gosub Ff
    jakimiś prostszymi mniej pamięcio żernymi???

    Próbowałem już zapisać to w ten sposób:
    If Pind = &B1110 Then Gosub Ff

    ale program nie chce się uruchomić.

    Jeżeli ktoś ma jakiś pomysł będę wdzięczny. Wkońcu kto pyta podobno nie błądzi :D
  • REKLAMA
  • Pomocny post
    #2 9162661
    zumek
    Poziom 39  
    dracomithril napisał:
    ...Jeżeli ktoś ma jakiś pomysł ...

    Ja mam taki pomysł :D
    $regfile = "ATtiny2313.dat"
    $crystal = 4000000
    Dim Wa As Byte , Kierunek As Byte
    
    Config Portb = Output
    Config Portd = Input
    
    Wa = 99
    Portd = &B1111
    
    Do
    Lus:
    
          Kierunek = Pind And &H0F
          '                 0    1    2    3    4    5    6    7    8    9    10   11   12   13   14   15
          On Kierunek Gosub Na , Na , Na , Na , Na , Bl , Fl , Ll , Na , Br , Fr , Rr , Na , Bb , Ff , Na
    
    
           'silniki
    '(
          If Pind.0 = 0 And Pind.1 = 1 And Pind.2 = 1 And Pind.3 = 1 Then Gosub Ff       ' 1110-14 do przodu
          If Pind.0 = 1 And Pind.1 = 0 And Pind.2 = 1 And Pind.3 = 1 Then Gosub Bb       ' 1101-13 do tylu
          If Pind.0 = 1 And Pind.1 = 1 And Pind.2 = 0 And Pind.3 = 1 Then Gosub Rr       ' 1011-11 prawo w miejscu
          If Pind.0 = 1 And Pind.1 = 1 And Pind.2 = 1 And Pind.3 = 0 Then Gosub Ll       ' 0111- 7 lewo w miejscu
          If Pind.0 = 0 And Pind.1 = 1 And Pind.2 = 0 And Pind.3 = 1 Then Gosub Fr       ' 1010-10 przod prawo
          If Pind.0 = 0 And Pind.1 = 1 And Pind.2 = 1 And Pind.3 = 0 Then Gosub Fl       ' 0110- 6 przod lewo
          If Pind.0 = 1 And Pind.1 = 0 And Pind.2 = 0 And Pind.3 = 1 Then Gosub Br       ' 1001- 9 tyl prawo
          If Pind.0 = 1 And Pind.1 = 0 And Pind.2 = 1 And Pind.3 = 0 Then Gosub Bl       ' 0101- 5 tyl lewo
    
          Goto Lus
    ')
    Loop
    
    Na:       'bez akcji
    Return
    'twoje funkcje
    '...
    
  • REKLAMA
  • #3 9162685
    dracomithril
    Poziom 2  
    Wow dzięki to sporo dało jakieś 800B. :D Przeszukiwałem fora w poszukiwaniu różnych rozwiązań i na ich podstawie napisałem ten program widzać jeszcze sporo muszę się nauczyć.:)

    mam jedno pytanie: Co oznacza ten zapis??
    
    Kierunek = Pind And &H0F    
    


    nie rozumiem tej części po = to znaczy wiem co znaczą osobno ale nie wiem jak to interpretować razem...:)

    Ktoś jeszcze jakieś pomysły??
  • REKLAMA
  • Pomocny post
    #4 9162769
    Fredy
    Poziom 27  
    dracomithril napisał:

    mam jedno pytanie: Co oznacza ten zapis??
    
    Kierunek = Pind And &H0F    
    


    nie rozumiem tej części po = to znaczy wiem co znaczą osobno ale nie wiem jak to interpretować razem...:)

    Ktoś jeszcze jakieś pomysły??


    Ten zapis to tzw maska. Liczba z indeksem &H to liczba szesnastkowa (Hex).
    Liczba &H0F to inaczej 00001111.
    Zapis
    Kierunek = Pind And &H0F

    daje w wyniku jedynki tam gdzie na porcie są jedynki i tam gdzie są jedynki w liczbie maskującej.Pozostałe pola mają być zerami.
    Chodzi o to PINom które możesz wykorzystać do innych celów nie zmienić wartośći.

    Wracając do Twojego programu:

    zamiast konstrukcji typu If PINd.1 ....and PINd.2 and PINd.3 then ....


    Możesz zrobić jedną instrukcję Select Case.


    Czyli robisz tak

    Stan = PIND and 0B00001111 ' to jest to samo co PIND and &H0F
    Select Case stan
    
    Stan 14   Gosub Ff
    Stan 13   Gosub Bb
    Stan 12  ...itd
    
    
    end select
  • #5 9172078
    dracomithril
    Poziom 2  
    obydwa sposoby rozwiązują mój problem :) skróciły one program o praktycznie 800 B. Jak dla mnie Case jest bardziej czytelny:) chociaż chwilę mi zajęło znalezienie jego składni w internecie:) ale dzięki temu nauczyłem się czegoś.
    Dzięki wam za pomoc. Temat rozwiązany:)
REKLAMA