Цитата(Student Pupkin @ Aug 27 2009, 23:50)

А нельзя типа такого?
Не работает - преобразование вешается, я с указателями пробовал и не работает с ними у меня этот компилятор - не пойму почему.
Судя по листингу он сам активно использует косвенную адресацию и гдето там и происходит глюк, а как найти не знаю.
Вот полный код который компилируется но не работает - подскажите где ошибка.
CODE
//---------------------------------------
// Процессор PIC12F675
// Fosc = 4MHz Генератор RC-внутренний
// HI-TECH 8.05LP1
//---------------------------------------
#include <pic.h>
#include <math.h>
__CONFIG(WDTDIS & INTIO & UNPROTECT & MCLRDIS & PWRTEN & BOREN );
#define warm_out GPIO5 //выход нагревателя
#define sound_out GPIO4 //выход pреле звука
#define start_out GPIO3 //вход выключателя нагрева
volatile unsigned char Temp, Count, Channel;
volatile unsigned int U[3];// @ 0x20; //массив из трех двухбайтных элементов
volatile unsigned char *pU =(char*)U; //указатель на адрес 1го элемента массива
//МАКРОСЫ
//-----------------------------------------
#define TESTBIT(ADRESS,BIT) (ADRESS & (1<<BIT))
#define SETBIT(ADRESS,BIT) (ADRESS |= (1<<BIT))
#define CLEARBIT(ADRESS,BIT) (ADRESS &= ~(1<<BIT))
//================================
//задержка для A/D преобразования
//================================
void ADDelay() { //задержка 10uS
static unsigned char i;
i = 3; //Генератор 4Mhz, период 3uS,
while(i > 0) { //переменная равна 3 плюс смещение
i--;
}
}
//================================
//Инициализация A/D преобразования
//================================
void InitAD() {
ADIE = 1; //Разрешить прерывания от АЦП
ADCON0 = Channel; //Генегатор внутр RC + номер канала
ADIF = 0; //очистить флаг прерывания от АЦП
PEIE = 1; //Разрешить переферийные прерывания
asm("nop");
}
//==========================================================================
// MAIN
//==========================================================================
void main(void) {
GPIO = 0b00000000; // порты в ноль
TRISIO = 0b10001111; // GP4-5 на выход
OPTION = 0b00000110; // R-up выкл, делитель 1:128 к TMR0
VRCON = 0x00; // выключить источнок опорного напряжения
WPU = 0b00000000; // gp0 gp5 подтягивающие резисторы выключены
IOCB = 0x00; // запрет прерываний по входам
CMCON = 0b00000111; // компаратор выключен
INTCON =0b10000000; // разреш прерывания
ANSEL =0b01010111;
warm_out = 1;
Count = 0; //первый запуск ацп
Channel = 129; //канал ацп 0
InitAD();
ADDelay();
SETBIT(ADCON0,1);
while(1) {
ei();
asm("nop");
di();
}
}
//================================
//Обработка прерываний
//================================
void interrupt ADC() {
sound_out = 1; //индикатор работы ацп
*(pU) = ADRESH; //старший байт в первый элемент массива
*(pU++) = ADRESL; //младший байт во второй элемент массива
//точно также в 3-4 и в 5-6 элементы по циклу
if(Count++ < 3) {
Channel = Channel + 8; //загрузить другой канал
}else {
Channel = 129; //10000001b загрузка канала АЦП 0
Count = 0; //перезагрузить счетчик каналов
*pU = U[0]; //перегружаем адрес первого элемента массива
}
InitAD();
ADDelay(); //задержка на 2xTad для восстановления
sound_out=0;
ADDelay();
SETBIT(ADCON0,1); //Запуск A/D преобразования
}
По посту №4 работает АЦП и даже есть результат но понятно это по изменению младшего байта результата, а вот когда пытаюсь запихать два байта в целое то сравнения не работают то есть не получается нормальног INT из двух CHAR.
Причина редактирования: Нарушение п.3.4 Правил форума.