нужно: оцифровать переходной процесс засветки фотодиода светодиодом.
проблема: при коэф. делителя 2 от частоты мк 1МГц результат не очень хороший. младшие биты теряются. это нормально, но при делители в 128 получаю одни FF. хотя должно нормально работать. по оссцилу все красиво.
туплю что не так.
Прошу помочь найти ляп.
CODE
unsigned char dip_get_signal(void)
{
unsigned int U_min = 0;
unsigned char res_of_meg[_NUMB_OF_MEG]; // Измеренные значения каждого отчета //
__disable_interrupt();
WATCHDOG_ENABLE_LONG;
// ADC_init_prescaler_on_2_auto(); // Инициализация АЦП //
ADC_init_prescaler_on_16();
for (unsigned char z=0; z<3; z++){
w_mks(5000);}
// for (unsigned char z=0; z<6; z++){
// __delay_cycles(350000/8/10*F_MHZ); // срабатывает watchdog
// WATCHDOG_RESET;}
//задержку на выход ацп на режим ADC
CLRBIT(PORTB, 2); //
SETBIT(DDRB, 2); // VT
CLRBIT(PORTB, 6); // для дрыганья ношкой для отладки
CLRBIT(PORTB, 7); // для дрыганья ношкой для отладки
SETBIT(DDRB, 6); // для дрыганья ношкой для отладки
SETBIT(DDRB, 7); // для дрыганья ношкой для отладки
SETBIT (ADCSRA, _ADC_Start); //делаем пустое преобразование для нормальной работы АЦП
ADC_CONTROL_auto();
SETBIT(PORTB, 7); //от начало до конца измерений
// длительность измерений АЦП
WATCHDOG_RESET;
// SETBIT(DDRB, _Bright);
SETBIT(PORTB, _Bright); // Включить ИК СД //
__delay_cycles(50);//w_mks(50000);
// xx мкс //
for (char j = 0; j <_NUMB_OF_MEG; j++)
{res_of_meg[j] = ADC_CONTROL_auto();} // Массив измеренного значения калибровки //
CLRBIT (ADCSRA, _ADC_Start);
CLRBIT (PORTB, _Bright); // Выключить свет
ADCSRA = 0<<ADEN; // выключаем чтобы не потреблялся ток 0.120 mA //
CLRBIT(PORTB, 7);
/////////////Для отладки
dbg_msg("rm\r");
for (char j = 0; j <_NUMB_OF_MEG; j++)
{
unch_hex(res_of_meg[j]); //
}
dbg_msg("rn\r");
////////////////////////////////////////
WATCHDOG_ENABLE_LONG
while (1) {;}
{
unsigned int U_min = 0;
unsigned char res_of_meg[_NUMB_OF_MEG]; // Измеренные значения каждого отчета //
__disable_interrupt();
WATCHDOG_ENABLE_LONG;
// ADC_init_prescaler_on_2_auto(); // Инициализация АЦП //
ADC_init_prescaler_on_16();
for (unsigned char z=0; z<3; z++){
w_mks(5000);}
// for (unsigned char z=0; z<6; z++){
// __delay_cycles(350000/8/10*F_MHZ); // срабатывает watchdog
// WATCHDOG_RESET;}
//задержку на выход ацп на режим ADC
CLRBIT(PORTB, 2); //
SETBIT(DDRB, 2); // VT
CLRBIT(PORTB, 6); // для дрыганья ношкой для отладки
CLRBIT(PORTB, 7); // для дрыганья ношкой для отладки
SETBIT(DDRB, 6); // для дрыганья ношкой для отладки
SETBIT(DDRB, 7); // для дрыганья ношкой для отладки
SETBIT (ADCSRA, _ADC_Start); //делаем пустое преобразование для нормальной работы АЦП
ADC_CONTROL_auto();
SETBIT(PORTB, 7); //от начало до конца измерений
// длительность измерений АЦП
WATCHDOG_RESET;
// SETBIT(DDRB, _Bright);
SETBIT(PORTB, _Bright); // Включить ИК СД //
__delay_cycles(50);//w_mks(50000);
// xx мкс //
for (char j = 0; j <_NUMB_OF_MEG; j++)
{res_of_meg[j] = ADC_CONTROL_auto();} // Массив измеренного значения калибровки //
CLRBIT (ADCSRA, _ADC_Start);
CLRBIT (PORTB, _Bright); // Выключить свет
ADCSRA = 0<<ADEN; // выключаем чтобы не потреблялся ток 0.120 mA //
CLRBIT(PORTB, 7);
/////////////Для отладки
dbg_msg("rm\r");
for (char j = 0; j <_NUMB_OF_MEG; j++)
{
unch_hex(res_of_meg[j]); //
}
dbg_msg("rn\r");
////////////////////////////////////////
WATCHDOG_ENABLE_LONG
while (1) {;}
Код
#define WATCHDOG_ENABLE_LONG {WDTCSR |=(1<<WDCE)|(1<<WDE); WDTCSR =(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0);}//2sec
CODE
void ADC_init_prescaler_on_16(void)
{
ADMUX = (1<<REFS0)|(1<<REFS1)|(1<<ADLAR)|(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3);
ADCSRB = 0;//(0<<ACME)&(0<<ADTS2)&(0<<ADTS1)&(0<<ADTS0);
ADCSRA =(1<<ADEN)|(1<<ADPS0)|(1<<ADPS1)|(1<<ADPS2);
//16for1MHz 100 деление тактирующей частоты на 16;
ADCSRA |= (1<<ADATE);
}
{
ADMUX = (1<<REFS0)|(1<<REFS1)|(1<<ADLAR)|(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3);
ADCSRB = 0;//(0<<ACME)&(0<<ADTS2)&(0<<ADTS1)&(0<<ADTS0);
ADCSRA =(1<<ADEN)|(1<<ADPS0)|(1<<ADPS1)|(1<<ADPS2);
//16for1MHz 100 деление тактирующей частоты на 16;
ADCSRA |= (1<<ADATE);
}
CODE
#pragma optimize=none
unsigned char ADC_CONTROL_auto(void)
{
unsigned char t;
SETBIT(PORTB, 6); // Запуск АЦ преобразования;
while( !TSTBIT(ADCSRA, _ADC_Flag)); // Ожидание флага прерывания - окончания преобразования;
CLRBIT(PORTB, 6);
t= ADCL;
t= ADCH;
return t; // Чтение результата преобразования;
}
unsigned char ADC_CONTROL_auto(void)
{
unsigned char t;
SETBIT(PORTB, 6); // Запуск АЦ преобразования;
while( !TSTBIT(ADCSRA, _ADC_Flag)); // Ожидание флага прерывания - окончания преобразования;
CLRBIT(PORTB, 6);
t= ADCL;
t= ADCH;
return t; // Чтение результата преобразования;
}
фото где полностью виден начальный импульс это с делителем 2.
желтый луч на осциле это от запуска ацп до завершения преобразования. (выводы дергаю).