Forum: Compiler & IDEs PWM_Atmega 88


von _Tom (Gast)


Lesenswert?

hallo zusammen, ich wollt ein wenig mit PWM rumspielen! nutze dafür den 
8bit timer0 vom at88!
nur leider lauft der code nicht! ich habe testweise eine led 
angeschlossen!
die led bleibt dunkel!


#include <avr/io.h>
void main(void)
{
  DDRD |= (1<<DDD6 ) ;
  // Timer/Counter Control Register A
  TCCR0A |= (1<<COM0A1);
  TCCR0A |= (1<<WGM00);
  TCCR0B |= (1<<WGM02);
  TCCR0B |= (1<<CS02 ) //clkI/O/256 (From prescaler)

  TCNT0 = 0;
  OCR0A = 0;

  while(1)
  {
    _delay_ms(500);
                OCR0A=OCR0A+10;
  }

}

kann mir jemand weiter helfen?

von Stefan E. (sternst)


Lesenswert?

Du variierst ja auch nur die PWM-Frequenz und nicht den Duty-Cycle.

Also bitte nochmal ins Datenblatt schauen, welchen PWM-Mode du da 
ausgewählt hast und wie der funktioniert.

von sd (Gast)


Lesenswert?

TCCR1A = (1<<COM1A1) | (1<<WGM11);
TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10);

//  den Endwert (TOP) für den Zähler setzen
//  der Zähler zählt bis zu diesem Wert
ICR1 = 0x28C0;

  // der Compare Wert
  // Wenn der Zähler diesen Wert erreicht, wird mit
  // obiger Konfiguration der OC1A Ausgang abgeschaltet
  // Sobald der Zähler wieder bei 0 startet, wird der
  // Ausgang wieder auf 1 gesetzt
  //
  // Durch Verändern dieses Wertes, werden die unterschiedlichen
  // PWM Werte eingestellt.

 // OCR1A = XXX; // 0x0400;

So hab ich das mal gemacht. Ist zwar für Timer 1. Aber umbauen für Timer 
0 sollte ja möglich sein.

Beispiel findest Du aber auch im Tutorial.

Gruß

SD

von _Tom (Gast)


Lesenswert?

danke für die antwort :) ich habe jetzt   "TCCR0B |= (1<<WGM02); " 
weggelassen und somit

Mode:1 PWM, Phase Correct

TOP: 0xFF
Update of OCRx at :TOP
TOV Flag Set on :BOTTOM

so funitoniert es auch!
Nur jetzt wird mir noch nicht ganz so klar, wozu ich überhaupt diesen 
mode:5 brauche! ich denke ich wühl mich nochmal durch das datenblatt! 
mir fehlt da noch iwas grundlegendes!

von Stefan E. (sternst)


Lesenswert?

_Tom schrieb:

> Nur jetzt wird mir noch nicht ganz so klar, wozu ich überhaupt diesen
> mode:5 brauche

Um die PWM-Frequenz feiner einstellen zu können.

von _Tom (Gast)


Lesenswert?

hat jemand evt nen kleines beispiel um das zu verdeutlichen ?

von Karl H. (kbuchegg)


Lesenswert?

Was willst du da verdeutlichen?
Die Tabelle auf Seite 99 zeigt es doch ganz deutlich:

Der einzige Unterschied zwischen Mode 1 und Mode 5 besteht darin, dass 
in Mode 1 der Timer immer bis 0xFF zählt ehe er wieder runterzählt und 
im Mode 5 kannst du einen anderen Wert als 0xFF über das Register OCRA 
vorgeben. Schreibst du also in OCRA den Wert 0xF0 hinein, dann zählt der 
Timer eben nicht mehr bis 0xFF sondern nur noch bis 0xF0 hoch und dann 
wieder runter. Schreibst du 0x40 hinein, dann zählt der Timer nur bis 
0x40 und dann wieder runter etc.

Je weniger hoch er zählen muss, desto schneller geht das auch.
Wenn du in 1 Sekunde immer um 1 weiter zählst, dann dauert es 100 
Sekunden bis du bei 100 angelangt bist, aber nur 45 Sekunden ehe du bei 
45 bist. Und da f = 1/T ist, besteht ein indirekter Zusammenhang 
zwischen der Zeit zum Zählen und der Frequenz die dabei herauskommt, 
wenn man bei bestimmten (gleichen) Zählerständen etwas macht.

von _Tom (Gast)


Lesenswert?

das hab ich soweit auch gesehen!
nur ist mir noch klar,in welchen register ich den wert, wo PD6 ein bzw. 
ausgeschaltet werden soll, eintrage!
das habe ich ja im mode 1 im register OCR0A gemacht! nur ist dieses 
register im mode:5 jetzt TOP !?!
ich glaub ich sollte ma leben kurz den kram beiseite legen und da nacher 
nochmal raufgucken

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.