• Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

Using timer 2 on atmega328

MacIntoshCZ

Member
That code is outputting PWM on pin 9 not pin 3... Pin 3 has a pot to change the PWM on pin 9..

500 is tooo high... 256 means 100%, 127 means 50% and 0 means 0%...
I selected pin 3 as output. And set pwm at 50% duty cycle. I dont need adc to set duty cycle. It was just for test purpose and it didnt work.
But i realize now that you was correct that 500 is too high. Timer 2 is 8 bit... And pin 3 should be under timer 2
 
Last edited:

MacIntoshCZ

Member
Something really strange is going on. Yesterday i tried burn hex file without bootloader from arduino to atmega32 (with usbasp) and it works, so I though that my arduino is faulty. Today i bought arduino mega and it has same issue. I am thinking that arduino just screw up code.
 

Nigel Goodwin

Super Moderator
Most Helpful Member
Something really strange is going on. Yesterday i tried burn hex file without bootloader from arduino to atmega32 (with usbasp) and it works, so I though that my arduino is faulty. Today i bought arduino mega and it has same issue. I am thinking that arduino just screw up code.
I'm thinking it's more likely you have :D
 

MacIntoshCZ

Member
OK so i discovered this. It actually works for me.

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
DDRH |= (1 << PH6);
TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
TCCR2B = _BV(WGM22) | _BV(CS20);
OCR2A = 80;
OCR2B = 39;
TIMSK2 = (1 << OCIE2A);
sei();
while (1);
}
 

MacIntoshCZ

Member
My last comment actually do not work properly on other timers.
This piece of code always work. Writed in atmel studio

/*
* Timers.c
*
* Created: 01.11.2019 15:36:58
* Author : NNT
*/
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <avr/interrupt.h>

int main(void)
{
// timer 0
TCCR0A = 0;
TCCR0B = 0;
TCNT0 = 0;
DDRD |= (1 << PD6) | (1 << PD5);
TCCR0A = 0b10100011;
TCCR0B = 0b00001001;
OCR0A = 0b10100000;
OCR0B = 0b01010000;

while (1)
{
}
}
 

MacIntoshCZ

Member
Using all timers:
/*
* Timers.c
*
* Created: 01.11.2019 15:36:58
* Author : NNT
*/
#ifndef F_CPU
#define F_CPU 16000000UL /
#endif
#include <avr/io.h>
#include <avr/interrupt.h>

int main(void)
{
// timer 0
TCCR0A = 0;
TCCR0B = 0;
TCNT0 = 0;
DDRD |= (1 << PD6) | (1 << PD5);
TCCR0A = 0b10100011;
TCCR0B = 0b00001001;
OCR0A = 0b10100000;
OCR0B = 0b01010000;

// timer 1
TCCR1A = 0;
TCCR1B = 0;
TCCR1C = 0;
TCNT1 = 0;
DDRB |= (1 << PB2) | (1 << PB1);
TCCR1A = 0b10100011;
TCCR1B = 0b00011001;
OCR1A = 0b10100000;
OCR1B = 0b01010000;
// timer 2
TCCR2A = 0;
TCCR2B = 0;
TCNT2 = 0;
DDRD |= (1 << PD3);
DDRB |= (1 << PB3);
TCCR2A = 0b10100011;
TCCR2B = 0b00001001;
OCR2A = 0b10100000;
OCR2B = 0b01010000;
while (1)
{
}
}
 

Latest threads

EE World Online Articles

Loading

 
Top