Hi every one,
I am going to turn on a relay each 200 hours for 5 minutes.
I use ATtiny13 and for the first test I am going to do this for each 1 houre.
the problem is that the system works randomly, I mean it works for the first or second hour properly but after one or two hours it turns the relay on after 3 or 4 minutes(instead of one hour).
i use ctc timer mode with an 1 second interrupt.
the Fcpu is 128kHz internal RC and the the prescale is 1024 so the OCR0A IS:
((128000/1024=125)-1)=124 decimal or 7CH.
I made the circuit on a bread board.
The code is as below:
Chip type : ATtiny13
AVR Core Clock frequency: 0.128000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 16
*****************************************************/
#include <tiny13.h>
#include <delay.h>
eeprom char sec=0x00;
eeprom char minutes=0x00;
eeprom char hours=0x00;
// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
if(++sec == 60) {
if(++minutes == 60) {
++hours;
minutes = 0;
}
sec = 0;
}
}
void main(void)
{
int i;
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out
// State5=P State4=P State3=P State2=P State1=P State0=1
PORTB=0x3F;
DDRB=0x01;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 0.125 kHz
// Mode: CTC top=OCR0A
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x02;
TCCR0B=0x05;
TCNT0=0x00;
OCR0A=0x7C;
OCR0B=0x00;
TIMSK0=0x04;
// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR0=0x00;
#asm("sei")
while (1){
if(hours>=1){
PORTB.0=0; //turn the relay on
for (i=1;i<=60;i++) { // 5 minutes deay
delay_ms(5000);
};
PORTB.0=1;//turn the relay off
sec=0;
minutes=0;
hours=0;
}
else
{
PORTB.0=1;//turn the relay off
};
}
}