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

ironmass

Members
  • Постов

    37
  • Зарегистрирован

  • Посещение

Информация

  • Пол
    Мужчина
  • Город
    Алтай

Электроника

  • Стаж в электронике
    Менее года
  • Сфера радиоэлектроники
    МИКРОКОНТРОЛЛЕРЫ AVR

Посетители профиля

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

Достижения ironmass

Новобранец

Новобранец (2/14)

  • 10 постов на форуме
  • 10 лет  на форуме
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

0

Репутация

  1. Точно,все заработало. Спасибо всем за советы. Можно тему закрывать.
  2. Исправил проблему,изменил тип переменной 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); компилятор ругается только на вторую строчку,а если вторую строчку убрать,а первую оставить,то нормально компилируется.
  3. открывал,он общий по работе компилятора,может я не туда жмыкаю пробывал не помогает
  4. попробывал опрашивать датчики не в прерывании,а в основном цикле.Ложных срабатываний стало в раза 4 больше,пробывал по разному,ни как.
  5. так и сделаю, завтра отпишусь что получилось
  6. так у меня так же было прописано,выдавал ошибку Error: function argument #1 of type 'int' is incompatible with required parameter of type 'unsigned char *' Error:(184): invalid expression
  7. Думаете я не переводил,конечно переводил,но перевод мне не о чем не сказал.А вот теперь мне понятно что он хочет.Для этого форум и нужен,чтоб знающие люди подсказали дураку что это. Я понимаю что так не делается,но нечего другого не придумал.Некому подсказать наверное,хотя на своих ошибках очень хорошо учатся.Вы бы видели мой первый код,первой программы,сейчас самому глаз режет.Опыт,дело такое. А вообще,огромное спасибо что помогаете, пинаете, но по теме. На другом форуме только пакости написали в мой адрес и на этом все. Сделал как советовал @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); пишет недопустимое значение
  8. Комментарии на английском это 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 *'
  9. начну по порядку. Код я не у кого не слямзил,сам писал ,как смог,как мне удобнее.За советы по читаемости и правильности кода спасибо ,постараюсь применять.Я не стал описывать полную работу данной программы,потому что все остальное работает без косяков и сбоев уже 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.
  10. ironmass

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

    Всем привет!Помогите разобраться,по условию задано,что если температура датчика 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 }}
  11. пробывал запрещать прерывание на момент вычислений,все равно прыгают.Скорей всего опрос датчиков идет как-то не так,а как исправить не знаю
  12. ironmass

    CodeVisionAVR

    Зайди в папку где установлена программа,в ней найди папку под именем INC зайди в неё и там должны лежать все файлы.Если там нету mega8.h,то напиши мне версию CVAVR и я тебе скину все файлы.
  13. Всем привет!Не стал создавать новую тему.Версия кода что описывалась выше была переписанна и успешно отработало почти год.Теперь решил обновить,сделать версию 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;}}} //установить состояние работы "вкл"
  14. И с чего вы взяли что он больше 8 атм.не выдаст.Я лично на своем компрессоре накачивал 150 литровый ресивер до 11 атм.потом просто лопнул шланг.Я новичек в програмировании,но далеко не новичек в самодельных устройствах,Да и этот форум не про то как лучше использовать компрессор.Я пришел сюда за помощью в написании программы для моего устройства.Если вам интересно как работает мой компрессор,то пишите в личку,расскажу что да как.Я хочу познать программирование и сделать полезное для моего устройста,совместить два дела одновременно.
  15. Всем доброго времени суток!Я новичек,так что сильно не ругайтесь.Собрал компрессор на базе ЗИЛ-130,вот теперь мудрю электронику,век технологий как не как.Алгоритм работы программы такой.При вкл.питания МК опрашивает датчики температуры DS18b20 выводит на семисегментник температуру первого датчика,после этого опрашивает второй датчик и если температура больше 40 гр. то опрашивает датчик давления и если он разрешает запуск то включает нужные порты и ставит флаг что компрессор работает.Дальше продолжает выводить температуру первого датчика на индикатор и опрашивать состояние датчика давления.когда датчик давления сработал,то выключаются нужные порты и ставиться флаг выключения.А если температура второго датчика меньше 40 гр. то вкл. подогреватель.Нашел схему термометра с несколькими датчиками и немного дописал под свои нужды.Температуру показывает,а остальное не делает.Уже всю голову сломал,не пойму что не так.Подскажите если не сложно.
×
×
  • Создать...