Hallo alle zusammen, ich muss für die Schule eine rgb led mit dem micro controler atmel T89C51RC2 mit einem capture and compare Register und einer pwm in assembler so programmieren das ich sie dimmen kann. Nun habe ich leider das Problem das ich garkeine Ahnung habe wie ich das anstellen soll.Das Datenblatt hilft mir auch nicht wirklich weiter. Darum jetzt hier meine Frage ob mir jemand einen Ansatz oder sogar ein vollständiges Programm schreiben könnte. Denn mit einem Beispiel würde ich das ganze vielleicht besser verstehen. Danke schon mal an alle Antwortenden. Mfg.Yazoo
http://mikrocontroller.rahm-home.de/SpezialProg.htm http://mikrocontroller.rahm-home.de/docfiles/Uebungen/4_5_Programmable_Counter_Array_PCA.pdf
Der Controller ist ja auch noch alt wie Steinkohle.
wurde von der Schule gestellt konnte mir keinen aussuchen aber ihc versteh immernoch nicht richtig wie ich jetzt die Led zum dimmen bringen kann :(
Yazoo schrieb: > wurde von der Schule gestellt konnte mir keinen aussuchen > aber ihc versteh immernoch nicht richtig wie ich jetzt die Led zum > dimmen bringen kann :( Deine Hausaufgaben musst du schon selber machen. Wenn dir das hier jemand vorkaut, hast du gar nichts davon. Ich würde mich an deiner Stelle mal zum Thema PWM einlesen. Dann ist es sicher nicht verkehrt zu wissen, wie sich so ein Mikrocontroller im allgemeinen konfigurieren lässt (Stichwort: Register). Zu guter Letzt, bleiben noch die Links aus meinem vorigen Post, in denen erklärt wird wie man über die PCA eines 8051 mehrere PWM-Signale erzeugen kann. Dort steht geschrieben, welche Register geschrieben werden müssen, um deine Aufgabe zu lösen. Gruß Oliver
Okay werde ich mal machen. Hoffentlich kapier ich das bis Übermorgen xD und danke für die Reposts :D
Also dann hätte ich nochmal eine Frage. Wenn ich den CMOD auf 1MHz stelle und den CCAPM0 auf die 8-bit PWM und CCAP0L und CCAP0H auf 0 dann hab ich doch eine Zeitspanne von 256 micro sek.? Jetzt wollte ich fragen ob es irgentwie möglich ist nach dem Overflow eine tabelle mit 256 möglichen Zuständen um 1 zu vermindern. Weil ich hab mir gedacht das ich die Led vielleicht so dimmen könnte, das heißt 11111111b ist volle Leistung und bei 00000000b ist die Led aus mfg. yazoo
Yazoo schrieb: > Wenn ich den CMOD auf 1MHz stelle Der Takt hängt vom angeschlossenen Quarz ab. Was für ein Quarz hängt denn dran? > Jetzt wollte ich fragen ob es irgentwie möglich ist nach dem > Overflow eine tabelle mit 256 möglichen Zuständen um 1 zu vermindern. Ja das geht. Ist aber zu schnell für das Auge, um das Dimmen wahrzunehmen. Ich würde das im Hauptprogramm machen und mit Verzögerungsschleifen arbeiten. Dann immer bloß das CCAP0H neu schreiben und damit den neuen PWM-Duty-Cycle einstellen. Die Daten können von einer Lookuptable stammen. Beispiele für Lookuptables gibt es im Netz zu Hauf. PS. Wie lange hattest du eigentlich Zeit dafür? Gruß Oliver
Oje und wieder Sachen die ich nicht verstehe xD ungefähr ne woche und es ist nichtmal bestandteil des lehrplans is halt son projekt wo man eine Note drauf bekommt und ersetzt die einzige Arbeit in dem Halbjahr und ich glaube im mom echt nicht dass ich das noch hinbekomme .......
Yazoo schrieb: > und ich glaube im mom echt nicht dass ich > das noch hinbekomme Du schaffst das schon. Was verstehst du denn nicht?
Also ich versteh nicht genau wie die PWM mit dem Dimmen der Led zusammen hängt ich habe die PWM so verstanden das sie unabhängig vom Programm abläuft und an CEXn entweder 1 oder 0 ausgibt je nachdem ob cl<ccapnl oder cl>=ccapnl ist, und je nachdem wie ich ccapnl einstelle ist CEXn eine bestimmte Zeit auf 0 und eine bestimte Zeit auf 1. Desweitern ich habe mir gedacht dass ich cappnh und cappnl immer gleich lasse da ich mit denen ja nur die Länge steuere die die Led in einem Zustand leuchted. Jetzt hab ich aber auch wieder das Problem das ich nicht weiß wie die einzelnen farben der rgb Led angesteuert werden denn wie der name ja schon sagt ist es eine RGB led also rot,grün,blau und wie ich sie mische weiß ich schon garnicht und ich glaube nichtmal das ich jetzt alles aufgeführt habe was ich nicht verstehe weil ich langsam total verwirrt bin mfg yazoo
Yazoo schrieb: > Also ich versteh nicht genau wie die PWM mit dem Dimmen der Led zusammen > hängt Eine PWM ist eine Pulsweitenmodulation. Das heißt es werden Spannungspulse erzeugt, die unterschiedliche Breite haben können. Die Breite stellst du über das CCAPXH. Je breiter die Pulse werden, umso heller wird die angeschlossene LED. Jetzt kommt der Clou. Wenn du 3 PWM-Kanäle hast, kannst du die 3 Farben der RGB-LED dort anschließen. Deren Helligkeit kannst du über das dazugehörige CCAPXH-Register einstellen. Somit kann man über 3 CCAPXH-Register Farben mischen. Beispiel: --------- Rot an CEX0 Blau an CEX1 Grün an CEX2 CCAP0H = 185; CCAP1H = 255; CCAP2H = 50; Welche Farbe dabei herauskommt weiß ich jetzt nicht, aber es ist definitiv eine Farbmischung. > Desweitern ich habe mir gedacht dass ich cappnh und cappnl immer gleich > lasse Du brauchst nur cappnh schreiben, cappnl bezieht seinen Wert daraus bei einem Überlauf und ist somit automatisch gleich. Gruß Oliver
Okay :D das heißt also indem ich das ccapxh in dem fall größer mache wird die Led schwächer? also muss ich für mein programm eigentlich nur 3 schleifen machen und ccapxh jeweils immer größer werden lassen ? aber dann is noch mein problem kann ich CEX0,CEX1,CEX2 direkt an meine ausgangsports p1,p2,p3 schreiben oder muss ich das über den Akku machen? und wenn ich es über den Akku machen muss wüsste ich nicht wie denn ich müsste sie ja gleichzeitig ausgeben und dann würde ich den Akku ja immer überschreiben und würde das bedeuten das die RGB Led 3 Anschlüsse hat? also für jeden Anschluss eine Farbe? sry dass ich so viel Frag mfg. Yazoo
Yazoo schrieb: > also muss ich für mein programm eigentlich nur 3 schleifen machen und > ccapxh jeweils immer größer werden lassen ? Um wirklich "alle" Farben zu erzeugen, sollten die Schleifen auch noch verschachtelt sein...
Ach auch noch xD naja jetzt versteh ich zumindest ein bisschen mehr und mit den Ausgängen kannst du mir nicht helfen?
Yazoo schrieb: > und würde das bedeuten das die RGB Led 3 Anschlüsse hat? also für jeden > Anschluss eine Farbe? Ja und einen 4. gemeinsamen Anschluss, den sich alle 3 LEDs Teilen. > das heißt also indem ich das ccapxh in dem fall größer mache wird die > Led schwächer? Ja. Vielleicht aber auch stärker. Komm darauf an, wie die LEDs angeschlossen sind. Am besten, du probierst es aus. > also muss ich für mein programm eigentlich nur 3 schleifen machen und > ccapxh jeweils immer größer werden lassen ? Ja. Das dürfen aber keine Endlosschleifen sein. > aber dann is noch mein problem kann ich CEX0,CEX1,CEX2 direkt an meine > ausgangsports p1,p2,p3 schreiben oder muss ich das über den Akku machen? Das machen die PCA von alleine. Da brauchst du dich nicht drum kümmern. Es reicht die ccapxh zu setzen und damit veränderst du unmittelbar die Helligkeit der angeschlossenen LED. > sry dass ich so viel Frag Dafür brauchst du dich nicht entschuldigen. Gruß Oliver
Das ist mal was was man gerne hört :D Ich probier das ganze mal und meld mich dann nochmal Morgen :D mfg Yazoo
Yazoo schrieb: > Ich probier das ganze mal > und meld mich dann nochmal Morgen :D Viel Erfolg. Gruß Oliver
So und da bin ich schon wieder :D Ich wollte mal fragen ob es geht das ich einfach dec ccapxh schreibe oder wie ich das Runterzählen sonst machen kann :D oder halt inc je nachdem
Nein. Der dec-Befehl kann nur auf den internen Ram (idata, die ersten 128 byte) zugreifen. Die ccapxh-Register liegen bei 0xFAh. Du müsstest dir den Wert von CCAPxH zu Beispiel in den Akkumulator laden und ihn dort dekrementieren. Anschließend ins ccapxh-Register zurückschreiben. Das würde für CCAP0H so aussehen:
1 | mov a, CCAP0H |
2 | dec a |
3 | mov CCAP0H, a |
Ob der Code funktioniert bzw. überhaupt richtig ist, kann ich nicht sagen. Ich bin nämlich kein (8051-)Assembler-Programmierer. Gruß Oliver
Oliver J. schrieb: > Nein. Der dec-Befehl kann nur auf den internen Ram (idata, die ersten > 128 byte) zugreifen. Doch, natürlich geht DEC/INC auch auf SFRs. Das einzige, was nicht auf SFRs geht, sind indirekte Befehle (mit @R0, @R1), die gehen dann in die oberen 128Byte SRAM. Peter
Peter Dannegger schrieb: > Doch, natürlich geht DEC/INC auch auf SFRs. > Das einzige, was nicht auf SFRs geht, sind indirekte Befehle (mit @R0, > @R1), die gehen dann in die oberen 128Byte SRAM. > > > Peter In der Tat. Wie heißt es so schön: Wenn man keine Ahnung hat einfach mal .... Gruß Oliver
hmmmm okay ich würde jetzt gerne mal mein Programm hochladen. In welchem Format muss ich es denn hochladen? mfg. Yazoo
Yazoo schrieb: > hmmmm okay ich würde jetzt gerne mal mein Programm hochladen. > In welchem Format muss ich es denn hochladen? Häng die Datei mit dem Quelltext einfach als Dateianhang an.
Yazoo schrieb: > hmmmm okay ich würde jetzt gerne mal mein Programm hochladen. > In welchem Format muss ich es denn hochladen? > > mfg. Yazoo Und Aufgabe gelöst?
Yazoo schrieb: > Mist sry es falsche hochgeladen Das wichtigste zuerst: sind deine LED gedimmt? Also: funktioniert die PWM Ansteurung grundsätzlich? Zu deiner Hauptschleife: Puh, noch komplizierter mit noch mehr hin und herspringen ist es nicht gegangen?
sry so wars halt in meinem kopf xD und ich hab leider nichts zum ausprobieren :(
Yazoo schrieb: > und ich hab leider nichts zum ausprobieren :( Wie soll man hardwarenahe Software entwickeln ohne die Hardware dahinter? Gruß Oliver
Das frage ihc mihc auch schon die ganze Zeit ....
Yazoo schrieb: > Das frage ihc mihc auch schon die ganze Zeit .... Na wie willst du das denn Debuggen? PS. Deine Tastatur ist kaputt, die verwechselt gelegentlich 'c' und 'h'
Yazoo schrieb: > und ich hab leider nichts zum ausprobieren :( Wie, nix zu ausprobieren? Solange ich nicht die PWM grundsätzlich in Gang bringe und ein simples haupt: mov CCAP0H,#100h ljmp haupt mir nicht eine gedimmte LED zeigt und ich mich vergewissert habe, dass unterschiedliche Werte anstelle von #100 dann auch tatsächlich unterschiedliche Helligkeiten EINER Led (und nicht gleich aller 3) produzieren, mach ich doch gar nicht erst weiter. Je mehr ungetesteten Code du jetzt produzierst, umso schwerer wird es mit der Fehlersuche. Und das das alles auf Anhieb funktioniert ... davon würde ich erst mal nicht ausgehen. Klappt das mit dem händischen verändern der Werte, dann lass ich das, wieder erst mal nur bei EINER Led mal testweise durchlaufen lassen haupt: bischen warten lassen mov a, CCAP0H inc a mov CCAP0H, a ljmp haupt dann mit 2 haupt: bischen warten lassen mov a, CCAP0H inc a mov CCAP0H, a jnz haupt mov a, CCAP1H inc a mov CCAP1H, a ljmp haupt und dann mit 3 haupt: bischen warten lassen mov a, CCAP0H inc a mov CCAP0H, a jnz haupt mov a, CCAP1H inc a mov CCAP1H, a jnz haupt mov a, CCAP2H inc a mov CCAP2H, a ljmp haupt
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.