Microcontroller › AVR › Servo Program Using TIMER0
- This topic has 7 replies, 3 voices, and was last updated 6 years, 5 months ago by
Jithin David.
-
AuthorPosts
-
March 28, 2013 at 4:52 am #2208
BhanuKiran Chaluvadi
ParticipantHello sir , I have programmed servo using Timer0, Its not Working.I am unable to sort out mistake, Could u please Help me
#include <avr/io.h>#include <util/delay.h>#include <avr/interrupt.h>volatile uint8_t tot_overflow;void timer0_init(){TCCR0 |= (1<<WGM01) | (1<<WGM00) | (1<<CS12) ; // Fast PWM CTC mode, Prescaling of 256.TCNT0 = 0 ;OCR0 = 249; //This gives us a time period of 4ms.TIMSK |= (1<<OCIE0) ;sei();}ISR (TIMER0_COMPA_vect){tot_overflow++;if(tot_overflow==5) //5 waves each of time period 4ms= 5*4=20ms{PORTA |= (1<<PA0) | (1<<PA1) | (1<<PA2) ;tot_overflow=0;}}int main (void){DDRA |= (1<<PA0) | (1<<PA1) | (1<<PA2) ;timer0_init();tot_overflow=0;while(1){if (TCNT0>=15 && TCNT0<=145 && tot_overflow==0 ){if (TCNT0 >= 23 && bit_is_set(PORTA, PINA0) ) PORTA &= ~(1<<PINA0);if (TCNT0 >= 78 && bit_is_set(PORTA, PINA1) ) PORTA &= ~(1<<PINA1);if (TCNT0 >= 133 && bit_is_set(PORTA, PINA2) ) PORTA&= ~(1<<PINA2);}}}March 28, 2013 at 8:02 am #9386zaib Akhter
Participantwhere from this TCNT1 came?????????????
initialized only timer0 and using tcnt1 in main ………
March 28, 2013 at 8:05 am #9387zaib Akhter
ParticipantTCNT1 is register of TIMER1
so you should either initialize timer1
OR
use TCNT0……………………………….
March 28, 2013 at 9:36 am #9388BhanuKiran Chaluvadi
ParticipantUnfortunately, i posted it wrongly sir . In the actual program i used TCNT0 every where. Now i corrected the program posted above . Could u please help me in finding mistake sir .
March 28, 2013 at 11:40 am #9391zaib Akhter
Participantfor Timer0 ……………… ISR (TIMER0_COMP_vect)
if you are having problem with result then tell what you want… add some discription.
as it is producing some output and able to rotate motor in one direction
(i have not really work with servo so don’t know much)
April 2, 2013 at 6:06 pm #9421BhanuKiran Chaluvadi
ParticipantThanks for u r help sir …I made 2 mistakes
1.Using CS12 for Prescaling which has to be CS02 ;
2. It has to be ISR(TIMER0_COMP_vect) not ISR(TIMER0_COMPA_vect) ;
April 2, 2013 at 6:08 pm #9422BhanuKiran Chaluvadi
Participant/* Here is the actual Working Progam, Controlling Servo Using TIMER0 . SO that we can use Timer1 for other Purpose */
#include <avr/io.h>#include <util/delay.h>#include <avr/interrupt.h>volatile uint8_t tot_overflow;void timer0_init(){TCCR0 |= (1<<WGM01) | (1<<WGM00) | (1<<CS02) ; // Fast PWM CTC mode, Prescaling of 256TCNT0 = 0 ;OCR0 = 249;TIMSK |= (1<<OCIE0) ;sei();}ISR (TIMER0_COMP_vect){tot_overflow++;if(tot_overflow==5){PORTA |= (1<<PA0) | (1<<PA1) | (1<<PA2) ;tot_overflow=0;}}int main (void){DDRA |= (1<<PA0) | (1<<PA1) | (1<<PA2) ;timer0_init();tot_overflow=0;while(1){if (TCNT0>=15 && TCNT0<=145 && tot_overflow==0){if (TCNT0 >= 23 && bit_is_set(PORTA, PINA0) ) PORTA &= ~(1<<PINA0);if (TCNT0 >= 78 && bit_is_set(PORTA, PINA1) ) PORTA &= ~(1<<PINA1);if (TCNT0 >= 133 && bit_is_set(PORTA, PINA2) ) PORTA &= ~(1<<PINA2);}}}November 10, 2018 at 7:46 am #14917Jithin David
ParticipantHi Bhanu
In above Program you have used three pins among them which pin used for servo motor.
-
AuthorPosts
- You must be logged in to reply to this topic.