milkpower писал(а):т.е если я правильно понимаю, то
ST DDRG,R16 // пишем в порт
LD R16,DDRG // читаем из порта
так?
Нет, не так.
Правильно так:
sts DDRG, r16
lds r16, DDRG
LD и ST это команды косвенной адресации через регистровые пары X, Y, Z
Только внимание, с регистрами, адреса которых не старше чем 0x3F лучше всегда пользовать IN/OUT, иначе если использовать STS/LDS с младшими регистрами, то нужно еще 0x20 прибавлять к адресу регистра.
Чтоб прояснилась ситуация, лучше глянуть в раздел "Register Summary" в даташите. Там можно заметить что в таблице у младших регистров двойные адреса, например для mega128 регистр PORTE записан как $03 ($23). Т.е. если мы пользуемся командами IN/OUT, то используется адрес $03, которому кстати и присвоено символьное имя PORTE в файле m128def.inc
Вот строка из inc файла:
.equ PORTE = $03
А если же захочется использовать с регистром PORTE команды STS/LDS, то придется написать так:
sts PORTE+0x20, r16
что разумеется выглядит кривовато и дает лишний шанс ошибиться.
Так что везде пользуем команды IN/OUT, ну а где ассемблер ругнулся там STS/LDS, тогда точно не ошибешься. А потом, когда привыкнешь к конкретному кристаллу, то уже сам будешь помнить какие регистры находятся в расширенном адресном пространстве, том которое старше 0x3F и на которое IN/OUT не действует.
Да, всё это выглядит кривовато и странно, я и сам по началу парился и не въезжал. Но потом когда привыкнешь и поймешь, то уже не страшно :)
Надеюсь, что нигде не обманул.