Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как в ИАР работать с битами? Что бы флаговый был регистр. 
:(
    Опции темы
Коляй
Дата 21.11.2006, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 14.6.2006

Репутация: нет
Всего: нет



 Ребята, вот в ИАР 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; тоже пробовал. Опять же работала только с ОЗУ).

PM   Вверх
Ivan.
Дата 23.11.2006, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Код

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 регистр



--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
Коляй
Дата 24.11.2006, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 14.6.2006

Репутация: нет
Всего: нет



Цитата


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

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


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

Это сообщение отредактировал(а) Коляй - 24.11.2006, 00:32
PM   Вверх
Коляй
Дата 24.11.2006, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 14.6.2006

Репутация: нет
Всего: нет



Вобщем вот такой код нормально работает.
Код

__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С и т.д. И в конце тоже разница. Может и в середине(весь .нех не стал лопатить), но видимо придётся.
PM   Вверх
PILOT
Дата 25.11.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: 20
Всего: 54



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

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

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
Коляй
Дата 1.12.2006, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 14.6.2006

Репутация: нет
Всего: нет



 Пилот, я же тоже не из пальца это всё взял! Сам в непонятках... 2313 так и умер... Даже паралельным программатором не откликается. Единственный глюк у меня в железе. Комп 166, порт битый. Пони-Прог при проверке не пишет "Test OK", а пишет "обрыв". Но всё равно шьётся и читается. Может из-за этого чего-нить не так. (Оптимизации все отключены и так - стоит "Low").
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0659 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.