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

Jak zoptymalizować i skrócić długi kod BASCOM AVR z obsługą RC5 i portów?

pini0 09 Wrz 2007 22:06 2357 17
  • #1 4267586
    pini0
    Poziom 15  
    Posty: 137
    Pomógł: 6
    Witam mam bardzo długi kod , a będzie jeszcze dłuższy
    
     $crystal = 8000000
    
    
    Config Portb.0 = Output
    Config Portb.1 = Output
    Config Portb.2 = Output
    Config Portb.3 = Output
    Config Portd.7 = Output
    Config Portd.6 = Output
    Config Portd.5 = Output
    Config Portd.4 = Output
    Config Rc5 = Pind.2
    Led Alias Portb.1
    Bsk Alias Portb.0
    Modee Alias Portb.3
    Snap Alias Portb.2
    
    Dim Address As Byte , Command As Byte
    Enable Interrupts
    
    Do
    Getrc5(address , Command)
    Command = Command And &B01111111
    Snap = 0
    Modee = 0
    
    
    If Address = 0 And Command = 38 Then
    Toggle Led
    End If
    If Address = 0 And Command = 15 Then       '  lampa błyskowa ładowanie '
    Bsk = 0
    
    End If
    If Address = 0 And Command = 13 Then       ' zdjęcia podswietleniem '
    Modee = 0
    Waitms 1
    Modee = 1          
    Waitms 20
    Modee = 0
    Waitms 20
    Snap = 0
    Led = 1
    Waitms 40
    Snap = 1
    Waitms 10
    Snap = 0
    Waitms 50
    Led = 0                  
    End If
    
     If Address = 0 And Command = 8 Then       ' tył'
      Portb.7 = 1
      Portb.6 = 0
      Portb.5 = 0
      Portb.4 = 1
       Waitms 35
        Portb.7 = 0
        Portb.6 = 0
        Portb.5 = 0
        Portb.4 = 0
     End If
     If Address = 0 And Command = 2 Then       ' przodu'
      Portb.7 = 0
      Portb.6 = 1
      Portb.5 = 1
      Portb.4 = 0
      Portb.1 = 1
       Waitms 35
        Portb.7 = 0
        Portb.6 = 0
        Portb.5 = 0
        Portb.4 = 0
     End If                  ' prawo'
     If Address = 0 And Command = 6then
      Portb.7 = 0
      Portb.6 = 1
      Portb.5 = 0
      Portb.4 = 0
       Waitms 15
        Portb.7 = 0
        Portb.6 = 0
        Portb.5 = 0
        Portb.4 = 0
     End If                  ' lewo'
     If Address = 0 And Command = 4 Then
      Portb.7 = 0
      Portb.6 = 0
      Portb.5 = 1
      Portb.4 = 0
       Waitms 15
        Portb.7 = 0
        Portb.6 = 0
        Portb.5 = 0
        Portb.4 = 0
     End If                 
     If Address = 0 And Command = 9 Then 'mocno w prawo'
      Portb.7 = 1
      Portb.6 = 0
      Portb.5 = 1
      Portb.4 = 0
       Waitms 15
        Portb.7 = 0
        Portb.6 = 0
        Portb.5 = 0
        Portb.4 = 0
      End If
     If Address = 0 And Command = 7 Then       ' mocno w lewo'
      Portb.7 = 0
      Portb.6 = 1
      Portb.5 = 0
      Portb.4 = 1
       Waitms 15
        Portb.7 = 0
        Portb.6 = 0
        Portb.5 = 0
        Portb.4 = 0
     End If
     If Address = 0 And Command = 5 Then       'stop'
      Portb.7 = 0
      Portb.6 = 0
      Portb.5 = 0
      Portb.4 = 0
      End If
     If Address = 0 And Command = 0 Then       'taniec lub droga '
      Portb.7 = 0
      Portb.6 = 1
      Portb.5 = 1
      Portb.4 = 0
       Waitms 350
        Portb.7 = 1
        Portb.6 = 0
        Led = 1
         Waitms 20
          Portb.6 = 1
          Portb.7 = 0
           Waitms 180
            Portb.4 = 1
            Portb.5 = 0
             Waitms 20
          Portb.7 = 0
      Portb.6 = 0
      Portb.5 = 0
      Portb.4 = 0
           Waitms 10
    
    
     End If
    Loop
    End
    
    


    Poprawiłem temat. [c_p]
  • #2 4267742
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 124
    Poczytaj o instrukcji select - case, możesz zastosować operatory logiczne i przypisywać całe bajty (jak w języku C) zamiast pojedynczych bitów.
  • #3 4267787
    pini0
    Poziom 15  
    Posty: 137
    Pomógł: 6
    znalazłem gosub i goto
    McRancor napisał:
    Poczytaj o instrukcji select - case, możesz zastosować operatory logiczne i przypisywać całe bajty (jak w języku C) zamiast pojedynczych bitów.

    A czy operatory logiczne działają na czas
  • #4 4267832
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 124
    W znikomym stopniu. Masz tu problemy z czasem? Na czym polegają? Czy po prostu chcesz żeby kod mniej miejsca zajmował?
  • Pomocny post
    #5 4267851
    grzebuj
    Poziom 13  
    Posty: 48
    Pomógł: 4
    Ocena: 1
    Można zapisać do portu liczbę odpowiadającą poszczególnym pinom. Zyskujemy wówczas zamiast

    Portb.7 = 0
    Portb.6 = 1
    Portb.5 = 0
    Portb.4 = 1

    możemy zapisać np:
    Portb = Portb Or &B01010000
  • #6 4267882
    pini0
    Poziom 15  
    Posty: 137
    Pomógł: 6
    Czasy to odległość i kąt skręcania , mam pojazd niby robot . Chce zaprogramować tory jazdy z robić zdjęcie i powrócić . Wiem że droga nie może być długa bo to nie jest zegarek szwajcarski .
  • Pomocny post
    #7 4267939
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 124
    Config Portb.0 = Output
    Config Portb.1 = Output
    Config Portb.2 = Output
    Config Portb.3 = Output
    Config Portd.7 = Output
    Config Portd.6 = Output
    Config Portd.5 = Output
    Config Portd.4 = Output

    zastąp:

    DDRD=255

    Zastąp IFy case'ami, dodaj procedurę zerującą Portd7-4 i kod będzie zgrabniejszy.

    Przypisanie logiczne zastąpi 4 instrukcje sbi/cbi warte 8 taktów przez instrukcję wartą 3 (in, andi/ori, out) a może się okazać że jeszcze jakiś PUSH/POP nieszczęsny bascom dołoży i dojdą kolejne 4 takty.
  • #8 4267942
    pini0
    Poziom 15  
    Posty: 137
    Pomógł: 6
    Co za pech 2 procesory mi coś szwankują , chyba jest ich koniec .
    Zrobiłem na ' goto ' ale nie mogę sprawdzić

    
    '''''''''''''''''''''''''''''''ustawienia'''''''''''''''''''''''''''''''
     $crystal = 8000000
    
    Config Portb.0 = Output
    Config Portb.1 = Output
    Config Portb.2 = Output
    Config Portb.3 = Output
    Config Portb.7 = Output
    Config Portb.6 = Output
    Config Portb.5 = Output
    Config Portb.4 = Output
    Config Rc5 = Pind.2
    Led Alias Portb.1
    Bsk Alias Portb.0
    Modee Alias Portb.3
    Snap Alias Portb.2
    
    Dim Address As Byte , Command As Byte
    Enable Interrupts
    ''''''''''''''''''''''''''''''''główny program''''''''''''''''''''''''''''''''
    Do
    Getrc5(address , Command)
    Command = Command And &B01111111
    Snap = 0
    Modee = 0
    
    If Address = 0 And Command = 8 Then       'tył'
    Goto Tyl
    End If
    If Address = 0 And Command = 2 Then       'przód'
    Goto Fff
    End If
    If Address = 0 And Command = 6 Then       'prawo'
    Goto Pra
    End If
    If Address = 0 And Command = 4 Then       'lewo'
    Goto Lew
    End If
    If Address = 0 And Command = 1 Then       'mocno w lewo'
    Goto Mwl
    End If
    If Address = 0 And Command = 3 Then       'mocno w prawo
    Goto Mwp
    End If
    
    
    If Address = 0 And Command = 38 Then
    Toggle Led
    End If
    If Address = 0 And Command = 15 Then       '  lampa błyskowa ładowanie '
    Bsk = 0
    End If
    If Address = 0 And Command = 13 Then       '  zdjęcie '
    Goto Snaps
    End If
    
    Loop
    End
     '''''''''''''''''''''''''''''''''tabela ruchów'''''''''''''''''''''''''''''
    Tyl:
      Portb.7 = 1
      Portb.6 = 0
      Portb.5 = 0
      Portb.4 = 1
       Waitms 35
        Portb.7 = 0
        Portb.6 = 0
        Portb.5 = 0
        Portb.4 = 0
     return
    Fff:
      Portb.7 = 0
      Portb.6 = 1
      Portb.5 = 1
      Portb.4 = 0
      Portb.1 = 1
       Waitms 35
        Portb.7 = 0
        Portb.6 = 0
        Portb.5 = 0
        Portb.4 = 0
     Return
    Pra:
      Portb.7 = 0
      Portb.6 = 1
      Portb.5 = 0
      Portb.4 = 0
       Waitms 15
        Portb.7 = 0
        Portb.6 = 0
        Portb.5 = 0
        Portb.4 = 0
     Return
    Lew:
      Portb.7 = 0
      Portb.6 = 0
      Portb.5 = 1
      Portb.4 = 0
       Waitms 15
        Portb.7 = 0
        Portb.6 = 0
        Portb.5 = 0
        Portb.4 = 0
     Return
    Mwp:
      Portb.7 = 1
      Portb.6 = 0
      Portb.5 = 1
      Portb.4 = 0
       Waitms 15
        Portb.7 = 0
        Portb.6 = 0
        Portb.5 = 0
        Portb.4 = 0
      Return
    Mwl:
      Portb.7 = 0
      Portb.6 = 1
      Portb.5 = 0
      Portb.4 = 1
       Waitms 15
        Portb.7 = 0
        Portb.6 = 0
        Portb.5 = 0
        Portb.4 = 0
     Return
    Stopp:
      Portb.7 = 0
      Portb.6 = 0
      Portb.5 = 0
      Portb.4 = 0
      Return
    Snaps:
    Modee = 0
    Waitms 1
    Modee = 1
    Waitms 20
    Modee = 0
    Waitms 20
    Snap = 0
    Led = 1
    Waitms 40
    Snap = 1
    Waitms 10
    Snap = 0
    Waitms 50
    Led = 0
     Return
    
  • #9 4271593
    Ch.M.
    Poziom 27  
    Posty: 1009
    Pomógł: 62
    Ocena: 15
    Zmień język na Asembler...
    Z tego co widzę, (używasz prostych rozgałęzień) to niewiele więcej linijek zajmuje napisanie tego samego w ASM a rozmiar kodu... no tego nie przewidzę ale na pewno kompresja 5:1

    Mam nadzieje, ze nie rozpęta się burza...
    pozdrawiam
  • #10 4271977
    pini0
    Poziom 15  
    Posty: 137
    Pomógł: 6
    no ale czy trzeba znać cały język Asembler dla danego µP bo tyle co się orientuje to tak . Jednak okazało się że mi wystarczy pamięci w attiny2313 z 52% skróciłem do 42% no i jestem zadowolony z efektów .
    Jestem początkującym i mam pytanko ile razy można programować µP i czy bascom avr demo compile większy kod niż 2 kb mam zamiar kupić atmega8 no a apetyt rośnie w miarę jedzenia i w planach mam atmega16 .
    Pozdrawiam.
  • #11 4271994
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 124
    uP zaprogramujesz więcej razy niż sam wytrzymasz, w dokumentacji są dokładne cyfry.

    Demo bascoma ma ograniczenie do 4KB, żeby kompilować więcej trzeba kupić pełną wersję.

    Asemblera całego nie trzeba się uczyć, jest to dość wygodne narzędzie do prostych projektów. Lepiej zostań przy bascomie, getrc5 w asemblerze wymaga od programisty pewnych umiejętności. Bascom tego nie nauczy...
  • #12 4272060
    pini0
    Poziom 15  
    Posty: 137
    Pomógł: 6
    Wolę zostać przy bascomie bo zaczynam powoli rozumieć .
    znalazłem
    Cytat:
    – 2K Bytes of In-System Self Programmable Flash
    Endurance 10,000 Write/Erase Cycles

    a ja programowałem góra 3000 razy 2 µP na przemian i chyba mam coś namieszane bo jeden po drugim padły
  • #13 4272078
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 124
    Same nie padły, a 10000 programowań to praktycznie niemożliwe do osiągnięcia w warunkach amatorskich.

    Pewnie przestawiłeś fusebity.
  • #14 4272092
    Ch.M.
    Poziom 27  
    Posty: 1009
    Pomógł: 62
    Ocena: 15
    10.000 zapisów to nie problem, sam dziennie programuje procka 20 do 50 razy ( a może wiecej?)
    Po za tym to jest średnia wartość i tak ja traktuj. Teoretycznie możesz trafic procka którego wogóle nie będzie dało sie zaprogramować, albo padnie po kilkudziesięciu razach. A praktycznie to pewnie wystapił jakis bład i sie poblokował SPI albo włączył zewnętrzny kwarc...
    Pozdrawiam
  • #15 4272113
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 124
    To musiałbyś go katować codziennie przez dwa lata żeby w końcu ubić flash, a jeżeli tak jest w rzeczywistości to radze się nad tym głęboko zastanowić...
  • #16 4272163
    pini0
    Poziom 15  
    Posty: 137
    Pomógł: 6
    To coś namieszałem ale co ? µP nic nie odpowiada programatorowi ( miso ) nie zmienia stanu podczas programowania może spaliłem jakieś wyprowadzenie SPI , a zewnętrzny kwarc brak częstotliwości i napięć 0,05V . Może połączyć jakieś wyprowadzenia portów ?
    Trochę odeszliśmy od tematu.
  • #17 4272192
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 124
    Kup nowe, będzie szybciej. Nie ma czegoś takiego jak wewnętrzny kwarc, możesz podłączyć kwarc lub generator i zobaczyć czy procesor wstanie.
  • #18 4276950
    pini0
    Poziom 15  
    Posty: 137
    Pomógł: 6
    Właśnie kupiłem nowego procka mam nadzieje że pochodzi . Wpadłem na pewien pomysł ale nie wiem czy sobie z nim poradzę , do pomysłu chciałbym wykorzystać pamięć i np zapisać trasę w pamięci a potem ją odtworzyć i pobrać do pliku , czy jest takie coś możliwe.
    Ale marzenia . No i nie mogę zrozumieć case'ów .

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy optymalizacji i skrócenia długiego kodu w BASCOM AVR obsługującego protokół RC5 oraz porty mikrokontrolera. Proponowane rozwiązania obejmują zastąpienie wielu pojedynczych konfiguracji portów jedną instrukcją przypisania rejestru DDRx, użycie instrukcji select-case zamiast wielu instrukcji if, a także operacji logicznych na całych bajtach zamiast pojedynczych bitów, co zmniejsza rozmiar i poprawia wydajność kodu. Wskazano, że użycie przypisania logicznego do portów (np. Portb = Portb Or &B01010000) jest bardziej efektywne niż ustawianie pojedynczych pinów. Poruszono także temat programowania mikrokontrolerów, gdzie podano, że pamięć flash można programować wielokrotnie (rzędu tysięcy razy), a ograniczenia demo BASCOM AVR dotyczą 4 KB kodu. Zasugerowano, że nauka asemblera nie jest konieczna dla prostych projektów, a BASCOM jest wygodnym narzędziem dla początkujących. Wspomniano o problemach sprzętowych z mikrokontrolerami (np. brak odpowiedzi na programatorze, problemy z kwarcem) i zaleceniu wymiany uszkodzonych układów. Autor planuje wykorzystać pamięć do zapisu i odtwarzania trasy pojazdu-robota, jednak ma trudności ze zrozumieniem instrukcji case w BASCOM.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA