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

Optymalizacja kodu Bascom: zamiana stringa na bajt w asemblerze

Dawid 88 17 Mar 2014 18:04 1767 7
  • #1 13414381
    Dawid 88
    Poziom 14  
    Chciałbym was prosić o małą pomoc. Mam króciutki kod w bascomie polegający na zamianie stringa 3 znakowego na jeden bajt ( wartość po przeliczeniu nie przekracza 255)
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Problem w tym że ten kawałek kodu powtarza się dużo razy a czasu jest nie wiele. Połączenie dużej ilości powtórzeń i dużej ilości cykli zegara na samą funkcję Mid bardzo mi przeszkadza. Według symulatora bascoma ten jeden fragment chodzi 126 cykli zegara. Chciałbym spróbować napisać to w asemblerze ale niestety mam zerowe doświadczenie we wkładaniu wstawek asm.
    Z tego co się zdążyłem pobawić to w asemblerze zrobiłem samo przeliczenie
    B = B * 100 i 10
    A = A + B
    zostawiając w bascomie funkcję Mid i symulator zszedł do 109 cykli zegara. niestety tu się zaciąłem i nie wiem jak się zabrać za funkcję Mid.
  • #2 13418173
    Jacek Rutkowski
    Poziom 28  
    Cześć,
    próbowałeś gotowej komendy Bascoma?
    Ile ona pożera czasu?
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #3 13420020
    Dawid 88
    Poziom 14  
    Niestety samo VAL potrzebuje 210 cykli zegara. Zazwyczaj gotowce są obszerne a to co cię robi od podstaw po kolei leci optymalniej.
  • #4 13420117
    BlueDraco
    Specjalista - Mikrokontrolery
    Zacznij zatem od porzucenia Bascoma i przesiadki na C, skoro zależy Ci na wydajności. Przy okazji możesz wziąć procesor tańszy od AVR i z 10 razy szybszy, np. jakiegoś Cortexa.
  • #5 13420439
    Mundi1970
    Poziom 24  
    Bez asemblera 59 - 64 cykli, łańcuch może mieć wartość od "000" do "255":

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #6 13437347
    Konto nie istnieje
    Konto nie istnieje  
  • #7 13594544
    maciek 222
    Poziom 11  
    Witam mam podobny problem i nijak nie mogę sobie poradzić LED z WS2812B
    pierwsza dioda w taśmie się zapala (wszystkie kolory, i PWM jest oki) a następne nie chcą niestety może mi ktoś pomoże :( - dzięki

    Kod: text
    Zaloguj się, aby zobaczyć kod

    $regfile = "m328pdef.DAT"
    $crystal = 16000000
    Config Portd.1 = Output
    Pind.1 = 0

    Dim A As Word

    Dim Green As Byte , Red As Byte , Blue As Byte


    Red = 100
    Green = 200
    Blue = 10




    Do

    Gosub Rgb0
    Wait 1

    Loop



    'Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

    Rgb0:
    Loadadr Green , X 'załaduj adres zmiennej GREEN do rejestru X

    'niestety to też mi nie działa
    $asm
    ; .dseg
    ; Rsbufor : .byte 16 ; Rezerwuje 16 Bajtów Dla Rsbufor


    ;ustawić portD na 1 i w zależności od BRCS C=1 tzn bit=1 1=800ns 0=400ns
    ;-----""------ na 0 ------""----- od BRCS C=0 tzn bit=0 0=400ns 1=800ns
    ;Ldi R17,(X) ; Kolor 1 Cykl

    Ldi r16,30 ;ilosc diod LDI laduj do r16
    ;ldi r17,255 ;kolor
    INC R16
    LDI R18,3

    ;Loop6:
    ; ldi ZL,low (Ledy*2) ;adres tabeli w pamięci programu
    ;ldi ZH,high (Ledy*2) ; niestety taki zapis nie mi kompiluje Bascom


    Ldi R17,5 ; Kolor 1 Cykl
    Loop6:
    Ldi r19,8 ;ilosc bitow 1 CYKL
    push r17

    ; 12,8=800 13 CYKLI 810ns
    ; 6,4=400 6 CYKLI 375ns
    ;150ns Tolerancja 2,4 Cykle
    Loop4:

    SBI portd,1 ; USTAWIA 1 NA PORCIE D 2 CYKLE
    add r17,r17 ; 1 CYKL
    NOP ; 1 CYKL
    NOP ; 1 CYKL
    brcs jeden ; jesli 1bit to C=1 jesli 0 to C=0 2 CYKLE lub 1
    ; SBIS PIND, 3 ' jak bit ustawiony to omiń skok
    cbi PORTd,1 ; USTAW 0 NA PORCIE 2 CYKLE

    Jeden:

    nop
    nop
    nop
    nop
    NOP
    DEC R19 ; 1 CYKL


    cbi PORTd,1 ; ZERUJ NA PORCIE D 2 CYKLE

    NOP
    NOP
    BRNE Loop4 ; 2 Cykle
    DEC R18
    pop r17
    add r17,r17
    BRNE LOOP6

    NOP


    rjmp LOOP8 ; 2 CYKLE


    '---------------------------------------------------------------------------------
    '---------------------------------------------------------------------------------

    Loop8:

    $end Asm

    Return
    End

    Ledy:
    Data 10 , 20 , 30
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #8 13600659
    maciek 222
    Poziom 11  
    Witam, może jednak ktoś rzuci okiem - niestety jestem początkujący :(. Dzięki.
REKLAMA