Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: DS18b20
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Andrew_k5
Пробовал разные задержки, отключил все что можно.
Температура до 40 нормально, при нагреве феном оключается при 45 градусах, при охлаждении включается при 55.
_Pasha
На всякий случай Вы бы код приложили. Интересуют только процедуры чт/зп одного бита. Недавно было подобное - датчик падал при отрицательных температурах. Дало оказалось, все-таки, во времянке smile.gif Проц от внутреннего генератора. Задержки были "на грани дозволенного". Ушел в безопасную область - все работает.
Andrew_k5
На 16 меге работает, на 8 нет, обработка датчика одинаковая, может датчики разные, местами не менял. На 8 меге внутренняя Р Ц на 8мгц, термометр подключен к хтаl2. Пробывал менять задержки и разные режимы (9-10 бит) стабильно глючит.
mempfis_
Цитата(Andrew_k5 @ Nov 10 2009, 22:23) *
На 16 меге работает, на 8 нет, обработка датчика одинаковая, может датчики разные, местами не менял. На 8 меге внутренняя Р Ц на 8мгц, термометр подключен к хтаl2. Пробывал менять задержки и разные режимы (9-10 бит) стабильно глючит.


А калибровочный байт RC-цепочки калибруете? У меня без калибровки бывало частота работы процессора чуть ли не в 2 раза меньше требуемой была!
Scanner
Andrew_k5
Приведите Ваш код.
Andrew_k5
CODE
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{#asm("sei")
if (needdelay==0) {ICR1H=0xFF;ICR1L=0xC1; //2 ms
delayok=1;
}
if (needdelay==1){switch (resolution){case 0: ICR1H=0xF3;ICR1L=0xCA;break;//zadergka 100 ms
case 1: ICR1H=0xE7;ICR1L=0x95;break;//zadergka 200 ms
case 2: ICR1H=0xCF;ICR1L=0x2B;break;//zadergka 400 ms
case 3: ICR1H=0x9E;ICR1L=0x57;break;//zadergka 800 ms
}
needdelay=0;
}

}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void) // 490 Hz
{
#asm("sei")
...
}

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 125 kHz
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x4F;
//TCNT2=130;//nachalnoe znachenie 125 000/(255-130)= 1000 gz
OCR2=0x00;
TIMSK=0xC5;

OSCCAL=170;


devices=w1_search(0xf0,rom_codes);
delay_ms(200);

if (!ds18b20_init(&rom_codes[0][0],20,30,DS18B20_9BIT_RES))
{init_error=1;}


while (1)
{if ((trmcount>20)&&(Menu==1))
{
TempSens=ds18b20_temperature(&rom_codes[0][0]);

trmcount=0;
}


}

}


И кусочек переделанного ds18b20.lib

Код
float ds18b20_temperature(unsigned char *addr)
{
unsigned char resolution;
delayok=0;
if (ds18b20_read_spd(addr)==0) return -9999;
resolution=(__ds18b20_scratch_pad.conf_register>>5) & 3;
if (ds18b20_select(addr)==0) return -9999;
w1_write(0x44);
//delay_ms(conv_delay[resolution]);
#asm("sei")
needdelay=1;
while(delayok==0){}
if (ds18b20_read_spd(addr)==0) return -9999;
w1_init();
return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & bit_mask[resolution])*0.0625;
}
_Pasha
Прошли сутки, а товарисч так и не понял, что надо ковырять там, где биты отправляются. Либо уже действительно-перекосить OSCCAL на 10% в одну или другую сторону до исчезновения глюка.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.