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
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...
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
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
warum? wenn du mit hardware spi die daten rausschiebst?
Ich habe eigentlich vor mit der Hardware spi zu arbeiten. Hab ich auch schon hinbekommen. Und wie funktioniert das mir der Mehrkanal-PWM?
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
@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
@ 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.