ATMega16 Fast PWM

OP #629920
Lesenswert?

Hallo Leute,

ich versuche gerade Fast PWM mit Timer 1 zum laufen zu bringen. Der 
Controller ist ein ATMega16 mit externem 16MHZ Quarz.
Ziel ist einen Servotester (Modellbau) zu bauen.

Ausgabe PWM auf OC1A (PD5) mit 50Hz.

High - Zeit des Signals für Mittelstellung 1,5ms

Zur Theorie:

50Hz => 20ms bei 16MHz-> t = 62,5ns ergibt 320.000 für prescaler 1

also prescaler auf 8 --> Overflow bei 40.000 (ICR1)

OCR1A (Compare match): 1,5ms * 40000 / 20ms = 3000

Folgendes hab ich dann programmiert:


DDRD = (1 << PD5);

// Enable fast PWM mode 14 (table 47 page 113 ATMega16 Doc):
TCCR1A    = (1 << COM1A1) | (1 << WGM13) |(1 << WGM12) |(1 << WGM11);
// Set prescaler 8
TCCR1B    = (1 << CS11);
// Set PWM
ICR1     = (uint16_t)40000;
OCR1A    = (uint16_t)3000;


aber an PD5 kommt leider nix raus .......

ich habs dann auch mal mit

for (;;)
{
  PORTD ^= (1 << PD5);
  for (i = 0; i < 3000; i++)
    asm ("NOP");
}

probiert, was wunderbar funktioniert. Muss ich für den Timer1 auch noch 
die Ints freigeben, denn ISR's brauch ich eigentlich nicht ....

Bin für jeden Tipp dankbar !

Grüße,
Michael
OP #629932
Lesenswert?

Hallo Leute,

hab den Fehler! So gehts:

// Enable fast PWM mode 14 (table 47 page 113 ATMega16 Doc):
TCCR1A    = (1 << COM1A1) |(1 << WGM11);
// Set prescaler 8
TCCR1B    = (1 << CS11) | (1 << WGM13) |(1 << WGM12);
// Set PWM
ICR1     = (uint16_t)40000;
OCR1A    = (uint16_t)3000;

Die WGM13 und WGM12 Bits waren im falschen Register gesetzt worden !

Grüße,

Michael

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren