-
Постов
37 -
Зарегистрирован
-
Посещение
Информация
-
Пол
Мужчина
-
Город
Алтай
Электроника
-
Стаж в электронике
Менее года
-
Сфера радиоэлектроники
МИКРОКОНТРОЛЛЕРЫ AVR
Посетители профиля
Блок последних пользователей отключён и не показывается другим пользователям.
Достижения ironmass
-
Точно,все заработало. Спасибо всем за советы. Можно тему закрывать.
-
Исправил проблему,изменил тип переменной temper на char,было int.И все заработало без ложных срабатываний. Осталась одна непонятка,почему при установки функции инициализации ds18b20 ds18b20_init(&ds18b20_rom_codes[0][0],0,100,DS18B20_9BIT_RES); ds18b20_init(&ds18b20_rom_codes[1][0],0,100,DS18B20_9BIT_RES); ИЛИ ТАК ds18b20_init(0,0,100,DS18B20_9BIT_RES); ds18b20_init(1,0,100,DS18B20_9BIT_RES); компилятор ругается только на вторую строчку,а если вторую строчку убрать,а первую оставить,то нормально компилируется.
-
открывал,он общий по работе компилятора,может я не туда жмыкаю пробывал не помогает
-
попробывал опрашивать датчики не в прерывании,а в основном цикле.Ложных срабатываний стало в раза 4 больше,пробывал по разному,ни как.
-
так и сделаю, завтра отпишусь что получилось
-
так у меня так же было прописано,выдавал ошибку Error: function argument #1 of type 'int' is incompatible with required parameter of type 'unsigned char *' Error:(184): invalid expression
-
Думаете я не переводил,конечно переводил,но перевод мне не о чем не сказал.А вот теперь мне понятно что он хочет.Для этого форум и нужен,чтоб знающие люди подсказали дураку что это. Я понимаю что так не делается,но нечего другого не придумал.Некому подсказать наверное,хотя на своих ошибках очень хорошо учатся.Вы бы видели мой первый код,первой программы,сейчас самому глаз режет.Опыт,дело такое. А вообще,огромное спасибо что помогаете, пинаете, но по теме. На другом форуме только пакости написали в мой адрес и на этом все. Сделал как советовал @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); пишет недопустимое значение
-
Комментарии на английском это 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 *'
-
начну по порядку. Код я не у кого не слямзил,сам писал ,как смог,как мне удобнее.За советы по читаемости и правильности кода спасибо ,постараюсь применять.Я не стал описывать полную работу данной программы,потому что все остальное работает без косяков и сбоев уже 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.
-
Всем привет!Помогите разобраться,по условию задано,что если температура датчика 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 }}
-
пробывал запрещать прерывание на момент вычислений,все равно прыгают.Скорей всего опрос датчиков идет как-то не так,а как исправить не знаю
-
Зайди в папку где установлена программа,в ней найди папку под именем INC зайди в неё и там должны лежать все файлы.Если там нету mega8.h,то напиши мне версию CVAVR и я тебе скину все файлы.
-
Всем привет!Не стал создавать новую тему.Версия кода что описывалась выше была переписанна и успешно отработало почти год.Теперь решил обновить,сделать версию 2.0.И опять проблема. Написал программу управляющая компрессором,которая следит за работой,измеряет температуру,выводит её на 4-х led индикатор.Все хорошо,но часто происходит что на индикаторе перепрыгивают символы(цифры).Например показывает температуру двух датчиков 21 и 54,потом почему-то прыгнет на 41 и 54,или 21 и 14.,а если программно отключить два символа(т.е. вывод только одной температуры)то нечего не прыгает.Все голову уже сломал,из-за чего,перепробывал многое менять,Прошу помогите.И да,сильно не материтесь на код программы,я только недавно начал писать на СИ. /***************************************************** Version :2.00 Date : 12.02.2017 Chip type : mega8 AVR Core Clock frequency: 8,000000 MHz Memory model : mega External RAM size : 0 Data Stack size : 32 *****************************************************/ #include <mega8.h> #include <delay.h> #asm .equ __w1_port=0x15 ;PORTC .equ __w1_bit=5 #endasm #include <1wire.h> #include <ds18b20.h> unsigned char ds18b20_devices;//переменная в которой хранится количество присоеденённых датчиков unsigned char ds18b20_rom_codes[3][9], i=1; volatile unsigned char temper,temper1,temper3,number,number1,number2,number3,number4;//переменные для хранения температур bit job=1,err=0; //переменные состояния работы //Timer 1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void){ PORTB.0=0; PORTD.5=0; PORTD.7=0; PORTD.6=0;// потушить все биты всех знакомест if(i==1){number=number1;PORTB.0=1;} //засветить первый бит if(i==2){number=number2;PORTD.5=1;} //засветить второй бит if(i==3){number=number3;PORTD.7=1;} //засветить третий бит if(i==4){number=number4;PORTD.6=1;i=0;}//засветить четвертый бит switch(number){//символ на иникатор case 0:{PORTD.2=0;PORTD.3=0;PORTB.7=0;PORTB.6=0;PORTD.4=0;PORTD.1=0;PORTD.0=1; break;}//0 case 1:{PORTD.2=1;PORTD.3=0;PORTB.7=0;PORTB.6=1;PORTD.4=1;PORTD.1=1;PORTD.0=1; break;}//1 case 2:{PORTD.2=0;PORTD.3=0;PORTB.7=1;PORTB.6=0;PORTD.4=0;PORTD.1=1;PORTD.0=0; break;}//2 case 3:{PORTD.2=0;PORTD.3=0;PORTB.7=0;PORTB.6=0;PORTD.4=1;PORTD.1=1;PORTD.0=0; break;}//3 case 4:{PORTD.2=1;PORTD.3=0;PORTB.7=0;PORTB.6=1;PORTD.4=1;PORTD.1=0;PORTD.0=0; break;}//4 case 5:{PORTD.2=0;PORTD.3=1;PORTB.7=0;PORTB.6=0;PORTD.4=1;PORTD.1=0;PORTD.0=0; break;}//5 case 6:{PORTD.2=0;PORTD.3=1;PORTB.7=0;PORTB.6=0;PORTD.4=0;PORTD.1=0;PORTD.0=0; break;}//6 case 7:{PORTD.2=0;PORTD.3=0;PORTB.7=0;PORTB.6=1;PORTD.4=1;PORTD.1=1;PORTD.0=1; break;}//7 case 8:{PORTD.2=0;PORTD.3=0;PORTB.7=0;PORTB.6=0;PORTD.4=0;PORTD.1=0;PORTD.0=0; break;}//8 case 9:{PORTD.2=0;PORTD.3=0;PORTB.7=0;PORTB.6=0;PORTD.4=1;PORTD.1=0;PORTD.0=0; break;}//9 case 10:{PORTD.2=1;PORTD.1=1;PORTD.3=0;PORTB.7=0;PORTB.6=0;PORTD.4=0;PORTD.0=0; break;}}//d i++;} void view_term_mot(void) { number3=temper3/10; //вычислить десятки number4=temper3%10; //вычислить единицы } void view_term_hot(void) { number1=temper1/10; //вычислить десятки number2=temper1%10; //вычислить единицы } void view_term(void) { number1=temper/10; //вычислить десятки number2=temper%10; //вычислить единицы } void main(void) { PORTC=0x00;DDRC=0x3F;PORTB=0x02;DDRB=0xFD;PORTD=0x00;DDRD=0xFF; // Clock value: 1000,000 kHz //Mode: CTC top=OCR1A TCCR1A=0x00; TCCR1B=0x0A;//настройка таймера 1 OCR1AH=0x06; OCR1AL=0x76; TIMSK=0x10;//запуск таймера 1 в режиме СТС top=OCR1A ds18b20_devices=w1_search(0xf0,ds18b20_rom_codes);//ищим датчики и считываем rom-коды датчиков #asm("sei")//разрешить глобальные прерывание // высветить на индикаторе кол-во найденых датчиков number1=10; //символ d number2=ds18b20_devices;//кол-во датчиков number3=10; //символ d number4=ds18b20_devices;//кол-во датчиков // т.к. при первом чтении датчиков считывается мусор // первое чтение датчиков делаем в холостую if (ds18b20_devices >= 1) { temper=ds18b20_temperature(&ds18b20_rom_codes[0][0]);//опрос верхнего датчика delay_ms(500);//ждем 500 мс для получения температуры верхнего датчика temper1=ds18b20_temperature(&ds18b20_rom_codes[1][0]);//опрос нижнего датчика delay_ms(500);//ждем 500 мс для получения температуры нижнего датчика temper3=ds18b20_temperature(&ds18b20_rom_codes[2][0]);//опрос датчика двтгателя delay_ms(500);}//ждем 500 мс для получения температуры датчика двигателя while (ds18b20_devices>0){ //если датчиков больше 1 то бесконечный цикл temper3=ds18b20_temperature(&ds18b20_rom_codes[2][0]);//опрос датчика двигателя view_term_mot(); if(err==0){ //если разрешенно включение подогревателя то if (temper1<=20){ //если температура нижнего датчика меньше 20 temper1=ds18b20_temperature(&ds18b20_rom_codes[1][0]);//опрос нижнего датчика delay_ms(200); //ждем 500 мс для получения температуры нижнего датчика view_term_hot();//выводим температуру PORTC.4=1; //Включение подогревателя PORTC.2=0; //Остановка двигателя на всякий случай PORTC.3=0;}} //Отключение помпы на всякий случай if (temper1>=20){ //если температура нижнего датчика больше или равно 20 temper=ds18b20_temperature(&ds18b20_rom_codes[0][0]);//опрос верхнего датчика delay_ms(200);//ждем 500 мс для получения температуры верхнего датчика view_term(); //выводим температуру верхнего датчика на индикатор if (PINB.1==0){ //если датчик давления выключен if (job==1){ //если состояние работы "вкл" PORTC.4=0; //Выключение подогревателя PORTC.3=1; //Включение помпы PORTC.0=1; //Включение клапана сброса давления delay_ms(3000); //подождем 3 сек для сброса давления в магистрале PORTC.2=1; //Запуск двигателя delay_ms(3000); //подождем 3 сек для полного запуска двигателя PORTC.0=0; //Отключение клапана сброса давления PORTC.1=1; //Сигнал на включение второму компрессору err=1; //запрет на включение подогревателя job=0;}}} //установить состояние работы "выкл" if (PINB.1==1){ //если датчик давления включен if (job==0){ //если состояние работы "выкл" PORTC.2=0; //Остановка двигателя PORTC.1=0; //Сигнал на отключение второму компрессору PORTC.0=1; //Включение клапана сброса давления delay_ms(3000); //подождем 3 сек для сброса давления в магистрале PORTC.0=0; //Отключение клапана сброса давления job=1;} //установить состояние работы "вкл" if (temper<=30){ //если температура верхнего датчика меньше или равно 30 PORTC.3=0;}} //Отключение помпы if (temper3>=60){ //если температура двигателя больше или равно 60 PORTC.2=0;} //Остановка двигателя if (temper3<=45){ //если температура двигателя упала до 45 job=1;}}} //установить состояние работы "вкл"
-
И с чего вы взяли что он больше 8 атм.не выдаст.Я лично на своем компрессоре накачивал 150 литровый ресивер до 11 атм.потом просто лопнул шланг.Я новичек в програмировании,но далеко не новичек в самодельных устройствах,Да и этот форум не про то как лучше использовать компрессор.Я пришел сюда за помощью в написании программы для моего устройства.Если вам интересно как работает мой компрессор,то пишите в личку,расскажу что да как.Я хочу познать программирование и сделать полезное для моего устройста,совместить два дела одновременно.
-
Всем доброго времени суток!Я новичек,так что сильно не ругайтесь.Собрал компрессор на базе ЗИЛ-130,вот теперь мудрю электронику,век технологий как не как.Алгоритм работы программы такой.При вкл.питания МК опрашивает датчики температуры DS18b20 выводит на семисегментник температуру первого датчика,после этого опрашивает второй датчик и если температура больше 40 гр. то опрашивает датчик давления и если он разрешает запуск то включает нужные порты и ставит флаг что компрессор работает.Дальше продолжает выводить температуру первого датчика на индикатор и опрашивать состояние датчика давления.когда датчик давления сработал,то выключаются нужные порты и ставиться флаг выключения.А если температура второго датчика меньше 40 гр. то вкл. подогреватель.Нашел схему термометра с несколькими датчиками и немного дописал под свои нужды.Температуру показывает,а остальное не делает.Уже всю голову сломал,не пойму что не так.Подскажите если не сложно.