Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 19.03.2010, 18:20  
code-by
Прописка
 
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
code-by на пути к лучшему
По умолчанию Как в 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.
code-by вне форума  
Непрочитано 19.03.2010, 21:34  
picavr
Почётный гражданин KAZUS.RU
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию Re: Как в CVAVR вывести 3х-значное число на порты?

Сообщение от code-by Посмотреть сообщение
мой вариант с делением чисел на 100 и 10 для получения значений 3 разрядов и дальнейший перевод в двойное число - наверное не лучший варианты лучше на C, можно со вставками на АСМ.
спасибо
У Микрочип есть апнот преобразования двоичного числа в двоично-десятичные на асcемблере. Переписать на Си.
picavr вне форума  
Непрочитано 19.03.2010, 22:13  
delay
Гражданин KAZUS.RU
 
Регистрация: 24.06.2005
Сообщений: 535
Сказал спасибо: 262
Сказали Спасибо 216 раз(а) в 118 сообщении(ях)
delay на пути к лучшему
По умолчанию 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;
}
delay вне форума  
Непрочитано 19.03.2010, 23:27  
code-by
Прописка
 
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
code-by на пути к лучшему
По умолчанию Re: Как в CVAVR вывести 3х-значное число на порты?

Сообщение от picavr Посмотреть сообщение
У Микрочип есть апнот
спасибо, но уж лучше переводить с асма для avr к тому же всю прогу (включающую также вывод числа на порт) писать на асме будет проблематично
code-by вне форума  
Непрочитано 20.03.2010, 00:54  
picavr
Почётный гражданин KAZUS.RU
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию Re: Как в CVAVR вывести 3х-значное число на порты?

Сообщение от code-by Посмотреть сообщение
спасибо, но уж лучше переводить с асма для avr
А какая разница с какого асма... просто его нуно знать )))
портировал на асм AVR и на СИ (IAR AVR & HITECH PIC). Держите на СИ.
Сообщение от code-by Посмотреть сообщение
всю прогу (включающую также вывод числа на порт) писать на асме будет проблематично
вывести порт намного легче табличное преобразование.
У Микрочипа вся математика написана на асме была и уже очень давно. В апнотах. вплоть до 32 бит. Сложение, вычитание, умножение, деление, синусы, квадраты, корни, экспоненциальная функция, с плавающей запятой и без неё. Вот такая вот поддержка для своих МК.
Вложения:
Тип файла: txt bin2_bcd3 .txt (2.1 Кб, 149 просмотров)

Последний раз редактировалось picavr; 20.03.2010 в 01:02.
picavr вне форума  
Непрочитано 20.03.2010, 01:24  
code-by
Прописка
 
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
code-by на пути к лучшему
По умолчанию Re: Как в CVAVR вывести 3х-значное число на порты?

Сообщение от picavr Посмотреть сообщение
bin2_bcd3 .txt (2.1 Кб, 0 просмотров)
если я правильно понял, это перевод двоичного числа в двоично-десятичный вид для вывода на порты. меня больше интересует вариант преобразования десятичного числа в BCD, а не двоичного
тут можно делить трехзначное число (от 0 до 999) на 100 и 10 (или преобразовывать в строку с извлечением каждого из символов с последующем преобразованием в число, но это еще хуже).
вывод на порты каждого разряда наверное лучше делать с наложением маски и сдвигом...
code-by вне форума  
Непрочитано 20.03.2010, 01:35  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Как в CVAVR вывести 3х-значное число на порты?

Сообщение от code-by Посмотреть сообщение
меня больше интересует вариант преобразования десятичного числа в BCD, а не двоичного
Какае такое десятичное? Думаете если вместо 534 взять 0x0216, то получится другой результат? Пользуйтесь делением как изначально и планировалось, это не самый быстрый способ, но вполне рабочий.
А вместо
Цитата:
PORTA.0=1;PORTA.1=0;PORTA.2=1;PORTA.3=0; // для 5
нужно всего лишь PORTA = 5;
kison вне форума  
Непрочитано 20.03.2010, 01:37  
picavr
Почётный гражданин KAZUS.RU
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию Re: Как в CVAVR вывести 3х-значное число на порты?

Сообщение от code-by Посмотреть сообщение
если я правильно понял, это перевод двоичного числа в двоично-десятичный вид для вывода на порты. меня больше интересует вариант преобразования десятичного числа в BCD, а не двоичного
Чего то я не понял.. в каком виде у вас 999 содержится?
В перемнной INT ?
Если ДА, то оно в двоичной форме, берём и вызываеем функцию из моего файла:

temp_int = 0x3E7; //это равно 999 десятичное
temp_long = bin2_bcd3 (temp_int);
temp_long будет иметь при выходе 0x00000999 шестнадатиричное.
далее из Long вытаскиваете что нуно

ЭТО ОНО? или покажите с примерами что хотите.

Сообщение от kison Посмотреть сообщение
Пользуйтесь делением, это не самый быстрый способ, но вполне рабочий.
а так быстрее
преобразование bin 2 байта to bcd 3 байта (5знаков)
IAR AVR = 1429 циклов / 62 word
HiTECH PICC = 1115 циклов / 61 word
picavr вне форума  
Непрочитано 20.03.2010, 01:59  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию 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 слов. В лоб.
При совсем одинаковом - т.е. обрабатываем все 5 байт будет похуже - 1625 тактов и 73 слова.
Но не всегда нужно полностью, например в данном случае с тремя значащими десятичными цифрами вариант с делениемдает лучший результат
А вот с вычитанием:
Код:
#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 тактов 66 слов.

Последний раз редактировалось kison; 20.03.2010 в 02:13.
kison вне форума  
Непрочитано 20.03.2010, 02:35  
picavr
Почётный гражданин KAZUS.RU
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию 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.
picavr вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Решено] Как внедрялась АСУ chermnv Отвлекитесь, эмбеддеры! 743 14.02.2010 23:11
[Решено] Третье Послание Человечеству lelkanet Отвлекитесь, эмбеддеры! 201 06.01.2010 00:33
как выйти с PROTEUS-а на порты? begun Микроконтроллеры, АЦП, память и т.д 5 28.10.2009 16:36
PICC как будет выглядеть код в CVAVR rv6yi Микроконтроллеры, АЦП, память и т.д 15 22.10.2009 23:22


Часовой пояс GMT +4, время: 07:38.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot