реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Вставка в СИ кода на ассемблере
Яrik
сообщение Jan 8 2007, 21:34
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



Тут (www.atmel.ru/Articles/Atmel13.htm) нашел программу на ассемблере,наз. bcdfp, преобразующая двоичные числа с плавающей точкой, в последовательность (строку) из 8 ASCII-символов, которая включает в себя ASCII-символ знака, шесть ASCII-символов значащих десятичных цифр и ASCII-символ точки. Но у меня его неполучается использоватьэтот код в CodeVisionAVR.
Выдает какието ошибки при компелировании. help.gif

Может, ктото растолкует, что и как, буду весьма благодарен.
Go to the top of the page
 
+Quote Post
Ryzhuk
сообщение Jan 8 2007, 22:03
Сообщение #2





Группа: Новичок
Сообщений: 2
Регистрация: 25-12-06
Пользователь №: 23 888



Привет.. У меня таже проблемка....
Может старожилы помогут...
Go to the top of the page
 
+Quote Post
Ryzhuk
сообщение Jan 8 2007, 23:28
Сообщение #3





Группа: Новичок
Сообщений: 2
Регистрация: 25-12-06
Пользователь №: 23 888



Может вместе решим эту проблему.... Стучи в аську 130712520
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Jan 8 2007, 23:42
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
Выдает какието ошибки при компелировании.

Вообще-то нехило код в студию вместе с ошибками компилятора.
Потому как Нео тут не водятся smile.gif

Во-вторых. Зачем такие половые извращения, когда существует семейство функций *printf() ?


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
big256
сообщение Jan 9 2007, 12:18
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 15
Регистрация: 9-08-05
Из: Киев-Борисполь
Пользователь №: 7 472



если вы о этом :
http://www.atmel.ru/Articles/Atmel13_app4.htm

то там написано : ;Подпрограмма может вызываться из головной программы, написанной на IAR C для AVR:

а у Иара другой синтаксис , нежели у CodeVision'a
в ЦВ надо использовать #asm, #endasm (если не ошибаюсь smile.gif ) для ассемблерных вставок -посмотрите пример С_asm поставляемый с кодевиженом и попробуйте притулить этот код туда wink.gif
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jan 9 2007, 12:55
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 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.
Выдает какието ошибки при компелировании. help.gif

Может, ктото растолкует, что и как, буду весьма благодарен.

Все должно быть в документации. Но лучше вставками вообще не пользоваться, поскольку эффекта от них нет. Лучше сделать отдельный модуль на ассемблере и включить его в проект. Сам я пользуюсь IAR, как это сделать в CV не знаю.
Go to the top of the page
 
+Quote Post
kamedi_clab
сообщение Jan 9 2007, 13:56
Сообщение #7


Местный
***

Группа: Новичок
Сообщений: 239
Регистрация: 5-10-06
Пользователь №: 21 004



в CVAVR по моему вот так вставку АСМ делают:

http://www.rambler.ru/srch?words=%23asm%28...%E0%E9%F2%E8%21
Go to the top of the page
 
+Quote Post
aleksey_g
сообщение Jan 9 2007, 15:21
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 11-01-06
Из: Украина Ровно
Пользователь №: 13 066



Сам пользуюсь этой штучкой под ИАР для "Печати" CHAR, INT, FLOAT.
Про КВ не знаю, но проблем не должно быть. Только не пользуйтесь вставками.
Подключайте как отдельный асм-модуль. Посмотрите, только соглашения
про передачу параметров (какими регистрами) в иаре и кв.
Go to the top of the page
 
+Quote Post
Яrik
сообщение Jan 9 2007, 21:35
Сообщение #9


Частый гость
**

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



Цитата
Может вместе решим эту проблему.... Стучи в аську 130712520


Давай попробуем cheers.gif , но я аськой не пользуюсь, пеши на мыло.
Go to the top of the page
 
+Quote Post
Яrik
сообщение Jan 9 2007, 22:05
Сообщение #10


Частый гость
**

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



Цитата
Во-вторых. Зачем такие половые извращения, когда существует семейство функций *printf() ?


Да, printf() мощьная функция, но при выводе чисел с плавающей точкой занимает много памяти МК.
У меня, программа измеряющая напряжение на входе встроеного АЦП (ATmega8L) с выводом на LCD, заняла почти 50% памяти.

Может, у кого небудь есть наработки по выводу чисел с плавающей точкой на дисплей? Поделитесь пожалуйста.

Сообщение отредактировал Яrik - Jan 9 2007, 22:13
Go to the top of the page
 
+Quote Post
Яrik
сообщение Jan 9 2007, 22:17
Сообщение #11


Частый гость
**

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



Цитата
Все должно быть в документации. Но лучше вставками вообще не пользоваться, поскольку эффекта от них нет. Лучше сделать отдельный модуль на ассемблере и включить его в проект. Сам я пользуюсь IAR, как это сделать в CV не знаю.


Документация это хорошо, но есть проблема, она на английском. А у меня с ним проблемы. smile.gif

Включить в проэкт пробывал, но (насколько я понял) CV добаляет только СИ модули. Исправте если не так.

Цитата
если вы о этом :
http://www.atmel.ru/Articles/Atmel13_app4.htm

то там написано : ;Подпрограмма может вызываться из головной программы, написанной на IAR C для AVR:

а у Иара другой синтаксис , нежели у CodeVision'a
в ЦВ надо использовать #asm, #endasm (если не ошибаюсь ) для ассемблерных вставок -посмотрите пример С_asm поставляемый с кодевиженом и попробуйте притулить этот код туда


C_asm смотрел. Неподскажите, что в нем означает:
...
#pragma warn-
...
#pragma warn+
...
Go to the top of the page
 
+Quote Post
Potter
сообщение Jan 10 2007, 00:15
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 151
Регистрация: 27-05-06
Из: Харьков
Пользователь №: 17 508



Собствено в помощь людям которым очень нужно написать асемдлерную функцию в сишном проекте(в IAR-е).

Создаем файл с расширением asm и пристегиваем его к проекту.

В этом файле пишем свою функцию.... К примеру:

//***********************************************
NAME set_int
#include <iom16.h>
PUBLIC set_int
RSEG CODE
EXTERN sinus

set_int:
cpi r16, 0x08
brne opt
clr r16
opt:

inc r16

ret

END set_int
//***********************************************

Теперь как вызвать эту функцию в main.c:

Сначала ее нужно в обьявить в main.c:

//*********************************
extern unsigned char set_int(unsigned char);
//*********************************

А теперь эту функцию "set_int" можно вызывать в любом месте в main.c. К примеру:

//*********************
//Обработчик прерывания по таймер вектору 1.
#pragma vector = TIMER1_OVF_vect
__interrupt void Timer1_interrupt(void){
F1 = set_int(F2);
F2 = F1;
TCNT1 = TIMER1_DELAY; //Перезапуск таймера на новый отчет времени
}
//*********************

Где "F1" и "F2"- глобальные переменныя которые объявленны как unsigned char....
Передоваемое значение функции ("F2") занаосится в r16. Потом с этим значением нужно работать уже в самой асемблерной функции. Передает асемблерная функция то значение которое находится опять же в регистре r16 на момент когда функция закончивает свою работу(т. е. в "F1" сохраняется значение которое на момент окончания функции находилось в регистре r16).

Мне когда-то очень нужно было разобраться как выполнить эту задачу..... Надеюсь что это кому-нибудь поможет. Удачи.

Сообщение отредактировал Potter - Jan 10 2007, 00:19
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 10 2007, 11:07
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
aleksey_g
сообщение Jan 10 2007, 13:33
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 11-01-06
Из: Украина Ровно
Пользователь №: 13 066



Цитата(Яrik @ Jan 9 2007, 21:05) *
Может, у кого небудь есть наработки по выводу чисел с плавающей точкой на дисплей? Поделитесь пожалуйста.

Дык выше говорил!
Попробуйте bcdfp
float value
value=12.345
bcdfp(value,str)
в str получите 12.3450
Go to the top of the page
 
+Quote Post
aleksey_g
сообщение Jan 10 2007, 13:52
Сообщение #15


Частый гость
**

Группа: Свой
Сообщений: 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++;} } // если да, то продолжаем печать
}
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th April 2024 - 13:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01493 секунд с 7
ELECTRONIX ©2004-2016