Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
19.03.2010, 18:20
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
Как в CVAVR вывести 3х-значное число на порты?
Подскажите как в Codevision AVR лучше всего перевести число от 0 до 999 и по очереди вывести каждый разряд на выходы 4 портов МК.
Пример:
число 534. Получаем три числа: 5, 3 и 4. Переводим в двоичный код - получаем 0b0101, 0b0011, 0b0100.
PORTA.0=1;PORTA.1=0;PORTA.2=1;PORTA.3=0; // для 5
PORTA.0=1;PORTA.1=1;PORTA.2=0;PORTA.3=0; // для 3
PORTA.0=0;PORTA.1=0;PORTA.2=1;PORTA.3=0; // для 4
мой вариант с делением чисел на 100 и 10 для получения значений 3 разрядов и дальнейший перевод в двойное число - наверное не лучший
варианты лучше на C, можно со вставками на АСМ.
спасибо
Последний раз редактировалось code-by; 19.03.2010 в 18:22.
|
|
|
|
19.03.2010, 21:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Как в CVAVR вывести 3х-значное число на порты?
Сообщение от code-by
|
мой вариант с делением чисел на 100 и 10 для получения значений 3 разрядов и дальнейший перевод в двойное число - наверное не лучший варианты лучше на C, можно со вставками на АСМ.
спасибо
|
У Микрочип есть апнот преобразования двоичного числа в двоично-десятичные на асcемблере. Переписать на Си.
|
|
|
|
19.03.2010, 22:13
|
|
Гражданин KAZUS.RU
Регистрация: 24.06.2005
Сообщений: 535
Сказал спасибо: 262
Сказали Спасибо 216 раз(а) в 118 сообщении(ях)
|
Re: Как в CVAVR вывести 3х-значное число на порты?
Если я правильно понял, вам нужно расчленить число на сотни, десятки, единицы и выдать результаты в порт. Я делал динамическую индикацию. Для этого выполнял ту же операцию. Делал это так:
Код:
|
void indikat()
{
int DIG_OUT = 0;
while (REZALT ›= 1000) // Подсчет тысяч
{
REZALT -= 1000; //вычитаем пока тысячи не закончатся
DIG_OUT++; // считаем сколько было тысяч
}
A4 = DIG_OUT; // Выдаем значение тысяч на индикацию
DIG_OUT = 0; // Обнуляем переменную для дальнейшего использования.
while (REZALT ›= 100) // Подсчет сотен
{
REZALT -= 100;
DIG_OUT++;
}
A3 = DIG_OUT;
DIG_OUT = 0;
while (REZALT ›= 10) // Подсчет десяиков
{
REZALT -= 10;
DIG_OUT++;
}
A2 = DIG_OUT;
DIG_OUT = 0;
while (REZALT ›= 1) // Подсчет единиц
{
REZALT--;
DIG_OUT++;
}
A1 = DIG_OUT;
DIG_OUT = 0;
} |
|
|
|
|
19.03.2010, 23:27
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
Re: Как в CVAVR вывести 3х-значное число на порты?
Сообщение от picavr
|
У Микрочип есть апнот
|
спасибо, но уж лучше переводить с асма для avr ![Улыбка](images/smilies/icon_smile.gif) к тому же всю прогу (включающую также вывод числа на порт) писать на асме будет проблематично
|
|
|
|
20.03.2010, 00:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Как в CVAVR вывести 3х-значное число на порты?
Сообщение от code-by
|
спасибо, но уж лучше переводить с асма для avr
|
А какая разница с какого асма... просто его нуно знать )))
портировал на асм AVR и на СИ (IAR AVR & HITECH PIC). Держите на СИ.
Сообщение от code-by
|
всю прогу (включающую также вывод числа на порт) писать на асме будет проблематично
|
вывести порт намного легче ![Мистер Грин](images/smilies/icon_smilegreen.gif) табличное преобразование.
У Микрочипа вся математика написана на асме была и уже очень давно. В апнотах. вплоть до 32 бит. Сложение, вычитание, умножение, деление, синусы, квадраты, корни, экспоненциальная функция, с плавающей запятой и без неё. Вот такая вот поддержка для своих МК.
Последний раз редактировалось picavr; 20.03.2010 в 01:02.
|
|
|
|
20.03.2010, 01:24
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
Re: Как в CVAVR вывести 3х-значное число на порты?
Сообщение от picavr
|
bin2_bcd3 .txt (2.1 Кб, 0 просмотров)
|
если я правильно понял, это перевод двоичного числа в двоично-десятичный вид для вывода на порты. меня больше интересует вариант преобразования десятичного числа в BCD, а не двоичного ![Улыбка](images/smilies/icon_smile.gif)
тут можно делить трехзначное число (от 0 до 999) на 100 и 10 (или преобразовывать в строку с извлечением каждого из символов с последующем преобразованием в число, но это еще хуже).
вывод на порты каждого разряда наверное лучше делать с наложением маски и сдвигом...
|
|
|
|
20.03.2010, 01:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Как в CVAVR вывести 3х-значное число на порты?
Сообщение от code-by
|
меня больше интересует вариант преобразования десятичного числа в BCD, а не двоичного
|
Какае такое десятичное? Думаете если вместо 534 взять 0x0216, то получится другой результат? Пользуйтесь делением как изначально и планировалось, это не самый быстрый способ, но вполне рабочий.
А вместо
Цитата:
|
PORTA.0=1;PORTA.1=0;PORTA.2=1;PORTA.3=0; // для 5
|
нужно всего лишь PORTA = 5;
|
|
|
|
20.03.2010, 01:37
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Как в CVAVR вывести 3х-значное число на порты?
Сообщение от code-by
|
если я правильно понял, это перевод двоичного числа в двоично-десятичный вид для вывода на порты. меня больше интересует вариант преобразования десятичного числа в BCD, а не двоичного
|
Чего то я не понял.. в каком виде у вас 999 содержится?
В перемнной INT ?
Если ДА, то оно в двоичной форме, берём и вызываеем функцию из моего файла:
temp_int = 0x3E7; //это равно 999 десятичное
temp_long = bin2_bcd3 (temp_int);
temp_long будет иметь при выходе 0x00000999 шестнадатиричное.
далее из Long вытаскиваете что нуно
ЭТО ОНО? или покажите с примерами что хотите.
Сообщение от kison
|
Пользуйтесь делением, это не самый быстрый способ, но вполне рабочий.
|
а так быстрее ![Улыбка](images/smilies/icon_smile.gif)
преобразование bin 2 байта to bcd 3 байта (5знаков)
IAR AVR = 1429 циклов / 62 word
HiTECH PICC = 1115 циклов / 61 word
|
|
|
|
20.03.2010, 01:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Как в CVAVR вывести 3х-значное число на порты?
Сообщение от picavr
|
а так быстрее
|
Сообщение от picavr
|
IAR AVR = 1429 циклов / 62 word
|
Прикольно.
Код:
|
#include ‹inttypes.h›
uint8_t a,b,c;
uint16_t var = 999;
void Bin2Bcd(void)
{
a = var /100;
var = var - (a*100);
b = var / 10;
c = var % 10;
}
int main(void)
{
Bin2Bcd();
while(1)
{
asm volatile("nop");
};
} |
GCC - 696 тактов. 55 слов. В лоб. ![Улыбка](images/smilies/icon_smile.gif)
При совсем одинаковом - т.е. обрабатываем все 5 байт будет похуже - 1625 тактов и 73 слова.
Но не всегда нужно полностью, например в данном случае с тремя значащими десятичными цифрами вариант с делениемдает лучший результат ![Улыбка](images/smilies/icon_smile.gif)
А вот с вычитанием:
Код:
|
#include ‹inttypes.h›
uint8_t a,b,c,d,e;
uint16_t var = 999;
void Bin2Bcd(void)
{
uint8_t temp; // íà ñëó÷àé åñëè ðåçóëüòàò ñ êâàëèôèêàòîðîì volatile
temp = 0;
while(var ›= 10000) { temp++; var -= 10000;}
a = temp;
temp = 0;
while(var ›= 1000) { temp++; var -= 1000;}
b = temp;
temp = 0;
while(var ›= 100) { temp++; var -= 100;}
c = temp;
temp = 0;
while(var ›= 10) { temp++; var -= 10;}
d = temp;
e = var;
}
int main(void)
{
Bin2Bcd();
while(1)
{
asm volatile("nop");
};
} |
Время - 229 тактов ![Улыбка](images/smilies/icon_smile.gif) 66 слов.
Последний раз редактировалось kison; 20.03.2010 в 02:13.
|
|
|
|
20.03.2010, 02:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Как в CVAVR вывести 3х-значное число на порты?
Сообщение от kison
|
При совсем одинаковом - т.е. обрабатываем все 5 байт
|
Там не байт, там тетрад - т.е. полу-байт.
А попробуйте, столько будет в GCC та функция из файла. Просто интересно.
Сообщение от kison
|
с тремя значащими десятичными цифрами вариант с делениемдает лучший результат
|
Таки наверное да, 3 цифры бысрее, а дальше нет...
//преобразование bin 8 байт to bcd 10 байт(20знаков)
//IAR AVR = 17424 циклов / 129 word
//HiTECH PICC = 13839 циклов / 136 word
Последний раз редактировалось picavr; 20.03.2010 в 02:43.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:38.
|
|