Odpověď na Tvůj poslední příspěvek je jednoduchá : nadefinovat symbol/makro ISREG.
Ale vrátím se k dotazu na makra :
Osobně nevidím problém v jejich použití. A výhodou je, že Ti opravdu stačí jeden název pro všechny operace s pinem. Dovolil jsem si nadhodit, jak by asi ty Tvoje makra mohly vypadat.
[code];***********************************************************
.MACRO SKIP_IN_SET ;@0=port,pin
sbis pin@0
.ENDMACRO
;***********************************************************
.MACRO SKIP_IN_CLR ;@0=port,pin
sbic pin@0
.ENDMACRO
;***********************************************************
[/code]
A dovolil jsem si něco přidat :
[code];***********************************************************
.MACRO DIR_IN ;@0=port,pin Možná jsi ho jenom nenapsal do svého dotazu, ale může se hodit - uvidíš dále.
cbi ddr@0
.ENDMACRO
;***********************************************************
.MACRO TOGGLE_OUT ;@0=port,pin
sbi pin@0
.ENDMACRO
;***********************************************************
[/code]
;kód
TOGGLE_OUT led_PWR ;změna pin 5 na portu B 0<=>1
Neumí to sice úplně všechny AVRka (pokud vím, tak ATmega8, 16, 32, 64, 128 to neumí), ale můžeš toho využít ke změně hodnoty na pozici daného pinu v registru PORT (!!!).
V datashetech tahle vlastnost je trošku shovaná, ale lze to tam najít.
Například Datasheet ATmega48/88/168/328, 14. I/O ports -> 14.1. Overview :
However, writing a logic one to a bit in the PINx Register, will result in a toggle in the corresponding bit in the Data Register.
a samozřejmě v zapojení portu.
A k čemu ty makra použít ? Jako příklad uvedu třeba sdílení pinu výstupními signály pro 74595-ku a vstupními signály od tlačítek.
74595-ka používá signály :
DATA = Vstup sériových dat
CLK = Hodinový signál pro zápis do posuvného registru
WR = Zapisovací impuls do výstupního registru.
OE = Aktivace výstupů 74595-ky - OE=0 - data jsou na výstupech, OE=1 - výstupy jsou vypnuté.
Využití signálů je tedy následující :
OE musí zůstat v log. 0, aby byla 74595-ka aktivní. Pokud by se multiplexoval, výstupy by se zapínaly a vypínaly = není vhodné k použití.
CLK = Zapisuje data do posuvného registru. Za určitých podmínek je možné jej využít, ale není to vhodné.
WR = Přepisuje stav posuvného registru do výstupního registru 74595-ky. Za určitých podmínek je možné jej využít.
DATA = Je možné použití tohoto signálu k multiplexaci.
CLK a WR je možné k multiplexaci s tlačítkem použít, ale nelze je použít současně. Když použiješ CLK, tak se stiskem tlačítka data posouvají. Výstupní registry zůstanou, ale nesmíš je signálem WR přepsat z výstupních. Mění se ale poslední výstupní pin (Q7’) 74595-ek, který slouží k jejich řetězení. Proto je vhodnější použít pro multiplexování signál WR. Díky tomu se nemění data v posuvných registrech 74595-ek a ani jejich poslední výstupní piny, jenom se přepisují výstupní registry stále stejnými daty.
Tlačítka lze připojit jak na VCC, tak na GND (příklad počítá s připojením na GND), v každém případě ale musí být splěno to, že tlačítka jsou k signálům připojená přes odpor tak, aby ani při stisknutém tlačítku měl vstup 74595-ky hodnotu, jaká je na výstupu MCU.
[code]DIR_OUT IO_DATA595 ; Nastavit IO pin DATA pro 74595 jako výstup
CLR_OUT IO_WR595 ; Vynulovat WR signál pro 74595
DIR_OUT IO_WR595 ; Nastavit IO pin WR pro 74595 jako výstup
call zapis_data_do_74595 ; Zavolat rutinu pro zápis bytu do 74595
DIR_IN IO_DATA595 ; Nastavit IO pin DATA pro 74595 jako vstup
SET_OUT IO_DATA595 ; Aktivovat pull-up pinu DATA pro 74595
DIR_IN IO_WR595 ; Nastavit IO pin WR pro 74595 jako vstup
SET_OUT IO_WR595 ; Aktivovat pull-up pinu WR pro 74595
SKIP_IN_SET IO_DATA595 ; Přeskočit, není-li stisknuto tlačítko na pinu DATA
rcall Stisknute_tlacitko_na_DATA_lince
SKIP_IN_SET IO_WR595 ; Přeskočit, není-li stisknuto tlačítko na pinu WR
rcall Stisknute_tlacitko_na_WRITE_lince
SKIP_IN_CLK IO_DATA595 ; Přeskočit, je-li stisknuto tlačítko na pinu DATA
rcall Nestisknute_tlacitko_na_DATA_lince
SKIP_IN_CLK IO_WR595 ; Přeskočit, je-li stisknuto tlačítko na pinu WR
rcall Nestisknute_tlacitko_na_WRITE_lince
[/code]
Přeju hodně úspěchů při programování.