Atmel AVR programozas

VF vf at elte.hu
Fri Dec 27 12:46:20 CET 2002


Thus spake VFX:

> Hali!

Hi!

>> A $-nek mit kene csinalnia? Az altalam ismert assemblerekben a hexa
> 
> Elvileg a PC aktualis erteket adja vissza. Ha van egy rjmp $+2
> utasitasod akkor az rjmp utani masodik cimre ugrik label nelkul is.

Na de sracok! Amiota az eszemet tudom, _minden_ assemblerben a *
jeloli az aktualis cimet. C64, Amiga, IBM-PC, mikrovezerlok tomegei,
mind ezt a szintaxist hasznaljak. Melyik fordito hasznal $-t?
 A Studio assemblere valoban nem kompatibilis ezzel. Meglepo modon
pc-vel jeloli az aktualis cimet :) Istvan peldaja igy atirva kivaloan
lefordul a Studio alatt:

label:
    db    'Ez itt a string',0
    db    PC-label           ;itt meg a string hossza 1 byte-ban

Viszont kicsit mast csinal: nem byte-ban, hanem wordben adja meg a
string hosszat. Ezt ra lehet kenni ugyan az assemblerre, de megvan az
oka hogy miert igy csinaltak. Az AVR proci ugyanis a belso memoriat
wordonkent cimzi, es a word cime van a pc-ben! Ezzel szivtam egy jo
par percet, vegul a debugger segitett. Az egyik elso dolgom volt olyan
uzenetkiiro fuggvenyt irni, mely a hivo utasitas utani cimrol veszi
az lcd-re kiirando szoveget. Tehat valahogy igy:

    rcall    prints
    .db      "Ezt a szoveget fogja kiirni",0
    ldi      r16,7

Ez kevesebb helyet foglal, mint ha regiszterekben adnam at a cimet, ami
16 bites, igy 2 utasitassal (4 byte!) toltheto csak be. A fuggveny miutan
kiolvassa a verembol a visszateresi cimet, megszorozza kettovel, igy kapja
meg a szoveg cimet. Majd a szoveg vegenek elerese utan felezi, es azt irja
vissza a verembe. Debugger nelkul soha nem jovok ra... Pedig az lpm
utasitas leirasaban celoznak is ra, utolag, miutan rajottem a trukkre, mar
vilagosan emlekeztem hogy a doksikban korrektul leirjak, csak annyira
furcsa ez a megoldas, hogy nehezen fogadta be az agyam.
 Egyebkent a cim betoltes is erdekes. Ha ugrani akarunk egy cimre, akkor
semmi problema. Ha olvasni akarunk onnan (lpm-el), meglepo lehet, hogy
nem jo helyrol olvas, ha nem duplazzuk meg a cimet. Pl:

    ldi      ZL,low(szoveg)
    ldi      ZH,high(szoveg)
    lpm

[..]

szoveg: .db "abc...

Vegrehajtas utan az r0-ban nem az 'a' karakter lesz! Helyesen:

    ldi      ZL,low(szoveg*2)
    ldi      ZH,high(szoveg*2)
    lpm

Tehat ez nem hiba, hanem a mikrovezerlo specialis belso tulajdonsagainak
tukrozodese az assembly nyelveben. Szerintem ha ezt az IAR-hez hasonloan
elfedtek volna a felhasznalo elol, bizonyos specialis esetekben szinte
lehetetlen lenne kitalalni hogy mi is tortent valojaban, jol osszezavartak
volna a kezdoket. Elismerem, ez igy is megtortenhet :)
Pl sbrc-vel akar ugrani a cim valamely bitetol fuggoen, es nem tudja hogy
a szuperintelligens fordito a cim felet/duplajat toltotte be... Vagy a
betoltott cimkehez hozza akar adni valamennyit, nem mindegy hogy mar
duplazva volt, vagy meg nem stb...

A 'logikatlansag' nem az assemblerben, hanem a proci felepiteseben van!
Csinalhattak volna ugy is, hogy a belso pc-t egy bittel eltoljak, es a
legalso fiktiv bitet mindig 0-nak veszik. Ez viszont azzal jarna, hogy
a 16 bites ugrasok csak 64k-n belul ugrananak, a jelenlegi megoldassal a
maximalis 128k programmemoria teljes terulete elerheto! Ennek az ara ez
a 'kis logikatlansag', ami sokakat meg tud zavarni...

Szoval _ez_ szerintem nem hiba, hanem specialis tulajdonsag.
Hasonlo problema elojott m68k alatt is:
    move.b    (a0,d0.w*8,*-tabla),d2
Az AsmPro a * helyere az utasitas cimet tette be, az Asm-One a proci belso
mukodesenek megfeleloen 2-vel tobbet, mert az offszet az utasitaskod utani
word-ben van, tehat 2-vel magasabb a cime. Igy persze nem is mukodott
megfeleloen... Szerencsere az intelligens assemblerek automatikusan tudnak
abszolut/relativ cim konverziot, igy ha a az ember nem okoskodik, rabizza a
forditora a cimkonverziot, az mindig jol mukodik:
    move.b    (a0,d0.w*8,tabla),d2

> ASCII ->  ldi R16,'A'

Ez mar megint mekkora marhasag. A .db-ben "A"-t kell irni, az
utasitasokban pedig 'A'-t. Azt gondoltam volna, hogy ha ASCII, akkor
azt konzisztensen, minden esetben ugyanugy jelolik.

> hexa - > ldi R16,0x16

Muxik az ldi r16,$16 is!

>> utasitas elott even, vagy cnop 0,2, es kesz. A fordito jo esetben szol
>> hogy nem kene kodot paratlan cimre rakni (warning), rossz esetben address
> 
> Pontosan ezt csinalja! Kapsz egy rakat warningot! Ami hiba benne, hogy
> az EEPROM teruletre is warningol, pedig ott nem kellene! De ettol meg
> muxik.

Nem! Egy normalis fordito, pl amit emlitettem m68k assemblereket, csak
siman warningolnak, de azt forditjak amit beirtal neki. A problema az,
hogy a Studio hulye assemblere onkenyesen beszur egy 0-t, hogy a kovetkezo
sor mar paros cimen, word hataron kezdodjon! Szerintem Istvannak is ez nem
tetszik, nekem sem, ez bizony valoban sulyos hiba. A warning onmagaban
nem lenne gond :)
A multkor hulyeseget irtam, a .dseg csak inicializalatlan adatterulet
lefoglalasara alkalmas, .db nem lehet benne. Az igaz hogy jol mukodik
paratlan cimmel is :), de a problemat nem oldja meg.

> main.asm(86) : warning : A .db segment with an odd number of bytes is
> detected.
> A zero byte is added.

Na ez itt a problema. A zero byte agyonvagja a strukturat...
Erre sajnos ugy tunik _nincs_ megoldas Studio alatt!
Szerencsere az en programozasi stilusom miatt eddig ez egyaltalan
nem okozott problemat, de nem tartom kizarhatonak hogy kesobb fog.
 Szivesen atternek az IAR-re, nem ertem hogy miert nem mukodik nalam.
Lehet hogy jobb, de a GUI mukodese bosszant. Egyreszt az a kesleltetes
az elejen, masreszt hogy a reportot kulon ablakba teszi, es nem lehet a
hibara kattintva a kurzort a hibas sorra vinni mint a Studioban, stb..
Lehet hogy bena a Studio assemblere, de a progi maga nagyon jol ossze
van rakva, kenyelmes, gyors. Egyebkent az assembler kulon exe fajlban
van, lehet hogy siman le lehet cserelni az IAR-felere, es a Studio
kornyezetet hasznalni az IAR assemblerrel. Majd egyszer kiprobalom :)
Valaki kuldhetne nekem egy IAR-rel rendesen lefordulo forrast! Nekem
egyaltalan nem muxik, ezerfele hibaval leallitja a forditast rogton az
elso soroknal. Keresgeltem, de nem talaltam peldaforrast az IAR-hez,
a Studiohoz adtak. Azokbol tanulgattam meg egy csomo mindent.
Ja es az includok. Az IAR-hez is adnak? Azt sem talaltam.

> UDV. VFX.
> http://www.vfx.hu

-- 
Valenta Ferenc <vf at elte.hu>   Visit me at http://ludens.elte.hu/~vf/
*** This advertising space is for sale ***





More information about the Elektro mailing list