mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Verschiedene Helligkeiten mit Schieberegister


Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo allerseits,

Ich habe eine kurze Frage. Und zwar habe ich ein Lauflicht mit einem
ATmega8 und zwei Schieberegistern (HEF4094) realisiert (in BASCOM). Das
hat super funktioniert (ist ja auch nicht schwer - gg).
Nun möchte ich aber etwas anspruchsvolleres probieren. Und zwar möchte
ich eine Art Welle programmieren. Da soll es natürlich ein Tal und ein
Maximum geben.
Wie kann ich aber mit den Schieberegistern verschiedene Helligkeiten
ausgeben. Geht das überhaupt, oder gehen ich mit dieser Lösung in die
falsche Richtung??

Ich hoffe, dass mir irgendwer helfen kann!! Vielen Dank im Voraus!

mfg
Andy

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar geht das (auch in BASCOM)...
Dazu muss man mehrere Bytes nacheinadner ausgeben, und diejenigen LEDs,
die heller als die andere erscheinen sollen öfter ausgeben.

z.B.

(1) 10000000
(2) 11000000
(3) 11100000
(4) 11110000
(5) 11111000
(6) 11111100
(7) 11111110
(8) 11111111

Wenn man diese 8 Byte in regelmässigen Abständen nacheineinander
ausgibt, erscheint es, als leuchtete das erste Bit am hellsten und das
letzte am schwächsten.
Dabei sollte die Ausgabefrequenz augenfreundlich wählen, weil es sonst
zu Flackereffekten kommt.
Sowas müsste man auch in BASCOM hinbekommen...

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Rahul,

Vielen Dank für deine rasche Antwort! Werd ich gleich probieren...

Gibt es auch noch eine andere Möglichkeit, das hinzubekommen. Ich
möchte gerne mehrere Varianten kennenlernen.

mfg

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Mehrkanal-PWM in Basic mit augenfreundlicher Wiederholfreqeunz auf
Schieberegister hinzubekommen, könnte sehr haarig werden.

Da sind Assembler oder C wesentlich besser geeignet.


Peter

Autor: Sebatsian Heyn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum? wenn du mit hardware spi die daten rausschiebst?

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe eigentlich vor mit der Hardware spi zu arbeiten. Hab ich auch
schon hinbekommen. Und wie funktioniert das mir der Mehrkanal-PWM?

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine PWM ist doch im Grunde nichts anderes als
eine bestimmte Rechteckschwingung an einem Ausgang.

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

Entscheidend ist dabei das zeitliche Verhältnis von High-Pegel
zu Low-Pegel. Warum? Weil die dadurch übertragene Energie
proportional zur Fläche unter der Kurve ist. Sind die High-
Pegel jetzt aber schmal


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

so ist die Fläche und damit die übertragene Energie kleiner,
als wenn die High-Pegel breit sind.


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

So weit klar?
Gut.

Nun, wie kann man sowas erzeugen?
Letztendlich läuft es doch immer darauf hinaus, dass der
Ausgabe-Pin eine bestimmte Zeit lang eingeschaltet ist
(der High-Puls) und dann eine bestimmte Zeit lang aus-
geschaltet wird (der Low-Puls). Das kann zb ein Timer
übernehmen, muss er aber nicht. Das kannst du auch selbst
machen. Du musst nur dafür sorgen, dass ein Pin in regelmässigen
Abständen High-Low toggelt und dass du das Verhältnis von
High zu Low Zeit einstellen kannst.

Sagen wir mal du gibst in einer Schleife immer wieder ein sich
wiederholendes Muster von 8 Werten (0 oder 1) auf einen Pin aus.
Sagen wir mal weiter, dass ein Durchlauf durch die Schleife genau
1 ms dauert.

Das Muster könnte zb sein:

 0 0 0 0 0 0 0 0

das heist dann: der Ausgane-Pin ist ständig low. Oder in Zeiten
ausgedrückt: der Ausgabe-Pin ist 8ms low und überhaupt nie high.

Oder das Muster könnte sein

 1 1 1 1 0 0 0 0

das heist dann: der Ausgabe-Pin ist 4 ms high und dann 4 ms low
(dann wiederholt sich das Spielchen, denn die Schleife läuft immer
wieder und immer wieder und gibt immer dieselbe Abfolge dieser
8 Werte aus).

Oder das Muster könnte sein:

 1 1 1 1 1 1 0 0

das heist dann: der Ausgabe-Pin ist 6 ms high und 2 ms low.

Durch die Anzahl der 1-en die da hintereinander am selben Pin
ausgegeben werden, steuere ich das Verhältnis (zeitlich gesehen)
von High-Zeit zu Low-Zeit. Und genau das ist ja das Wesen einer
PWM.

Für eine Mehrkanal-PWM machst du jetzt das selbe Spielchen
an mehreren Output-Pins gleichzeitig. Anstatt also nur einen
Pin in der Schleife auf 0 oder 1 zu setzen, macht man das halt
zb mit einem kompletten Port an allen Pins.

Bei dir kommt jetzt natuerlich noch hinzu, dass du die
eigentlichen Output-Pins nicht am µC hast, sondern dass die
am Schieberegister abgegriffen werden. Aber das Prinzip
ist das gleiche: Du musst nur dafür sorgen, dass ein Schieberegister
Output Pin im richtigen High-Low Verhältnis umgeschaltet wird.
Du lädst also das Schieberegister ständig neu. Immer und immer
wieder und sorgst mit obiger Technik dafür, dass das Puls/Pausen
Verhältnis dem entspricht was du haben möchtest.

Wenn man das mal verstanden hat, dann ist das mit Schieberegistern
auch nicht schwer zu realisieren. Ich bin allerdings ein starker
Verfechter der 'zum Lernen so einfach wie möglich'-Technik. Daher
würde ich Dir mal empfehlen eine LED mal direkt am µC anzu-
schliessen und diese LED durch gezieltes 'Wackeln' am Pin in
der Helligkeit zu regeln. Wenn du das erst mal durchschaut hast,
dann sollte die Verkomplizierung durch das SR auch keine
Rolle mehr spielen.


Und genau das will ich ja: das ist eine

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Andy,

Du setzt einen Timerinterupt auf, z.B. alle 50µs und läßt dort eine
Variable von 99 auf 0 runterzählen usw.. Diesen Wert vergleichst Du mit
8 Variablen (0..100), die der Helligkeit der LEDs entsprechen und setzt
dann entsprechend die Bits im Schiebewert.

D.h. die LEDs sind 0..100 von 100 Interrupts an.


Peter

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Karl Heinz:
Vielen Dank für deine ausführliche Erläuterung. Diese Variante ist das,
was ich gesucht haben. Besten Dank!

@ Alle:
Danke für eure rasche Hilfe. Das ist es, was ich an diesem Forum so
mag!!

THX Andy

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.