Цитата(SasaVitebsk @ Apr 14 2007, 23:00)

Да уж.

Непереводимая игра слов.

Извините, похоже моя малоразговорчивость стала отражаться на письме. Редко спрашиваю, поэтому не умею задавать внятные вопросы.
На самом деле мне нужно измерить 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.
Поэтому я спрашивал, как всё это лучше написать на языке Си!

Цитата(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)

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