Forum: Mikrocontroller und Digitale Elektronik Atmel T89C51RC2 RGB LED mit PWM in assembler Programmieren


von Joschua E. (yazoo)


Lesenswert?

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

von Oliver J. (skriptkiddy)


Lesenswert?


von Cyblord -. (cyblord)


Lesenswert?

Der Controller ist ja auch noch alt wie Steinkohle.

von Yazoo (Gast)


Lesenswert?

wurde von der Schule gestellt konnte mir keinen aussuchen
aber ihc versteh immernoch nicht richtig wie ich jetzt die Led zum 
dimmen bringen kann :(

von Oliver J. (skriptkiddy)


Lesenswert?

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

von Yazoo (Gast)


Lesenswert?

Okay werde ich mal machen.
Hoffentlich kapier ich das bis Übermorgen xD
und danke für die Reposts :D

von Yazoo (Gast)


Lesenswert?

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

von Oliver J. (skriptkiddy)


Lesenswert?

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

von Yazoo (Gast)


Lesenswert?

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

von Oliver J. (skriptkiddy)


Lesenswert?

Yazoo schrieb:
> und ich glaube im mom echt nicht dass ich
> das noch hinbekomme

Du schaffst das schon. Was verstehst du denn nicht?

von Yazoo (Gast)


Lesenswert?

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

von Oliver J. (skriptkiddy)


Lesenswert?

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

von Yazoo (Gast)


Lesenswert?

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

von STK500-Besitzer (Gast)


Lesenswert?

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

von Yazoo (Gast)


Lesenswert?

Ach auch noch xD

naja jetzt versteh ich zumindest ein bisschen mehr

und mit den Ausgängen kannst du mir nicht helfen?

von Oliver J. (skriptkiddy)


Lesenswert?

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

von Yazoo (Gast)


Lesenswert?

Das ist mal was was man gerne hört :D

Ich probier das ganze mal
und meld mich dann nochmal Morgen :D

mfg Yazoo

von Oliver J. (skriptkiddy)


Lesenswert?

Yazoo schrieb:
> Ich probier das ganze mal
> und meld mich dann nochmal Morgen :D

Viel Erfolg.

Gruß Oliver

von Yazoo (Gast)


Lesenswert?

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

von Oliver J. (skriptkiddy)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Oliver J. (skriptkiddy)


Lesenswert?

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

von Yazoo (Gast)


Lesenswert?

hmmmm okay ich würde jetzt gerne mal mein Programm hochladen.
In welchem Format muss ich es denn hochladen?

mfg. Yazoo

von Karl H. (kbuchegg)


Lesenswert?

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.

von Yazoo (Gast)


Angehängte Dateien:

Lesenswert?

Okay :D

von Yazoo (Gast)


Angehängte Dateien:

Lesenswert?

Mist sry es falsche hochgeladen

von Oliver J. (skriptkiddy)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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?

von Yazoo (Gast)


Lesenswert?

sry so wars halt in meinem kopf xD

und ich hab leider nichts zum ausprobieren :(

von Oliver J. (skriptkiddy)


Lesenswert?

Yazoo schrieb:
> und ich hab leider nichts zum ausprobieren :(
Wie soll man hardwarenahe Software entwickeln ohne die Hardware 
dahinter?

Gruß Oliver

von Yazoo (Gast)


Lesenswert?

Das frage ihc mihc auch schon die ganze Zeit ....

von Oliver J. (skriptkiddy)


Lesenswert?

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'

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.