Ну вот что получилось - ацп работает но результата по прежнему толком нет.
В ацп есть какоето число но какое так и не смог выяснить.
Уже голову сломал не могу найти ошибку.
CODE
//;---------------------------------------
//; Процессор PIC12C672 или PIC12F675
//; Fosc = 4MHz Генератор RC-внутренний
//;---------------------------------------
#include <pic.h>
__CONFIG(WDTDIS & INTIO & UNPROTECT & MCLRDIS & PWRTEN & BOREN );
#define warm_out GPIO5 //выход нагревателя
#define sound_out GPIO4 //выход pреле звука
#define start_out GPIO3 //вход выключателя нагрева
unsigned char Temp, Count, Channel;
unsigned int U[3]; //массив данных с 3х каналов
union{
unsigned int Vin;
struct{
unsigned char UL:8;
unsigned char UH:8;
} byte;
}volt;
#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 преобразования (ADCON1 после сброса уже установлен)
//================================
void InitAD() {
ADIE = 1; //Разрешить прерывания от АЦП
ADCON0 = Channel; //Генегатор внутр RC + номер канала
ADIF = 0; //очистить флаг прерывания от АЦП
PEIE = 1; //Разрешить переферийные прерывания
}
//==========================================================================
// MAIN
//==========================================================================
void main(void) {
#asm
bsf status,5 // КАЛИБРОВКА ГЕНЕРАТОРА !!!
call 0X3ff
movwf 0X90
bcf status,5
#endasm
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 =0b00010111; // F/8 и три канала аналоговый вход
warm_out = 1; // вкл выход
Count = 0; //первичная инициализация АЦП
Channel = 129;
InitAD();
ADDelay();
SETBIT(ADCON0,1);
while(1) { //бесконечный цикл
#asm
nop
nop
nop
nop
nop
nop
#endasm
if(U[0] < 2900 ) { //вот тут не работает при напряжении на ацп 3,8 вольт
sound_out = 1; //результат должен быть в районе 3114 а его нет
}else {
sound_out = 0;
}
}
}
//================================
//Обработка прерываний
//================================
void interrupt ADC() {
// sound_out = 1;
volt.byte.UL=ADRESL;
volt.byte.UH=ADRESH;
U[Count]=volt.Vin;
if(Count++ < 3) {
Channel = Channel + 8; //загрузить другой канал
}else {
Channel = 129; //10000001b загрузка канала АЦП 0
Count = 0; //перезагрузить счетчик каналов
}
InitAD();
ADDelay(); //задержка на 2xTad для восстановления
// sound_out=0;
ADDelay();
SETBIT(ADCON0,1); //Запуск A/D преобразования
}
Раньше писал для этого же процессора на асме и все работало - правда были мучения с вычислениями, а сейдас даже результата преобразования получить не могу - а ведь хотелось как быстрее и красивее
Модератор. В очередной раз фиксирую нарушение Вами п.3.4 Правил форума. Либо упаковывайте цитаты исходников в тэги [ codebox ] самостоятельно, либо прилагайте их к сообщению в виде архива так, как это рекомендуют Правила форума.
С уважением, rezident.
Причина редактирования: Нарушение п.3.4 Правил форума.