Hello,
I have been trying to get this working for a few days now. I plan to use timer one to control a servo which will change due to inputs on a interval of 5 min or so. I have done the math to figure out all the details of timer0 to get the required time interval but I know it is long so I am prescaling at 1024 and using normal mode to get the 255 steps.
The counter appears to be working but I don't seem to be generating any interrupts as that code never seems to execute. I have left all the timer1 stuff in and I hope it is not too confusing.
Can anyone see why this is not working? I tried setting things beyond what I thought was nessasary and have tried evey setting I can find to enable the interrupt on overflow for timer 0
Thanks for any help I am mainly a hardware guy and C is a little new to me. I am sure it is something I have misunderstood but just can't see the problem. I am using a ATmega168 set at 8 Mhz clock.
int main()
{
int i;
int OvenH;
int Ovenlo;
int Previous_temp;
int timer1;
int timer256;
int timerlastbyte;
int Speed;
uartInit(); // initialize the UART (serial port)
uartSetBaudRate(38400);// set the baud rate of the UART for our debug/reporting output
rprintfInit(uartSendByte);// initialize rprintf system
rprintf("Start****************************************************************************************\r\n");
DDRD=0xFF;
DDRB =0x00;//|= (_BV(1));// | _BV(2)); //0xFF; // make port B1 an output pin data sheet says to put this last???
//setup timer 0 for counting time using timer1,256,lastbyte to keep enough space
TCCR0A=0x00;// set for normal counting
OCR0A=250; // not needed but added for testing purposes same goes of B
OCR0B=250;
//set mode for normal and prescale 1024
TCCR0B=0x05; //prescale 1024
//enable overflow interupt
TIMSK0=0x01;
TCNT0=0; // to see if anythng changed no difference in output
TIFR0=0; // can't seem to clear out the 4 and 2 bit????
sei();
Prn_all(); // prints a bunch of timer registers
// I am getting
/*
Print all active timer 1
TCNT1 0
OCR1A 0
OCR1B 0
TCCR1A 0
TCCR1B 0
TCCR1C 0
ICR1 0
DDRB 0
PINB 0
Print all active timer 0
TCNT0 52
OCR0A 250
OCR0B 250
TCCR0A 0
TCCR0B 5
TIMSK0 1
Print TIFR0 7 181
Print TIFR0 7 216
Print TIFR0 7 251
Print TIFR0 7 30
Print TIFR0 7 63
Print TIFR0 7 96
Print TIFR0 7 129
*/
// setup Timer1 for slow pulses to debug change later to drive servo at 1.5 ms
//disable all PWM just in case
TCCR1A=0x00;
ICR1 = 10000;// 16 HZ
// 1024x prescaling CS10 CS12
//8x cs11
// PWM phase and frequency correct wgm13
TCCR1B = (1 << WGM13) | (1 << CS11); //| (1<<CS12);
Speed=750; //stop
OCR1A = Speed; // 2ms pulse to left motor on PB1
OCR1B= Speed;
TCCR1A =0xA0; // 0b1010000 enable PWM on port B1 to use non-inverting mode com1a1=1 com1a0=0 com1b1=1 com1b0=0 wgm11=0 wgm10=0
DDRB =0xFF;
PORTD=1<<PD5;
delay_cycles(100000);
PORTD=1<<PD4;
delay_cycles(100000);
PORTD=1<<PD3;
delay_cycles(100000);
PORTD=0;
while(1)
{
i=TIFR0;
if (i=7)
{
rprintf("Print TIFR0 %d %d\r\n",i,TCNT0);
PORTD=0;
}
// rprintf("Print TIFR0 %d\r\n",i);
PORTD=1<<PD5;
delay_cycles(100000);
PORTD=0;
// delay_cycles(100000);
}
return 0;
}
ISR(TIM0_OVF_vect )
{
TIFR0=0;
PORTD=0;
PORTD=1<<PD4;
PORTD=1<<PD3;
}