Bascom Software-PWM

Bardo

Neues Mitglied
30 Dez 2012
9
0
0
47
Kapfenberg
Sprachen
BascomAVR, C
Hallo liebe Leute,

ich habe ein Programm geschrieben, welches per SW-PWM 4 LED`s nacheinander auf und ab dimmt.
das Ganze soll ein Drehlicht simmulieren.
Was mir noch fehlt ist eine "Art" Nachglüh-Effekt".
also, es soll die LED danach noch etwas nachleuchten.
Hat dazu jemand einen Ansatz für mich ?

Hier ist der Code:
Code:
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 20
$swstack = 20
$framesize = 12


Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output

Led1_pin Alias Portb.0
Led2_pin Alias Portb.1
Led3_pin Alias Portb.2
Led4_pin Alias Portb.3

Const Fade_up = 10
Const Fade_down = 10
Const Hold = 10
Const Pause = 5

Dim Led1 As Byte
Dim Led2 As Byte
Dim Led3 As Byte
Dim Led4 As Byte
                                                               'Auflösung 0 - 49
Dim Timerzaehler As Byte                                    'Maximalwerte wie LED1


Config Timer0 = Timer , Prescale = 8                        'Timer konfigurieren
On Timer0 Timerroutine                                      'Timerinterrupt Subroutine zuweisen
Enable Timer0                                               'Timer aktivieren
Start Timer0                                                'Timer starten
Timer0 = 205                                                'Timer vorladen

Enable Interrupts                                           'Interrupt aktivieren
Portb = 0


'*** Hauptschleife *************************************************************

Do


   For Led1 = 0 To 49                                       'aufdimmen
      Waitms Fade_up
   Next Led1
   Waitms Hold                                              'halten

   For Led1 = 49 To 0 Step -1                               'abdimmen
      Waitms Fade_down
   Next Led1
   Waitms Pause                                             'Pause
'======================================
   For Led2 = 0 To 49
      Waitms Fade_up
   Next Led2
   Waitms Hold

   For Led2 = 49 To 0 Step -1
      Waitms Fade_down
   Next Led2
   Waitms Pause
'======================================
   For Led3 = 0 To 49
      Waitms Fade_up
   Next Led3
   Waitms Hold

   For Led3 = 49 To 0 Step -1
      Waitms Fade_down
   Next Led3
   Waitms Pause
'======================================
   For Led4 = 0 To 49
      Waitms Fade_up
   Next Led4
   Waitms Hold

   For Led4 = 49 To 0 Step -1
      Waitms Fade_down
   Next Led4
   Waitms Pause

Loop

                                               'Ende Hauptschleife
End


'*** Subs **********************************************************************
Timerroutine:                                               'Beginn Subroutine
   Timer0 = 205
   Incr Timerzaehler
   If Timerzaehler = 50 Then Timerzaehler = 0               'Timerzaehler auf LED-Auflösung begrenzen
   If Timerzaehler < Led1 Then Led1_pin = 1 Else Led1_pin = 0       'Vergleich Timerzähler mit LED-Wert -> LED Ein- od. Ausschalten
   If Timerzaehler < Led2 Then Led2_pin = 1 Else Led2_pin = 0
   If Timerzaehler < Led3 Then Led3_pin = 1 Else Led3_pin = 0
   If Timerzaehler < Led4 Then Led4_pin = 1 Else Led4_pin = 0
Return
ich wäre dankbar für Ideen oder Lösungsvorschläge, bin mit meinem Latein am Ende.
 

Janiiix3

Aktives Mitglied
28 Sep 2013
1.314
10
38
Hannover
Sprachen
C, C#
Was mir noch fehlt ist eine "Art" Nachglüh-Effekt".

Beschreib das doch mal bitte ein bisschen genauer was du mit "eine Art"... "Nachglüh Effekt" meinst!...:confused:
Wie lange sollen die LED´s noch schwach gedimmt bleiben ?!
 

Bardo

Neues Mitglied
30 Dez 2012
9
0
0
47
Kapfenberg
Sprachen
BascomAVR, C
Hallo Janiiix3,

naja, die 4 LED`s sollen eben ein "Drehlicht" wie bei der Feuerwehr oder der Polizei nachahmen.
Da ist es ja auch so, das, bedingt durch die Leuchte und dem Spiegel ein gewisser Nachleucht-Effekt vorhanden ist.
 

dino03

Aktives Mitglied
27 Okt 2008
6.710
15
38
Sprachen
BascomAVR, Assembler
Hi,

naja, die 4 LED`s sollen eben ein "Drehlicht" wie bei der Feuerwehr oder der Polizei nachahmen.
Da ist es ja auch so, das, bedingt durch die Leuchte und dem Spiegel ein gewisser Nachleucht-Effekt vorhanden ist.
ist ein wenig schwer zu verstehen :confused:

Sagen wir mal die LEDs werden nun im Kreis nacheinander angeschaltet.
LED1 - LED2 - LED3 - LED4 - LED1 - LED2 - ...

Meinst du mit Nachglüheffekt nun das es bei diesem "drehen" der LEDs etwas weicher zugehen soll?
Also sozusagen wenn LED3 auf voll ist, die LEDs 2 + 4 schon auf halb oder viertel Helligkeit sein sollen damit es alles nicht so abgehackt aussieht?

Oder meinst du das beim "ausschalten" des Rundumlichtes die LEDs insgesammt runterdimmen sollen so als wenn die zentrale Lampe ausgeschaltet wird? und der Dreheffekt evtl dabei noch auslaufen soll?

Man kann in deine Angabe leider ne ganze Menge reininterpretieren. Du solltest also mal ganz genau definieren was du nun möchtest.

Gruß
Dino
 

TommyB

Premium Benutzer
17 Mai 2010
2.111
76
48
36
127.0.0.1 ;)
Sprachen
Assembler, LunaAVR, VB.Net, Python, C#
Wenn ich dein Vorhaben jetzt richtig verstanden habe...
Du darfst nicht "über 0 gehen", also jede LED einzelnd ansteuern.

Deklarier mal eine Zählervariable, nennen wir sie "i"

dann (vorsicht, Pseudocode!)
Code:
...
led4 = 49 ' definierte startposition festlegen
for i = 0 to 49
  led1 += 1 ' led1 heller
  led4 -= 1 ' led4 dunkler
next i
for i = 0 to 49
  led2 += 1 ' led2 heller
  led1 -= 1 ' led1 dunkler
next i
for i = 0 to 49
  led3 += 1 ' led3 heller
  led2 -= 1 ' led2 dunkler
next i
for i = 0 to 49
  led4 += 1 ' led4 heller
  led3 -= 1 ' led3 dunkler
next i
...
+ den Wartezyklen. Nur um das Prinzip zu zeigen
 

Bardo

Neues Mitglied
30 Dez 2012
9
0
0
47
Kapfenberg
Sprachen
BascomAVR, C
Problem gelöst ... fertige SW-PWM, als Code-Vorlage verwendbar !!!

Hallo liebe Leute!

So, nun habe ich das kleine Problemchen gelöst.
Es ist doch immer das selbe ... eigene Fehler findet man am schwersten!

Ich habe nun die Werte dahingehend angepasst, das die LED`s nicht mehr ganz ausgeschaltet werden, und dann erst in der nächsten Schleife ( bei der nächsten LED ) ganz ausgeschaltet werden.

Den Code gebe ich hiermit ausdrücklich frei, da ich immer wieder Anfragen bz. SW-PWM in den Foren finde.

Das Programm erzeugt 4 unabhängige PWM-Kanäle mit denen ich 4 LED`s ansteuere.
Es ist natürlich NICHT als die Optimal-Lösung anzusehen, dennoch ist die Funktion und die Vorgehens-Weise daraus gut ersichtlich.
Eines noch:
Das Programm belegt 84% des Speichers des Atiny13!
Ich habe den kleinen Atiny13 gewählt, da es mir ausschließlich um ein Drehlicht (Nachahmung eines Feuerwehr oder Polizei-Drehlichtes) ging.
Die SMD-Bauform noch als "Bastler" handle-bar ist, und er durch die Bauform so gut wie überall in einem Modellfahrzeug untergebracht werden kann.

Für Fragen stehe ich gerne zur Verfügung!

Code:
'============================================================
'
' ************************************
' ***                              ***
' *** Drehlicht    18.05.2014      ***
' ***                              ***
' ************************************
'
'name                      : Drehlicht.bas
'purpose                   : Drehlicht mit 4 LEDs
'µC                        : ATtiny13
'
'============================================================
'

$regfile = "attiny13.dat"
$crystal = 300000
$hwstack = 20
$swstack = 20
$framesize = 12


Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output

Led1_pin Alias Portb.0
Led2_pin Alias Portb.1
Led3_pin Alias Portb.2
Led4_pin Alias Portb.3

Const Fade_up = 3
Const Fade_down = 3
Const Hold = 3
Const Pause = 3

Dim Led1 As Byte
Dim Led2 As Byte
Dim Led3 As Byte
Dim Led4 As Byte
                                                               'Auflösung 0 - 49
Dim Timerzaehler As Byte                                    'Maximalwerte wie LED1


Config Timer0 = Timer , Prescale = 8                        'Timer konfigurieren
On Timer0 Timerroutine                                      'Timerinterrupt Subroutine zuweisen
Enable Timer0                                               'Timer aktivieren
Start Timer0                                                'Timer starten
Timer0 = 205                                                'Timer vorladen

Enable Interrupts                                           'Interrupt aktivieren
Portb = 0

'*** Hauptschleife *************************************************************

Do


   For Led1 = 0 To 49
      If Led4 < 21 Then                                     'Werte begrenzen um Timerüberläufe abzufangen
         If Led4 > 0 Then Decr Led4.                        'Werte begrenzen um Timerüberläufe abzufangen, DED4 weiter abdimmen
      End If
      Waitms Fade_up                                        'aufdimmen
   Next Led1

   Waitms Hold                                              'halten

   For Led1 = 49 To 20 Step -1                              'abdimmen
      Waitms Fade_down
   Next Led1
   Waitms Pause                                             'Pause
'======================================
   For Led2 = 0 To 49
      If Led1 < 21 Then
         If Led1 > 0 Then Decr Led1.
      End If
      Waitms Fade_up
   Next Led2

   Waitms Hold

   For Led2 = 49 To 20 Step -1
      Waitms Fade_down
   Next Led2
   Waitms Pause
'======================================
   For Led3 = 0 To 49
      If Led2 < 21 Then
         If Led2 > 0 Then Decr Led2.
      End If
      Waitms Fade_up
   Next Led3

   Waitms Hold

   For Led3 = 49 To 20 Step -1
      Waitms Fade_down
   Next Led3
   Waitms Pause
'======================================
   For Led4 = 0 To 49
      If Led3 < 21 Then
         If Led3 > 0 Then Decr Led3.
      End If
      Waitms Fade_up
   Next Led4

   Waitms Hold

   For Led4 = 49 To 20 Step -1
      Waitms Fade_down
   Next Led4
   Waitms Pause



Loop

                                               'Ende Hauptschleife
End


'*** Subs **********************************************************************
Timerroutine:                                               'Beginn Subroutine
   Timer0 = 205
   Incr Timerzaehler
   If Timerzaehler = 49 Then Timerzaehler = 0               'Timerzaehler auf LED-Auflösung begrenzen
   If Timerzaehler < Led1 Then Led1_pin = 1 Else Led1_pin = 0       'Vergleich Timerzähler mit LED-Wert -> LED Ein- od. Ausschalten
   If Timerzaehler < Led2 Then Led2_pin = 1 Else Led2_pin = 0
   If Timerzaehler < Led3 Then Led3_pin = 1 Else Led3_pin = 0
   If Timerzaehler < Led4 Then Led4_pin = 1 Else Led4_pin = 0
Return
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)