Forum: Mikrocontroller und Digitale Elektronik Software PWM - LED Dimmen kleine Problem bitte um Hilfe


von Dennis Brücke (Gast)


Angehängte Dateien:

Lesenswert?

Hi @all,

endlich habe ich die Software PWM hinbekommen ;) und einfach mal ein
kleines Programm für nen AT Tiny12 geschrieben, welches nichts anderes
macht wie LED hochdimmen und wieder runterdimmen. Leider passiert es,
das er nach einer weile beim abdimmen kurze Helle impulse bringt. Dann
läuft es ne weile wieder gut und dann wieder impulse. Das ganze
passiert ziemlich rythmisch so das ich störungen ausschliese, es kann
also nur am Programm liegen... :(

Kann mir vieleicht jemand den Fehler erklären ?

Gruß Dennis

von Andi (Gast)


Lesenswert?

Vielleicht hast Du den Timer Compare zu hoch gewählt und wenn die LED
dunkler geschaltet werden soll, ist die Aus-Periode so lang, das wir
ein flimmern bemerken.
Kümmer dich mal um den richtigen Prescaler und Compare-Wert.
Für Licht-PWM benötigt man mindestens 50Hz.
Bei 50 Regelstufen wären das dann 50 * 50 = 2500 mal Interrupt pro
Sekunde.

Ansonsten gefällt mir Deine PWM-Routine nicht so richtig.
Du läßt vorher die LED mit sbi immer ausschalten und danach
entscheiden, ob dann noch eingeschaltet werden soll.
Entweder aus oder ein aber lieber nie beides.
Probiers mal hiermit:

Timer0OVF:
  in temp1, SREG  ;Statusregister sichern.
  dec PWMZ  ;PWM-Counter minus 1.
  brne label1  ;Ist PWM-Counter bei 0?
  ldi PWMZ, pwmax  ;Wenn, dann auf Höchstwert setzen.
label1:
  tst PWM1  ;Ist PWM1 auf 0 also LED = aus?
  breq label2  ;Dann LED aus.
  cp PWMZ, PWM1  ;Ist PWM-Kanal 1 <= PWM-Max?
  brcs label2  ;Wenn nicht, dann Pin B0 setzen.
  cbi portb, PB0  ;Ansonsten löschen, LED ein.
  rjmp label3  ;Bei label3 weiter.
label2:
  sbi portb,PB0  ;Pin B0 setzen, LED aus.
label3:
  out SREG, temp1
  reti

Habe mit "tst PWM1" noch eine 0-Prüfung für immer aus eingebaut dafür
zählt Dein PWM-Zähler nun rückwärts was das ein bißchen vereinfacht.
Ansonsten kannst Du zum sichern von SREG lieber eines der unteren
Register hernehmen wie z. B. r1 mit
.def STReg=r1

und dann im Prog machst Du
  in STReg,sreg
und
  out sreg,STReg

Nur ein Vorschlag.

Gruß
Andi

von Andi (Gast)


Lesenswert?

Mist, hab da nen Fehler rein gewurschtelt.
Der Vergleich "cp PWMZ,PWM1" gehört andersrum.

Hier der berichtigte Code:

Timer0OVF:
  in temp1, SREG  ;Statusregister sichern.
  dec PWMZ        ;PWM-Counter minus 1.
  brne label1     ;Ist PWM-Counter bei 0?
  ldi PWMZ, pwmax ;Wenn, dann auf Höchstwert setzen.
label1:
  tst PWM1        ;Ist PWM1 auf 0 also LED = aus?
  breq label2     ;Dann LED aus.
  cp PWM1, PWMZ   ;Ist PWM-Kanal 1 >= PWM-Max?
  brcs label2     ;Wenn nicht, dann Pin B0 setzen.
  cbi portb, PB0  ;Ansonsten löschen, LED ein.
  rjmp label3     ;Bei label3 weiter.
label2:
  sbi portb,PB0   ;Pin B0 setzen, LED aus.
label3:
  out SREG, temp1
  reti

Kann es nicht testen da kein Tiny12 mehr da.

Gruß
Andi

von ...HanneS... (Gast)


Lesenswert?

Moin Dennis...

Versuche mal statt

  cp PWMZ, PWM1
  brne label2
  cbi portb, PB0
label2:

Folgendes...

  cp PWMZ, PWM1
  brlo label2
  cbi portb, PB0
label2:

Wolltest du das nicht für 3 Farben machen?

Desweiteren würde ich auf Delay verzichten und dafür in der Timer-ISR
ein Register (mit Übertrag) hoch bzw runterzählen (muss ja nicht in 1er
Schritten sein.

Willst du das Teil (wenn es fertig ist) für Werbebeleuchtung bei Kunden
einsetzen?

Gruß...
...HanneS...

von Dennis Brücke (Gast)


Lesenswert?

Danke euch beiden ;)

@Hannes:

Naja eigendlich ist es eher Hobby.

Wir machen es als kleine Schildvarianten:
Firmen Logo oder anderes in Glasplatte Sandstrahlen
und dann mit einem Tischständer per LED Streifen beleuchtet (Konstantes
Licht).

Der Optische effekt an der ganzen Sache ist schon genial ;)

Gruß Dennis

von ...HanneS... (Gast)


Lesenswert?

Klappt es denn nun?

von Dennis Brücke (Gast)


Lesenswert?

grad noch am testen ;) hab gerad ein wenig durcheinander gebracht...
:( hab jetzt die Interuppt Routine von Andi drin. Muss erstmal meine
Delay schleife neu schreiben. (Ist ja nur zum Testen) Denk mal in 10
min kann ich es sagen. (wenn die frau nicht immer dazwischen funken
würde) hi hi

Gruß Dennis

von Dennis Brücke (Gast)


Angehängte Dateien:

Lesenswert?

Hi Hannes,

also SoftwarePWM funktioniert Prinzipiell jetzt für 3 LED´s
Danke euch auf jedenfall nochmal ;) Jetzt kann ich endlich meine
Salzsteinlampe bund leuchten lassen ;) hi hi.

@Hannes:
Die Sandgestrahlten Glasscheiben mit Beleuchtung sehen am ende
dann so aus wie in der Anlage.

Nicht wundern ist nicht gerade das beste Foto ;)

Gruß Dennis

von Andi (Gast)


Lesenswert?

Sieht nicht schlecht aus!
Aber wie sieht denn nu die Software aus?
Tät mich nun schon interessieren!

Gruß
Andi

von Dennis Brücke (Gast)


Lesenswert?

Hi Andi,

also die Interrupt Routine ist wie folgt aufgebaut:
---------------------------------------------------
Timer0OVF:
  in SREGs, SREG  ;Statusregister sichern.
  dec PWMZ        ;PWM-Counter minus 1.
  brne label1     ;Ist PWM-Counter bei 0?
  ldi PWMZ, pwmax ;Wenn, dann auf Höchstwert setzen.

label1:
  tst PWM1        ;Ist PWM1 auf 0 also LED = aus?
  breq label2     ;Dann LED aus.
  cp PWM1, PWMZ   ;Ist PWM-Kanal 1 >= PWM-Max?
  brcs label2     ;Wenn nicht, dann Pin B0 setzen.
  sbi portb, PB0  ;Ansonsten löschen, LED ein.
  rjmp label3     ;Bei label3 weiter.
label2:
  cbi portb,PB0   ;Pin B0 setzen, LED aus.

label3:
  tst PWM2        ;Ist PWM1 auf 0 also LED = aus?
  breq label4     ;Dann LED aus.
  cp PWM2, PWMZ   ;Ist PWM-Kanal 1 >= PWM-Max?
  brcs label4     ;Wenn nicht, dann Pin B0 setzen.
  sbi portb, PB1  ;Ansonsten löschen, LED ein.
  rjmp label5     ;Bei label3 weiter.
label4:
  cbi portb,PB1   ;Pin B0 setzen, LED aus.

label5:
  tst PWM3        ;Ist PWM1 auf 0 also LED = aus?
  breq label6     ;Dann LED aus.
  cp PWM3, PWMZ   ;Ist PWM-Kanal 1 >= PWM-Max?
  brcs label6     ;Wenn nicht, dann Pin B0 setzen.
  sbi portb, PB2  ;Ansonsten löschen, LED ein.
  rjmp label7     ;Bei label3 weiter.
label6:
  cbi portb,PB2   ;Pin B0 setzen, LED aus.

label7:
  out SREG, SREGs
reti
--------------------------------------------

Eigendlich weitgehend deine Routine nur das ich sbi & cbi getauscht
habe, damit auch PWMMax LED an ist (HighSide).

Gruß Dennis

von Andi (Gast)


Lesenswert?

Ja super!
Wußte ja nicht, wie Du die LED´s beschaltet hast (auf GND oder +).
Übrigens *räusper*: Die 2 Befehle zum null-Test, "tst PWMx" und
"breq labelx" kannst Du Dir sparen.
Habe es gerade mit meiner LCD-Hintergrundbeleuchtung auch in
Slow-Motion getestet und es geht auch ohne 0-Prüfung.
Also bei PWM1 = 0 wird die LED auch ohne diesen Test nicht
eingeschaltet.
Man lernt halt nie aus :-)

Gruß
Andi

von Dennis Brücke (Gast)


Lesenswert?

@Andi:

Jetzt wie du das erwähnst... ist es eigendlich klar bei einer Impuls
Länge von 0 lässt sich da echt nicht viel einschalten ;) sind ja
immerhin schon 2 Taktcyclen pro PWM eingespart ;)

Kannst du mir nochmal kurz sagen wie ich jetzt die Frequenz berechne ?
irgendwie hab ich da jetzt nen Gedankenstau...

Gruß Dennis

von ...HanneS... (Gast)


Lesenswert?

Hi Dennis...

Ehe du die Frequenz berechnest, müsstest du erstmal dafür sorgen, dass
der Tiny12 mit den angegebenen 1,2MHz arbeitet. Dazu musst du das
Calibrationsbyte auslesen und per Programm in OSCCAL schreiben.

Schau mal hier, da habe ich das halbwegs erklärt...

http://www.brummbaerhannes.de/hannes/avr/fr_t12/Fahrst3.html

...HanneS...

Achja, "mit Sand beworfene Glasscheibe" sieht gut aus. Meine Frage
sollte die allerdings nur mitteilen, dass ich deine Webseite gesehen
habe... ;-)

von Dennis Brücke (Gast)


Lesenswert?

@Hannes,

ja ja immer diese Modelbauer ;) Ich selber bin ja auch begeisteter
E-Glattbahner. Das mit den Sandgestrahlten Glasflächen ist schon auf
jedenfall ne schicke angelegenheit.

Das mit dem Calbyte finde ich interessant, muss ich irgendwie im
Datenblatt überlesen haben. Muss ich glatt nochmal schauen.

Gruß Dennis

von Dennis Brücke (Gast)


Lesenswert?

@Hannes,

sag mal hab ich das jetzt richtig verstanden, das der Tiny12 von Hause
aus OSCCAL auf 0x00 sprich 0,6-1,2 Mhz läuft ?

Also brauch ich doch theoretisch nur 0xff in OSCCAL schreiben, damit er
im bereich von 1,2 - 2,5 Mhz läuft oder ?

Gruß Dennis

von ...HanneS... (Gast)


Lesenswert?

Hi Dennis...

Ja, von Hause aus läuft der langsamer.
Und von Hause aus steht das Calibyte zusätzlich im H-Byte und L-Byte
der letzten Flash-Zelle. Dort wird es aber beim Flashen von einigen
ISP-Programmen gelöscht.

Übertakten: Das sollte man nicht tun, denn das EEPROM-Timing hängt auch
an diesem Takt und das funktioniert nicht mehr bei Übertaktung. Ich weiß
jetzt nicht genau, aber ich glaube, da kann was kaputt gehen... Musst
mal im Datenblatt schaun, Irgendwas war da. Ich habe nicht genauer
hingeschaut (also nicht den gesamten Text mit Wörterbuch übersetzt), da
ich nicht auf Übertakten stehe.

Aber es bringt schon was, auf 1,2MHz zu kalibrieren, um die
Fertigungstoleranzen auszuhebeln. Und die Toleranzen sind beachtlich,
ich habe mal meinen (kleinen) Vorrat an Tiny12 und Tiny15 überprüft.

Schau dir mal den Tiny15 an. Wäre der nix für ein (Werbe-)
Farblichtspiel? Mittels Analogeingang und z.B. Fotowiderstand könnte
das Ding auf die Umwelt reagieren, z.B. die Zeitkonstanten der
Farbwechsel ändern.

...HanneS...

von Dennis Brücke (Gast)


Lesenswert?

@Hannes,

bisher hab ich hauptsächlich mit ATMega8/16 gearbeitet, das Farblicht
Spielerei ist ja eigendlich eher ein Privates Joy & Fun weil ich gerad
mein Wohnzimmer renoviert habe und jetzt auf jedenfall mit Licht eine
Menge gemacht werden kann ;)

Der Tiny15 hat ja glaub ich sogar 3 Hardware PWM kanäle oder ? muss
einfach mal schauen.

Werde jetzt einfach mal am nächsten Wo ne Platine ätzen mit je 3 SMD
Led´s (RGB) und dann nen Matten Plexiglasstreifen drauf legen. Wenn es
genügen Licht abwirft und schick aussieht wird das wohl ein Schickes
Lichtspiel für meinen Flur werden (Treppen Rand)

Mit genügen Kreativität und mut für Lichtexperimente lässt sich echt
tolle dinge anstellen... ;)

P.S.:
Hab die glasplatte heute in meinen Laden gestellt... naja nun fehlt ne
ecke, gleich nachdem ich zuviel kaffee gedrunken habe und sie vom Tisch
gehauen habe :( also nochmal neu sandstrahlen.

Aus welcher Region kommst du eigendlich Hannes ? evtl. im Sommer mal
nen Modelbautreffen ? ;)

von ...HanneS... (Gast)


Lesenswert?

Hi Dennis...

Tiny15 hat nur 1 HW-PWM. Für langsame Sachen wie Licht oder Motoren
reicht die Software-PWM allemal.

Schade um die Platte...

Ich bin zwischen Magdeburg und Bernau, ganz dicht bei MD.
Aber Modellbau betreibe ich selbst nicht, ich bastel nur etwas mit
AVRs. Habe aber mit 1200/2313/4433 angefangen, nutze jetzt auch Mega8
und vor allem Tiny15 (das Teil ist geil...).

Haste dir auch den Rest der HP angesehen?

Gruß...
...HanneS...

von Andi (Gast)


Lesenswert?

Hi!

Laut PDF läuft der Tiny12 von Hause aus bei 1,2MHz.
Müßtest Du doch wissen, oder Hannes?

@Dennis:
Die nötige Timer-Frequenz für das PWM berechnet man mit 50Hz * 50
Regelstufen = 2500 Timer-IRQ´s/Sekunde.
Macht einen Counter für den Timer 1200000Hz (µC) / 2500 = 480.
Da 480 größer als 255 mit Prescaler 8 also 480 / 8 = 60 (-60 wegen
Aufwärtszähler) für den Counter und Prescaler = 8.
Ich hoffe, Du kannst mir folgen.

Ansonsten kannst Du das auch so lassen wie es ist.
Du hast ja nen Prescaler von 1 eingestellt aber nichts für den Counter
(TCNT0).
Jetzt zählt der Timer0 immer von 0 bis 0, also 256 mal aufwärts und
alle 256 Takte wird ein IRQ ausgelöst.
Das macht dann bei 1200000Hz / 256 = 4687,5 / 50 Regelstufen = 93,75Hz
für das LED-PWM.
Mit den ca. 30 Takten in der PWM-Routine hat der Tiny sogar noch über
80% Luft für anderes.

Gruß
Andi

von ...HanneS... (Gast)


Angehängte Dateien:

Lesenswert?

Hi...

@Andi: 1,2MHz gibt es erst, wenn der Tiny12 kalibriert ist.
Ausgeliefert wird er unkalibriert. Nachzulesen in AVR053.
Tiny12 hat Kalibrationsmode 1.1, die muss man per User-Programm
kalibrieren.

Gruß...
...HanneS...

von Christof Rieger (Gast)


Lesenswert?

@...HanneS...
Ich war gerade auf deiner Homepage. Deine Platinenfräse ist ja nur
Gail. Falls mal eine gewaltige Katastrophe alle technologien auf dieser
Erde zerstörrt hat, wird man bestimmt auf dich zurück kommen.

PS. Ich hab mir auch die Mühe gemacht und einen ISP-Entwickelt die
haben mich auch alle ausgelacht. Dabei läuft meiner sogar unter XP.

von ...HanneS... (Gast)


Lesenswert?

Hi...

@Christof:

Ich war auch mal auf deiner HP...

Ich denke mal, dass ich dich nicht ausgelacht habe. Ich habe auch zur
Kenntnis genommen, dass dein ISP den Takt liefert, so dass man auch
"zerfuste" Megas ansprechen kann. Daran dachte ich bei meinem ISP
zwar auch mal, es war aber noch nicht erforderlich.


Gruß...
...HanneS...

von Dennis Brücke (Gast)


Lesenswert?

@Christof,

dein ISP würde mich auch mal Interessieren ;)

@Andi
Danke Dir nochmal für die Berechnungsgrundlagen
muss wohl ein brett vorm kopf gehabt haben. Nimmt sich
ja eigendlich alles nichts vom ATmega8

Gruß Dennis

von Christof Rieger (Gast)


Lesenswert?

@Dennis
unter http://www.r-tron.de Menüpunkt Projekte

von Dennis Brücke (Gast)


Lesenswert?

Hi @all,

mal wieder ein altes Thema hoch holen ;)
Versuche gerade mal wieder den alten Code von Andi
in eine 8 Kanal Software PWM zu bauen. Prinzipiell geht
es ja. Aber dennoch fehlt mir immer noch die Berechnungsgrundlage...

grübel...
sehe den Wald vor lauter Bäumen schon wieder mal nicht...

die 8 Kanäle sollen mal wieder LED´s Dimmen denke das 100Hz pro LED Ok
währen (oder hat jemand andere Vorschläge?)

HILLFE... räusper sorry...

Das ganze läuft auf nem ATMega8 wo ich das ganze am Liebsten über nen
shiftregister machen würde wollen aber damit beschäftige ich mich
später. Erstmal muss das Timing stimmen.

Der ATmega8 läuft mit 3,686400 Mhz habe einen Timer0 & Timer1 zu
laufen. Timer0 wollte ich am liebsten für die PWM nehmen.

Gruß Dennis

von Andreas K. (andi_k)


Lesenswert?

Bist aber spät dran :-)
Mittlerweile habe ich das mit der PWM nicht mehr mit Zeitabfrage in
einem Timer, sondern mit Timer Overflow zum Start der PWM-Phasen und
dem Timer Output Compare zum ausschalten der einzelnen PWM-Kanäle
gemacht.

Vorteile:
- Für Software-PWM recht schnell: Mit 8 Kanälen in 200 Regelstufen
1243Hz bei 16MHz, bei 100 Regelstufen 2486Hz.
- CPU-Belastung nur ca. 3,5% bei 1243Hz und ca. 7% bei 2486Hz.
- Lässt sich leicht auf 16 oder mehr Kanäle erweitern - etwas
Umprogrammierung erforderlich.

Nachteile:
- Etwas komplexer da eine Veränderung eines PWM-Kanals eine
Neusortierung des sogenannten PWM-Buffers erfordert.
- Das verstellen eines PWM-Kanals bzw. die Neusortieren des PMW-Buffers
sollte nicht öfter als die PWM-Frequenz passieren (1243/2486 mal je
Sekunde) da es sonst zu Nebeneffekten kommen kann. Das sollte aber kein
Problem sein das zu Timen.

MfG
Andi

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.