Ну вот собственно заработало.
Проиллюстрирую поподробнее, может пригодится кому.
Обязательно надо настроить все переиферийные устройства, не полагаясь на автоматические установки после сброса.
Это переменная куда заносятся байты результата. Главное, чтобы они были именно в этом порядке.
Пока сделал так - потом без структуры попробую.
CODE
union{
volatile unsigned int Vin;
struct{
volatile unsigned char UL:8;
volatile unsigned char UH:8;
} byte;
}volt;
Это программы задержки и переинициализации АЦП
CODE
void ADDelay() { //задержка 10uS
static unsigned char i;
i = 3; //Генератор 4Mhz, период 3uS,
while(i > 0) { //переменная равна 3 плюс смещение
i--;
}
}
void InitAD() {
ADIE = 1; //Разрешить прерывания от АЦП
ADCON0 = Channel; //Генегатор внутр RC + номер канала
ADIF = 0; //очистить флаг прерывания от АЦП
PEIE = 1; //Разрешить переферийные прерывания
}
Это необходимые процедуры для запуска АЦП
CODE
void main(void) {
#asm
bsf status,5 // КАЛИБРОВКА ГЕНЕРАТОРА !!!
call 0X3ff
movwf 0X90
bcf status,5
#endasm
WPU = 0; // все подтягивающие резисторы выключены
ANSEL = 0b01010011; // F/16 для АЦП и 2 канала аналоговых
GPIO = 0b00000000; // порты в ноль
TRISIO = 0b00001111; // GP4-5 на выход
OPTION = 0b10000111; // R-up выкл, делитель 1:256 к TMR0
VRCON = 0x00; // выключить источник опорного напряжения
IOCB = 0x00; // запрет прерываний по входам
CMCON = 0b00000111; // выключить компаратор
INTCON = 0b10000000; // разрешить общее прерывание
Count = 0; //первичная инициализация АЦП
Channel = 129;
InitAD();
ADDelay();
SETBIT(ADCON0,1);
while(1) { //бесконечный цикл
#asm
nop
nop
nop
nop
nop
nop
#endasm
......................................
//основная программа
......................................
}
}
А это обработка прерывания АЦП.
CODE
void interrupt ADC() {
if(ADIF == 1) {
volt.byte.UL=ADRESL; //ВОТ В ЭТИХ ТРЕХ СТРОКА ФОРМИРУЕТСЯ МАССИВ РЕЗУЛЬТАТОВ АЦП
volt.byte.UH=ADRESH; //В ДАННОМ СЛУЧАЕ - ЭТО ДВА ЦЕЛЫХ ЧИСЛА
U[Count]=volt.Vin; //ТУТ ПОЛУЧАЕМ ЦЕЛОЕ С ПРАВИЛЬНЫМ РАСПОЛОЖЕНИЕМ БАЙТОВ
//ПРИ ДАЛЬНЕЙШЕЙ МАТЕМАТИЧЕСКОЙ ОБРАБОТКЕ ВСЕ ПРОИСХОДИТ ПРАВИЛЬНО
if(++Count < 2) {
Channel = Channel + 4; //загрузить другой канал
InitAD();
ADDelay(); //задержка на 2xTad для восстановления
ADDelay();
SETBIT(ADCON0,1);
}else {
Channel = 129; //10000001b загрузка канала АЦП 0
Count = 0; //перезагрузить счетчик каналов
InitAD();
ADDelay();
ADDelay();
SETBIT(ADCON0,1);
}
}
............................
//Тут могут быть обработчики других прерываний
...........................
}
Итого был неправильно оформлен счетчик массива, разрядность АЦП 12 бит вместо десяти ну и обьединение для собственно запихивания байт в целое.
Всем спасибо!