Atmel T89C51RC2 RGB LED mit PWM in assembler Programmieren

OP #2437632
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
#2438966
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
Gast #2439078
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
#2439156
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
Gast #2439196
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 .......
Gast #2439249
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
#2439324
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
Gast #2439390
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
#2439420
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
#2440443
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
#2440912
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren