Code: Select all
if (PINB.1)
{
Beep();
}
Code: Select all
if (PINB.1)
{
Beep();
}
Code: Select all
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.8d Professional
Automatic Program Generator
© Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 12.02.2007
Author : Hardlock
Company : CTO Y Zhuka
Comments:
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>
#define ADC_VREF_TYPE 0x00
#define MIN_TEMP 36
#define MAX_TEMP 66
#define DT 30
#define U5V 0x014D
#define ALLTIME_5V //раскомментировать, если на выходе должно быть всегда
//5 Вольт. Даже при Т < Tмин.
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;
// 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.2 = 1;
PORTB.2 = 0;
delay_ms(100);
PORTB.2 = 1;
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
char t1, t2, T, dP;
// 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);
if (T > 127) T = 0;
w1_init();
w1_write(0xCC);
w1_write(0x44);
if (!FanStoped & PINB.1)
{
Beep();
}
#ifdef ALLTIME_5V
if (T <= MAX_TEMP)
{
#else
if ((T >= MIN_TEMP) & (T <= MAX_TEMP))
{
if (FanStoped)
{
PWM_ = Max;
FanStoped = 0;
goto e1;
}
#endif
dP = Max - Min;
if (T < MIN_TEMP)
{
T = MIN_TEMP;
}
T = T - MIN_TEMP;
PWM_ = ((dP / DT) * T);
PWM_ = PWM_ + Min;
goto e1;
}
#ifndef ALLTIME_5V
if (T < MIN_TEMP)
{
PWM_ = 0;
FanStoped = 1;
}
#endif
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=0b00000110;
DDRB= 0b00000101;
// 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;
// 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(1000);
//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)
{
Max = i + 5;
break;
}
}
for (i=Max; i>1; i--)
{
OCR0A = i;
delay_ms(100);
U = read_adc(2);
if (U < U5V)
{
Min = i + 1;
break;
}
if (PINB.1)
{
Beep();
}
}
//e2:
#ifndef ALLTIME_5V
FanStoped = 1;
#endif
#asm("sei")
}
};
}
Code: Select all
void Beep(void)
{
//DDRB.2 = 1;
PORTB.2 = 0;
delay_ms(100);
PORTB.2 = 1;
}
Code: Select all
for (i=Max; i>1; i--)
{
OCR0A = i;
delay_ms(100);
U = read_adc(2);
if (U < U5V)
Code: Select all
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.8d Professional
Automatic Program Generator
© Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 12.02.2007
Author : Hardlock
Company : CTO Y Zhuka
Comments:
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>
#define ADC_VREF_TYPE 0x00
#define MIN_TEMP 36
#define MAX_TEMP 66
#define DT 30
#define U5V 0x014D
#define ALLTIME_5V //раскомментировать, если на выходе должно быть всегда
//5 Вольт. Даже при Т < Tмин.
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;
// 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.2 = 1;
PORTB.2 = 0;
delay_ms(100);
PORTB.2 = 1;
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
char t1, t2, T, dP;
// 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);
if (T > 127) T = 0;
w1_init();
w1_write(0xCC);
w1_write(0x44);
/*
if (!FanStoped & PINB.1)
{
Beep();
}
*/
#ifdef ALLTIME_5V
if (T <= MAX_TEMP)
{
#else
if ((T >= MIN_TEMP) & (T <= MAX_TEMP))
{
if (FanStoped)
{
PWM_ = Max;
FanStoped = 0;
goto e1;
}
#endif
dP = Max - Min;
if (T < MIN_TEMP)
{
T = MIN_TEMP;
}
T = T - MIN_TEMP;
PWM_ = ((dP / DT) * T);
PWM_ = PWM_ + Min;
goto e1;
}
#ifndef ALLTIME_5V
if (T < MIN_TEMP)
{
PWM_ = 0;
FanStoped = 1;
}
#endif
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=0b00000110;
DDRB= 0b00000101;
// 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;
// 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(1000);
//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)
{
Max = i + 5;
break;
}
}
for (i=Max; i>1; i--)
{
OCR0A = i;
delay_ms(100);
U = read_adc(2);
if (U < U5V)
{
Min = i + 1;
break;
}
}
//e2:
#ifndef ALLTIME_5V
FanStoped = 1;
#endif
#asm("sei")
}
};
}
Не понятно. Что нужно то ? Поподробнейsrqemiko wrote:чтобы контроль за вращением кулера был постоянным, как при достижении минимальной температуры так и до нее. То есть когда кулер вращается при минимальных 5 вольтах
Как я понял используется прошивка с постоянным включением вентилятора.srqemiko wrote: Так вот вопрос что нужно изменить в проге чтобы испрать данную проблему и контроль за работой кулера был с первого включения и до последнего момента его работы.
Code: Select all
char FanStoped = 1;
Code: Select all
char FanStoped = 0;
Можно вместо вызова Beep()LYG wrote: В общем такой вопрос, реально ли вместо пищалки поставить реле(естественно через транзистор) чтоб при достижении критической температуры (около 80 градусов) оно отключалось?
Code: Select all
if (T > MAX_TEMP)
{
PWM_ = 255;
FanStoped = 0;
Beep();
}
Code: Select all
if (T > MAX_TEMP)
{
PWM_ = 255;
FanStoped = 0;
PORTB.2 = 1;
}
else PORTB.2 = 0;
Заменитьhawkman wrote:нет tiny13, но есть tiny25. помогите подправить исходник под этот контроллер.
Code: Select all
#include <tiny13.h>
Code: Select all
#include <tiny25.h>
Code: Select all
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x02;
Code: Select all
// Timer/Counter 0 Interrupt(s) initialization
TIMSK=0x02;