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

dsPIC30F6014A: Wymiana danych między C a assemblerem - problem z buforem RX

downybear 10 Maj 2010 17:23 1863 2
  • #1 8059164
    downybear
    Poziom 11  
    Posty: 42
    Pomógł: 1
    Ocena: 3
    Witam kolegów,
    w trzecim tygodniu nad dsPIC30F6014A stanąłem nad problemem wymiany danych pomiędzy C i assemblerem.

    Jest taki kawałek assemblerowy - problemy opisuję w kodzie:


    .include "p30fxxxx.inc"
    .extern _RxBuf  ; bufor danych zadeklarowany w C
    .extern _RxPtr  ; pointer do bufora jw.
    .extern _curDat ; aktualna dana z UART w celach poglądowych
    
    .weak _RXBUFSIZE ; zadeklarowana globalnie stała w C, żeby w razie
    ; konieczności nie poprawiać w wielu miejscach
    ; ale w kodzie poniżej zawsze widziana jest źle 
    ;i od razu czyści mi się pointer _RxPtr
    
    .equ RX, 20
    ; tak oczywiście działa dobrze, wpisanie zamiast '20'
    ; _RXBUFSIZE, też nie pomaga
    
    .global __U2RXInterrupt
    .section  .text
    __U2RXInterrupt:
            push    w0                      ;Save w0
            clr     w0                      ;Clear w0
            mov.b   U2RXREG, WREG           ;Transfer received byte to w0
            mov     WREG, _curDat
    
    
            mov     _curDat, w0
    ;      mov  w0, _RxBuf[_RxPtr] ; <--- to chcę osiągnąć, ale nie potrafię tego
    ; zapisać tak, żeby MPASM przyjął
    
            inc     _RxPtr
            mov     _RxPtr,w0
    ;        cp.b    w0, #_RXBUFSIZE     ; <--- _RXBUFSIZE  zero zawsze
            cp.b    w0, #RX 
            bra     lt, no_buff_roll
            clr     _RxPtr
    no_buff_roll:
    
    
    
            pop     w0                      ;Restore w0
            bclr    IFS1, #U2RXIF           ;Clear the interrupt flag.
            retfie                          ;Return from Interrupt
    
    .end                                    ;EOF
    


    Drugi dzień drążę instrukcję do MPASM, MPLAB C30 i inne związane z tematem, ale jakoś nie mogę tego rozwiązać :(.
    Pojedyncze dane int, char działają mi bez problemu w obie strony, tylko te stałe i tablice...

    Z góry dziękuję za pomoc.
    Pozdrawiam
    Mariusz
  • Pomocny post
    #2 8061067
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    mov wX, [wY+wZ]

    adresowanie pośrednie z offsetem. Wcześniej musisz do wY załadować adres RxBuf, a do wZ - RxPtr offset (bajtowy!) w tablicy.

    Co do wykorzystania zmiennych z C w assemblerze, to - jak już zauważyłeś jest to problematyczne, ale gdy próbowałem to zrobić, to nie było problemu... Lektura dokumentacji do kompilatora C30 wystarczyła.

    4\/3!!
  • #3 8063658
    downybear
    Poziom 11  
    Posty: 42
    Pomógł: 1
    Ocena: 3
    Witaj Freddie,
    szczerze mówiąc czytałem wiele Twoich postów i liczyłem na Ciebie - cieszę się, że się nie pomyliłem ;).

    A więc działa, dla potomności załączam kod, banalny, ale na początku zabaw z każdym prockiem pewnie i taki się komuś przyda.

    Na Forum Microchipa odbyła się rozmowa dotycząca problemu stałej:

    http://www.ekiert.com/cgi-bin/yabb/YaBB.pl?board=pic;action=display;num=1273507190

    Mnie się nie udało tego rozwiązać tego mimo wskazówek, ale to naprawdę mały pikuś (Pan), w porównaniu z tymi tablicami C z ASM :).

    W końcówce postu napisałeś, że zmienne C<-> Assembler są problematyczne - ciekawe dlaczego tak sądzisz - oprócz mojego braku oswojenia z tutejszymi dsPIC-owymi zapisami, char-y i inty ruszyły mi od razu... a w tym procku i narzędziach jestem świeżutki....

    Jeszcze raz wielkie dzięki :).
    Mam już w zanadrzu kolejny problem, ale jeszcze nad nim popracuję zanim zacznę pytać :)
    Pozdrawiam
    Mariusz

    A tu jeszcze kod dla potomnych:

    
    
    
    .include "p30fxxxx.inc"
    .extern _RxBuf
    .extern _RxPtr
    
    .section .data
    .equ RX ,20
    
    .global __U2RXInterrupt
    .section  .text
    
    __U2RXInterrupt:
            push    w0                      ;Save w0
            clr       w0                      ;Clear w0
    	push    w1
            push    w2
            mov.b  U2RXREG, WREG           ;Transfer received byte to w0
            mov    #_RxBuf, w1
            mov     _RxPtr, w2
            mov.b  w0,[w1+w2]
            inc      _RxPtr
            mov    _RxPtr,w0
            cp      w0, #RX 
            bra     lt, no_buff_roll
            clr      _RxPtr
    no_buff_roll:
            pop 	 w2
    	pop 	 w1
            pop    w0                      ;Restore w0
            bclr    IFS1, #U2RXIF           ;Clear the interrupt flag.
            retfie                          ;Return from Interrupt
    
    .end                                    ;EOF
    
    
REKLAMA