Forum: Compiler & IDEs WGM13 in TCCR1A?


von Udo S. (Firma: allround) (1udo1)


Lesenswert?

Hallo,

10-Bit PWM, Phase and Frequency Correct:

So funktioniert das Programm: Position WGM13!!??
1
OC1A_DDR |= _BV(OC1A_PIN);     
2
3
TCCR1A= _BV(WGM10) | _BV(WGM13) | _BV(COM1A1) | _BV(COM1A0) ;
4
5
TCCR1B= _BV(CS10);

Das Programm dimmt eine LED an PD5 des MEGA16. Aber nur dann, wenn WGM13 
in TCCR1A steht. Sobald ich, wie im Datenblatt zu finden ist, WGM13 nach 
TCCR1B stecke, dann bleibt PD5 auf LOW. Auf meinem Rechner ist 
WinAVR-20081205-install.exe installiert. Im Internet finde ich keinen 
Hinweis, ob WGM13 mal einem anderen Register zugeordnet war.

Auch, wenn manche zweifeln: WGM13 in TCCR1B bleibt die LED an PD5 
dunkel. Ich habe es mehrere Male umprogrammiert. WGM13 in TCCR1B. Nix 
geht mehr.

Was läuft hier schief?
1
// PWM 10 Bit Phase und Frequency Correct PWM
2
3
4
#include <avr/io.h>
5
#include <avr/interrupt.h>
6
7
#define F_CPU 7372800UL       
8
9
#include <util/delay.h>     
10
11
#define OC1A_PIN PD5    // OC1A pin 
12
#define OC1A_DDR DDRD     // OC1A DDR 
13
14
15
uint8_t i = 0;
16
17
18
void init(void)
19
{
20
   // set OC1A PD5 pin as output, required for output toggling
21
    OC1A_DDR |= _BV(OC1A_PIN);     
22
23
  TCCR1A= _BV(WGM10)|_BV(COM1A1) | _BV(COM1A0) ;
24
25
  TCCR1B= _BV(WGM13) | _BV(CS10); // so funktioniert es nicht!!!
26
27
  
28
  DDRA=0xff;
29
30
  PORTA=0xff;
31
32
  }   
33
34
//############################# MAIN #######################################
35
36
int main(void)
37
{
38
39
  init();  
40
41
    for(;;)
42
    {  // Anfang for-Schleife
43
44
          for(i=0;i<255;i++)
45
      {
46
      
47
         OCR1AL = i;    //Ausgabe an PORTD5
48
             _delay_ms(50); // delay 10 ms
49
      }
50
51
      for(i=255;i>0;i--)
52
      {
53
    
54
         OCR1AL = i;    //Ausgabe an PORTD5
55
             _delay_ms(50); // delay 10 ms
56
      }
57
    }  // Ende for-Schleife
58
    return 0;
59
}

Gruß

Udo

von Johannes M. (johnny-m)


Lesenswert?

Mit WGM10 und WGM13 gesetzt hast Du Mode 9, und bei dem steht der 
TOP-Wert in OCR1A, was die Benutzung von OC1A als PWM-Ausgang 
ausschließt! Wenn Du "WGM13 in TCCR1B setzt", dann bedeutet das nur, 
dass in TCCR1A COM1B0 gesetzt wird, was für Dein Programm keinerlei 
Auswirkung hat. Der andere Effekt ist, dass WGM13 in TCCR1B gar nicht 
gesetzt wird, was zu Mode 1 (8-Bit Phase Correct PWM) führt...

Ich habe den Eindruck, dass Du das Funktionsprinzip der PWM nicht ganz 
verstanden hast. Wenn Du an OC1A ein PWM-Signal ausgeben willst, dann 
musst Du einen Modus benutzen, bei dem OCR1A nicht für den TOP-Wert 
belegt wird. Wenn TOP (und damit die PWM-Frequenz) tatsächlich frei 
einstellbar sein soll, dann musst Du in dem Fall einen Modus nehmen, in 
dem TOP in ICR1 abgelegt wird.

Bei einer PWM musst Du immer zwei Dinge angeben:
- TOP bestimmt die Frequenz der PWM, ist entweder fest vorgegeben (bei 
8-, 9- oder 10-Bit-PWM mit 0xFF, 0x1FF bzw. 0x3FF) oder kann je nach 
Modus in OCR1A oder ICR1 geschrieben werden.

- Compare-Wert bestimmt das Tastverhältnis der PWM und wird in das dem 
gewünschten Ausgang zugeordnete Compare-Register geschrieben und darf 
(sinnvollerweise) nicht größer als TOP sein.

Wenn OCR1A schon anderweitig belegt ist, kann die Compare-Einheit nicht 
mehr zur Ausgabe eines PWM-Signals benutzt werden.

von Michael U. (amiga)


Lesenswert?

Hallo,

naja, Wanderbits kenne ich nicht, WGM13 in TCCR1B gibt ja nur eine 
Bitnummer in einem Register an.
WGM13 ist Bit 4.
Bit 4 in TCCR1A ist COM1B0.

Deine LED ist also vermutlich an PD4 (OC1B) statt an PD5 (OC1A) 
gelandet?

Gruß aus Berlin
Michael

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.