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

 
 
 
Reply to this topicStart new topic
> Вопрос новичка, Преобразование в 2-10 код
Anjey_N
сообщение Apr 14 2007, 16:24
Сообщение #1


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

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



Есть два 10-разрядных двоичных слова, полученных после преобразований АЦП по двум аналоговым каналам.
Необходимо преобразовать 2-й код в 2-10 код и результат поместить в 8 злементный масив.
Например
array[0]=v0
array[1]=v1
array[2]=v2
array[3]=v3
array[4]=i0
array[5]=i1
array[6]=12
array[7]=13
где v и i- значения 2-10 кода


Подскажите, как лучше это написать на языке Си!
Go to the top of the page
 
+Quote Post
Anjey_N
сообщение Apr 14 2007, 21:21
Сообщение #2


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

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



Подскажите, где хоть можно почитать!
Go to the top of the page
 
+Quote Post
d__
сообщение Apr 14 2007, 21:36
Сообщение #3


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

Группа: Свой
Сообщений: 197
Регистрация: 26-08-04
Пользователь №: 548



Уж очень круто изложено. Не асилил. Напиши человеческим языком чего тебе нужно, иначе никто не сможет тебе помочь...
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Apr 14 2007, 22:00
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Anjey_N @ Apr 14 2007, 16:24) *
Есть два 10-разрядных двоичных слова, полученных после преобразований АЦП по двум аналоговым каналам.
Необходимо преобразовать 2-й код в 2-10 код и результат поместить в 8 злементный масив.


Да уж. blink.gif Непереводимая игра слов. biggrin.gif
Go to the top of the page
 
+Quote Post
Stas633
сообщение Apr 15 2007, 00:19
Сообщение #5


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

Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901



Цитата(Anjey_N @ Apr 14 2007, 17:24) *
Есть два 10-разрядных двоичных слова, полученных после преобразований АЦП по двум аналоговым каналам.
Необходимо преобразовать 2-й код в 2-10 код и результат поместить в 8 злементный масив.
Например
array[0]=v0
array[1]=v1
array[2]=v2
array[3]=v3
array[4]=i0
array[5]=i1
array[6]=12
array[7]=13
где v и i- значения 2-10 кода
Подскажите, как лучше это написать на языке Си!


....
например так:

Код
v=АЦП/10;  //число десятков
i=АЦП%10; //число единиц
v<<=4;
РЕЗУЛЬТ=v+i;


нужно ли размещать "РЕЗУЛЬТ" (побитно!!!?? blink.gif ) в массиве "array" решите сами...
Go to the top of the page
 
+Quote Post
Stas633
сообщение Apr 15 2007, 02:33
Сообщение #6


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

Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901



Цитата(Stas633 @ Apr 15 2007, 01:19) *
....
например так:

Код
v=АЦП/10;  //число десятков
i=АЦП%10; //число единиц
v<<=4;
РЕЗУЛЬТ=v+i;


нужно ли размещать "РЕЗУЛЬТ" (побитно!!!?? blink.gif ) в массиве "array" решите сами...


Это не правильно.. Извините, не понял сразу вопрос...
должно было бы быть так:
...
Код
array[0]=АЦП1%10; //v0
АЦП1=АЦП1/10;
array[1]=АЦП1%10; //v1
АЦП1=АЦП1/10;
array[2]=АЦП1%10; //v2
array[3]=АЦП1/10;  //v3  

array[4]=АЦП2%10; //i0
АЦП2=АЦП2/10;
array[5]=АЦП2%10; //i1
АЦП2=АЦП2/10;
array[6]=АЦП2%10; //i2
array[7]=АЦП2/10;   //i3


... это только один из возможных, причем не самый лучший, вариант.

...если вы "сделаете" массив "array" двумерным (array[НомАЦП][j]), то решение Вашей задачи можно будет записать короче и понятнее.

Код
void ВАШАФУНКЦ (unsigned int АЦП, char n) // где n - это номер канала АЦП, а АЦП - 10-битное значение
{
   char i;
   for(i=0;i<=2;i++)
   {
      array[n][i]=АЦП%10;
      АЦП/=10;
    }
   array[n][3]=АЦП1/10;
}
Go to the top of the page
 
+Quote Post
SKov
сообщение Apr 15 2007, 12:00
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 812
Регистрация: 22-01-05
Из: SPb
Пользователь №: 2 119



Цитата(Anjey_N @ Apr 14 2007, 17:24) *
Есть два 10-разрядных двоичных слова, полученных после преобразований АЦП по двум аналоговым каналам.
Необходимо преобразовать 2-й код в 2-10 код и результат поместить в 8 злементный масив.
...
Подскажите, как лучше это написать на языке Си!

Первое, что вводит в ступор - это упоминание ДВУХ чисел, которые надо преобразовать.
И "ежику без сотового телефона" понятно, что если есть решение для одного числа, то для второго надо делать аналогично.
Так что дальше будем рассматривать задачу с одним числом.
Второе непонятное слово - "лучше". В каком смысле лучше?
Возможны варианты.
1) Самая короткая запись на Си (по количеству букв в тексте программы)
2) Программа, имеющая самый короткий код, пусть и медленная.
3) Программа, работающая быстро, пусть даже и с длинным кодом.
4) Некий вариант, промежуточный между п.2 и п3.

Не претендуя на истину в последней инстанции:

1) i=0; while(v) {array[i++]=v%10;v/=10; } // считается, что изначально массив нулевой

2) не уверен, но может что-то типа
i=0; while(v){v--;
loop: array[i]++;
if (array[i]==10){array[i++]=0; goto loop;}
else i=0;
}
3) возможно, это п1.
Ну, если совсем памяти навалом, то просто
array[0]= array_0[v];
array[1]= array_1[v];
array[2]= array_2[v];
array[3]= array_3[v];
Понятно, что массивы array_x надо сосчитать зааранее
4)
Я бы так написал
if(v>999){array[3]=1;v-=1000;}
while (v>99){array[2]++;v-=100;}
while (v>9){array[1]++;v-=10;}
array[0]=v;

P.S. Программы компилятором не проверял, так что возможны тараканы.
Go to the top of the page
 
+Quote Post
ASZ
сообщение Apr 15 2007, 16:59
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 302
Регистрация: 24-07-06
Из: Донецк, Украина
Пользователь №: 19 042



Цитата(Anjey_N @ Apr 14 2007, 16:24) *
Необходимо преобразовать 2-й код в 2-10 код и результат поместить в 8 злементный масив.

Если я правильно понял, то есть желание преобразовать код АЦП в двоично-десятичный?

Четче формулируйте.
Есть на эту тему отличный НФ-рассказ Шекли - "Верный вопрос".
Очень многим вопрошающим следует почитать.

Сообщение отредактировал ASZ - Apr 15 2007, 17:05
Go to the top of the page
 
+Quote Post
Anjey_N
сообщение Apr 15 2007, 19:21
Сообщение #9


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

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



Цитата(SasaVitebsk @ Apr 14 2007, 23:00) *
Да уж. blink.gif Непереводимая игра слов. biggrin.gif


Извините, похоже моя малоразговорчивость стала отражаться на письме. Редко спрашиваю, поэтому не умею задавать внятные вопросы.
На самом деле мне нужно измерить 2 напряжения. Для этого использую AtMega16 со встроенным АЦП.
Вот код:

#include <ioavr.h>
#include <inavr.h>

#define setbit(ADRES,N) ADRES|=(1<<N)
#define clearbit(ADRES,N) ADRES&=~(1<<N)
#define testbit(ADRES,N) ADRES&(1<<N)
#define ADC_VREF_TYPE 0xC0; // ИОН внутренний 2.56 В с кон-м на AREF, правое выравнивание
#define max 100 // к-т усреднения
#define Indicator PORTD
#define Strob PORTB
__flash const char ind[10]={0xC0,0xFC,0xA4,0xB0,0x99,0x92,0x02,0xF8,0x80,0x90};
__flash const char st[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
unsigned char array[8];
unsigned char ADC_INPUT,n; // номер аналогового входа
unsigned int data;


// Измеряем напряжение
unsigned int adc_data=0;
for (char i=0;i<max-1;i++)
{
read_adc(0);
adc_data+=ADC;
}
adc_data=adc_data/max;


// Преобразование
unsigned int read_adc (unsigned char adc_input)
{
unsigned int ADC=0;
ADMUX=adc_input|ADC_VREF_TYPE;
// Старт преобразования
setbit(ADCSRA,ADSC);
// Ждём окончания преобразования
while(!testbit(ADCSRA,ADIF));
setbit(ADCSRA,ADIF); // сброс флага окончания преобразования
ADC=ADCL;
ADC|=(int)ADCH<<8;
return ADC;
}


// Вывод информации на индикатор
// Обработка прерываний по таймеру ТС0
#pragma vector=TIMER0_OVF_vect
__interrupt void FIRST (void)
{
unsigned char Temp;
Strob=0xFF; // выключаем индикатор
Temp=array[n];
Indicator=ind[Temp];
Strob=st[n];
n++;
if (n==8)n=0;
}

Я не мог справится с преобразованием 2-кода в 2-10 и с заполнением массива array.

Поэтому я спрашивал, как всё это лучше написать на языке Си! help.gif

Цитата(Stas633 @ Apr 15 2007, 03:33) *
Это не правильно.. Извините, не понял сразу вопрос...
должно было бы быть так:
...
Код
array[0]=АЦП1%10; //v0
АЦП1=АЦП1/10;
array[1]=АЦП1%10; //v1
АЦП1=АЦП1/10;
array[2]=АЦП1%10; //v2
array[3]=АЦП1/10;  //v3  

array[4]=АЦП2%10; //i0
АЦП2=АЦП2/10;
array[5]=АЦП2%10; //i1
АЦП2=АЦП2/10;
array[6]=АЦП2%10; //i2
array[7]=АЦП2/10;   //i3


... это только один из возможных, причем не самый лучший, вариант.

...если вы "сделаете" массив "array" двумерным (array[НомАЦП][j]), то решение Вашей задачи можно будет записать короче и понятнее.

Код
void ВАШАФУНКЦ (unsigned int АЦП, char n) // где n - это номер канала АЦП, а АЦП - 10-битное значение
{
   char i;
   for(i=0;i<=2;i++)
   {
      array[n][i]=АЦП%10;
      АЦП/=10;
    }
   array[n][3]=АЦП1/10;
}



Спасибо, очень помогли.

Цитата(ASZ @ Apr 15 2007, 17:59) *
Если я правильно понял, то есть желание преобразовать код АЦП в двоично-десятичный?

Четче формулируйте.
Есть на эту тему отличный НФ-рассказ Шекли - "Верный вопрос".
Очень многим вопрошающим следует почитать.



Прочитал, суть - чтобы задать правильный вопрос, нужно частично знать ответ, а для этого нужно "учить матчасть"

Сообщение отредактировал Anjey_N - Apr 15 2007, 19:38
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 19:21
Рейтинг@Mail.ru


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