Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Как в ИАР работать с битами? |
Автор: Коляй 21.11.2006, 21:22 | ||||||
Ребята, вот в ИАР 4,12 хотел сделать флаговый регистр (R15) 90S2313. Но не тут то было. Вернее если битовая структура лежит в ОЗУ, то всё нормально работает, а если в регистре, то не работает. Точнее один только цикл проходит, а дальше как будто к этому регистру вобще нет обращений. (В свойствах один регистр под переменную выделен.)
Вот эти обращения к 0 биту, компилятор делает вот так/
Чего то я таких команд не встречал, когда на АСМе писАл для этого контроллера!? После замены этого кода на простой/
Всё заработало. Причом до этого работало в ИАР-овском эмуляторе и на АВР-студио4. Не работало в Протеусе и на железе. Это что ж получается, ИАР уже старые модели просто не тащит? Или глюк "растоможки"? Или я чего-нить неправильно написАл на СИ? (volatile struct {} flag @ 15; тоже пробовал. Опять же работала только с ОЗУ). |
Автор: Ivan. 23.11.2006, 20:51 | ||||||
Вполне правильный код и будет работать. Пинцип такой: команда clt сбрасывает флаг T; команда bld r15,b0 записывает флаг T в 0 бит регистра 15; команда set устанавливает флаг T; команда bld r15,b0 записывает флаг T в 0 бит регистра 15. Причина, почему компилятор сделал так в том, что регистр 15 неимеет возможности работы с константами, поэтому он выполнил это через флаг T. Это также удобно для перемещения битов например оз 7 бита надо скопировать в 3:
Вот этот код работать впринципе неможет:
|
Автор: Коляй 24.11.2006, 00:31 | ||
Спасибо. Вот этот код на железе не проверял, только в протеусе. Контроллер сломался. Не сгорел, а именно сломался. Не выдаёт ничего, даже порты не открывает. Ресет "упал" и кварц не работает и от внешнего генератора не работает. При этом шьётся и читается. (ничего не замыкал, просто работал-работал и остановился) Потом другой попробую, когда куплю. А остальное всё на железе проверялось, собственно с железа и началось. Не думал что код в "три" строчки не будет правильно работать! |
Автор: Коляй 24.11.2006, 19:24 | ||||
Вобщем вот такой код нормально работает.
Но если вместо него записать по-другому, то не работает.
Когда битовую структуру создавал, тоже самое, в ОЗУ работало, а в регистре нет. Сегодня специально листинги сравнил - листинги полностью идентичны. А вот файл .нех с первой строки разница началась вместо 0С было 1С и т.д. И в конце тоже разница. Может и в середине(весь .нех не стал лопатить), но видимо придётся. |
Автор: PILOT 25.11.2006, 18:14 |
Просто чудеса какие-то ![]() ![]() Чудес не бывает. 1) отключаем любые оптимизации, устанавливаем режим Debug. 2) проверяем правильность установки фьюзов осцилятора. СУВ. |
Автор: Коляй 1.12.2006, 19:57 |
Пилот, я же тоже не из пальца это всё взял! Сам в непонятках... 2313 так и умер... Даже паралельным программатором не откликается. Единственный глюк у меня в железе. Комп 166, порт битый. Пони-Прог при проверке не пишет "Test OK", а пишет "обрыв". Но всё равно шьётся и читается. Может из-за этого чего-нить не так. (Оптимизации все отключены и так - стоит "Low"). |