Problem with CTC mode of timer

Status
Not open for further replies.

abdi110

Member level 3
Joined
Mar 5, 2015
Messages
60
Helped
1
Reputation
2
Reaction score
1
Trophy points
1,288
Visit site
Activity points
1,728
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
};


}
}
 
Last edited:

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…