mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega8 und PWM


Autor: jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

für ein kleines Übungsprojekt mit einem Atmega8 möchte ich 4 PWM-
Kanäle zum Regeln der Helligkeit von LEDs verwenden.

Im Datenblatt lese ich von "Three PWM Channels", den vierten Kanal 
möchte ich mit einem Timer realisieren.

Das ganze mit einem CAN-Interface, also benötige ich noch die 
SPI-Schnittstelle und zum Debuggen die UART-Port.

Nun stellt sich mir die Frage: geht das?

Im Datenblatt lese ich von PWM10 und PWM11, zusätzlich zu den drei PWMs 
benötige ich noch einen Timer.

Inwieweit kann ich diese Anfordrungen auf einem Atmega8 kombinieren?

Die Anforderungen an den PWM sind "überschaubar", die kürzesten 
Low/Highzeiten sind 10us; von der Theroie her sollte es also gehen, alle 
10us einen Interrrupt auszulösen und die IOs entsprechend im Pegel zu 
ändern. (gesetz dem Fall, dass keine drei PWMs unabhängig voneinander 
laufen, bzw den vierten PWM mus sich so realisieren).

rätselnde Grüße
jochen

Autor: Ale (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich wurde es per soft machen, ein Interrupt je 10 us, 4 IOs als 
Ausgänge, 4 (lo)Register kein push/pop. sher einfach und schnell. Takt 
wurde ich 8 MHz (So du hast Zeit für CAN Prozesse)

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

Bewertung
0 lesenswert
nicht lesenswert
Ale hat recht.
Da du sowieso mindestens eine PWM in Software realisieren musst,
kannst du auch gleich alle 4 in Software realisieren. Dadurch
werden wenigstens alle 4 PWM identisch angesteuert und der
Programmaufbau vereinfacht sich.

Wenns nur ein Übungsbeispiel sein soll, würde ich
ganz einfach den Timer0 mit einem Overflow Interrupt
betreiben.
uint8_t PWMCounter;
volatile uint8_t PWM1;      // PWM Wert für LED 1
volatile uint8_t PWM2;      // PWM Wert für LED 2
volatile uint8_t PWM3;      // PWM Wert für LED 3
volatile uint8_t PWM4;      // PWM Wert für LED 4

ISR( TIMER0_OVF_vect )
{
  PWMCounter++;

  if( PWMCounter > 64 )  // oder wieviele PWM Stufen du brauchst
    PWMCounter = 0;

  if( PWM1 < PWMCounter )
    // Led 1 einschalten
  else
    // Led 1 ausschalten

  if( PWM2 < PWMCounter )
    // Led 2 einschalten
  else
    // Led 2 ausschalten

  if( PWM3 < PWMCounter )
    // Led 3 einschalten
  else
    // Led 3 ausschalten

  if( PWM4 < PWMCounter )
    // Led 4 einschalten
  else
    // Led 4 ausschalten
}

Durch zuweisen von Werten von 0 bis 63 regelst du dann die
Helligkeit deiner LEDs.

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Hacker schrebit das natürlich so ;-)
PWMCounter = ++PWMCounter & 0x1F;


Ist aber genauso effektiv wie:

 PWMCounter++;

  if( PWMCounter > 64 )  // oder wieviele PWM Stufen du brauchst
    PWMCounter = 0;

Macht aber keinen so coolen Eindruck ;-)

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> PWMCounter = ++PWMCounter & 0x1F;
Na, da hat der "Hacker" sich aber verhauen... Wohl eher "& 0x3F"...

Autor: Bastelmensch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> PWMCounter = ++PWMCounter & 0x1F;
> Na, da hat der "Hacker" sich aber verhauen... Wohl eher "& 0x3F"...

HARHARHAR! Ich schmeiß mich weg!

Autor: Ale (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der richtige Hacker wurde es auf asm codieren !!!

PWM Werte auf r2,r3,r4,r5

r6 ergilt PWMCounter
r7 hat 0x3f
r16 scratch

__timer0_ovf_int:
  inc  r6
  and  r6,r7

  in   r16,PORTx
  andi r16,LED_MASK_ALLE_AUS
  cp   r2,r6
  brcc .+2
  ori  r16,LED0_AN
  cp   r3,r6
  brcc .+2
  ori  r16,LED1_AN
  cp   r4,r6
  brcc .+2
  ori  r16,LED2_AN
  cp   r5,r6
  brcc .+2
  ori  r16,LED3_AN

  out  PORTx,r16
  reti

So 20 Takte, nicht so schlecht :-)

Gruß

Ale

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.