ATMega32 und PWM - Problem gelöst

  • Hallo Leute,


    wie die Überschrift schon sagt..


    Ich suche einen Bascom Quellcode, der mit einem ATMega 32 eine RGB Led regenbogenartig steuert.


    Gibt ja 100e Beispiele, aber alles mit Schnickschnack, welcher mich total verwirrt, bin Anfänger.


    Hatte vor ca. 1 Woche sage und schreibe eine einzige Schaltung + Quellcode im www gefunden, die genau das macht,


    was ich will. Und selbst nach (ohne Übertreibung) 10-15 Stündiger Suche finde ich besagten Code + Schaltung nicht mehr.


    Auch die hier im Forum vorhandene, vielfach verlinkte Schaltung (Mikrocontroller... II) will bei mir nicht so richtig.


    Klar, Ihr werdet sagen, "lern die Timer und PWM mit Bascom und du kriegst das hin"...aaaber


    ich kann derart schlecht englisch, dass ich die AppNotes usw. nicht kapier.


    Was ich selbst kann: Eine RGB ansteuern, dass sie zB nacheinander R, G, B, gelb, blaugrün, lila und "weiss" leuchtet.


    Aber ich bin zu dumm um beispielsweise blau von 0-255 zu dimmen. Würde ich das hinbekommen, würde ich einen Schritt weiter sein. Denn R,G,B und jede Farbe dimmen können würde ja schon nett aussehen.


    Wenns geht, möchte ich Software-PWM nutzen, um damit bei Bedarf mehrere LEDs unterschiedlich leuchten zu lassen.


    Würdet Ihr so lieb sein und mir mal einen (compilierbaren, also funktionstüchtigen) Code für EINE Led zu posten ?


    Also ich meine Code, der mir eine Led von 0% auf 100% und langsam wieder zurückdimmt.


    Dann kann ich - learning by doing - experimentieren und es vielleicht schaffen, selbst so einen Farbwechsel hinzubekommen.


    Ich sag schon mal ganz herzlich DANKE!


    Euer kernspin

  • Da ich da selber auch noch nicht wirklich eine Ahnung von habe, versuch ich es dir mal so zu
    erklären wie ich es zumindest ohne weitere Hilfe aber allerdings auch ohne Hardware-PWM oder
    Timer
    gemacht habe:



    Die LED an dem 1. Pin ist also 50msek. an und 50msek. aus. 1 Sekunde durch 50 ms ergibt 20, also 20 Hz... das ist jetzt
    nicht sooo gut, das kann man noch wahrnehmen, es flimmert.


    Ändern wir den Code also in folgendes:



    Jetzt haben wir 100Hz, besser. Die LED ist aber noch immer nicht dunkler, das kommt jetzt:



    Die LED ist jetzt 10 mal so lange aus wie an, daher müsste diese jetzt nur noch ein 1/10 der Leuchtkraft
    haben (Die Wahrnehmungsschwelle des Auges und die Farbe der LED mal ausser acht gelassen).


    Hinweis:Das war jetzt nur meine eigene Pi mal Daumen-Erklärung. Sollten da irgendwelche
    Fehler oder Ungenauigkeiten drin sein, zögert nicht mich zu korregieren und mir ne Bratpfanne übern
    Kopp zu ziehen. :)


    Ich hoffe ich konnte einen kreativen Denkanstoß geben.


    Gruß, Dennis :)

  • Also zunächst mal ergibt im ersten Fall 50 ms an und 50 ms aus eine Periode (für eine Rechteckschwingung) von 100 ms, also 10 Hz PWM-Frequenz und nicht 20 Hz. Im zweiten Beispiel mit je 10 ms ergibt es 20 ms für eine Periode und damit also 50 Hz PWM-Frequenz.


    Desweiteren verändert man bei der PWM (lPulsWeiten-Modulation) nur die Pulsweite und hält die Frequenz konstant, ansonsten hätte man auch noch eine Frequenzmodulation dazu. Deshalb würde man im entsprechenden Beispiel dann eher eine on-Zeit von 2 ms und off-Zeit von 18 ms für eine Pulsweite von 10% bei der gleichen Frequenz von 50 Hz (wie vorhin mit 10 ms / 10 ms bei Pulsweite 50 %) wählen.


    Dies alles soll nur dem theoretischen Verständnis dienen. Praktisch erzeugt man PWM mit anderen Mitteln (keine Wait-Schleifen) und sinnvollerweise bei deutlich höheren Frequenzen (ab ca. 200 Hz für LED-Licht).


    Gruss
    Neni

  • Auch die hier im Forum vorhandene, vielfach verlinkte Schaltung (Mikrocontroller... II) will bei mir nicht so richtig.

    Das kann ich mir vorstellen. Die Schaltung ist für einen Tiny2313 geschrieben. Wenn du die auf einem Mega32 benutzen willst, musst du einiges ändern. Gerade die Timer dürften da etwas anders funktionieren.
    Wieso fängst du nicht erst mal mit einem Tiny an?

  • Ups, das kommt davon wenn man sowas fix im Kopf durchrechnet wärend man nebenbei
    noch am Essen ist. :)


    Aber eben, genau mein Reden: richtig macht man das ja sowieso anders. Aber ich denke
    da findet sich bestimmt heute noch der ein oder andere der das gerne mal mit entsprechendem
    Codebeispiel mit Hardware-PWM erklären will. :)


    Gruß, Dennis 8)

  • Danke schon mal an Euch!


    Das mit waitms hab ich auch schon probiert. Funktioniert ja soweit auch. Aber rauf-runterdimmen....


    Angenommen ich möchte hochdimmen, dann würde ich das waitms nach Led-an länger, das waitms nach Led-aus dementsprechend kürzer machen.


    Aber ich krieg das nicht hin mit Automatik.


    Ich bräuchte ja da einen fixen waitms Wert, den ich je nach dimmen auf die An- bzw. Auszeit aufteile zB mit For-Schleife.


    Andy KEH:


    Ich mach mit 2313, Mega8,16 und 32 herum, je nach Zweck.


    Aber ich hab jetzt auf einem Steckbrett die Grundbeschaltung mit Mega32 gefrickelt.


    Die "Aussenbeschaltung" und Programme passe ich dann einfach an. Mega32 auch deshalb, weil ich da nicht auf Codegrösse und Portvielfalt achten muss...im Rahmen natürlich.


    Mir gehts ja bei den ganzen Schaltungen nur ums Prinzip-Lernen, sonst könnte ich ja alles viel billiger fertig kaufen.


    Es geht einfach ums "Ha-das kann ich selber auch, das brauch ich mir nicht kaufen um den Effekt zu haben"..oder so halt gg

  • Nochmal ich...


    Hab jetzt zumindest so ziemlich das gefunden, was ich haben wollte. Weiß ja nicht, ob ich den Link zu einem fremden Forum bzw. Topic posten darf, falls Interesse besteht. Sollte dies nicht erlaubt sein, weist mich bitte darauf hin.


    http://www.mikrocontroller.net/topic/54561


    Leider hat das Ganze keinen Lerneffekt für mich, da das gefundene Prog in C geschrieben ist. Und das kann und will ich nicht lernen.


    Ich klemm mich trotzdem dahinter, sowas in Bascom hinzukriegen.


    LG, kernspin

  • Ersetz doch die Waitms Zeit durch eine Variable. Wenn Bascom das kann.
    Also nicht Waitms 10 sondern Waitms temp ( Also temp=10)
    Dann kannst du bei jedem Schleifendurchgang den Wert von temp inkrementieren und / oder dekrementieren.
    Dann sollte die LED schonmal in einem gewissen Rahmen dimmen.

  • Hallo Kernspin,


    naja, ich kann dir hier ja mal den Link zu meinem RGB-Moodulator angeben, den ich auch heute noch gerne verwende, um die Farbmischung und -güte von RGB-LEDs zu testen. Es basiert auf einem ATmega88 oder ATmega168 und bietet versch. Farbwechselprogramme für zwei RGB-LEDs (6 Hardware-PWM-Kanäle) unabhängig. Die Applikation besteht also zwar nicht gerade NUR aus dem PWM-Code, aber vielleicht kannst du trotzdem was Lernbares da rausholen, obwohl es für einen absoluten Anfänger vielleicht doch etwas zu komplex ist. Die Applikation ist jedenfalls in BASCOM geschrieben.


    -> RGB-Moodulator


    Gruss
    Neni


  • Ui, da sag ich doch auch mal nett danke. Ich denke da bekomm ich einige gute Ansätze *denk* :thumbup:

  • Moin!


    Dankeschön synvox!


    Also, ich hab mal die Datenblätter angeschaut. "Dein Mega168/88" hat 6 Hardware PWM Kanäle, "mein" Mega32 dagegen nur 4.


    Kann also Deinen Code nicht direkt probieren, aber ich habe mit 4 PWM Kanälen genug für meinen Zweck.


    Als nächstes: Ich kann PWM gar nicht lernen, wenn ich nicht mal weiß, wo meine PWM/Timer Ausgänge sind.


    Wenn ich das Datenblatt des Mega32 richtig verstehe, sind die Ausgänge folgende PINs:


    Portb.3 = Timer 0


    Portd.5 = Timer 1 A


    Portd.4 = Timer 1 B


    Portd.7 = Timer 2


    Mit diesen 4 Pins kann ich also was anfangen für meine RGB LED, richtig?


    Und siehe da, mein (für mich riesiges) 1. Ziel habe ich soeben erreicht:




    Eine normale LED dimmt mit diesem Code wunderbar sanft auf und ab. Ich würde mal sagen, die Basis ist gesetzt. *FREEUUU*


    Werd jetzt (4:28 Uhr) gleich weitermachen. Sobald ich es geschafft habe, mit einer RGB Led die 3 Grundfarben nacheinander rauf-und runterfahren kann, melde ich mich wieder.


    Ich hoff ich schaff das mit Deinem Code, Datenblättern und nächtlichem Hirnschmalz *gg*


    DANKE auch an Kanwas!


    LG, kernspin

  • Was ist heute bloss für eine Nacht? Ich schaff Sachen in einer Stunde, die ich in MONATEN nicht geschafft habe.


    Folgender Code macht genau das, was ich wollte: Ohne Schnickschnack eine RGB Led regenbogenartig leuchten lassen.


    Dabei ist das ein Nebeneffekt, denn ich schaffs (noch) nicht, dass anfangs alle LEDs bei 0 anfangen.


    Und ich schaffs auch nicht, nach jedem Runterdimmen einer Farbe NUR die nächste aufdimmen zu lassen.


    Die Dinger bleiben "brennen"


    Ich habs mit Timer1=0 und Timer2=0 probiert


    Ich habs mit Rot=0, Gruen=0, Blau=0 Probiert


    Ich habs mit Compare1a=0, Compare1b, Ocr2=0 probiert


    Ich habs statt mit Do-Loop mit While-Wend probiert




    Könnt Ihr mir da noch auf die Sprünge helfen?


    Aber wie gesagt, folgender Code ist das Endergebnis das ich haben wollte:






    Auf den freundlichen Hinweis von Delphi schreib ich in diesem Post weiter *smile*




    Für alle, die ein KnightRider Lauflicht suchen... bitteschön:





    Oder mal ein "Lauflicht", welches die LEDs im Binärcode hochlaufen lässt: