PWM na ATMEGA328P

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
kulikus
Příspěvky: 3261
Registrován: 10 pro 2009, 00:00
Kontaktovat uživatele:

PWM na ATMEGA328P

#1 Příspěvek 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;
}
Uživatelský avatar
WLAB
Příspěvky: 867
Registrován: 13 zář 2005, 00:00
Bydliště: Praha

#2 Příspěvek 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 :(
de omnibus dubitandum est
Uživatelský avatar
kulikus
Příspěvky: 3261
Registrován: 10 pro 2009, 00:00
Kontaktovat uživatele:

#3 Příspěvek 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?
Uživatelský avatar
WLAB
Příspěvky: 867
Registrován: 13 zář 2005, 00:00
Bydliště: Praha

#4 Příspěvek 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)
de omnibus dubitandum est
Uživatelský avatar
kulikus
Příspěvky: 3261
Registrován: 10 pro 2009, 00:00
Kontaktovat uživatele:

#5 Příspěvek od kulikus »

Už to vidím! Díky!!
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“