Forum: Mikrocontroller und Digitale Elektronik LED Dimmer mit ATiny13 und einem Taster


von Alexander G. (alex0265)


Lesenswert?

Hallo,
ich möchte einen LED Streifen mit einem Dimmer auf Basis eines ATtiny13 
dimmen.

Diese Schaltung und den Code habe ich von folgender Seite:
http://www.dieelektronikerseite.de/uC%20Ecke/Circuits/Ein-Tasten-Dimmer.htm
Vielen Dank an Thomas. Leider gibt es keinen Kontakt zu ihm.

Mit einem Taster kann man die LEDs Ein- und Ausschalten und mit längerem 
Druck dimmen.
Als Endtreiber steuere ich einen Mosfet an.
Das funktioniert auch sehr gut, ich würde nun gern den Streifen nicht 
maximal leuchten lassen sondern nur bis zu ca. 2/3 der max. Helligkeit.
Da ich von der Programmiererei fast keine Ahnung habe, würde ich gern in 
die Runde fragen, an welchem Wert im Programm ich stellen muss, um die 
Endhelligkeit einzustellen.





$regfile = "Attiny13.dat"
$crystal = 1200000
$hwstack = 10
$framesize = 17
$swstack = 0



Dim Hell As Word
Dim An As Word
Dim Aus As Word
Dim Pressed As Word
Dim Neu As Word
Dim Heller As Word
Dim Dunkler As Word
Dim Pwm As Word
Dim Analog As Word
Dim Dimm As Word



Const Starthelligkeit = 255

Config Portb.0 = Output

Config Portb.2 = Input

Tccr0a = &B11110001 : Tccr0b = &B00000010 : Ocr0b = 255

Ocr0a = 255 : Portb.2 = 1

An = 0 : Neu = 0 : Pwm = 255

Hell = 255 - Starthelligkeit

Dunkler = Hell

If Dunkler = 0 Then Dunkler = 255

Do
  If Pinb.2 = 0 Then
    Incr Pressed : Waitms 1 : Neu = Heller
  End If

  If Pwm = 0 Then Heller = 0
  If Pwm = 255 Then Heller = 1
  If Pressed > 250 Then
    If Heller = 0 Then Incr Pwm Else Decr Pwm
    Waitms 30
  End If

  If Pinb.2 = 1 And Pressed > 0 And Pressed < 250 Then
    If Pressed < 50 Then
      If Pwm = 0 Then
        Do
          Incr Pwm : Ocr0a = Pwm : Waitms 5
          Pressed = 0 : Neu = 1 : An = 1
        Loop Until Pwm = Dunkler Or Pinb.2 = 0
      Else
        Do
          Decr Pwm : Ocr0a = Pwm : Waitms 5
          Pressed = 0 : Neu = 0 : An = 1
        Loop Until Pwm = 0 Or Pinb.2 = 0
      End If
    Elseif An = 1 Then
      Do
        Incr Pwm : Ocr0a = Pwm : Waitms 5
        Pressed = 0 : Neu = 1 : An = 0
      Loop Until Pwm = 255 Or Pinb.2 = 0
    Else
      Do
        Decr Pwm : Ocr0a = Pwm : Waitms 5
        Pressed = 0 : Neu = 0 : An = 1
      Loop Until Pwm = Hell Or Pinb.2 = 0
    End If
    If Pinb.2 = 0 Then Pressed = 250
  Elseif Pressed > 0 And Pinb.2 = 1 Then
    If Neu = 1 Then Heller = 0
    If Neu = 0 Then Heller = 1
    Pressed = 0 : Waitms 100
  End If
  If Pwm = 255 Then An = 0 Else If Aus > 5 Then An = 1
  Incr Aus : Ocr0a = Pwm
Loop


Falls mir jemand helfen kann, bedanke ich mich schon im Voraus.
Gruß Alexander

von MWS (Gast)


Lesenswert?

Alexander G. schrieb:
> an welchem Wert

Der ist lustig, "welchem" ist Einzahl, Du hast Mehrzahl, alles was nach 
255 aussieht.
Um den Verhau nicht verstehen zu müssen, würde ich überall wo mit Ocr0a 
= Pwm der neue Helligkeitswert gesetzt wird, eine kleine Funktion 
anspringen, welche die Skalierung 255 auf 170 erledigt.

Evtl. reicht es auch aus, wenn Du überall wo "255" steht durch "170" 
ersetzt.
Damit Du flexibler bist, fügst Du ein:

Const Maxhell = 170

Alle "255" ersetzt Du durch "Maxhell".

von Alexander G. (alex0265)


Lesenswert?

Hallo MWS,
vielen Dank für deine Antwort.

Das mit dem Werte ersetzen, hatte ich schon probiert.
Leider ohne Ergebnis, was mir weitergeholfen hätte.

Ich werde deine Anregungen ausprobieren.

Schönen Tag noch, Alexander

von Stefan F. (Gast)


Lesenswert?

Geil, ich dachte immer Quelltext würde dazu dienen, den Programmcode für 
Menschen lesbar zu machen. Aber dieser...

Man hätte wenigstens mal die Variablen und If-Ausdrücke kommentieren 
können.

von Norbert (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Geil, ich dachte immer Quelltext würde dazu dienen, den
> Programmcode für
> Menschen lesbar zu machen. Aber dieser...
>
> Man hätte wenigstens mal die Variablen und If-Ausdrücke kommentieren
> können.

Ich hatte zuerst gedacht, das wäre in Brainf*ck geschrieben.
Aber die Abwesenheit von ›ComeFrom‹ hatte mich stutzig werden lassen.

Das ist ein BASIC Programm! (Bin mir nicht ganz sicher, aber ich vermute 
das steht für Beginner … After Significant Intoxication … Coding)

von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

Auch der Schaltplan enthält nicht empfehlenswerte Mängel.

Am Eingang des Spannungsreglers fehlt der Abblock-Kondensator.

Die Ruhestromaufnahme des Spannungsreglers wird die Batterie binnen 
weniger Tage entladen, auch wenn die "Lampe" gar nicht verwendet wird.

An S1 fehlt ein Pull-Up Widerstand, er wird empfindlich auf Radiowellen 
reagieren und schnell kaputt gehen das der notwendige Mindest-Strom 
nicht erreicht wird.

Mir fehlt da eine Leistungsstufe am Ausgang. Man wird ja wohl kaum leine 
Lampe mit 20mA LED ausbauen wollen. Falls es nur ums Schaltungsprinzip 
ginge, warum hat sie dann einen Spannungsregler? Da hätte man dann 
einfach einen Pin mit 5V beschriften können oder 4,5V Batterien 
verwenden können.

von EAF (Gast)


Lesenswert?

MWS schrieb:
> Evtl. reicht es auch aus, wenn Du überall wo "255" steht durch "170"
> ersetzt.
> Damit Du flexibler bist, fügst Du ein:
>
> Const Maxhell = 170
>
> Alle "255" ersetzt Du durch "Maxhell".

Oder einen Widerstand vor den Streifen basteln.
So bekommt man ihn dunkler und behält trotzdem alle 256 Stufen.

----

von Georg M. (g_m)


Lesenswert?

>
1
 Dim Analog As Word
2
 Dim Dimm As Word

Wozu diese Worde?

von MWS (Gast)


Lesenswert?

Alexander G. schrieb:
> Leider ohne Ergebnis, was mir weitergeholfen hätte.

Der Code ist nun wirklich sagenhaft grottig, aber hier würde ich die 
Effekte des Ergebnisses erfahren wollen und nicht dass es Dir nicht 
weiter half. Mir helfen unerwünschte Ergebnisse beim Verständnis.

Der Timer0 ist so konfiguriert, dass ein Wert von 255 = voll Low am 
Ausgang bedeutet und 0 = voll High der PWM.

D.h. Du müsstest alle "0", welche die Grenzen der PWM bedeuten auf "85" 
setzen, darfst dabei aber keine "0" ändern, die mit der 
Tastenfunktion/Logik zu tun haben.

Wenn Du dagegen wie vor alle "255" auf "170" ändern möchtest, dann 
ändere
1
Tccr0a = &B11110001
in
1
Tccr0a = &B10100001
Die PWM bei Programmstart wäre voll High, also müsste noch
1
An = 0 : Neu = 0 : Pwm = 255
in
1
An = 0 : Neu = 0 : Pwm = 0
angepasst werden

> Ich werde deine Anregungen ausprobieren.

Hier die Subroutinen-Methode.
Nachdem sowieso zwei unbenutzte Variablen "Analog" und "Dimm" 
existieren, nutze eine davon.

Du ersetzt jedes
1
Ocr0a = Pwm
im Code durch ein
1
Gosub Skale
Unten, nach dem letzten "Loop" hängst Du an:
1
Skale:
2
Analog = Pwm * 2
3
Analog = Analog / 3
4
Ocr0a = Analog + 85
5
Return
Damit wird ein Wertebereich von 0 - 255 zu einem von 85 - 255.

von Alexander G. (alex0265)


Lesenswert?

Hallo
vielen lieben Dank an Alle für die Hilfe.
Eine kleine Änderung an 3 Einträgen hat es dann gebracht:


$regfile = "Attiny13.dat"
$crystal = 1200000
$hwstack = 10
$framesize = 17
$swstack = 0



Dim Hell As Word
Dim An As Word
Dim Aus As Word
Dim Pressed As Word
Dim Neu As Word
Dim Heller As Word
Dim Dunkler As Word
Dim Pwm As Word
Dim Analog As Word
Dim Dimm As Word



Const Starthelligkeit = 255

Config Portb.0 = Output

Config Portb.2 = Input

Tccr0a = &B11110001 : Tccr0b = &B00000010 : Ocr0b = 255

Ocr0a = 255 : Portb.2 = 1

An = 0 : Neu = 0 : Pwm = 255

Hell = 425 - Starthelligkeit        'GEÄNDERT

Dunkler = Hell

If Dunkler = 170 Then Dunkler = 255        'GEÄNDERT

Do
  If Pinb.2 = 0 Then
    Incr Pressed : Waitms 1 : Neu = Heller
  End If

  If Pwm = 170 Then Heller = 0        'GEÄNDERT
  If Pwm = 255 Then Heller = 1
  If Pressed > 250 Then
    If Heller = 0 Then Incr Pwm Else Decr Pwm
    Waitms 30
  End If

  If Pinb.2 = 1 And Pressed > 0 And Pressed < 250 Then
    If Pressed < 50 Then
      If Pwm = 0 Then
        Do
          Incr Pwm : Ocr0a = Pwm : Waitms 5
          Pressed = 0 : Neu = 1 : An = 1
        Loop Until Pwm = Dunkler Or Pinb.2 = 0
      Else
        Do
          Decr Pwm : Ocr0a = Pwm : Waitms 5
          Pressed = 0 : Neu = 0 : An = 1
        Loop Until Pwm = 0 Or Pinb.2 = 0
      End If
    Elseif An = 1 Then
      Do
        Incr Pwm : Ocr0a = Pwm : Waitms 5
        Pressed = 0 : Neu = 1 : An = 0
      Loop Until Pwm = 255 Or Pinb.2 = 0
    Else
      Do
        Decr Pwm : Ocr0a = Pwm : Waitms 5
        Pressed = 0 : Neu = 0 : An = 1
      Loop Until Pwm = Hell Or Pinb.2 = 0
    End If
    If Pinb.2 = 0 Then Pressed = 250
  Elseif Pressed > 0 And Pinb.2 = 1 Then
    If Neu = 1 Then Heller = 0
    If Neu = 0 Then Heller = 1
    Pressed = 0 : Waitms 100
  End If
  If Pwm = 255 Then An = 0 Else If Aus > 5 Then An = 1
  Incr Aus : Ocr0a = Pwm
Loop



Der Wert von 170 kommt zustande, weil der LED Streifen als 
Scalenbeleuchtung in ein Radio eingebaut wird und der Strom 200mA nicht 
übersteigen soll.

Danke an MWS, EAF und auch an  Stefan F. (stefanus).

Stefan ⛄ F. schrieb:
> Am Eingang des Spannungsreglers fehlt der Abblock-Kondensator.
>
> Die Ruhestromaufnahme des Spannungsreglers wird die Batterie binnen
> weniger Tage entladen, auch wenn die "Lampe" gar nicht verwendet wird.
>
> An S1 fehlt ein Pull-Up Widerstand, er wird empfindlich auf Radiowellen
> reagieren und schnell kaputt gehen das der notwendige Mindest-Strom
> nicht erreicht wird.
>
> Mir fehlt da eine Leistungsstufe am Ausgang.

Die Schaltung sitzt hinter einem Netzteil und den Abblock Kondensator 
hatte ich bereits eingebaut.
Den Pull Up Widerstand löte ich noch ein. Danke für den Hinweis.
Als Leistungsstufe sitzt da ein IRLML6244 Mosfet.


EAF schrieb:
> Oder einen Widerstand vor den Streifen basteln.
> So bekommt man ihn dunkler und behält trotzdem alle 256 Stufen.

Das hatte ich im Notfall eingeplant. Ich wollte es aber etwas eleganter 
haben.



Gruß Alexander

von Uwe D. (monkye)


Lesenswert?

Norbert schrieb:
> Stefan ⛄ F. schrieb:
>> Geil, ich dachte immer Quelltext würde dazu dienen, den
>> Programmcode für
>> Menschen lesbar zu machen. Aber dieser...
>>
>> Man hätte wenigstens mal die Variablen und If-Ausdrücke kommentieren
>> können.
>
> Ich hatte zuerst gedacht, das wäre in Brainf*ck geschrieben.
> Aber die Abwesenheit von ›ComeFrom‹ hatte mich stutzig werden lassen.
>
> Das ist ein BASIC Programm! (Bin mir nicht ganz sicher, aber ich vermute
> das steht für Beginner … After Significant Intoxication … Coding)

Jede Sprache kann man beschissen verwenden. Und ein guter Entwickler 
kommt mit jeder Sprache klar und hilft.

Und ja, in der Form liest sich der Code einfach nur bescheiden und ist 
nie optimiert worden. „Es funktioniert ja….“

von Stefan F. (Gast)


Lesenswert?

Uwe D. schrieb:
> ein guter Entwickler
> kommt mit jeder Sprache klar und hilft.

Ich sage mal so: Wenn ich wirklich wollen würde, dann könnte ich diesen 
Quelltext durchaus durchblicken.

Aber, der erste Anblick nimmt mir jede Lust, mich weiter damit 
freiwillig zu beschäftigen. Deswegen kommt von mir dieses mal keine 
Hilfe.

Beitrag #6784123 wurde von einem Moderator gelöscht.
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.