|
Вставка в СИ кода на ассемблере |
|
|
|
Jan 8 2007, 21:34
|
Частый гость
Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216
|
Тут ( www.atmel.ru/Articles/Atmel13.htm) нашел программу на ассемблере,наз. bcdfp, преобразующая двоичные числа с плавающей точкой, в последовательность (строку) из 8 ASCII-символов, которая включает в себя ASCII-символ знака, шесть ASCII-символов значащих десятичных цифр и ASCII-символ точки. Но у меня его неполучается использоватьэтот код в CodeVisionAVR. Выдает какието ошибки при компелировании. Может, ктото растолкует, что и как, буду весьма благодарен.
|
|
|
|
|
Jan 8 2007, 22:03
|
Группа: Новичок
Сообщений: 2
Регистрация: 25-12-06
Пользователь №: 23 888
|
Привет.. У меня таже проблемка.... Может старожилы помогут...
|
|
|
|
|
Jan 8 2007, 23:28
|
Группа: Новичок
Сообщений: 2
Регистрация: 25-12-06
Пользователь №: 23 888
|
Может вместе решим эту проблему.... Стучи в аську 130712520
|
|
|
|
|
Jan 8 2007, 23:42
|
Профессионал
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380
|
Цитата Выдает какието ошибки при компелировании. Вообще-то нехило код в студию вместе с ошибками компилятора. Потому как Нео тут не водятся Во-вторых. Зачем такие половые извращения, когда существует семейство функций *printf() ?
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jan 9 2007, 12:18
|
Участник
Группа: Новичок
Сообщений: 15
Регистрация: 9-08-05
Из: Киев-Борисполь
Пользователь №: 7 472
|
если вы о этом : http://www.atmel.ru/Articles/Atmel13_app4.htmто там написано : ;Подпрограмма может вызываться из головной программы, написанной на IAR C для AVR:а у Иара другой синтаксис , нежели у CodeVision'a в ЦВ надо использовать #asm, #endasm (если не ошибаюсь ) для ассемблерных вставок -посмотрите пример С_asm поставляемый с кодевиженом и попробуйте притулить этот код туда
|
|
|
|
|
Jan 9 2007, 12:55
|
Местный
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219
|
Цитата(Яrik @ Jan 8 2007, 21:34) Тут ( www.atmel.ru/Articles/Atmel13.htm) нашел программу на ассемблере,наз. bcdfp, преобразующая двоичные числа с плавающей точкой, в последовательность (строку) из 8 ASCII-символов, которая включает в себя ASCII-символ знака, шесть ASCII-символов значащих десятичных цифр и ASCII-символ точки. Но у меня его неполучается использоватьэтот код в CodeVisionAVR. Выдает какието ошибки при компелировании. Может, ктото растолкует, что и как, буду весьма благодарен. Все должно быть в документации. Но лучше вставками вообще не пользоваться, поскольку эффекта от них нет. Лучше сделать отдельный модуль на ассемблере и включить его в проект. Сам я пользуюсь IAR, как это сделать в CV не знаю.
|
|
|
|
|
Jan 9 2007, 21:35
|
Частый гость
Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216
|
Цитата Может вместе решим эту проблему.... Стучи в аську 130712520 Давай попробуем , но я аськой не пользуюсь, пеши на мыло.
|
|
|
|
|
Jan 9 2007, 22:05
|
Частый гость
Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216
|
Цитата Во-вторых. Зачем такие половые извращения, когда существует семейство функций *printf() ? Да, printf() мощьная функция, но при выводе чисел с плавающей точкой занимает много памяти МК. У меня, программа измеряющая напряжение на входе встроеного АЦП (ATmega8L) с выводом на LCD, заняла почти 50% памяти. Может, у кого небудь есть наработки по выводу чисел с плавающей точкой на дисплей? Поделитесь пожалуйста.
Сообщение отредактировал Яrik - Jan 9 2007, 22:13
|
|
|
|
|
Jan 9 2007, 22:17
|
Частый гость
Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216
|
Цитата Все должно быть в документации. Но лучше вставками вообще не пользоваться, поскольку эффекта от них нет. Лучше сделать отдельный модуль на ассемблере и включить его в проект. Сам я пользуюсь IAR, как это сделать в CV не знаю. Документация это хорошо, но есть проблема, она на английском. А у меня с ним проблемы. Включить в проэкт пробывал, но (насколько я понял) CV добаляет только СИ модули. Исправте если не так. Цитата если вы о этом : http://www.atmel.ru/Articles/Atmel13_app4.htmто там написано : ;Подпрограмма может вызываться из головной программы, написанной на IAR C для AVR: а у Иара другой синтаксис , нежели у CodeVision'a в ЦВ надо использовать #asm, #endasm (если не ошибаюсь ) для ассемблерных вставок -посмотрите пример С_asm поставляемый с кодевиженом и попробуйте притулить этот код туда C_asm смотрел. Неподскажите, что в нем означает: ... #pragma warn- ... #pragma warn+ ...
|
|
|
|
|
Jan 10 2007, 11:07
|
Гуру
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095
|
Цитата(Potter @ Jan 9 2007, 23:15) Собствено в помощь людям которым очень нужно написать асемдлерную функцию в сишном проекте(в IAR-е). В ИАРе все подробно расписано в документации. И делается как и положено в "больших" компиляторах с раздельной компиляцией и линковкой. А люди хотят перетащить это в CV, у которого нет понятия модулей, объектных файлов, линковки. Он все файлы склеивает в один с помощью #include, компилирует эту "колбасу", получает один большой ассемблерный файл на весь проект из которого при помощи avrasm (или avrasm32 - не помню, давно смотрел) получает сразу .hex прошивки. При этом в документации создание кусков на асме описано весьма скудно, часть #pragma не описана вообще - о них можно догадаться только просматривая прилагаемые исходники "библиолтек". В CV асм-вставки делаются так (в свое время полдня убил пока разобрался): Код #pragma asm_function+ void TX_Putchar ( char TX_byte) { #asm LD R16,Y+ ;// first parameter (TX_byte) passed in [Y] RJMP TX_PUTCHAR #endasm }
unsigned int Get_Serial(void) { #asm asm_function+
RCALL GET_SERIAL MOV R30,R16 MOV R31,R17 ;// return unsigned int in R30:R31 RET #endasm } #pragma asm_function- Про то, как передаются параметры и возвращаются значения было описание в документации.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 10 2007, 13:33
|
Частый гость
Группа: Свой
Сообщений: 151
Регистрация: 11-01-06
Из: Украина Ровно
Пользователь №: 13 066
|
Цитата(Яrik @ Jan 9 2007, 21:05) Может, у кого небудь есть наработки по выводу чисел с плавающей точкой на дисплей? Поделитесь пожалуйста. Дык выше говорил! Попробуйте bcdfp float value value=12.345 bcdfp(value,str) в str получите 12.3450
|
|
|
|
|
Jan 10 2007, 13:52
|
Частый гость
Группа: Свой
Сообщений: 151
Регистрация: 11-01-06
Из: Украина Ровно
Пользователь №: 13 066
|
Цитата(Яrik @ Jan 9 2007, 21:05) Может, у кого небудь есть наработки по выводу чисел с плавающей точкой на дисплей? Поделитесь пожалуйста. Я пользуюсь так: Сразу предвижу ругательства гуру от С. Но я более паскалист, чем сионист. Может гуру и подоптимизируют код? Цитата // ********************************************************************* // // *** Display a variable char, int, float *** // // ********************************************************************* // void LCD_print(float value) { unsigned char i,mt,fl; bcdfp(value,str); if (str[0]==' ') mt=1; else mt=0;//печатать ли знак '-' while (mt<8) {if (str[mt]=='.') break; else {LCD_DisplayCharacter(str[mt]);mt++;}}// пытаемся печатать целую часть i=mt+1; fl=0; while (i<8) {if (str[i]=='0') {i++;} else {fl=1;break;} }// отличная ли от 0 дробная часть? if (fl==1) { while (mt<8) {LCD_DisplayCharacter(str[mt]);mt++;} } // если да, то продолжаем печать }
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|