Jde o to nahradit instrukce SBI a CBI instrukcí ST a mělo by to být univerzální pro použití pro porty jak na extended registrech, tak na standartních, protože i k portům na standartních registrech lze přistoupit pomocí adresace přes paměť. S časováním by moc velký problém být neměl, protože oboje instrukce trvají 2 takty hodin. Jediné, co musíš udělat je předat adresu portu do některého z dvojregistrů (X, Y, Z) a připravit si hodnoty portu pro vynulování a nastavení daného bitu, protože CBI a SBI pracují s bitem a neovlivňují zbytek portu, kdežto ST zapisuje do celého portu. Nejsem kovaný v použití inline assembleru v Cčku, takže Ti tady ukážu, jak by měl assemblerovský zápis vypadat a snad Ti někdo poradí, jak to přelouskat do inline assembleru.
Příklad pro použití s dvojregistrem Z :
ldi ZH, high(PametovaAdresaPortu) ; ZH asi bude vždy 0x00
ldi ZL, low(PametovaAdresaPortu)
ldi TempRegistr, (1<<PozadovanyBit) ; TempRegistr musí být R16 až R32, kromě použitých pro adresu portu.
mov NulovaciRegistr, TempRegistr ; Registr, ve kterém bude hodnota, která se zapíše místo instrukce CBI
mov NastavovaciRegistr, TempRegistr ; Registr, ve kterém bude hodnota, která se zapíše místo instrukce SBI
ld TempRegistr, Z ; Načtení aktuální hodnoty portu
or NastavovaciRegistr, TempRegistr
eor NulovaciRegistr, NastavovaciRegistr ; V tuhle chvíli je připraveno vše k nahrazení instrukcí CBI a SBI
To byla příprava před vlastní smyčkou. Tu provedeš jenom jednou na začátku.
Ve vlastní smyčce :
cbi %2, %3
; nahradíš instrukcí
st Z, NulovaciRegistr
sbi %2, %3
; nahradíš instrukcí
st Z, NastavovaciRegistr
Assembler není problém, ale do jeho inline použití jsem zatím nějak neproniknul, ale snad jsem Tě alespoň nasměroval.