Society of Robots - Robot Forum
Software => Software => Topic started by: ksquared on May 31, 2010, 02:39:31 PM
-
I was working on using a PWM timer
(here: http://www.societyofrobots.com/member_tutorials/node/232 (http://www.societyofrobots.com/member_tutorials/node/232))
to make an L.E.D. flash on and off every half second. That would mean my duty period should be 1 second at 1 hz. and thus following the equation...
TOP = (Clock_Speed / (Prescaler * Output_PWM_Frequency)) - 1
Assuming the Atmega168 does 8 Mhz without an external crystal (Am I right about THAT!?) that leaves something like 8000000/(1024*1)-1 = 78124. Since this is a 16 bit timer, I put 65535 for that value.
My code goes something like:
TCCR1A = 0;
ICR1 = 65535;
///*******
//// 1024x prescaling ?
TCCR1A = (1 << WGM11);
TCCR1B = (1 << WGM13) | (1<<WGM12) | (1 << CS12) | (1 << CS10);
DDRB |= _BV(1); // make port B1 an output pin
TCCR1A |= 2 << 6; // enable PWM on port B2 to use non-inverting mode - mode 2
//pin
DDRB |= _BV(2); // make port B2 an output
TCCR1A |= 2 << 4; // enable PWM on port B2 to use non-inverting mode - mode 2
Unfourtunatly, the L.E.D just stays on constantly. You might find this useful:
http://www.societyofrobots.com/member_tutorials/files/ATMega8.pdf (http://www.societyofrobots.com/member_tutorials/files/ATMega8.pdf)
I already know how bit flags work. For someone wondering what to do with this, look up how does work...
Is this becuase I did not specify a comparator value? Thanks...
Fixed
int main (void){
TCCR1A = 0; // disable all PWM on Timer1 whilst we set it up
TCCR1A = (1<<WGM11);
ICR1 = 15625*2;
TCCR1A = (1 << WGM11);
TCCR1B = (1 << WGM13) | (1<<WGM12) | (1 << CS11) | (1 << CS10);
OCR1A = ICR1 / 2;
OCR1B = ICR1 / 2;
DDRB |= _BV(1); // make port B1 an output pin
TCCR1A |= 2 << 6; // enable PWM on port B2 to use non-inverting mode - mode 2
//pin
DDRB |= _BV(2); // make port B2 an output
TCCR1A |= 2 << 4; // enable PWM on port B2 to use non-inverting mode - mode 2
while (1)
{
}
}
THIS code should do it for a 1 Mhz processor. Ie, make it flash on one second, off one second. I was experimenting with the scalers and realized it was not acting at 8 Mhz. If your processor is fast enough it might not flash at all but dim. Recalculate your value. Be sure to have the proper include files.... use that tutorial!
-
Just an FYI:
my duty cycle should be 1 hz
This is the frequency not the duty cycle. The period is 1 second.
Duty cycle is the percent of on time verses the period. So for a 1Hz frequency a 50% duty cycle would be on for 0.5 second and off for 0.5 second.