Всем доброго времени суток!Я новичек,так что сильно не ругайтесь.Собрал компрессор на базе ЗИЛ-130,вот теперь мудрю электронику,век технологий как не как.Алгоритм работы программы такой.При вкл.питания МК опрашивает датчики температуры DS18b20 выводит на семисегментник температуру первого датчика,после этого опрашивает второй датчик и если температура больше 40 гр. то опрашивает датчик давления и если он разрешает запуск то включает нужные порты и ставит флаг что компрессор работает.Дальше продолжает выводить температуру первого датчика на индикатор и опрашивать состояние датчика давления.когда датчик давления сработал,то выключаются нужные порты и ставиться флаг выключения.А если температура второго датчика меньше 40 гр. то вкл. подогреватель.Нашел схему термометра с несколькими датчиками и немного дописал под свои нужды.Температуру показывает,а остальное не делает.Уже всю голову сломал,не пойму что не так.Подскажите если не сложно.
Спойлер
Код:
#include <tiny2313.h>
#asm
.equ __w1_port=0x12 ;PORTD
.equ __w1_bit=6
#endasm
#include "ds18x20_v2.h"
#include <delay.h>
#include <bcd.h>
#define A 2
#define B 32
#define C 4
#define D 64
#define E 128
#define F 1
#define G 1
static flash unsigned char digits_PA[] = {
(A+F),
(0),
(A),
(A),
(F),
(A+F),
(A+F),
(A),
(A+F),
(A+F),
(A+F),
(F),
(A+F),
(0),
(A+F),
(A+F),
(0),
(A+F),
(0)
};
static flash unsigned char digits_PB[] = {
(B+C+D+E),
(B+C),
(B+D+E+G),
(B+C+D+G),
(B+C+G),
(C+D+G),
(C+D+E+G),
(B+C),
(B+C+D+E+G),
(B+C+D+G),
(B+C+E+G),
(C+D+E+G),
(D+E),
(B+C+D+E+G),
(D+E+G),
(E+G),
(G),
(B+G),
(0)
};
#define MINUS 16
#define GRADUS 17
#define PROBEL 18
#define SYMBOL_F 15
static flash unsigned char cursor[]={0b1110100, 0b1111000, 0b1101100};
unsigned char digit_out[3], cur_dig;
bit zpt_ON;
int temperature;
int temperature1;
bit job=1;
#define MAX_DS18x20 4
unsigned char rom_code[MAX_DS18x20][9];
interrupt [TIM0_OVF] void timer0_ovf_isr(void) {
PORTD|=0b00111100;
PORTA=digits_PA[digit_out[cur_dig]];
PORTB=digits_PB[digit_out[cur_dig]];
if ((zpt_ON == 1) && (cur_dig == 1)) PORTB.4=1;
PORTD&=(cursor[cur_dig]);
cur_dig++; if (cur_dig > 2) cur_dig=0;
}
void view_term(void) {
unsigned char celie, drob, tmp;
unsigned int temp, celie_tmp, drob_tmp;
temp = (unsigned int) temperature;
if (temperature>=0) {
digit_out[0]=PROBEL;
} else {
temp = ( ~temp ) + 0x0001;
digit_out[0]=MINUS;
};
zpt_ON=1;
celie_tmp = temp >> 4;
drob_tmp = temp & 0x000F;
drob = (unsigned char) ((drob_tmp * 10) / 16);
celie = (unsigned char) celie_tmp;
if (celie >= 100) {tmp=bin2bcd(celie-100); digit_out[0] = 1; } else { tmp=bin2bcd(celie); }
if ((celie >= 100) || ((digit_out[0] == MINUS) && (celie >= 10))) {
zpt_ON=0;
digit_out[1] = tmp >> 4;
digit_out[2] = tmp & 0x0F;
}
if ((digit_out[0] == MINUS) && (celie < 10)) {
digit_out[1] = celie;
digit_out[2] = drob;
}
if ((digit_out[0] == PROBEL) && (celie < 100)) {
if (tmp >> 4) digit_out[0] = tmp >> 4;
digit_out[1] = tmp & 0x0F;
digit_out[2] = drob;
}
}
void main(void) {
unsigned char i, ds18x20_devices;
PORTA=0x00;
DDRA=0x03;
PORTB=0x00;
DDRB=0xFF;
PORTD=0b0100000;
DDRD=0b1011111;
TCCR0A=0x00;
TCCR0B=0x03;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
TIMSK=0x02;
w1_init();
ds18x20_devices=w1_search(0xf0,rom_code);
#asm("sei")
digit_out[0]=SYMBOL_F;
digit_out[1]=PROBEL;
digit_out[2]=ds18x20_devices;
if (ds18x20_devices >= 1) {
for (i=0;i<ds18x20_devices;i++) {
if (rom_code[i][0] == DS18B20_FAMILY_CODE){
temperature=ds18b20_temperature(&rom_code[i][0]);
}
}
delay_ms(1000);
} else {
delay_ms(2000);
}
while (1) {
temperature=ds18b20_temperature(&rom_code[1][0]);
view_term();
temperature=ds18b20_temperature(&rom_code[0][0]);
temperature1=temperature;
if (temperature1>=40)
{ if (PIND.5==1)
{ if (job==1)
{
PORTB.3=0;
PORTD.1=1;
delay_ms(500);
PORTB.1=1;
delay_ms(1000);
PORTD.1=0;
job=0;
}
}
if (PIND.5==0)
{ if (job==0)
{ PORTB.1=0;
job=1;
}
}
}
else {
PORTB.3=1;
}
};
}