spokojnie, poukłada się zaraz... jest tak:
instrukcje IN/OUT jako parametry dostają rejestr i adres portu I/O
dopuszczalne rejestry to od 0 do 31, więc tu nie ma problemu
dopuszczalny zakres adresów I/O to 0...63 (0x00...0x3F),
wszystko co jest poza tym zakesem, musi być traktowane jako
komórki pamięci, czyli z wykorzystaniem instrukcji LDS i STS,
ponieważ one jako operand oznaczający adres akceptują 0..0xFFFF.
ale akurat to jest do wytrzymania, po prostu należy pamiętać,
że pewne rejestry należy potraktować nieco inaczej...
o, napisz sobie do nich zestaw dodatkowych makr...
z instrukcjami cbi/sbi jest troszkę gorzej, ponieważ one operują
na adresach 0...31 (0...0x1F) i dla portów I/O mapowanych
w pamięci należy je zastąpić zestawem instrukcji LDS + SBR (lub CBR) + STS
czyli pobrać z portu wartość do rejestru, ustawić/skasować w niej
wymagany bit, potem wstawić tak zmodyfikowaną tam, skąd się ją wzięło
o, coś takiego - makro memo_sbi
Kod: Zaznacz cały
.include "m128def.inc"
.cseg
.org 0x0000
;-----------------------
.macro memo_sbi
; do R16 wartośc z komórki pamięci
lds r16,@0
;operacja na zadanych via @1 bitach R16
sbr r16,@1
; oddanie zmodyfikowanje wartości
sts @0,r16
.endm ; of memo_sbi
;-----------------------
; przykładowe wywołanie
memo_sbi TWCR, (1<<2)
loop:
rjmp loop
najlepiej uruchom AVR studio i poobserwuj jak działają
takie kawalątka kodu, na małych fragmentach, jak ten właśnie
dobrze że internet jest w pracy
a tak, tylko ważne kto Ci stoi za plecami...
ja na przykład mam okno i chwilowo ciekawskie assemblera słoneczko...
tasza