Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR, AVR Studio, WinAVR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Страницы: 1, 2
cyb
Напишу здесь чтобы не создавать ещё одну тему.
Есть такая "хитрая" загвоздка с AVR Studio (версия 4.18). В общем работаю в IARe 5.51, а дебаг программный делаю в студии и всё всегда работало. Однако есть проект массивный, где такая связка не работает и не знаю почему. Вроде всё как всегда линковщик настроен на ubrof8, всё линкуется, открываю файл в студии .dbg, но он врубает десасемблер, а на С не хочет. Что только не делал, все настройки проверял не в какую. Тут же открываю другой проект, всё тоже самое и там работает.

П.С. Этот проект был перенесён со старой версии ИАРа 4.20, но в новом всё компилится, в общем должно быть всё норм по идее. У кого-нибудь такое было?
Сергей Борщ
QUOTE (cyb @ Oct 4 2011, 16:23) *
открываю файл в студии .dbg, но он врубает десасемблер, а на С не хочет.
Посмотрите на вкладке Output компилятора, стоит ли галочка "Generate debug information".
defunct
Цитата(demiurg_spb @ Jan 15 2011, 13:20) *
Чтобы исправить ситуацию надо поместить пути WinAVR раньше buildera.
(наберите в справке windows "переменные среды окружения или системные переменные")

Или, есть вариант проще:
переименовать каталог куда был установлен Borland в _Borland, на время работы с gnu make.
cyb
Цитата(Сергей Борщ @ Oct 4 2011, 17:19) *
Посмотрите на вкладке Output компилятора, стоит ли галочка "Generate debug information".

Точно, сработало, спасибо за совет rolleyes.gif .
Smoky
Не смог обнаружить в WinAVR функции или макросы преобразования двоичного кода в двоично-десятичный. Имеются ли в нём таковые, или кроме printf() ничего нет и нужно создавать свои?
alexeyv
Создай свои - не так уж и сложно.
Использование printf() - слишком уж тормозной и memory-потребляющий способ.
Сергей Борщ
QUOTE (alexeyv @ May 24 2012, 06:36) *
Использование printf() - слишком уж тормозной и memory-потребляющий способ.
С printf в avr-libc недавно разбирались - не слишком memory-потребляющий, около 20 байт на стеке. Неспешный, это да. А, еще по размеру кода может быть великоват.

дымок: В avr-libc есть функции ltoa(), itoa(), utoa, ultoa(). Вы можете вычесть из каждого символа результата по '0' и сложить полученные числа парами в тетрады. Или писать свою функцию - поддержка BCD-кода как-то не слишком распространена в языках программирования.
Smoky

Спасибо. Я так и думал, что придётся делать самому.
alexeyv
Цитата
А, еще по размеру кода может быть великоват.

Я это и имел ввиду. Забыл уточнить тип памяти
ReAl
Грубо от 1.5 до 2.5 килобайта в зависимости от версии форматтера (поддержка разных вариантов ширин полей и float).
Smoky
Коллеги, объясните что это за опрерация и применима ли она в WinAVR?
TWCR=((1<<TWEN)+(1<<TWINT)+(1<<TWSTO))
_Артём_
Цитата(дымок @ May 31 2012, 19:33) *
Коллеги, объясните что это за опрерация и применима ли она в WinAVR?
TWCR=((1<<TWEN)+(1<<TWINT)+(1<<TWSTO))

Запись в TWCR байта с установленными (равными 1) битами TWEN, TWINT и TWSTO.
Чаще пишут TWCR=((1<<TWEN)|(1<<TWINT)|(1<<TWSTO)) . Но результат тот же.
Smoky
Цитата(_Артём_ @ May 31 2012, 22:45) *
Запись в TWCR байта с установленными (равными 1) битами TWEN, TWINT и TWSTO.
Чаще пишут TWCR=((1<<TWEN)|(1<<TWINT)|(1<<TWSTO)) . Но результат тот же.


Спасибо. Меня смущает только то что в одной функции одновременно одна и таже операция записана по разному: так как привёл я и так как привели вы. Весьма странно.
_Артём_
Цитата(дымок @ May 31 2012, 20:03) *
Спасибо. Меня смущает только то что в одной функции одновременно одна и таже операция записана по разному: так как привёл я и так как привели вы. Весьма странно.

Записать то можно по разному - всё равно это константа
Код
#define TWI_BYTE 0x94

TWCR=TWI_BYTE; // тот же результат


Код
22:           TWCR=((1<<TWEN)|(1<<TWINT)|(1<<TWSTO));
+00000070:   E984        LDI       R24,0x94       Load immediate
+00000071:   93800074    STS       0x0074,R24     Store direct to data space

Может почему-то автору так было удобней в тот момент.
alexeyv
Цитата
Может почему-то автору так было удобней в тот момент.

Ага,клавиша "+" располагается удобнее на клавиатуре, или клавишу "|" заело.
Smoky
Помогите, не могу понять:
#define CH 0x07
temp=I2C_Rx(NOT_ACK);
if(temp&(1<<CH)) - что за операция здесь происходит?
Marto
Цитата(дымок @ Jun 6 2012, 23:15) *
Помогите, не могу понять:
#define CH 0x07
temp=I2C_Rx(NOT_ACK);
if(temp&(1<<CH)) - что за операция здесь происходит?


единичка сдвигается на семь битов (0x07) и поразрядно складывается с переменной temp.
Если седьмой бит переменной temp равен единице, то их побитовая (поразрядная) сумма будет больше нуля, а если значение в скобках if больше нуля, то выполнится соотвествующий код. в противном случае выполнение перейдет на else
1<<CH = 1<<0x07 = 10000000
допустим значение переменной temp = 11011100, тогда
11011100
& 10000000
____________
10000000

или temp = 01110000

01110000
&10000000
____________
00000000
Smoky
Цитата(Marto @ Jun 6 2012, 23:36) *
единичка сдвигается на семь битов (0x07) и поразрядно складывается с переменной temp.


Большое спасибо, теперь всё ясно. Я то думал что 0х07 сдвигается на один бит, получался полный ступор.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.