Dessp писал(а):Всем привет. Такой вот вопрос.
Пишу программу на асемблере для атмега88
так работает
ldi temp,0b00000001
out EIMSK,temp
а так нет
ldi temp,0b00000001
sts EIMSK,temp
почему?
Матчасть мал-мал учить однако надо...
А также команды ассемблера и их выполнение...
Команды IN\OUT работают с адресным пространством УВВ, а ST(STD/STS)\LD(LDD/LDS) c адресным пространством ОЗУ.
Одна из особенностей AVR - обращение к регистрам специальных функций одновременно как к области УВВ и как к ячейкам ОЗУ - частенько весьма долго с толку сбивает (у XMEGA еще поинтереснее будет).
Если использовать заранее установленные имена регистров ( в данном случае m88def.inc ), то предпочтение отдается командам IN\OUT. Если потребуется к заранее объявленному регистру спецфункций обратиться как к ячейке памяти - то для tiny/mega к имени регистра прийдется добавить 0х20, поскольку регистры общего назначения также являются частью адресного пространства ОЗУ ( STS EIMSK+0x20,temp ).
Хоша, с моей подушки, поскольку у ATmega88 регистр EIMSK находится в младшей группе адресов (от 0 до 31 /0-0x1F/) такая операция выглядит корректнее как:
sbi EIMSK,INT0
...
Там еще есть много чего зловредного - посему ежли решено с ассемблером работать - много-много читать и учить надо... желательно самому...
Или вот шпора для разнообразия...
viewtopic.php?f=20&t=68985




