Forum: Mikrocontroller und Digitale Elektronik PWM und rgb led


von Fazerfighter (Gast)


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

von Christof Rieger (Gast)


Angehängte Dateien:

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

von Hannes L. (hannes)


Lesenswert?


von Tim Günther (Gast)


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.

von Christof Rieger (Gast)


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 ;-)

von Hannes L. (hannes)


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...

von Fazerfighter (Gast)


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

von Karl H. (kbuchegg)


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.

von Hannes L. (hannes)


Angehängte Dateien:

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.

...

von Hannes L. (hannes)


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.

von Karl H. (kbuchegg)


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 ) {
    ;
  }
}

von Karl H. (kbuchegg)


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. :-)

von Fazerfighter (Gast)


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

von Hannes L. (hannes)


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.

...

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.