Stránka 1 z 1

PWM na ATMEGA328P

Napsal: 10 lis 2014, 00:05
od kulikus
Potřebuji změnit PWM z výstupu OC2A na výstup OC2B. Pouhé nastavení modu pinu OC2B a změna registru zdá se nestačí. Je tam jiný zádrhel?

Kód: Vybrat vše

#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

void setup()
{
//  pinMode(11, OUTPUT);     // pin OC2A= PWM  output / frequency output
   pinMode(3, OUTPUT);     // pin OC2B= PWM  output / frequency output
   Setup_timer2();

  // disable interrupts to avoid timing distortion
  cbi (TIMSK0,TOIE0);              // disable Timer0 available
  sbi (TIMSK2,TOIE2);              // enable Timer2 Interrupt
}

void loop() {
 while(1){}
}

//******************************************************************
// timer2 setup
// set prscaler to 1, PWM mode to phase correct PWM,  16000000/510 = 31372.55 Hz clock
void Setup_timer2() {

// Timer2 Clock Prescaler to : 1
  sbi (TCCR2B, CS20);
  cbi (TCCR2B, CS21);
  cbi (TCCR2B, CS22);

  // Timer2 PWM Mode set to Phase Correct PWM
  cbi (TCCR2A, COM2A0);  // clear Compare Match
  sbi (TCCR2A, COM2A1);

  sbi (TCCR2A, WGM20);  // Mode 1  / Phase Correct PWM
  cbi (TCCR2A, WGM21);
  cbi (TCCR2B, WGM22);
}

//******************************************************************
// Timer2 Interrupt Service at 31372,550 KHz = 32uSec
ISR(TIMER2_OVF_vect) {

  // read value fron ROM sine table and send to PWM DAC
//  OCR2A = pgm_read_byte_near(wave256 + icnt);   
  OCR2B = pgm_read_byte_near(wave256 + icnt);   
  if(++icnt>255) icnt=0;
}

Napsal: 10 lis 2014, 01:28
od WLAB
A nemas tam nahodou furt nastaveno, ze ma delat clear on compare na kanalu A?

Dalsi moznosti jsou spatne definovany masky, nejaka jina aktivita, ktera meni prislusny vystup zpet na vstup atd....

To sbi(,) a cbi(,) je pekna zruda, clovek by rekl, ze to jen nastavi bit, a to navic atomicky a ono to ve skutecnosti udela (nebo muze udelat -podle konkretniho kompilatoru) read-modify-write.... navic neatomicky :(

Napsal: 11 lis 2014, 00:13
od kulikus
Toto je defakto celé, jiná aktivita nenastává. Clear on compare mi nic neříká, ani datasheet tuto slovní vazbu neobsahuje. Můžeš to blíže specifikovat?

Napsal: 11 lis 2014, 00:34
od WLAB
Myslim tohle:

cbi (TCCR2A, COM2A0); // clear Compare Match
sbi (TCCR2A, COM2A1);


furt tam nejak vidim ten kanal A (cekal bych B) a v komentari je ono Clear (On) Compare (match)

Napsal: 11 lis 2014, 23:52
od kulikus
Už to vidím! Díky!!