www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM und rgb led


Autor: Fazerfighter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich hab schon alles ab gegoogelt und mit den beiträgen hier komm ich
teilweiße nicht klar.

Ich noch totaler anfänger.

Hab hier einen M16 mit 8 mhz
und drei leds an Portb.0 - b.2

hab schon etliches versucht mit timern usw. aber bekomme nichts hin.

ich will so einen schönen farbübergang bekommen
nur ich weiß nicht ganz wie man das anstellt

eins hab ich schon geschafft das die leds blinken
und nach einander aus und an gehen

hab hier auch ein paar bücher nur mit denen
hab erst den anfang geschafft und jetzt das mit den leds
da komm ich einfach nicht weiter

hoffe ihr könnt mir das erklären das ich des dann auch versteh

danke schon mal

Autor: Christof Rieger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ist zwar für ATMEL vieleich kannst du was damit anfangen. Sieht viel
Code aus, liegt aber darann, weil ich noch versucht hatte die Seriele
Schnitstelle zu simuliren, zweks Einstellung der Farwerte

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist ein "M16"??
Was ist ein "Atmel"??

Ansonsten:
http://www.mikrocontroller.net/forum/forum.php?que...

...

Autor: Tim Günther (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls du mit M16 einen Atmel ATmega16 meinst, müsste dir das o.g.
PWM-Tutorial helfen. Für RGB brauchst du jedoch 3 PWM-Kanäle, müsstest
also Timer 1 und Timer 2 für PWM nutzen bzw einen Software-PWM
aufbauen.

Autor: Christof Rieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
O.K. ...HanneS...
Du has ja recht. Ich war wieder schlampig. Aber wenn man die Anlage
öffnet, dann kann man an der inc - Datai erkennen, was ich meine. War
halt müde. Sorry ;-)

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Christof:

Das war eigentlich als Scherz (mit ernstem Hintergrund) gedacht.
Denn den Mega16 sollte man nicht M16 nennen, da es einen
16-Bit-Mikrocontroller mit diesem Namen gibt. Und da ich einmal dabei
war, ist mir eingefallen, dass ATMEL nicht nur AVRs herstellt, sondern
auch 8051er, ARMs und etliches mehr. Nimms also bitte nicht
persönlich...

Bit- & Bytebruch...
...HanneS...

Autor: Fazerfighter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also als M16 meinte ich den Atmega 16
Ja nach den ganzen links hab ich aber
immer noch nicht ganz verstanden wie man
so ein Software PWM aufbaut.

Also entweder stell ich mich zu blöd
an oder ich brings irgend wie nicht hin

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

Bewertung
0 lesenswert
nicht lesenswert
Ist ganz simpel.
Was macht den eine PWM?
Eine PWM ist zunaechst mal ein periodisches Signal.
D.h. alle x Zeiteinheiten beginnt ein neuer Zyklus und das
Signal geht auf High. Nach einer bestimmten Zeitdauer,
die kleiner als die Periodendauer ist, nennen wir sie mal y,
geht das Signal wieder auf low. Und das wars dann auch schon.
Indem du y variierst, kannst du bestimmen, wieviele % der Zeit
von x das Signal auf high ist und wieviele % es auf low ist.


       <---y----->

       +---------+         +---------+
       |         |         |         |
       |         |         |         |
  -----+         +---------+         +-------

       <---------- x ------>

Du realisierst dir das zb. mit einem Timer. Den stellst
du zb. so ein, dass die Zeitdauer x mit, sagen wir mal 1000
Timer Overflows erreicht wird. d.h. du hast innerhalb des
Timer Overflows einen Zaehler mitlaufen, der bei jedem Overflow
um 1 erhoeht wird. Ist er bei 1000 angelangt (der 1000.-te
Overflow ist gerade duerchgekommen), dann setzt du den Zaehler
wieder auf 0.

Damit hast du den Basistakt, der die Zeitdauer x mittels 1000
Timer Overflows festlegt. Jedes mal wenn der Zaehler auf 0
zurückgesetzt wird, schaltest du den Ausgang auf High. Und wenn
der Zaehler einen bestimmten Wert, eben y, erreicht hat, schaltest
du den Ausgang wieder auf Low. Durch Variation von y kannst du
jetzt in diesem Zeittakt den Ausgang nur ganz kurz einschalten
oder auch länger.

Autor: Hannes Lux (hannes)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das Beispiel im Anhang ist zwar (aus heutiger Sicht) auch nicht das
Nonplusultra, aber es könnte dir beim Verständnis der Software-PWM
helfen.

...

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hätt ich gewusst, dass Karl-Heinz antwortet, hätt ich mir meinen Beitrag
sparen können... ;-)

(Und hätte ich Enten gekauft, dann wären die Hühner nicht ersoffen...)

> kannst du bestimmen, wieviele % der Zeit...

Hmmm... Prozente (auf Basis 100) sind was für Menschen. Auf dem AVR
verwende ich gerne "binäre Prozente", also auf Basis 256 oder 128...

Duck & weg...

...Bit- & Bytebruch...
...HanneS...

Achja, einige weitere Beispiele mit Software-PWM findest du auf
www.hanneslux.de/avr/ unter Modellbau in den verschiedenen
Fahrtregler-Projekten.

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

Bewertung
0 lesenswert
nicht lesenswert
Damit ich auch mal was beitrage:
Hier meine SW-PWM fuer 8 Kanäle am B-Port
(Wird im Endausbau ein geiles Ding: an praktisch
jedem Portpin haengt eine PWM ueber die ich weisse
LEDS in der Helligkeit steuere. Meine Frau wünscht
sich einen Sternenhimmel, also kriegt sie ihn auch.
Einfach nur LEDS ist aber fad. Die muessen schon
unabhängig voneinander flackern koennen :-)

#include <avr/io.h>
#include <avr\signal.h>
#include <avr\interrupt.h>

volatile unsigned char PWM[8];
volatile unsigned char PWM_Cnt;

SIGNAL( SIG_OVERFLOW0 )
{
  unsigned char i;
  unsigned char NewPortState = 0;

  PWM_Cnt++;

  for( i = 0; i < 8; ++i ) {
    if( PWM_Cnt < PWM[i] ) {
      NewPortState |= ( 1 << i );
    }
  }

  PORTB = NewPortState;
}

int main()
{
  PWM_Cnt = 0;

  PWM[0] = 99;
  PWM[1] = 89;
  PWM[2] = 79;
  PWM[3] = 04;
  PWM[4] = 03;
  PWM[5] = 02;
  PWM[6] = 01;
  PWM[7] = 00;

  DDRB = 0xFF;
  PORTB = 0x00;

  TCCR0 = ( 1 << CS00 );
  TIMSK = ( 1 << TOIE0 );
  sei();

  while( 1 ) {
    ;
  }
}

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

Bewertung
0 lesenswert
nicht lesenswert
Oops, da hab ich etwas zuviel rausgelöscht.
Die Overflow Funktion muss natürlich so aussehen:

SIGNAL( SIG_OVERFLOW0 )
{
  unsigned char i;
  unsigned char NewPortState = 0;

  PWM_Cnt++;

  for( i = 0; i < 8; ++i ) {
    if( PWM_Cnt < PWM[i] ) {
      NewPortState |= ( 1 << i );
    }
  }

  PORTB = NewPortState;

  if( PWM_Cnt > 99 )
    PWM_Cnt = 0;
}

Der Periodenzähler muß ja uch zurückgesetzt werden. :-)

Autor: Fazerfighter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schön und gut
dein code würde ja
funktionieren wenn ich wüsste wie ich im
avr studio 4
irgend wie will des net
hab die meiste zeit oder hauptsächlich
nur mit dem bascom also basic angefangen
und mit dem assembler hab ich noch gar nix gemacht
sorry

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
- AVR-Studio von ATMEL downloaden,
- AVR-Studio installieren,
- AVR-Studio aufrufen,
- neues Projekt (im eigenen Ordner) anlegen (Simulator, ATMega8535),
- den Quelltext in das Editorfenster des Projekts kopieren,
- mit F7 speichern und assemblieren,
- im Output-Fenster (unten links) die Meldungen überprüfen,
- wenn fehlerfrei, dann:
- mit Control-F7 Simulator starten,
- mit F11 im Einzelschrittmode das Programm simulieren und versuchen
  zu verstehen.
- Im anderen Fenster Datenblatt des ATMega8535 aufrufen und bei
  Unklarheiten darin nachschlagen.

...

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.