Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Как в ИАР работать с битами?


Автор: Коляй 21.11.2006, 21:22
 Ребята, вот в ИАР 4,12 хотел сделать флаговый регистр (R15) 90S2313. Но не тут то было. Вернее если битовая структура лежит в ОЗУ, то всё нормально работает, а если в регистре, то не работает. Точнее один только цикл проходит, а дальше как будто к этому регистру вобще нет обращений. (В свойствах один регистр под переменную выделен.)

Код

__regvar __no_init unsigned char flag @ 15;
................
flag&=~(1<<0);
..........
flag|=(1<<0);//.....


Вот эти обращения к 0 биту, компилятор делает вот так/
Код

clt
bld r15,b0 // очистка.
set
bld r15,b0// установка.


Чего то я таких команд не встречал, когда на АСМе писАл для этого контроллера!?

 После замены этого кода на простой/
Код

ori r16,0x01;
mov r15,r16;

ori r16,0x00;
mov r15,r16;
 

Всё заработало. Причом до этого работало в ИАР-овском эмуляторе и на АВР-студио4. Не работало в Протеусе и на железе.
 Это что ж получается, ИАР уже старые модели просто не тащит? Или глюк "растоможки"? Или я чего-нить неправильно написАл на СИ?
 (volatile struct {} flag @ 15; тоже пробовал. Опять же работала только с ОЗУ).

Автор: Ivan. 23.11.2006, 20:51
Код

clt
bld r15,b0 // очистка.
set
bld r15,b0// установка

Вполне правильный код и будет работать.
Пинцип такой:
команда clt сбрасывает флаг T;
команда bld r15,b0 записывает флаг T в 0 бит регистра 15;
команда set устанавливает флаг T;
команда bld r15,b0 записывает флаг T в 0 бит регистра 15.
Причина, почему компилятор сделал так в том, что регистр 15 неимеет возможности работы с константами, поэтому он выполнил это через флаг T.
Это также удобно для перемещения битов например оз 7 бита надо скопировать в 3:
Код

BST r15, 7        ; копируем бит 7 во флаг T
BLD t15, 3        ; записываем флаг T в 3 бит

Вот этот код работать впринципе неможет:
Код

ori r16,0x01; установка 0 бита
mov r15,r16; сохранение в 15 регистр
;...
ori r16,0x00; какойто бред
mov r15,r16; сохранение в 15 регистр

Автор: Коляй 24.11.2006, 00:31
Цитата


Вот этот код работать впринципе не может:

 ori r16,0x01; установка 0 бита
mov r15,r16; сохранение в 15 регистр
;...
ori r16,0x00; какойто бред
mov r15,r16; сохранение в 15 регистр


Спасибо. Вот этот код на железе не проверял, только в протеусе. Контроллер сломался. Не сгорел, а именно сломался. Не выдаёт ничего, даже порты не открывает. Ресет "упал" и кварц не работает и от внешнего генератора не работает. При этом шьётся и читается. (ничего не замыкал, просто работал-работал и остановился) Потом другой попробую, когда куплю. А остальное всё на железе проверялось, собственно с железа и началось. Не думал что код в "три" строчки не будет правильно работать!

Автор: Коляй 24.11.2006, 19:24
Вобщем вот такой код нормально работает.
Код

__regvar __no_init unsigned char flags @ 15;

__interrupt void Timer1 (vjod)
{
  if (flags&0x01)
   {
   //////////////////
   flags=0x00;
   }
  else
   {
   //////////////////
   flags=0x01;
   }
}



 Но если вместо него записать по-другому, то не работает.
Код

flags&=~(1<<0);

flags|=(1<<0);


 Когда битовую структуру создавал, тоже самое, в ОЗУ работало, а в регистре нет.
 Сегодня специально листинги сравнил - листинги полностью идентичны.  А вот файл .нех с первой строки разница началась вместо 0С было 1С и т.д. И в конце тоже разница. Может и в середине(весь .нех не стал лопатить), но видимо придётся.

Автор: PILOT 25.11.2006, 18:14
Просто чудеса какие-то smile то контроллер взял и отключился, то при одинаковых листингах один из них не работает smile не иначе бабка с пустым ведром выпустила через дорогу свою черную кошку из застрявшего лифта из которого на плечо накакал черный ворон.

Чудес не бывает.
1) отключаем любые оптимизации, устанавливаем режим Debug.
2) проверяем правильность установки фьюзов осцилятора.

СУВ.

Автор: Коляй 1.12.2006, 19:57
 Пилот, я же тоже не из пальца это всё взял! Сам в непонятках... 2313 так и умер... Даже паралельным программатором не откликается. Единственный глюк у меня в железе. Комп 166, порт битый. Пони-Прог при проверке не пишет "Test OK", а пишет "обрыв". Но всё равно шьётся и читается. Может из-за этого чего-нить не так. (Оптимизации все отключены и так - стоит "Low").

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)