Re: Регулятор 12V вентилятора на ATtiny13
Posted: 30 Nov 2016 21:07
Вообще это задумано для откр. и закр. форточек в парнике.А логика такая- +14С откр. одна форточка при+16С-другая и при+10С-закр. обе.Спасибо за ответ.
Сделал такую логику.alex-spb wrote:Вообще это задумано для откр. и закр. форточек в парнике.А логика такая- +14С откр. одна форточка при+16С-другая и при+10С-закр. обе.Спасибо за ответ.
С одинарнымalex-spb wrote:В архиве вы сделали с одинарным импульсом или повторяющимся?
Можноalex-spb wrote: Если будут появляться вопросы можно будет к вам обратиться ?
Вот собрался наконец-то. Проект и Протеус.Sergey_202 wrote: управление ШИМом по внешней команде, индикация перегрева и неисправности датчика температуры.
Я просто решил упростить схему. Поставить вместо транзисторов N-мосфет чтобы не грелось.Sergey_202 wrote:Спасибо, но это значительно отличается от моей схемы
и надо дополнить алгоритм Hardlocka (нужна та его часть где есть цикл измерения напряжения 5в для обеспечения минимальных оборотов вентилятора, в моем случае возможно изменение питающего напряжения вентилятора).
Да осталась ссылка в настройках U1. Подправил. Но у меня при включении ШИМ Протеус сразу начинает тормозитьSergey_202 wrote: У меня в Протеусе ошибка Could not open MODDATA initializer file '..\dimmer.bin' [U1].
Code: Select all
#include <tiny13.h>
#include <delay.h>
// 1 Wire Bus functions
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=3
#endasm
#include <1wire.h>
#include <ds18b20.h>
#define ADC_VREF_TYPE 0x00
/* MIN_TEMP - нижняя граница температуры (вкл. вентилятора), гр.C
MAX_TEMP - граница выхода на макс. обороты вентилятора, гр.C
DT - разница между MAX_TEMP и MIN_TEMP, что бы не считать в программе
U5V - устанавливает нижнее значение напряжения, т.е. напряжение
на вентиляторе до которого оно падает (в версии с невыключаемым
вентилятором) при падении температуры ниже MIN_TEMP. Подбором
этого значения надо обеспечить устойчивую работу вентилятора
и не допустить его выключения. Т.е. при уменьшени этой констатнты
так же уменьшатся обороты вентилятора, что полезно с точки зрения
снижения уровня шума в нижнем температурном диапазоне регулировок.
Исходная константа далее
0x01FF - 7.6в.
0x01AD - 6.4в,
0x016D - 5.8в,
0x014D - 5в,
0x00ED - 3.5в,
0x00BD - 3.3в.
При уменьшении ниже значения 0x00BD теряется стабильность работы.
Т.е. на этапе отладки эту константу можно будет подобрать под конкретную
модификацию вентилятора. Каждый вентилятор имеет свою нижнюю границу
напряжения, при которой он ещё вращается. Температурный режим выходного
транзистора можно таким образом значительно улучшить (?).
*/
#define MIN_TEMP 25
#define MAX_TEMP 55
#define DT 30
#define U5V 0x014D
#define UPB1 0x01AA
#define BYTE unsigned char
int PWM_ = 255;
char FanStoped = 1;
int counter = 0;
//eeprom int V;
//eeprom int D;// = 0;
/*eeprom*/ int Max = 0;
/*eeprom*/ int Min = 0;
//char m;
int Q;
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void Beep(void)
{
DDRB.1 = 1;
PORTB.1 = 0;
delay_ms(100);
PORTB.1 = 1;
}
void Beep2(void)
{
DDRB.1 = 1;
PORTB.1 = 0;
delay_ms(100);
PORTB.1 = 1;
delay_ms(100);
PORTB.1 = 0;
delay_ms(100);
PORTB.1 = 1;
delay_ms(200);
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
char t1, t2, T, dP;
BYTE t;
BYTE w1buffer[9];
volatile BYTE i,AllDataFF=1,NonZero = 0;
// int *val = (int*)w1buffer;
// Place your code here
counter++;
if (counter > 4700)
{
counter = 0;
w1_init();
w1_write(0xCC);
w1_write(0xBE);
t1=w1_read(); //LSB
t2=w1_read(); //MSB
//Ff = (t1 & 0x0F);
t2 = t2 << 4;
t1 = t1 >> 4;
T = (t2 & 0xF0) | (t1 & 0x0F);
w1_init();
w1_write(0xCC);
w1_write(0x44);
Q = read_adc(1);
if (Q >= UPB1) //if (Q >= UPB1)
{
PWM_ = 255;
FanStoped = 0;
}
else
{
if ((T >= MIN_TEMP) & (T <= MAX_TEMP))
{
if (FanStoped)
{
PWM_ = Max;
FanStoped = 0;
goto e1;
}
dP = Max - Min;
T = T - MIN_TEMP;
PWM_ = ((dP / DT) * T);
PWM_ = PWM_ + Min;
goto e1;
}
if (T < MIN_TEMP)
{
PWM_ = 0;
FanStoped = 1;
}
if (T > MAX_TEMP)
{
PWM_ = 255;
FanStoped = 0;
Beep();
}
e1:
OCR0A=PWM_;
}
}
}
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
char i, j;
int U;
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
//Разряд DDRx - определяет направление передачи данных (0 - вход, 1 - выход).
//Разряд PORTx - если вывод определен выходом (DDRx = 1), то:
// если установлена 1 - то на выводе устанавливается лог. 1
// если установлена 0 - то на выводе устанавливается лог. 0
// если вывод определен входом (DDRx = 0), то PORTx - определяет
// состояние подтягивающего резистора (при PORTx = 1 резистор подключен)
//Разряд PINx - доступен только для чтения и содержит физическое значение вывода порта
//PORTB=0b00000010;
//DDRB= 0b00000011;
PORTB=0x02;
DDRB=0x03;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 150,000 kHz
// Mode: Fast PWM top=FFh
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
TCCR0A=0x83;
TCCR0B=0x02;
TCNT0=0x00;
OCR0A=0xFF;
OCR0B=0x00;
TCCR0A=0x83;
//TCCR0B=0x02; //4,6 kHz частота на выходе.
//TCCR0B=0x01; //37,6 kHz частота на выходе.
//TCNT0=0x00;
//OCR0A=0x00;
//OCR0B=0x00;
// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x02;
// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
// ADC initialization
// ADC Clock frequency: 600,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: None
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: Off, ADC4: On
DIDR0=0x00;
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x84;
// 1 Wire Bus initialization
w1_init();
w1_write(0xCC);
w1_write(0x44);
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
if (Max==0)
{
#asm("cli")
delay_ms(500);
Max = read_adc(2);
j = 5;
for (i=255; i>1; i=i-j)
{
OCR0A = i;
delay_ms(100);
U = read_adc(2);
if ((U < Max - 10) /*& (j == 1)*/)
{
Max = i + 5;
break;
}
/* if ((U < Max - 10) & (j > 1))
{
i = i + 10;
OCR0A = i;
delay_ms(500);
j = 1;
} */
}
//e3:
for (i=Max; i>1; i--)
{
OCR0A = i;
delay_ms(100);
U = read_adc(2);
if (U < U5V)
{
Min = i + 1;
break;
}
}
//e2:
FanStoped = 1;
#asm("sei")
}
};
}
А ты попробуй прошивку IYra - может и скрешивать не надо. Но если очень надо - добавлюSergey_202 wrote: Как прошивку Hardlocka скрестить с прошивкой IYra без потери качества, получив все плюшки от скрещивания.
А просто ради интереса попробуй мою прошивку. Как она будет работать ? Может какой косяк вылезет ?Sergey_202 wrote: Уже плату изготовил под такой вариант, понимаю что можно делитель не распаивать, но всё же хочется полный вариант.
Жаль что в предлагаемом варианте N канальный полевик, плата сделана по схеме с P канальном полевиком (хотя это не особо критично).IYra wrote:А просто ради интереса попробуй мою прошивку. Как она будет работать ? Может какой косяк вылезет ?Sergey_202 wrote: Уже плату изготовил под такой вариант, понимаю что можно делитель не распаивать, но всё же хочется полный вариант.
Тем более что железо уже есть
Code: Select all
/*****************************************************
Chip type : ATtiny13
Clock frequency : 9,600000 MHz
Memory model : Tiny
External SRAM size : 0
Data Stack size : 16
*****************************************************/
#include <tiny13.h>
#include <delay.h>
// 1 Wire Bus functions
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=3
#endasm
#include <1wire.h>
//#include <ds18b20.h>
#define ADC_VREF_TYPE 0x00
#define BYTE unsigned char
#define WORD unsigned short int
/* MIN_TEMP - нижняя граница температуры (вкл. вентилятора), гр.C
MAX_TEMP - граница выхода на макс. обороты вентилятора, гр.C
DT - разница между MAX_TEMP и MIN_TEMP, что бы не считать в программе
UminV - устанавливает нижнее значение напряжения, т.е. напряжение
на вентиляторе до которого оно падает (в версии с невыключаемым
вентилятором) при падении температуры ниже MIN_TEMP. Подбором
этого значения надо обеспечить устойчивую работу вентилятора
и не допустить его выключения.
0x01FF - 7.6в.
0x01AD - 6.4в,
0x016D - 5.8в,
0x014D - 5в,
0x00ED - 3.5в,
0x00BD - 3.3в.
При уменьшении ниже значения 0x00BD теряется стабильность работы.
Т.е. на этапе отладки эту константу можно будет подобрать под конкретную
модификацию вентилятора.
*/
#define MIN_TEMP 25
#define MAX_TEMP 55
#define DT 30
#define UminV 0x014D
#define UPB1 0x02A8
BYTE PWM_ = 255;
BYTE FanStoped = 1;
BYTE Error = 0;
BYTE Errcount1;
BYTE Err;
WORD Errcount;
WORD counter = 0;
//eeprom int V;
//eeprom int D;// = 0;
/*eeprom*/ int Max = 0;
/*eeprom*/ int Min = 0;
int Q;
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
char t1, t2, T, dP;
// Place your code here
if (Error)
{
Errcount++ ;
if (Errcount==400) // около 80 мс
{
Errcount = 0 ;
if (Err)
{
PORTB.1 = !PORTB.1;
Err-- ;
}
Errcount1 ++ ;
if (Errcount1==7) // 80*7 - 0.5 c
{
Errcount1 = 0;
Err = Error;
}
}
}
counter++;
if (counter > 4700)
{
counter = 0;
w1_init();
w1_write(0xCC);
w1_write(0xBE);
t1=w1_read(); //LSB
t2=w1_read(); //MSB
//Ff = (t1 & 0x0F);
t2 = t2 << 4;
t1 = t1 >> 4;
T = (t2 & 0xF0) | (t1 & 0x0F);
w1_init();
w1_write(0xCC);
w1_write(0x44);
Q = read_adc(1); // измеряем напряжение на PB1
Error = 0 ;
if ((T==255)||(T==0)) // проблемы с датчиком
{
Error = 4;
PWM_ = 128;
goto e1;
}
if (Q >= UPB1) // сравниваем напряжение на PB1 с установленным значением Q
{
PWM_ = 255;
FanStoped = 0;
}
else
{
if ((T >= MIN_TEMP) & (T <= MAX_TEMP))
{
if (FanStoped)
{
PWM_ = Max;
FanStoped = 0;
goto e1;
}
dP = Max - Min;
T = T - MIN_TEMP;
PWM_ = ((dP / DT) * T);
PWM_ = PWM_ + Min;
goto e1;
}
if (T < MIN_TEMP)
{
PWM_ = 0;
FanStoped = 1;
}
if (T > MAX_TEMP)
{
PWM_ = 255;
FanStoped = 0;
Error = 2;
}
e1:
OCR0A=PWM_;
if (Error==0) PORTB.1 = 1;
}
}
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
char i, j;
int U;
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
//Разряд DDRx - определяет направление передачи данных (0 - вход, 1 - выход).
//Разряд PORTx - если вывод определен выходом (DDRx = 1), то:
// если установлена 1 - то на выводе устанавливается лог. 1
// если установлена 0 - то на выводе устанавливается лог. 0
// если вывод определен входом (DDRx = 0), то PORTx - определяет
// состояние подтягивающего резистора (при PORTx = 1 резистор подключен)
//Разряд PINx - доступен только для чтения и содержит физическое значение вывода порта
//PORTB=0b00000010;
//DDRB= 0b00000011;
PORTB=0x02;
DDRB=0x03;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 150,000 kHz
// Mode: Fast PWM top=FFh
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
TCCR0A=0x83;
TCCR0B=0x02;
TCNT0=0x00;
OCR0A=0xFF;
OCR0B=0x00;
//TCCR0B=0x02; //4,6 kHz частота на выходе.
//TCCR0B=0x01; //37,6 kHz частота на выходе.
//OCR0A=0x00; // инвертирование PWM ?
// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x02;
// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
// ADC initialization
// ADC Clock frequency: 600,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: None
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: Off, ADC4: On
DIDR0=0x00;
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x84;
// 1 Wire Bus initialization
w1_init();
w1_write(0xCC);
w1_write(0x44);
// Global enable interrupts
#asm("sei")
// Place your code here
while (1)
{
if (Max==0)
{
#asm("cli")
delay_ms(500);
Max = read_adc(2);
j = 5;
for (i=255; i>1; i=i-j)
{
OCR0A = i;
delay_ms(100);
U = read_adc(2);
if ((U < Max - 10) /*& (j == 1)*/)
{
Max = i + 5;
break;
}
/* if ((U < Max - 10) & (j > 1))
{
i = i + 10;
OCR0A = i;
delay_ms(500);
j = 1;
} */
}
//e3:
for (i=Max; i>1; i--)
{
OCR0A = i;
delay_ms(100);
U = read_adc(2);
if (U < UminV)
{
Min = i + 1;
break;
}
}
//e2:
FanStoped = 1;
#asm("sei")
}
}
}
Да вроде похоже. Выкладываю и свой вариант с начальным расчетом диапазона ШИМ.Sergey_202 wrote:у меня получилось скрестить два варианта?
В этом варианте неисправность датчика температуры определяется иначе (гораздо интереснее, опрашивается сам датчик ),IYra wrote:Попробуй тестовую прошивку. Надо к выводу 5 (PB0 - выход ШИМ) и 7 (PB2 - выход на бузер) подключить светодиоды через 100 Ом катодом к земле.Nizam wrote: При подаче питания на схему кулер включается в полную напряжение на нем 12в где то секунды 5 и потом шим начинает снижать до 10 вольт 6-7 секунды и выключает кулер. Это когда я не ставлю электролитический конденсатор параллельно вентилятору. Если подпаиваю конденсатор он вообще не снижает обороты.. В чем может быть дело? Прошивал не один контроллер.. все равно одной и тоже..
Светодиод на ноге 7 (бузер) должен моргать (1 сек горит / 1 сек не горит) - если не так значит фьюзы и частота МК
Светодиод на ноге 5 (ШИМ) должен менять яркость при нагреве датчика пальцем. В прошивке стоит
Если проблемы с датчиком Светодиод на ноге 5 начинает моргать в такт со Светодиодом на ноге 7
Code: Select all
for (i=0; i<9; i++)
{
t = w1_read();
w1buffer[i]=t ;
if (t != 0xFF) AllDataFF = 0;
if (t != 0x00) NonZero = 1 ;
}
i=w1_dow_crc8(w1buffer,8);
if ((i == w1buffer[8])&&(AllDataFF==0)&&(NonZero)) // нет ошибок
Code: Select all
if ((T==255)||(t1==0))
Был сделан упрощенный вариант проверки так как мало памятиSergey_202 wrote: В этом варианте неисправность датчика температуры определяется иначе (гораздо интереснее, опрашивается сам датчик ),а предложенном варианте прошивки, исправность датчика проверяется по условию. Что если датчик при опросе будет давать некорректные значения, тогда это условие не будет выполняться (нет обрыва, нет замыкания,) и схема не будет работать.Code: Select all
if ((T==255)||(t1==0))
в тестовой версии был более правильный вариант, ведь dallas может сам сказать о своей неисправности, его только надо спросить. или я в чем то заблуждаюсь?
На эти фузы галочки остальные снять в Пони?alelula wrote:На втором был осторожней, вот для пони правильные фузы: cksel0,sut0,ckdiv8=0
в стройках 97-100 код "закоментирован" - перед ними стоит "/*", а после "*/" если убрать, то будет работать.PTAXA73 wrote:Доброе время. Не могли пояснить эту строку? Не разобрался.
да, указанные поставить, остальные снять.PTAXA73 wrote:На эти фузы галочки остальные снять в Пони?
Спасибо!!hardlock wrote:да, указанные поставить, остальные снять.
Code: Select all
#include <tiny13a.h>
#include <delay.h>
// 1 Wire Bus functions
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=3
#endasm
#include <1wire.h>
#define ADC_VREF_TYPE 0x00
#define BYTE unsigned char
#define WORD unsigned short int
#define MIN_TEMP 35
#define MAX_TEMP 65
#define DT 30
#define UMinV 0x00E0
#define UMinV_min 175
#define UMinV_max 275
#define UPB1 0x02F6
BYTE PWM_ = 255;
BYTE Min = 0;
BYTE Max = 0;
BYTE Errcount = 0;
BYTE Errcount1 = 0;
BYTE Err = 0;
WORD counter = 0;
BYTE Error = 0;
BYTE i;
WORD U, V;
//*eeprom*/ int Max;// = 0;
//*eeprom*/ int Min;// = 0;
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void smrpm(void) //установка мин. оборотов
{
#asm("cli")
delay_ms(100);
for (i = 32; i > 0; --i)
{
OCR0A = i;
delay_ms(100);
U = read_adc(2);
if (U < UMinV)
{
Min = i;
break;
}
}
#asm("sei")
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
BYTE t1, t2, T, dP;
V = read_adc(1);
U = read_adc(2);
// Place your code here
if (Error)
{
Errcount++ ;
if (Errcount == 20)
{
Errcount = 0;
if (Err)
{
PORTB.1 = !PORTB.1;
Err-- ;
}
Errcount1 ++ ;
if (Errcount1 == 20)
{
Errcount1 = 0;
Err = Error;
}
}
}
counter++;
if (counter > 586)
{
counter = 0;
w1_init();
w1_write(0xCC);
w1_write(0xBE);
t1=w1_read(); //LSB
t2=w1_read(); //MSB
t2 = t2 << 4;
t1 = t1 >> 4;
T = (t2 & 0xF0) | (t1 & 0x0F);
w1_init();
w1_write(0xCC);
w1_write(0x44);
if (T == 255)
{
Error = 14;
PWM_ = 192;
goto e1;
}
if (T == 0)
{
Error = 12;
PWM_ = 192;
goto e1;
}
if (V > UPB1)
{
PWM_ = 254;
Error = 10;
goto e1;
}
if (T > MAX_TEMP)
{
PWM_ = 255;
Error = 8;
goto e1;
}
if ((V < UPB1) && (T <= MIN_TEMP) && (U < UMinV_min))
{
Error = 6;
smrpm();
}
if ((V < UPB1) && (T <= MIN_TEMP) && (U > UMinV_max))
{
Error = 4;
smrpm();
}
if (T <= MIN_TEMP)
{
PWM_ = Min;
Error = 2;
goto e1;
}
if ((T >= MIN_TEMP) & (T <= MAX_TEMP))
{
dP = Max - Min;
T = T - MIN_TEMP;
PWM_ = ((dP / DT) * T);
PWM_ = PWM_ + Min;
goto e1;
}
e1:
OCR0A = PWM_;
if (Error == 0) {PORTB.1 = 1;}
}
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
//Разряд DDRx - определяет направление передачи данных (0 - вход, 1 - выход).
//Разряд PORTx - если вывод определен выходом (DDRx = 1), то:
// если установлена 1 - то на выводе устанавливается лог. 1
// если установлена 0 - то на выводе устанавливается лог. 0
// если вывод определен входом (DDRx = 0), то PORTx - определяет
// состояние подтягивающего резистора (при PORTx = 1 резистор подключен)
//Разряд PINx - доступен только для чтения и содержит физическое значение вывода порта
// RESET CONTROL FAN SENSOR TEMP INPUT 1 OUT LED OUT PWM
DDRB=0x03; //DDRB= (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (1<<DDB1) | (1<<DDB0);
PORTB=0x2A; //PORTB= (1<<PORTB5) | (0<<PORTB4) | (1<<PORTB3) | (0<<PORTB2) | (1<<PORTB1) | (0<<PORTB0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 150,000 kHz
// Mode: Fast PWM top=FFh
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
TCCR0A=0x83;
TCCR0B=0x05;
TCNT0=0x00;
OCR0A=0xFF;
OCR0B=0x00;
// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x02;
// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
// ADC initialization
// ADC Clock frequency: 600,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: None
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: Off, ADC4: On
DIDR0=0x00;
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x84;
// 1 Wire Bus initialization
w1_init();
w1_write(0xCC);
w1_write(0x44);
// Global enable interrupts
#asm("sei")
while (1)
{
if (Max==0)
{
#asm("cli")
delay_ms(100);
V = read_adc(1);
for (i = 255; i > 127; i--)
{
OCR0A = i;
delay_ms(100);
U = read_adc(2);
if (U < (V - 10))
{
Max = i;
break;
}
}
#asm("sei")
smrpm();
//e3:
}
}
}
Подключить датчик по 3-х проводной схеме (как в термостате)alex-spb wrote:Датчик подкл. средний вывод к 2й ноге МК а 2 другие на корпус(если я правильно понял).Т.е.на датчик нет реакции.
Дак надо попробовать подключить 3 проводамиalex-spb wrote:подкл.2мя проводами
Если галка обозначает установленный 0 - надо ее убиратьalex-spb wrote: МК прошил правильно может с фузами напортачил-не снял галку с CKDIV8.