Při psaní větších, rozsáhleších, kódů asi nejlepší způsob; využívat výhody Cčka v kobinaci s možnostmi assambleru.
Já jsem ale jen radioamatér, který potřebuje občas něco vyřešit pomocí mikroprocesoru, za využití relativně krátkého kódu a často mi jde o přesné časování. Takže pro mě je assambler zkrátka výhodnější.
Ze Tvých příspěvků jsem pochopil, že automaticky předpokládáš, že používám AVRStudio…nepoužívám. Pracuju v prostředí Linuxu. Ke psaní kódu používám textový editor a k převodu do .hex a následnému programování mikroprocesoru si vystačím s příkazovou řádkou (mi kluci vychovaný drsnými Krkonošskými podmínkami si vystačíme s málem )
AVRA by měl být plnohodnotnou náhradou AVRASM, ale podle všecho není, alespoň teda ne ve všem. Existuje i AVRASM pro linux, ale ten makra nepodporuje vůbec. Pak je pro linux ještě GAVRASM, ale ten jsem zase nenašel zkompolovaný tak, aby šel rozchodit na 32bitových procesorech. Nakonec jsem ale našel způsob, jak svůj problém vyřešit v AVRA.
Následující řádky napíšu jako inspiraci pro další linuxáky, kteří používají AVRA. Uživatelé Windows a AVRStudia je mohou v klidu ignorovat.
Takže, jak by řekl klasik: “Selže-li všecko, přečtěte si návod!”. Po prostudování možností všech možný i nemožných direktiv jsem narazil na .EQU.
.macro nastav_ocr_registry; vnořené makro, které nastaví OCR1x registry
ldi temp, high(_ocr1a)
sts OCR1AH, temp
ldi temp, low(_ocr1a)
sts OCR1AL, temp
ldi temp, high(_ocr1b)
sts OCR1BH, temp
ldi temp, low(_ocr1b)
sts OCR1BL, temp
.endmacro
.macro timer1_pc_8bit; makro nastavující pracovní režim TCNT1 na "8bit phase correct"
;@0 - na hodnotě nezáleží (0)
;@1 - hodnota pro OCR1A
;@2 - hodnota pro OCR1B
;@3 - výstup A (off, toggle, normal, revers)
;@4 - výstup B (off, toggle, normal, revers)
.equ _top = @0
.equ _ocr1a = @1
.equ _ocr1b = @2
.equ _OC1A = @3
.equ _OC1B = @4
ldi temp, (_OC1A<<com1a0)|(_OC1B<<com1b0)|(0<<WGM11)|(1<<WGM10)
sts TCCR1A, temp
ldi temp, (0<<WGM13)|(0<<WGM12)
sts TCCR1B, temp
nastav_ocr_registry
; další část kódu je propochopení principu již nepodstatná
.endmacro
Pointa spočívá v tom, že si v příslušném makru, které nastavuje TCNT “převedu” argumenty makra na proměnné definovamé direktivou .EQU (zřejmě by to fungovalo i s direktivou .SET, ale to jsem ještě nezkoušel). Pak už s nimi pracuju jako s obyčejnými proměnnými a není tak problém je používat ve vnořených makrech.
Jde to udělat i tak, že se tyhle proměnné vytvoří už na začátku programu a makra se pak používají zcela bez argumentů (u rozsáhlejších kódů s velkým počtem maker to pak ale bude asi trošku nepřehledné)