www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM AT90CAN128 an OCR2 unc OCR0


Autor: Josef Kkk (zumlin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe gerade ein komsiches Verhalten meines µC entdeckt und kann meinen 
Fehler einfach nicht finden. Ich will 2 PWMs über den µC ausgeben lassen 
und zwar über OCR0 und OCR2, also an PB7 und PB4.
Dazu habe ich zwei Funktionen erstellt:
void init_pwm0(int onoff, int comparevalue)
{
  OCR0A = comparevalue;
  DDRB = (1 << DDB7);
  // xxxxx abc  
  // N= Teiler  abc
  //        000  kein clock
  //        001  kein teiler
  //        010  8
  //        011  64  
  //        100  256  (0=31kHz; 255=122Hz)
  //        101  1024 (0=7,8kHz, 255=30Hz)
  // f = 16MHz / (2*N*(1+OCR0A))
  if(onoff)
    TCCR0A = 0b00011101;
  else
    TCCR0A = 0b00011000;
}

void init_pwm4(int onoff, int comparevalue)
{
  OCR2A = comparevalue;
  DDRB = (1 << DDB4);
  // xxxxx abc  
  // N= Teiler  abc
  //        000  kein clock
  //        001  kein teiler
  //        010  8
  //        011  32  
  //        100  64
  //        101 128
  //        110 256  (0=31.250kHz; 255=122Hz)
  //        111  1024 (0=7,8kHz, 255=30Hz)
  // f = 16MHz / (2*N*(1+OCR0A))
  if(onoff)
    TCCR2A = 0b00011111;
  else
    TCCR2A = 0b00011000;
}
Im Hauptprogramm starte ich diese irgendwo:
  init_pwm0(1, 110 );
  init_pwm4(1, 110 );

Leider kann ich an PB7 keine nützliche PWM sondern nur ein "Flakern" 
finden. PB4 funktioniert. Sobald ich aber nur jeweils eine PWM 
aktiviere, funktioniert diese, egal ob es PB4 oder PB7 ist.

Kann mein µC keine 2 PWMs gleichzeitig erzeugen??

Autor: Josef Kkk (zumlin)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Habe jetzt das ganze mal mit dem 16bit Timer probiert...
void init_pwm6(int onoff, uint16_t comparevalue)
{
  OCR3AL = (uint8_t)(comparevalue&0x00FF);
  OCR3AH = (uint8_t)((comparevalue>>8)&0x00FF);
  TCCR1A = TCCR1A & 0b11001111;
  TCCR1A = TCCR1A | 0b00010000;
  DDRB = (1 << DDB6);
  // xxxxx abc  
  // N= Teiler  abc
  //        000  kein clock
  //        001  kein teiler
  //        010  8
  //        011  64  
  //        100  256  (0=31kHz; 255=122Hz)
  //        101  1024 (0=7,8kHz, 255=30Hz)
  // f = 16MHz / (2*N*(1+OCR0A))
  if(onoff)
    TCCR1B = 0b00011101;
  else
    TCCR1B = 0b00011000;
}

...jedoch mit dem gleichen Effekt (siehe Bild).

Wieder können sich nicht beide PWMs (bzw. CTCs) bilden.
Ich werde noch verrückt. Woran kann das liegen?

PS: Ups. Hab das Bild zweimal hochgeladen :(

Autor: Josef Kkk (zumlin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man finde den Fehler:
DDRB = (1 << DDB6);

...genanu. Da fehlt was!
DDRB |= (1 << DDB6);


So kann man seine Zeit verschwenden :)

Autor: Horst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir jemand sagen wie ich bei dem Programm das tastverhältnis 
ändere???

Autor: Horst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe vergessen zu schreiben das es um den Teil geht:
void init_pwm0(int onoff, int comparevalue)
{
  OCR0A = comparevalue;
  DDRB = (1 << DDB7);
  // xxxxx abc  
  // N= Teiler  abc
  //        000  kein clock
  //        001  kein teiler
  //        010  8
  //        011  64  
  //        100  256  (0=31kHz; 255=122Hz)
  //        101  1024 (0=7,8kHz, 255=30Hz)
  // f = 16MHz / (2*N*(1+OCR0A))
  if(onoff)
    TCCR0A = 0b00011101;
  else
    TCCR0A = 0b00011000;
}


Autor: Josef Kkk (zumlin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sehr sehr lange ist's her, dass ich das geschrieben hab, aber ich würde 
mal behaupten, dass man das Tastverhältnis mit dem comparevalue ändern 
kann. Das das diese Variable ein u16 ist, sollte 2¹⁶ 100% an und 0 immer 
aus bedeuten.

Josef Kkk schrieb:
>
> void init_pwm6(int onoff, uint16_t comparevalue)
> {
>   OCR3AL = (uint8_t)(comparevalue&0x00FF);
>   OCR3AH = (uint8_t)((comparevalue>>8)&0x00FF);
>   TCCR1A = TCCR1A & 0b11001111;
>   TCCR1A = TCCR1A | 0b00010000;
>   DDRB = (1 << DDB6);
>   if(onoff)
>     TCCR1B = 0b00011101;
>   else
>     TCCR1B = 0b00011000;
> }
> 

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.