Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос новичка
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Anjey_N
Есть два 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 кода


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


Да уж. blink.gif Непереводимая игра слов. biggrin.gif
Stas633
Цитата(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" решите сами...
Stas633
Цитата(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;
}
SKov
Цитата(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. Программы компилятором не проверял, так что возможны тараканы.
ASZ
Цитата(Anjey_N @ Apr 14 2007, 16:24) *
Необходимо преобразовать 2-й код в 2-10 код и результат поместить в 8 злементный масив.

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

Четче формулируйте.
Есть на эту тему отличный НФ-рассказ Шекли - "Верный вопрос".
Очень многим вопрошающим следует почитать.
Anjey_N
Цитата(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) *
Если я правильно понял, то есть желание преобразовать код АЦП в двоично-десятичный?

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



Прочитал, суть - чтобы задать правильный вопрос, нужно частично знать ответ, а для этого нужно "учить матчасть"
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.