Using timer 2 on atmega328

Status
Not open for further replies.

MacIntoshCZ

Active Member
Hello there,
i would like use timer 2 on avr, but i probably made somewhere a mistake or avr is faulty becouse i am getting square wave about 95%duty cycle.
I already succesfully used timer 0.
I should get 100Khz square wave, 50% duty cycle, on pin 11. Thanks for help
Here is code:


void setup() {
TCCR2A = 0;
TCCR2B = 0;
TCNT2 = 0;
TCCR2A |= (1 << WGM20) | (1 << WGM21);
TCCR2B |= (1 << WGM22);
TIMSK2 |= 1;
TCCR2A |= (1 << COM2A1);
TCCR2A |= (1 << COM2B1);
OCR2A |= 160;
OCR2B |= 80;
pinMode(3, OUTPUT);
pinMode(11, OUTPUT);
TCCR2B |= (1 << CS20);
interrupts();
}


void loop() {

}
 
The TCCR1A and B select wave format.. Page 141 in the datasheet... This timer is setup as a PWM controller by default
 
I mainly program pic's so looky here.. **broken link removed**

Should help a tad..
 
In my case its not working. I think my arduino uno timer 2 is defective. I tried that code but nothing seems to happen.
 
I wrote it on timer 1. It definitely something does. It still acts very strange. Like my level trigger is gone mad.
void setup() {
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
TCCR1A = 0;
TCCR1B = 0;
TCCR1C = 0;
TCNT1 = 0 ;
TCCR1A |= (1<<WGM10) | (1<<WGM11);
TCCR1B |= (1<<WGM12) | (1<< WGM13);
TCCR1A |= (1<<COM1A1) | (1<< COM1B1);
OCR1A = 160;
OCR1B = 80;
TIMSK1 = 1;
interrupts();
TCCR1B |= (1<<CS10);



}


void loop() {

}
 

Attachments

  • DS1Z_QuickPrint8.png
    42.7 KB · Views: 297
May I ask?? If you are using an Arduino IDE why not use Arduino commands?
 
Using brightness on an LED

C:
int ledPin = 9;      // LED connected to digital pin 9
int analogPin = 3;   // potentiometer connected to analog pin 3
int val = 0;         // variable to store the read value

void setup() {
  pinMode(ledPin, OUTPUT);  // sets the pin as output
}

void loop() {
  val = analogRead(analogPin);  // read the input pin
  analogWrite(ledPin, val / 4); // analogRead values go from 0 to 1023, analogWrite values from 0 to 255
}
 
I should get 100Khz square wave, 50% duty cycle, on pin 11.

See if you can run this to get 200kHz PWM with 50% duty cycle on pin 3.

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

int main(void)
{
  pinMode(3, OUTPUT); 
  TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(WGM22) | _BV(CS20);
  OCR2A = 80;
  OCR2B = 39;
  while (1);
}

See:
**broken link removed**
 
For Rogers:
I know this function. But its not powerful enough for me. I want to know exactly what its going on. This is "black box" function.
 
I tried exactly this code and i got zero volts on pin 3 =). I really thing that my arduino is messed up.
A will try to use atmega8/32/128 instead in standalone circuit. I dont have another arduino.
 
Even this function not works.
analogWrite(3,500);
So i assume my arduino is KO
 
I tried exactly this code and i got zero volts on pin 3 =). I really thing that my arduino is messed up.
A will try to use atmega8/32/128 instead in standalone circuit. I dont have another arduino.

Using my toy oscilloscope, I just got this:


That speed is at the maximum specified for the toy scope, so I didn't expect to see much, but the stats are about right.

When I slow it down with
Code:
  OCR2A = 254;
  OCR2B = 127;

I get this, which is a pretty decent waveform considering it is a $30 scope.


Of course, I may have messed something up, but I highly recommend those two references that I posted, plus the data sheet.
 
Thank
Thanks for help. I should buy new arduino
 
Even this function not works.
analogWrite(3,500);
So i assume my arduino is KO
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%...
 
Status
Not open for further replies.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…