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

AVR Atiny 2313 Bascom - Asembler

kamil007 01 Sty 2011 12:52 1640 8
  • #1 8943083
    kamil007
    Poziom 12  
    Witam!
    W programie napisanym w Bascom do wyświetlania na matrycy 8x8 , używam rejestru przesównego, do którego ładuję dane poleceniem " SHIFTOUT" wygląda to tak:
    
    Shiftout Ds_a6276 , Clock_a6276 , Temp 
    

    Chcąc troszkę to przyspieszyć wpadłem na pomysł żeby zoptymalizować tą funkcję i skleciłem kod w ASM:
    
    $asm
      lds r18 , {Temp}                                   'Wczytaj do r18 zmienną Temp
        rcall ShiftByte  
          ret
    
     Shiftbyte:
       ldi    r19, 8                                            ' 8 bitów do wysłania 
        Shiftloop:
              sbrc   r18, 8                                     ' 
              sbi    PORTB, 0                                   '  Ds 1
              sbrs   r18, 8                                     ' 
              cbi    PORTB, 0                                 ' Ds 0
              nop                                               '
              sbi    PORTB, 1                                   ' pulse shift clock
              lsr    r18                                        ' next bit
              cbi    PORTB, 1                                   ' end shift clock pulse
              dec    r19                                        ' 
               brne  ShiftLoop                                  ' loop for 8 bits
    
              sbi    PORTB, 2                                   ' pulse storage clock high
              nop                                               '
              cbi    PORTB, 2                                   ' then return low
              ret
           $end Asm

    Niby wszystko działa, ale :D
    Zmienna temp wyświetlana jest do góry nogami.
    Dlaczego tak się dzieje i jak to poprawić :?: :?: :?:
  • Pomocny post
    #2 8943233
    asembler
    Poziom 32  
    Nie wgłebiajac sie w kod moze zamiast LSR daj LSL i po sprawie.
    Nie ma '8' bitu chyba.
  • #3 8943285
    kamil007
    Poziom 12  
    No troszke nie mogę załapać z tym 8 bitem. :cry:
    Dałem LSL, ale teraz obraz jest tak jak by poza matrycą.
    Wyświetla się tylko pierwszy wiersz.
    Hehe Działa :D :D
    
    $asm 
      lds r18 , {Temp}                                   'Wczytaj do r18 zmienną Temp 
        rcall ShiftByte  
          ret 
    
     Shiftbyte: 
       ldi    r19, 8                                            ' 8 bitów do wysłania 
        Shiftloop: 
              sbrc   r18, 7                                    ' 
              sbi    PORTB, 0                                   '  Ds 1 
              sbrs   r18, 7                                     ' 
              cbi    PORTB, 0                                 ' Ds 0 
              nop                                               ' 
              sbi    PORTB, 1                                   ' pulse shift clock 
              lsl    r18                                        ' next bit 
              cbi    PORTB, 1                                   ' end shift clock pulse 
              dec    r19                                        ' 
               brne  ShiftLoop                                  ' loop for 8 bits 
    
              sbi    PORTB, 2                                   ' pulse storage clock high 
              nop                                               ' 
              cbi    PORTB, 2                                   ' then return low 
              ret 
           $end Asm
    

    Wielkie dzięki :D
    Tylko i tak nie mogę załapać.
  • #4 8943625
    asembler
    Poziom 32  
    Durny kompilator nie sygnalizuje ci przekroczenia zakresu.
    Zamiast r18,8 co jest bez sensu bo kompilator i tak prawdopodobnie przyjmie wartosc zeor a dokladnie 256 czyli po wlozeniu tej liczby do jednego bajtu wyjdzie 0
    Popraw R18,8 NA R18,7

    Dodano po 6 [minuty]:

    HEHE teraz dopiero odsiwerzył mi sie twój poprawiony program.
  • #5 8944215
    kamil007
    Poziom 12  
    A słuchaj teraz muszę iść do przodu :D i rozbudować troszke program.
    Zmienna Temp będzie typu Word . Jak to rozwiązać przecież nie wepcham 16 bitów do jednego rejestru?? :|
  • #7 8944272
    asembler
    Poziom 32  
    Lub robisz tak:
    licznik birów R19 zwiekszasz do 16
    A zamiast jednego bajtu dajesz dwa r17,r18

    zastepujesz lsl r17

    ROL R17
    LSL R18

    Program rośnie o jedno slowo rozkazowe.
  • #8 8944659
    kamil007
    Poziom 12  
    No myślę myślę i ciemno :D
    Bliższy jestem zaskoczenia drugiego sposobu bo z tymi makrami to nie wiem co wpisać w nawias
     ldi ZH,high(??)
          ldi ZL,low(??)

    W drugim sposobie nie kumam tego
    Cytat:

    A zamiast jednego bajtu dajesz dwa r17,r18

    Czyli robię dwie pętle, w pierwszej przepycham r17, a r18 sobie kołuje, a w drugiej przepycham r18 :?:
  • #9 8944936
    asembler
    Poziom 32  
    LD R19,16
    LOOP ........
    ........
    LSL ZL
    ROL ZH
    BRNE LOOP
REKLAMA