Итак, во-первых, ОГРОМНОЕ спасибо всем откликнувшимся в данной теме=). Отдельное спасибо товарищам SasaVitebsk, Aleksandr Baranov и Цыкетчик за подробные ответы и сведения касающиеся практики!!! Я наконец разобрался!=)))
Как промежуточный конечный результат я сваял следующий код:
Цитата
#include <avr/io.h>
#include <avr/sfr_defs.h>
#include <avr/delay.h>
#define MYADMUX_U_T (1<<REFS1) | (1<<REFS0) | (0<<MUX3) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0);
#define MYADMUX_I (1<<REFS1) | (1<<REFS0) | (0<<MUX3) | (1<<MUX2) | (1<<MUX1) | (0<<MUX0);
void port_B_settings (void);
void port_C_settings (void);
void measure_Ubat (int *, int *);
void measure_Tbat (int *, int *);
void measure_Icur (int *);
void main (void)
{
int Ubat[4];
int Tbat[4];
int Icur;
const int channel_number[8] =
{0b000, 0b001, 0b010, 0b011, 0b100, 0b101, 0b110, 0b111};
port_B_settings();
ADCSRA = 0x80;
_delay_ms(10);
measure_Ubat (&Ubat, &channel_number);
measure_Tbat (&Tbat, &channel_number);
measure_Icur (&Icur);
return;
}
void port_B_settings (void)
{
DDRB = 0x07;
return;
}
void measure_Ubat (int *Ubat, int *channel_number)
{
for (int i=0;i<4;i++)
{
ADMUX = MYADMUX_U_T;
PORTB = ((channel_number[i]>>2)<<PB2) | ((channel_number[i]>>1)<<PB1) | ((channel_number[i])<<PB0);
_delay_ms(10);
ADCSRA=ADCSRA | (1<<ADSC);
for (;;)
{
if (bit_is_set(ADCSRA,4))
break;
}
*(Ubat+i) = ADCH;
*(Ubat+i) = (*(Ubat+i)<<8) + ADCL;
ADCSRA = ADCSRA | (1<<ADIF);
}
return;
}
void measure_Tbat (int *Tbat, int *channel_number)
{
for (int i=0;i<4;i++)
{
ADMUX = MYADMUX_U_T;
PORTB = ((channel_number[i+4]>>2)<<PB2) | ((channel_number[i+4]>>1)<<PB1) | ((channel_number[i+4])<<PB0);
_delay_ms(10);
ADCSRA=ADCSRA | (1<<ADSC);
for (;;)
{
if (bit_is_set(ADCSRA,4))
break;
}
*(Tbat+i) = ADCH;
*(Tbat+i) = (*(Tbat+i)<<8) + ADCL;
ADCSRA = ADCSRA | (1<<ADIF);
}
return;
}
void measure_Icur (int *Icur)
{
ADMUX = MYADMUX_I
ADCSRA=ADCSRA | (1<<ADSC);
for (;;)
{
if (bit_is_set(ADCSRA,4))
break;
}
*Icur = ADCH;
*Icur = (*Icur<<8) + ADCL;
ADCSRA = ADCSRA | (1<<ADIF);
return;
}
Который вроде даже работает=)
У меня только вот что "вылезло":
1) В последнем ответе SasaVitebsk на мой пост есть фраза:
Цитата
В этом случае в п/п вам надо проверить флаг готовности АЦП и ждать его выставления и прочитать значение. Опять таки (см. выше) первое, после переключ. канала отбросить как не верное.
этот момент мне не очень понятен... Или таким образом реализуется "устаканивание" сигнала после смены канала? своего рода задержка между подачей сигнала на оцифровку и оцифровкой дабы получить более точное значение? Если так, то можно ли это реализовать функцией delay()?
2) На счёт встроенного дизасемблера и функции watch - спасибо, что подсказали... Удобно... НО почему она мне не позволяет наблюдать за метаморфозами моих переменных во время нахождения в вызываемых функциях? А я могу видеть состояние массивов только после возвращения из этих функций... Кроме того, переменную Icur она вообще наотрез отказывается отображать, всё время пишет либо "Location not valid" либо "Not in scope"... Таким образом я даже не вижу что с ней происходит... Может я как-то неправильно осуществляю вызов функций? Вроде бы всё что называется как по книжке... или может быть я где-то ошибся? Кстати при компиляции она мне пишет различного рода вонингсы как раз на моменты вызова функции... Они звучат следующим образом:
"../first.c:29: warning: passing argument 1 of 'measure_Ubat' from incompatible pointer type"
что я примерно перевожу как:
"впервый аргумент функции 'measure_Ubat' несовместим с сылочным типом..."
Я в чём-то заблуждаюсь при вызове функций?
Спасибо!
Чёрт, эта зараза не понимает рускую кодировку каментов из студии, пришлось все каменты удалить, ибо каракули отобразились при вставке...
Сообщение отредактировал NikitoS-86 - Sep 23 2008, 12:27