mikrocontroller.net

Forum: Compiler & IDEs PWM für Anfänger


Autor: Rocco L. (kaufparkangucker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin gerade im GCC Tutorial über PWM gestolpert und fand das eine 
feine Idee um mal mit einem LED herum zu spielen.

Mir fehlt nur die Idee wie ich das Signal einem PORT Pin in einer While 
übergebe. Also so das das LED hoch und runter fadet.

bisher sieht es so aus:
  #include <avr/io.h>
 
int main()
{
  // OC1A auf Ausgang
  DDRB = (1 << PB1 );  //ATMega8
  // DDRD = (1 << PD5 ); //ATMega16
  //
  // Timer 1 einstellen
  //  
  // Modus 14:
  //    Fast PWM, Top von ICR1
  //
  //    WGM13    WGM12   WGM11    WGM10
  //      1        1       1        0
  //
  //    Timer Vorteiler: 1
  //     CS12     CS11    CS10
  //       0        0       1
  //
  //  Steuerung des Ausgangsport: Set at BOTTOM, Clear at match
  //     COM1A1   COM1A0
  //       1        0
 
  TCCR1A = (1<<COM1A1) | (1<<WGM11);
  //TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10);
  TCCR1B =  (1<<CS10);
 
  //  den Endwert (TOP) für den Zähler setzen
  //  der Zähler zählt bis zu diesem Wert
 
  ICR1 = 0x6FFF;
 
  // 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 = 0x3FFF;
 
  while (1) {

  }
}


Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rocco L. schrieb:

> Mir fehlt nur die Idee wie ich das Signal einem PORT Pin in einer While
> übergebe. Also so das das LED hoch und runter fadet.

Wozu musst du da einer 'while' einen Pin übergeben?

Deine PWM und damit die Helligkeit, wird eingestellt, indem du an OCR1A 
einen Wert zuweist. Und genau das machst du dann
int main()
{
  uint16_t i;

  ....

  while( 1 ) {

    for( i = 0; i < 0x6FFF; ++i ) {
      OCR1A = i;
      _delay_ms( 10 );
    }

    for(  ; i > 0; --i ) {
      OCR1A = i;
      _delay_ms( 10 );
    }
  }
}

Autor: Rocco L. (kaufparkangucker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, macht genau was es soll.
Ich hoffe das ich auch langsamm da ran komme das mir der Code selber 
einfällt.

Und fals es nochmal jemand machen will:

PWM Pulsweitenmodulation an einem LED am Atmega:
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#define F_CPU 100000UL
#include <util/delay.h>
#include <stdint.h>
 
int main()
{
  uint16_t i;
  // OC1A auf Ausgang
  DDRB = (1 << PB1 );  //ATMega8
  // DDRD = (1 << PD5 ); //ATMega16
  //
  // Timer 1 einstellen
  //  
  // Modus 14:
  //    Fast PWM, Top von ICR1
  //
  //    WGM13    WGM12   WGM11    WGM10
  //      1        1       1        0
  //
  //    Timer Vorteiler: 1
  //     CS12     CS11    CS10
  //       0        0       1
  //
  //  Steuerung des Ausgangsport: Set at BOTTOM, Clear at match
  //     COM1A1   COM1A0
  //       1        0
 
  TCCR1A = (1<<COM1A1) | (1<<WGM11);
  //TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10);
  TCCR1B =  (1<<CS10);
 
  //  den Endwert (TOP) für den Zähler setzen
  //  der Zähler zählt bis zu diesem Wert
 
  ICR1 = 0x6FFF;
 
  // 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.
 
   while( 1 ) {

    for( i = 0; i < 0x6FFF; ++i ) {
      OCR1A = i;
      _delay_ms( 10 );
    }

    for(  ; i > 0; --i ) {
      OCR1A = i;
      _delay_ms( 10 );
    }

   }
  //OCR1A = 0x3FFF;
 
}

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.