Перейти к содержанию

непонятки с DS18b20.Help!


ironmass

Рекомендуемые сообщения

Всем привет!Помогите разобраться,по условию задано,что если температура датчика DS18b20 больше 40 то отключить подогреватель и поставить флаг,а если меньше то включить подогрев и поставить флаг.Тестирую В протеусе,когда температура больше 40 то подогреватели время от времени включаются секунд на 5 и выключаются.Что не так,не могу понять,перепробывал всяко уже,понятно что мне не хватает знаний чтоб исправить это,вот и пришлось потревожить вас.

#include <mega8.h>
#include <delay.h>
#include <1wire.h>
#include <ds18b20.h>
#asm
   .equ __w1_port=0x12 ;PORTD  
   .equ __w1_bit=6 
#endasm

#define OFF 1
#define ON 0
#define IN_RPM1 PORTB.0
#define IN_RPM2 PORTB.1
#define MOTOR1 PORTD.0  
#define PUSK1 PORTD.2   
#define MOTOR2 PORTD.1  
#define PUSK2 PORTD.3   
#define CLAPAN1 PORTD.4 
#define CLAPAN2 PORTD.5
#define TOOLS PORTB.7
#define HOT1 PORTB.2
#define HOT2 PORTB.3

#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 0
#define ADC_VREF_TYPE 0x40
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
float result;//переменная хранения данных с датчика давления
unsigned char inpat_index=0;

unsigned char ds18b20_devices;
unsigned char ds18b20_rom_codes[2][9];
volatile int temper,temper1;//переменные для хранения температур
volatile char i=1;//переменная для очередности считывания данных температуры с датчиков

bit ready1;//флаг готовности от подогревателя компрессора 1 
bit ready2;//флаг готовности от подогревателя компрессора 2
bit allowed1=1;//флаг разрешения запуска компрессора 1
bit allowed2=1;//флаг разрешения запуска компрессора 2

// ADC interrupt service routine with auto input scanning
 interrupt [ADC_INT] void adc_isr(void)
{
// Read the AD conversion result
adc_data[inpat_index]=ADCW;
// Select next ADC input
if (++inpat_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
inpat_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+inpat_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
}

// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Опрос датчика температуры каждую 1 сек.
TCNT1H=0x85EE >> 8;
TCNT1L=0x85EE & 0xff;
if(i==1){temper=ds18b20_temperature(&ds18b20_rom_codes[0][0]);//опрос датчика компрессора 1
      if(temper>40){          //если температура подогревателя 1 больше 40 °С      
        HOT1=OFF;              //то выключить подогреватель 1 
         ready1=1;}             //и поставить флаг готовности к запуску компрессора 1 
                               //а если условие не выполнятся по температуре
        else{HOT1=ON;          //то включть подогреватель 1 для догрева компрессора 1 
         ready1=0;}}             //и поставить флаг не готовности к работе компрессора 1

if(i==2){temper1=ds18b20_temperature(&ds18b20_rom_codes[1][0]);i=0;//опрос датчика компрессора 2

      if(temper1>40){         //если температура подогревателя 2 больше 40 °С      
        HOT2=OFF;              //то выключить подогреватель 2 
         ready2=1;}             //и поставить флаг готовности к запуску компрессора 2 
                               //а если условие не выполнятся по температуре
        else{HOT2=ON;          //то включть подогреватель 2 для догрева компрессора 2 
         ready2=0;}}             //и поставить флаг не готовности к работе компрессора 2
i++;
}

void start1(void)//функция процедуры запуска компрессора 2
{
     #asm("cli")        //запрет прерываний для корректного запуска компрессора 1
     CLAPAN1=ON;        //включение клапана сброса давления с компрессора 1
      delay_ms(2000);   //подождем 2 сек. для полного сброса давления
       MOTOR1=ON;       //включим двигатель компрессора 1
        PUSK1=ON;       //включим пусковые конденсаторы двигателя компрессора 1
         delay_ms(2000);//подождем 2 сек. для полного разгона двигателя 1
          PUSK1=OFF;    //отключим пусковые конденсаторы двигателя 1 
           IN_RPM1=ON;  //отправим сигнал включения модулю считывания оборотов двигателя 1    
            CLAPAN1=OFF;//отключим клапан сброса давления компрессора 1
            #asm("sei") //разрешим прерывания
}

void start2(void)//функция процедуры запуска компрессора 2
{
     #asm("cli")        //запрет прерываний для корректного запуска компрессора 2
     CLAPAN2=ON;        //включение клапана сброса давления с компрессора 2
      delay_ms(2000);   //подождем 2 сек. для полного сброса давления
       MOTOR2=ON;       //включим двигатель компрессора 2
        PUSK2=ON;       //включим пусковые конденсаторы двигателя компрессора 2
         delay_ms(2000);//подождем 2 сек. для полного разгона двигателя 2
          PUSK2=OFF;    //отключим пусковые конденсаторы двигателя 2
           IN_RPM2=ON;  //отправим сигнал включения модулю считывания оборотов двигателя 2    
            CLAPAN2=OFF;//отключим клапан сброса давления компрессора 2
            #asm("sei") //разрешим прерывания
}

void stop(void)//функция процедуры остановки обоих компрессоров
{
       #asm("cli")          //запрет прерываний для корректной остановки обоих компрессоров
       IN_RPM1=OFF;         //сигнал отключения модулю считывания оборотов компрессора 1 
        IN_RPM2=OFF;        //сигнал отключения модулю считывания оборотов компрессора 2
         MOTOR1=OFF;        //отключения двигателя компрессора 1
          MOTOR2=OFF;       //отключения двигателя компрессора 2
           CLAPAN1=ON;      //включения клапана сброса давления компрессора 1
            CLAPAN2=ON;     //включения клапана сброса давления компрессора 2
             delay_ms(3000);//подождем 3 сек. для полного сброса давления
              CLAPAN1=OFF;  //отключим клапан сброса давления компрессора 1
               CLAPAN2=OFF; //отключим клапан сброса давления компрессора 2
               #asm("sei")  //разрешим прерывания
}

void main(void)
{

PORTC=0b0000000; DDRC=0b0000000; 
PORTB=0b10110000; DDRB=0b00001111; 
PORTD=0b11111111; DDRD=0b00111111;

// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
ADCSRA=0xCE;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 31,250 kHz
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 1 s
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off

TCCR1B=(1<<CS12);
TCNT1H=0x85;
TCNT1L=0xEE;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(1<<TOIE1);

ds18b20_devices=w1_search(0xf0,ds18b20_rom_codes);//ищим датчики и считываем rom-коды датчиков
ds18b20_init(0,0,100,DS18B20_9BIT_RES); 
//ds18b20_init(1,0,100,DS18B20_9BIT_RES); 

// т.к. при первом чтении датчиков считывается мусор 
// первое чтение датчиков делаем в холостую

         temper=ds18b20_temperature(&ds18b20_rom_codes[0][0]);//опрос датчика температуры подогревателя 1
         delay_ms(500);//ждем 500 мс для получения температуры подогревателя 1
         temper1=ds18b20_temperature(&ds18b20_rom_codes[1][0]);//опрос датчика температуры подогревателя 2
         delay_ms(500);//ждем 500 мс для получения температуры подогревателя 2

#asm("sei")

while (1){
      result=((5.00*adc_data[0])/1024.00);//переводим и записываем в переменную данные с датчика давления
       
       if(TOOLS==1){           //если включен режим инструмента
        if(result>3){          //и если давления в рессивере меньше 4.0 bar
         if(ready1==1){        //и если есть готовность от подогревателя 1 
          if(allowed1==1){     //и если установлен флаг разрешения к запуску компрессора 1
           start1();           //то выполнить функцию запуска компрессора 1
            allowed1=0;}}      //и после запуска установить флаг запрета запуска компрессора 1
                               //после этого 
         if(ready2==1){        //если есть готовность от подогревателя 2
          if(allowed2==1){     //и если установлен флаг разрешения к запуску компрессора 2
           start2();           //то выполнить функцию запуска компрессора 2
            allowed2=0;}}}     //и после запуска установить флаг запрета запуска компрессора 2
           
        if(result<=1.82){      //когда давление в рессивере достигнет 8.0 bar 
         if(ready1||ready2==1){//доп.условие для ложных срабатываний
          if(allowed1==0){     //и если установлен флаг разрешения к остановки компрессоров
           stop();             //выполнить функцию остановки обоих компрессоров
            allowed1=1;        //после остановки установить флаг разрешения к запуску компроессора 1
             allowed2=1;}}}    // и флаг разрешения к запуску компроессора 2
             
        if(result>=2.20){      //после остановки компрессоров если давление в рессивере упало до 7.0 bar
         if(ready1==1){        //доп.условие для ложных срабатываний
          if(allowed1==1){     //и если установлен флаг разрешения к запуску компрессора 1
           start1();           //то выполнить функцию запуска компрессора 1
            allowed1=0;}}}     //и после запуска установить флаг запрета запуска компрессора 1

        if(result>=2.30){      //а если после запуска компрессора 1 давление все равно падает до 6.5 bar
         if(ready2==1){        //доп.условие для ложных срабатываний
          if(allowed2==1){     //и если установлен флаг разрешения к запуску компрессора 2
           start2();           //то выполнить функцию запуска компрессора 2
            allowed2=0;}}}}    //и после запуска установить флаг запрета запуска компрессора 2
       
       if(TOOLS==0){           //если включен режим подкачки
        if(result>4){          //и если давления в рессивере меньше 1.5 bar
        if(ready1==1){         //и если есть готовность от подогревателя 1
         if(allowed1==1){      //и если установлен флаг разрешения к запуску компрессора 1
          start1();            //то выполнить функцию запуска компрессора 1
           allowed1=0;}}}      //и после запуска установить флаг запрета запуска компрессора 1
        
        if(result<=2.8){      //когда давление в рессивере достигнет 5.0 bar 
        if(ready1||ready2==1){//доп.условие для ложных срабатываний
         if(allowed1==0){     //и если установлен флаг разрешения к запуску компрессора 1
          stop();             //выполнить функцию остановки обоих компрессоров
           allowed1=1;        //после остановки установить флаг разрешения к запуску компроессора 1 
           allowed2=1;}}}     //и компрессора 2

        if(result>3.5){       //после остановки компрессоров если давление в рессивере упало до 3.0 bar
        if(ready1==1){        //доп.условие для ложных срабатываний
         if(allowed1==1){     //и если установлен флаг разрешения к запуску компрессора 1
          start1();           //то выполнить функцию запуска компрессора 1
           allowed1=0;}}}}    //и после запуска установить флаг запрета запуска компрессора 1

}}


 

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

4 часа назад, ironmass сказал:

понятно что мне не хватает знаний чтоб исправить это

Т.е Вы написали вот "это" всё и не можете в "нём" разобраться ? Судя по коду, там не только включение/отключение по температуре.

PS: В протеусе можно гонять код пошагово. Погоняйте и скорее всего найдёте проблему.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

20 часов назад, ironmass сказал:

Помогите разобраться,по условию задано,что если температура

Ужас какой!

Вот вроде и написано все красиво: лесенкой, а читать страшно!

При таком количестве ИФов, даже страшно представить сколько надо веток этого кода прошагать, что бы понять что не так! То есть практически это не возможно, или это выльется в бесконечное добавление заплаток!

У вас формулировка задачи:

Цитата

если температура датчика DS18b20 больше 40 то отключить подогреватель и поставить флаг,а если меньше то включить подогрев и поставить флаг

убирается в одну строчку, а кода на 15-ть таких задач! (Почему только goto все боятся, IF гораздо страшнее!!!).

Вывод: вы обрабатываете не существующие(придуманные) условия!

Переписывайте в более компактную форму ваш алгоритм!

Изменено пользователем ruhi
уточнение

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Переменная i бесконечно увеличивается. А вообще я глаза сломал об код.

И вообще понадергают кусков кода без разбору и понимания, а потом на форумах плачут.

Изменено пользователем Vic_po
Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Я, наверное, покажусь занудным, но с моей точки зрения код написан крайне неудачно с точки зрения оформления и выбора имен переменных.

Например:

if(result<=1.82){      //когда давление в рессивере достигнет 8.0 bar 
         if(ready1||ready2==1){//доп.условие для ложных срабатываний
          if(allowed1==0){     //и если установлен флаг разрешения к остановки компрессоров
           stop();             //выполнить функцию остановки обоих компрессоров
            allowed1=1;        //после остановки установить флаг разрешения к запуску компроессора 1
             allowed2=1;}}}    // и флаг разрешения к запуску компроессора 2

Я понимаю, что куча скобочек в последней строке продиктована сократить количество строк кода, чтобы был легче в нем ориентироваться... Но читать это сложно.

Далее, мы видим комментарий "когда давление в рессивере достигнет 8.0 bar ", но в самом коде нет ни малейшего намека на то, что происходит! Какой-то странный result... Что за результат? Почему не pressure - давление? Что за константа 1,82, если в комментарии написано 8 БАР? Почему бы при помощи #define не определть константу типа PRESSURE_8_BAR, и сравнивать затем с нею? Ведь при правильном выборе имен переменных, констант и функций необходимость в комментариях МИНИМАЛЬНА, и, следовательно, можно не тулить кучу скобочек в одну строку для экономии строк...

Например, как бы этот кусок написал я (1 в 1, как у автора по сути): 

#define PRESSURE_8_00_BAR	1.82
if(pressure <= PRESSURE_8_00_BAR){ 
	if(ready1||ready2==1){ // вот тут с именами флагов я не понял
		if(compressor1_enabled == 0){
			stop_both_compressor();
			compressor1_enabled = 1;
			compressor2_enabled = 1;
        }
    }
}

Само собой, что следует подумать, нужно ли такое количество условий, следующих подряд группами? Может быть, стоит разделить по "состояниям" ? Например, мне показалось, что просто напрашивается один if по режиму "инструмента" - это сразу сократит число вложенных if-ов в некотоых местах в 2 раза. Так же можно охватить бОльшую часть кода if-ом по состоянию компрессоров (включены или нет), и сразу упростится остальной анализ...

А вообще, я бы весь этот код рассовал по функциям управления компрессорами и остальным оборудованием...

 

P.S. Оригинально как-то движок форума код форматирует: в редакторе отступы  красиво, в сообщении уже лажа...

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

@ARV Позанудствую.

Во-первых ==1 или ==0 в условиях не нужно, это же флаги(только почему-то битовые вместо логических).

Во-вторых закрывающая скобка должна быть на уровне своего "открывающего" оператора, образуя "блок" кода.

10 минут назад, ARV сказал:

А вообще, я бы весь этот код рассовал по функциям управления компрессорами и остальным оборудованием...

Сюда конечный автомат просится, стучит прям в дверь.

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Только что, Vic_po сказал:

==1 или ==0 в условиях не нужно

Я сам так и поступаю, но здесь для топикстартера оставил :)

Только что, Vic_po сказал:

закрывающая скобка должна быть на уровне своего "открывающего" оператора

Это не я, это движок: в редаторе табуляциями я отступы выставил правильно, о чем даже сделал постскриптум :)

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

начну по порядку.

Код я не у кого не слямзил,сам писал ,как смог,как мне удобнее.За советы по читаемости и правильности кода спасибо ,постараюсь применять.Я не стал описывать полную работу данной программы,потому что все остальное работает без косяков и сбоев уже 7 месяцев.Но в зиму,когда долго стоят компрессоры,масло густеет и движки не могут крутнуть.Вот и стал дописывать программу с подогревателями.Вы пишите,что в этом коде разбираться и разбираться,хорошо,я убрал работу компрессоров,оставил только работу АЦП и считывание температуры.

#include <mega8.h>
#include <delay.h>
#include <1wire.h>
#include <ds18b20.h>
#asm
   .equ __w1_port=0x12 ;PORTD  
   .equ __w1_bit=6 
#endasm

#define OFF 1
#define ON 0
#define HOT1 PORTB.2
#define HOT2 PORTB.3

#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 0
#define ADC_VREF_TYPE 0x40
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
float result;//переменная хранения данных с датчика давления
unsigned char inpat_index=0;

unsigned char ds18b20_devices;
unsigned char ds18b20_rom_codes[2][9];
volatile int temper,temper1;//переменные для хранения температур
volatile char i=1;//переменная для очередности считывания данных температуры с датчиков

bit ready1;//флаг готовности от подогревателя компрессора 1 
bit ready2;//флаг готовности от подогревателя компрессора 2


// ADC interrupt service routine with auto input scanning
 interrupt [ADC_INT] void adc_isr(void)
{
// Read the AD conversion result
adc_data[inpat_index]=ADCW;
// Select next ADC input
if (++inpat_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
inpat_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+inpat_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
}

// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Опрос датчика температуры каждую 1 сек.
TCNT1H=0x85EE >> 8;
TCNT1L=0x85EE & 0xff;
if(i==1){temper=ds18b20_temperature(&ds18b20_rom_codes[0][0]);//опрос датчика компрессора 1
 if(temper>40){          //если температура подогревателя 1 больше 40 °С      
        HOT1=OFF;              //то выключить подогреватель 1 
        ready1=1;             //и поставить флаг готовности к запуску компрессора 1 
  }                             //а если условие не выполнятся по температуре
        else{HOT1=ON;          //то включть подогреватель 1 для догрева компрессора 1 
         ready1=0;             //и поставить флаг не готовности к работе компрессора 1
        }
 }
  if(i==2){temper1=ds18b20_temperature(&ds18b20_rom_codes[1][0]);//опрос датчика компрессора 2
    i=0;
       if(temper1>40){         //если температура подогревателя 2 больше 40 °С      
           HOT2=OFF;              //то выключить подогреватель 2 
             ready2=1;             //и поставить флаг готовности к запуску компрессора 2 
        }                       //а если условие не выполнятся по температуре
            else{HOT2=ON;          //то включть подогреватель 2 для догрева компрессора 2 
               ready2=0;             //и поставить флаг не готовности к работе компрессора 2
            }
  }
 
  i++;
}

void main(void)
{

PORTC=0b0000000; DDRC=0b0000000; 
PORTB=0b10110000; DDRB=0b00001111; 
PORTD=0b11111111; DDRD=0b00111111;


// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
ADCSRA=0xCE;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 31,250 kHz
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 1 s
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off

TCCR1B=(1<<CS12);
TCNT1H=0x85;
TCNT1L=0xEE;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(1<<TOIE1);

ds18b20_devices=w1_search(0xf0,ds18b20_rom_codes);//ищим датчики и считываем rom-коды датчиков
ds18b20_init(0,0,100,DS18B20_9BIT_RES); 
//ds18b20_init(1,0,100,DS18B20_9BIT_RES); 

// т.к. при первом чтении датчиков считывается мусор 
// первое чтение датчиков делаем в холостую

         temper=ds18b20_temperature(&ds18b20_rom_codes[0][0]);//опрос датчика температуры подогревателя 1
          delay_ms(500);//ждем 500 мс для получения температуры подогревателя 1
           temper1=ds18b20_temperature(&ds18b20_rom_codes[1][0]);//опрос датчика температуры подогревателя 2
            delay_ms(500);//ждем 500 мс для получения температуры подогревателя 2

#asm("sei")

while (1){
      result=((5.00*adc_data[0])/1024.00);//переводим и записываем в переменную данные с датчика давления
}
}

и все равно каждые 5-6 сек. подогреватель включается,т.е. в переменную temper1 почему-то записывается число меньшее чем 40,а через 2-3 сек. записывается действительное число которое больше 40 и подогреватель выкл.Это происходит что с temper1 что с temper2.

Ссылка на комментарий
Поделиться на другие сайты

55 минут назад, ironmass сказал:

Код я не у кого не слямзил

Тот факт, что половина комментариев на английском, а половина на русском, говорит об обратном. И вообще я тут вижу не меньше 3 стилей разных программистов.

Про переменную i я тебе уже написал, это раз. У тебя случайно не ресетится по ватчдогу? Это два. Цикл начинает работать до того как пройдет 2 секунды. Соответственно данные у нас еще не считались, а цикл уже молотит. Т.к. переменные изначально содержат неадекватные данные, получается неадекватная работа.

 

Изменено пользователем Vic_po
Ссылка на комментарий
Поделиться на другие сайты

2 hours ago, ironmass said:

ds18b20_init(0,0,100,DS18B20_9BIT_RES);

ds18b20_init(&ds18b20_rom_codes[0][0],0,100,DS18B20_9BIT_RES);

У вас датчик в 12 битном режиме работает.

Желательно сделать гистерезис типа так

 if(temper>40){          //если температура подогревателя 1 больше 40 °С      
    HOT1=OFF;              //то выключить подогреватель 1 
    ready1=1;             //и поставить флаг готовности к запуску компрессора 1 
  }                             //а если условие не выполнятся по температуре
  else{
    if (temper<35){
	  HOT1=ON;          //то включть подогреватель 1 для догрева компрессора 1 
      ready1=0;         //и поставить флаг не готовности к работе компрессора 1
    }
  }
 }

 

Ссылка на комментарий
Поделиться на другие сайты

9 часов назад, Vic_po сказал:

Тот факт, что половина комментариев на английском, а половина на русском, говорит об обратном. И вообще я тут вижу не меньше 3 стилей разных программистов.

Комментарии на английском это codevision сгенерировал начальный код.Переменная i после опроса второго датчика,обнуляется.Попробую сделать как советует @snn_krs .Но почему-то после того как я прописываю режим датчиков

ds18b20_init(0,0,100,DS18B20_9BIT_RES); 
ds18b20_init(1,0,100,DS18B20_9BIT_RES);

то компилятор ругается на эту строчку ds18b20_init(1,0,100,DS18B20_9BIT_RES);

Error: function argument #1 of type 'int' is incompatible with required parameter of type 'unsigned char *'

 

Изменено пользователем ironmass
Ссылка на комментарий
Поделиться на другие сайты

5 hours ago, ironmass said:

Error: function argument #1 of type 'int' is incompatible with required parameter of type 'unsigned char *'

Это переводится приблизительно так: Аргумент № 1 типа "Целое" не совместим с ожидаемым типом "Указатель на строку"

ds18b20_init(&ds18b20_rom_codes[0][0],0,100,DS18B20_9BIT_RES); 
ds18b20_init(&ds18b20_rom_codes[1][0],0,100,DS18B20_9BIT_RES); 

Функция одна поэтому в ней надо указывать какой датчик инициировать

Ссылка на комментарий
Поделиться на другие сайты

Блин, обычный переводчик переводит так, что всё становится понятно :

Скрытый текст

2018-02-27_10-33-22.png.5c69ed95be99a9002fdc2d77d6139afc.png

Неужели лень копирнуть одну строку и посмотреть, что означает ошибка ? :wacko:

Ссылка на комментарий
Поделиться на другие сайты

8 часов назад, ironmass сказал:

Переменная i после опроса второго датчика,обнуляется.

Точно. И ведь хрен заметишь. И получается что она сразу же инкрементируется. Вообще так не делается.

Короче, предполагаю, что тут у тебя все таки собачка сбрасывает. Вообще обработчик прерывания слишком тяжеловесный. Тем более, что ds18b20_temperature внутри обработчика прерываний вообще не факт, что можно делать. Перепиши все без прерываний, не мучайся.

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, Alex сказал:

Неужели лень копирнуть одну строку и посмотреть, что означает ошибка ? :wacko:

Думаете я не переводил,конечно переводил,но перевод мне не о чем не сказал.А вот теперь

 

3 часа назад, snn_krs сказал:

ds18b20_init(&ds18b20_rom_codes[0][0],0,100,DS18B20_9BIT_RES);  

ds18b20_init(&ds18b20_rom_codes[1][0],0,100,DS18B20_9BIT_RES);

мне понятно что он хочет.Для этого форум и нужен,чтоб знающие люди подсказали дураку что это.

16 минут назад, Vic_po сказал:

Точно. И ведь хрен заметишь. И получается что она сразу же инкрементируется. Вообще так не делается.

Я понимаю что так не делается,но нечего другого не придумал.Некому подсказать наверное,хотя на своих ошибках очень хорошо учатся.Вы бы видели мой первый код,первой программы,сейчас самому глаз режет.Опыт,дело такое.

А вообще,огромное спасибо что помогаете, пинаете, но по теме. На другом форуме только пакости написали в мой адрес и на этом все. 

Сделал как советовал @snn_krs ,теперь ругается на эти две сторочки

ds18b20_init(&ds18b20_rom_codes[0][0],0,100,DS18B20_9BIT_RES);  

ds18b20_init(&ds18b20_rom_codes[1][0],0,100,DS18B20_9BIT_RES);

пишет недопустимое значение

Ссылка на комментарий
Поделиться на другие сайты

9 минут назад, ironmass сказал:

но перевод мне не о чем не сказал

Ну как же так ? Он же прямо говорит - не тот тип.

Вообще, на сколько мне известно, у CV есть хелп. Вы пробовали его открывать ?

Ссылка на комментарий
Поделиться на другие сайты

codevisionavr ds18b20_init Просто море информации и примеров.
Народ, ну нельзя же быть настолько ленивыми :(

http://sxem.org/2-vse-stati/codevisionavr/71-codevisionavr?start=3

Цитата

Функция инициализации

ds18b20_init( адрес датчика, нижний порог Т, верхний порог Т, разрешающая способность );

20 секунд понадобилось, чтобы найти нужную информацию. Но нет, мы будем темы раздувать, с бессмысленным обсуждением непонятно чего и ждать пока "в рот положат".

Ссылка на комментарий
Поделиться на другие сайты

27 минут назад, Alex сказал:

Функция инициализации

ds18b20_init( адрес датчика, нижний порог Т, верхний порог Т, разрешающая способность );

так у меня так же было прописано,выдавал ошибку Error: function argument #1 of type 'int' is incompatible with required parameter of type 'unsigned char *'

31 минуту назад, snn_krs сказал:

А как это выглядит на языке компилятора ?

Error:(184): invalid expression

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, ironmass сказал:

А вообще,огромное спасибо что помогаете, пинаете, но по теме

Не вижу в коде w1_init();      Может опять в глаза долблюсь. Но вообще предлагаю все стереть и написать заново без использования прерываний.

Ссылка на комментарий
Поделиться на другие сайты

11 минуту назад, ironmass сказал:

так у меня так же было прописано,выдавал ошибку Error: function argument #1 of type 'int' is incompatible with required parameter of type 'unsigned char *'

Error:(184): invalid expression

Откройте хелп на свою версию компилятора, не мучайтесь с методом тыка. Он никогда нормально не работал.

Ссылка на комментарий
Поделиться на другие сайты

12 минуты назад, Vic_po сказал:

Не вижу в коде w1_init();      Может опять в глаза долблюсь. Но вообще предлагаю все стереть и написать заново без использования прерываний.

так и сделаю, завтра отпишусь что получилось

Ссылка на комментарий
Поделиться на другие сайты

попробывал опрашивать датчики не в прерывании,а в основном цикле.Ложных срабатываний стало в раза 4 больше,пробывал по разному,ни как.

Ссылка на комментарий
Поделиться на другие сайты

Попробуй запретить прерывания на время опроса датчика

#asm("cli")
temper=ds18b20_temperature(&ds18b20_rom_codes[0][0]);
#asm("sei")

Я сейчас тоже с DS18B20 вожусь. Есль прерывания разрешены он часто возвращает -9999. Я запретил прерывания в библиотеке. Сейчас ошибок таких нет

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...