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

[Atmega88][ASM] Operand 2 out of range: 0XC5

gary2007 23 Sty 2011 23:05 1923 7
  • #1 9048476
    gary2007
    Poziom 14  
    Pisząc program dla ATmega88PA-AU natknąłem się na problem przy np. takim rozkazie:
    OUT UBRR0H,R17

    W datasheet dla ATmega48/V;ATmega88/V;ATmega168/V taki rozkaz jest, ale kompilator go nie przepuści. Jak mam załadować R17 do rejestru UBRR0H? Za pomocą rozkazu np ST używając adresu dla rejestru UBRR0H, wyszczególnionego w ATmega88PA Summary?
  • Pomocny post
    #2 9048627
    zumek
    Poziom 39  
    gary2007 napisał:
    ... Za pomocą rozkazu np ST używając adresu dla rejestru UBRR0H, wyszczególnionego w ATmega88PA Summary?

    Dokładnie :D
    Wszystkie rejestry powyżej 0x3F(0x5F), należy traktować jak przestrzeń DATA.
  • Pomocny post
    #3 9049036
    LordBlick
    VIP Zasłużony dla elektroda
    sts UBRR0H, r17
    co więcej pomocne tu może być makra :
    .macro _in
    	.if (@1<0x60)
    		in @0, @1
    	.else
    		lds @0, @1
    	.endif
    .endmacro
    .macro _out
    	.if (@0<0x60)
    		out @0, @1
    	.else
    		sts @0, @1
    	.endif
    .endmacro
    Przy jego użyciu nie zastanawiamy się, gdzie i co, po prostu wszędzie wpisujemy _out(przydatne w uniwersalnej bibliotece procedur). Oczywiście to makro zadziała tylko przy standardowych plikach nagłówkowych Atmela typu XXXdef.inc, gdzie wszystkie I/O od adresu 0x60 mają w komentarzu MEMORY MAPPED(konkretny przykład z m162def.inc):
    .equ	PCMSK0	= 0x6b	; MEMORY MAPPED
    

    EDIT (25.01.2011): poprawiłem makro _in - były zamienione argumenty w w in i lds.
  • #4 9049608
    gary2007
    Poziom 14  
    Faktycznie, swietna sprawa z macro, tylko że kompilator nie przyjmuje mi .if... Dlatego że pisze w czystym asemblerze pewnie?
  • #5 9049719
    LordBlick
    VIP Zasłużony dla elektroda
    Te makra działają w asemblerze od AVR Studio, używam go, odpowiednio oskryptowanego, w wine pod Linuksem...
    Co masz na myśli poprzez "czysty asembler" ?
    Przecież nie do tego temat się sprowadza, żeby klepać cyferka po cyferce, tylko mieć maksimum możliwości przy jak najlepszej przejrzystości kodu i małym koszcie czasowym.
    Spróbuj może z nawiasami, tak jak poprawiłem wyżej.
    Tak w ogóle to
    gary2007 napisał:
    kompilator nie przyjmuje mi .if...
    nic mi nie mówi, wklej w tagach [code][/code] to co wypluwa...
  • #6 9050312
    gary2007
    Poziom 14  
    Dobra, już ruszyło

    .macro _in 
       .if (@1<0x60) 
          in @0, @1 
       .else 
          lds @0, @1 
       .endif 
    .endmacro


    Zmieniłem w tym macro (nie wiem czy słusznie) 0 na 1 i odwrotnie. Możesz mi powiedzieć, gdzie szukać informacji o instrukcjach typu if, które można umieszczać w makrach?
  • #7 9050558
    zumek
    Poziom 39  
    gary2007 napisał:
    ... gdzie szukać informacji o instrukcjach typu if, które można umieszczać w makrach?

    Ale nadal nie wiadomo, jakiego kompilatora używasz.
    Jeśli byś używał avrasm2, to poczytaj w helpie o jego preprocesorze.
    A co do makr, to warto zerknąć tam: https://www.elektroda.pl/rtvforum/topic665818.html
  • #8 9053616
    LordBlick
    VIP Zasłużony dla elektroda
    gary2007 napisał:
    Dobra, już ruszyło

    .macro _in 
       .if (@1<0x60) 
          in @0, @1 
       .else 
          lds @0, @1 
       .endif 
    .endmacro


    Zmieniłem w tym macro (nie wiem czy słusznie) 0 na 1 i odwrotnie.
    Tak, słusznie, pomyliłem się wcześniej. Wyżej już też poprawiłem.
    gary2007 napisał:
    Możesz mi powiedzieć, gdzie szukać informacji o instrukcjach typu if, które można umieszczać w makrach?
    Bezpośrednio to nie polega na szukaniu, 90% to są przemyślenia z istniejących zależności, gdy już masz kilka projektów za sobą - wtedy wpadasz na to, aby sobie coś ułatwić makrem.
REKLAMA