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

Atmega16 - Jak mogę przekazwywac wartość do bajtów high i low

b1088 15 Sty 2013 22:16 1116 8
  • #1 11794692
    b1088
    Poziom 10  
    Witam,
    chciałbym przekazywać wartość, która będzie się zmieniała.Mam cos takiego

    ldi r16, high(1000)
    ldi r17, low(1000)

    i chciałbym, żeby zamiast wartości liczbowych mógł podawać różne zmienne. Jak to mogę wykonać? kod jest w asemblerze
  • #2 11794794
    BlueDraco
    Specjalista - Mikrokontrolery
    Zmienna 16-bitowa zajmuje 2 bajty o adresach zmienna i zmienna+1. Do r16 ładujesz zmienna, do r17 - zmienna+1 (albo odwrotnie, według fantazji). Tylko po co męczyć się z asemblerem, skoro C jest zupełnie przyzwoity na tym procesorze? W końcu to nie jakiś PIC, na którym kompilator ledwie zipie.
  • #3 11794854
    piotrva
    VIP Zasłużony dla elektroda
    Co do męczenia się z ASM - na złe mu to nie wyjdzie. Sam znam C dosyć dobrze, ale ciągle idę w stronę ASM, żeby uzupełnić wiedzę.
  • #4 11795174
    b1088
    Poziom 10  
    niestety nadal nie rozwiązałem programu. Chodzi o zaladowanie adresu zmiennej do rejestrow:
    LDI R16,High(zmienna)
    LDI R17,Low(zmienna)
    czy w ogóle takie coś można wykonać?
  • #5 11795194
    excray
    Poziom 41  
    "high" i "low" są informacjami tylko dla kompilatora (w asemblerze nie ma czegoś takiego) i tylko względem stałych. Nie można ładować tam zmiennych. Zresztą nie ma nawet takiej potrzeby. Pokaż swój kod i wyjaśnij na jego przykładzie o co Ci chodzi.
  • #6 11795242
    b1088
    Poziom 10  
    Chodzi o to, że w trakcie działania programu otrzymuję zmienna 16-bitową, na której chcę wykonać operacje np:
    ldi BH, high(1000)
    ldi BL, low(1000)
    ldi AH,high(500)
    ldi AL,low(500)
    add AL, BL
    adc AH, BH

    i chciałbym, żeby zamiast stałej wartości 1000 była to zmienna, która będzie wyliczana w trakcie programu.
  • #7 11795264
    excray
    Poziom 41  
    A gdzie niby przechowujesz tą wyliczoną zmienną skoro AVR nie posiada żadnego 16-bitowego rejestru? Chyba musisz zapoznać się z datasheet tej atmegi.
  • #8 11795271
    piotrva
    VIP Zasłużony dla elektroda
    No ale i tak Twoja wyliczona zmienna 16-hit będzie zapisana jako 2 osobne bajty...
  • #9 11795352
    b1088
    Poziom 10  
    No tak racja, już sobie poradziłem poprostu przenosząć:
    ldi r16,$03
    ldi r17,$E8
    mov AH, r16
    mov AL, r17
    i śmiga. Przez dłuższy czas nie zaglądame do asm i tak wyszło, że... zgłupiałem :) Wielkie dzieki za zainteresowanie i pomoc
REKLAMA