RGB Steuerung mit Atiny13

Anleitungen für "hausgemachte" LED Projekte

Moderator: T.Hoffmann

Antworten
KB
Super-User
Super-User
Beiträge: 92
Registriert: Fr, 15.09.06, 21:37
Kontaktdaten:

Di, 30.01.07, 23:27

Ich hab seit Weihnachten mein RGB Code etwas überarbeitet und jetzt noch mit Kommentaren versehen.

Nun kann man mit Hilfe eines Potis eine Spannung abgreifen mit der man die Durchlaufszeit bestimmen kann.
Das Programm ist allerding in Assembler geschrieben.
In der Zip Datei befindet sich das Projektfile fürs aktuelle AVR Studio natürlich auch dem Quellcode und
eine Hex Datei mit dem fertigen Programm für den Tiny13 ist auch dabei.
Hier

Das Programm kann man mit zB Ponyprog auf den Tiny13 bringen(es wird eine Spezielle version von Ponyprog benötigt
Klick

Des weiteren kann man die Fusebits ändern wenn man es etwas schneller haben will einfach wie im Bild CKDIV8 das Häckchen wegmachen. Ansonsten einfach so lassen wie es ist
Bild

Und zum Schluss noch ein Video http://www.youtube.com/watch?v=UgNalMxHp1E
Leider nimmt meine Kamera sowas recht schlecht auf damit die Farben etwas besser zur geltung kommen hab ich vor die matte Kunststofffolie noch ein Stück Papier gelegt. Aber in echt sieht das sowieso immer besser aus.

ich hofe das ist für den ein oder anderen der sich hier mit den AVRs beschäftigt interessant.

Für Fragen stehe ich natürlich immer bereit.
Mfg Kai und gute Nacht
Andy
Hyper-User
Hyper-User
Beiträge: 1284
Registriert: Mi, 17.05.06, 13:03

Mi, 31.01.07, 01:02

Schick...gefällt mir gut...nur das Problem ist, das ich nicht in Assambler programieren kann...in Basic (Bascom) kann ich es ein wenig.
Habe auch mal ein RGB Fader mit Software PWM programiert, habe allerdings die übergänge nicht so flüssig hinbekommen wie du in deinem Beispiel...das mit dem Poti finde ich auch sehr interessant, wird bei mir auch noch folgen, wenn ich es dann irgendwann einmal kann... :wink: aber dafür sind meine Kenntnisse auf dem Gebiet des Programierens noch nicht ausreichend.
Benutzeravatar
Pehu
Mega-User
Mega-User
Beiträge: 469
Registriert: Mi, 01.11.06, 19:33
Kontaktdaten:

Mi, 31.01.07, 06:40

@Andy Die "AC/DC RGB-LED Fan-Lampe" von Thomas Grziwa:
http://www.smartprogramming.de/index.php?siteid=10
Andy
Hyper-User
Hyper-User
Beiträge: 1284
Registriert: Mi, 17.05.06, 13:03

Mi, 31.01.07, 09:42

Jou...der Code stand meinem Projekt auch als Grundlage... aber gerade den Code meine ich, das Funktioniert bei mir nicht so recht, wie man auf dem Video sieht, Flackern die LED´s bei mir...aber warum?
Nur hat die Cam das Flackern nicht so recht aufnehmen können, in Natura ist es wesentlich mehr.

Vielleicht liegt es ja dadran, das er einen AT90S2333 genommen hat und ich einen ATMega 8, das mein yC damit nicht um kann... hehehe :wink:
KB
Super-User
Super-User
Beiträge: 92
Registriert: Fr, 15.09.06, 21:37
Kontaktdaten:

Mi, 31.01.07, 12:36

Das Flackern könnte am Takt der AVRs liegen. Du wirst die Fusebits umstellen müssen, entweder auf einen Externen Quarz oder eventuell den internen RC Oszilator benutzen und eventuell CKDIV8 rausnehmen (Frequenzteiler durch 8)
Andy
Hyper-User
Hyper-User
Beiträge: 1284
Registriert: Mi, 17.05.06, 13:03

Mi, 31.01.07, 13:52

Meine Einstellungen sind derzeit:
$regfile = "m8def.dat"
'Quarz definieren
$crystal = 425000


'Timer konfigurieren, Vorteiler auf 1

Config Timer0 = Timer , Prescale = 1


'Definiere den Interrupthandler

On Ovf0 Tim0_isr
habe damit die besten Ergebnisse erzielt, wenn ich die Frequenz erhöhe (8 oder gar 12MHz) dann wird das "Flackern" schlimmer.
Benutzeravatar
Pehu
Mega-User
Mega-User
Beiträge: 469
Registriert: Mi, 01.11.06, 19:33
Kontaktdaten:

Mi, 31.01.07, 17:55

Vielleicht liegt es ja dadran, das er einen AT90S2333 genommen hat und ich einen ATMega 8, das mein yC damit nicht um kann... hehehe
Ich habe auch mal zum Spielen auf meinem Atmega8 geknallt. Bei mir läuft alles sehr glatt. Bei mir läuft es mit 8 Mhz.
Andy
Hyper-User
Hyper-User
Beiträge: 1284
Registriert: Mi, 17.05.06, 13:03

Mi, 31.01.07, 18:31

Hmmmm....merkwürden....

Hast du dir mal das Video dazu angesehen?...da sieht man das Farbwechselflackern recht gut...(nicht das, der Zusatzleds, denn das ist gewollt) :wink:
Benutzeravatar
Pehu
Mega-User
Mega-User
Beiträge: 469
Registriert: Mi, 01.11.06, 19:33
Kontaktdaten:

Mi, 31.01.07, 20:01

Du meinst das Video vom KB?

So, hab auch mal ein Video von meinem Teil erstellt:

http://www.youtube.com/watch?v=TE8FvG4cmKY
Andy
Hyper-User
Hyper-User
Beiträge: 1284
Registriert: Mi, 17.05.06, 13:03

Mi, 31.01.07, 20:14

Ich meinte eigentlich mein Video aus diesem Post:

http://www.leds-forum.de/viewtopic.php? ... e9c2b6b927

nicht den mit dem ersten Video sondern meinen letzten Post mit dem 2ten Video.

Wobei ich sagen muß, das das Faden bei dem Video von dir auch nicht gerade ein Faden ist...is mehr ein sanfteres Umschalten. :lol: das Video oben gefiel mir sehr gut, nur das ich leider nicht in Assembler Programieren kann und ich habe noch keinen Converter gefunden, der von Assambler in Basic (Bascom) Convertieren kann.
Das wäre nochmal ne Alternative.
KB
Super-User
Super-User
Beiträge: 92
Registriert: Fr, 15.09.06, 21:37
Kontaktdaten:

Mi, 31.01.07, 20:32

Naja ist zwar Assembler und das ist anfangs etwas kompliziert. Aber wie geschrieben hab ich ein eine HEX Datei in der Zip die brauch man dann nur aufn Tiny13 draufladen.
Das Problem von LEDs direkt mit PWM stewuern ist halt das man halt eine Spannung hat mit "konstanten" Strom und da LEDs nicht linear sind wenn man mit der Spannung regelt wirkt das ganze etwas komisch. dazu bräuchte man per PWM regelbare Stromquellen. Was ich in nächster Zeit mal austüfteln werde.
Andy
Hyper-User
Hyper-User
Beiträge: 1284
Registriert: Mi, 17.05.06, 13:03

Mi, 31.01.07, 20:46

na...das hört sich doch gut an...da binn ich auf das Ergebnis schonmal sehr gespannt.
Benutzeravatar
alexStyles
Auserwählter
Auserwählter
Beiträge: 2333
Registriert: So, 20.08.06, 16:51
Wohnort: Düsseldorf
Kontaktdaten:

Mi, 31.01.07, 20:48

Oh :D
Das sieht ja "cool" aus :D 8)
:shock:
Könnte man das mit einem Tiny2313 auch machen mit mehreren Kanälen *fg* ?
:oops: ?
Ich denke schon aber so ein Programm ist dann schon sehr lang oder ?

MfG Alex
Benutzeravatar
Pehu
Mega-User
Mega-User
Beiträge: 469
Registriert: Mi, 01.11.06, 19:33
Kontaktdaten:

Mi, 31.01.07, 20:55

@Andy :oops: Sorry, hab's vergessen. Kann mich jetzt wieder an das riesige Video erinnern. :wink:

Ja, da flackert es manchmal.

Ich werde noch versuchen, das faddddeeen zu verlängern. :wink: :lol:
Andy
Hyper-User
Hyper-User
Beiträge: 1284
Registriert: Mi, 17.05.06, 13:03

Mi, 31.01.07, 20:58

@Alex....wen meinst du nu?... :wink:

@Pehu...das wäre ne feine sache. auf das Ergebnis binn ich jetzt schon mal gespannt. :lol: wer weiß...vielleicht ja auch mit Potiregelung?... :roll:

Hier mal der von mir Umgeschriebene Code:

Code: Alles auswählen

           ' RGB-LED Lampe mit PULS WEITEN MODULATION (PWM)

' =========================
' Sprache: Bascom AVR-Basic
' Version: 1.5
' System: ATMega8
' =========================
' copyright 2004 by Thomas Grziwa
' www.smartprogramming.de
'Habe die Daten natürlich hier stehen lassen...halt aus Copyride Gründen.
'Geänderte Version von A. Wessel
'Bsp.:

 'R = 51                       ' bei Ub= 5V ca. 1Volt
 'G = 102                      ' ca. 2V
 'B = 1                        ' 5V/256 = 0.01953125 V Soll
                               ' 150 = 2V

'===============================================================================
$regfile = "m8def.dat"
                     'Quarz definieren
$crystal = 425000


'Timer konfigurieren, Vorteiler auf 1

Config Timer0 = Timer , Prescale = 1


'Definiere den Interrupthandler

On Ovf0 Tim0_isr


'Wichtig: Ports als Output definieren !

Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pinb.4 = Output
Config Pinb.5 = Output
Config Pinb.6 = Output
Config Pinb.7 = Output
Config Pind.0 = Output

Config Pinc.5 = Output
Config Pinc.4 = Output
Config Pinc.3 = Output
Config Pinc.2 = Output

Led1 Alias Portc.5
Led2 Alias Portc.4
Led3 Alias Portc.3
Led4 Alias Portc.2


Enable Timer0                                               'timer einschalten
Enable Interrupts                                           'interrupts  einschalten

Dim R1 As Byte                                              ' In diese Variablen muss man
Dim G1 As Byte                                              ' im Hauptprogram die gewünschten
Dim B1 As Byte                                              ' Ausgabewerte laden

Dim R2 As Byte
Dim G2 As Byte
Dim B2 As Byte

Dim R3 As Byte
Dim G3 As Byte
Dim B3 As Byte

Dim Z As Word                                               'Byte 'Zähler

Dim Ri1 As Byte                                             ' Hilfsregister
Dim Gi1 As Byte
Dim Bi1 As Byte
Dim Ri2 As Byte                                             ' Hilfsregister
Dim Gi2 As Byte
Dim Bi2 As Byte
Dim Ri3 As Byte                                             ' Hilfsregister
Dim Gi3 As Byte
Dim Bi3 As Byte

          'Variablen für Hauptprogramm
Dim A As Byte                                               'Eine Schleifenvariable
Dim B As Byte                                               'Eine Schleifenvariable
Dim C As Byte                                               'Eine Schleifenvariable




Z = 0

G1 = 0
R1 = 0
B1 = 0
G2 = 0
R2 = 0
B2 = 0
G3 = 0
R3 = 0
B3 = 0

'Hauptschleife==================================================================
Do

'Rot
For A = 0 To 254
R1 = R1 + 1
R2 = R2 + 1
R3 = R3 + 1
Waitms 0.5

Next
Waitms 175
Gosub Flasher

Waitms 175
For A = 0 To 254
R1 = R1 - 1
R2 = R2 - 1
R3 = R3 - 1

Waitms 0.5
Next

'Grün
For A = 0 To 254
G1 = G1 + 1
G2 = G2 + 1
G3 = G3 + 1
Waitms 0.5

Next
Waitms 175
Gosub Flasher

Waitms 175
For A = 0 To 254
G1 = G1 - 1
G2 = G2 - 1
G3 = G3 - 1

Waitms 0.5
Next

'Blau
For A = 0 To 254
B1 = B1 + 1
B2 = B2 + 1
B3 = B3 + 1
Waitms 0.5

Next
Waitms 175
Gosub Flasher

Waitms 175
For A = 0 To 254
B1 = B1 - 1
B2 = B2 - 1
B3 = B3 - 1
Waitms 0.5
Next

'Blau/Grün
For A = 0 To 254
B1 = B1 + 1
B2 = B2 + 1
B3 = B3 + 1
G1 = G1 + 1
G2 = G2 + 1
G3 = G3 + 1
Waitms 0.5

Next
Waitms 175
Gosub Flasher

Waitms 175
For A = 0 To 254
B1 = B1 - 1
B2 = B2 - 1
B3 = B3 - 1
G1 = G1 - 1
G2 = G2 - 1
G3 = G3 - 1

Waitms 0.5
Next

'Blau/Rot
For A = 0 To 254
B1 = B1 + 1
B2 = B2 + 1
B3 = B3 + 1
R1 = R1 + 1
R2 = R2 + 1
R3 = R3 + 1
Waitms 0.5
Next
Waitms 175
Gosub Flasher1

Waitms 175
For A = 0 To 254
B1 = B1 - 1
B2 = B2 - 1
B3 = B3 - 1
R1 = R1 - 1
R2 = R2 - 1
R3 = R3 - 1

Waitms 0.5
Next

'Grün/Rot
For A = 0 To 254
G1 = G1 + 1
G2 = G2 + 1
G3 = G3 + 1
R1 = R1 + 1
R2 = R2 + 1
R3 = R3 + 1
Waitms 0.5
Next
Waitms 175
Gosub Flasher1
Waitms 100
Gosub Flasher2

Waitms 175
For A = 0 To 254
G1 = G1 - 1
G2 = G2 - 1
G3 = G3 - 1
R1 = R1 - 1
R2 = R2 - 1
R3 = R3 - 1

Waitms 0.5
Next

'Grün/Rot/Blau
For A = 0 To 254
G1 = G1 + 1
G2 = G2 + 1
G3 = G3 + 1
R1 = R1 + 1
R2 = R2 + 1
R3 = R3 + 1
B1 = B1 + 1
B2 = B2 + 1
B3 = B3 + 1
Waitms 0.5
Next
Waitms 175
Gosub Flasher2

Waitms 175
For A = 0 To 254
G1 = G1 - 1
G2 = G2 - 1
G3 = G3 - 1
R1 = R1 - 1
R2 = R2 - 1
R3 = R3 - 1
B1 = B1 - 1
B2 = B2 - 1
B3 = B3 - 1

Waitms 0.5
Next

Waitms 10
Gosub Flasher2
Waitms 10

Loop
'Hauptschleife ende===========================================

'Interupthandler, wird bei jedem Timerüberlauf(bei 8 MHz und Vorteiler=1 alle 32 µSec.)aufgerufen:

Tim0_isr:

    If Z = 0 Then                                           'Gewünschte Ausgabewerte an
    Ri1 = R1                                                'Hilfsregister übergeben
    Gi1 = G1
    Bi1 = B1
    Ri2 = R2
    Gi2 = G2
    Bi2 = B2
    Ri3 = R3
    Gi3 = G3
    Bi3 = B3
    Z = 255
    End If
    Z = Z - 1

    'PWM Kanäle

    'RGB LED 1
    If Ri1 > 0 Then                                         'R > Port B.0
    Portb.0 = 1                                             'bei R = 51 wird hier
    Else                                                    'Port b.0 51 mal auf 1
    Portb.0 = 0                                             'und 205 mal auf 0 geschaltet
    End If                                                  'das ergibt bei 5V Ub im Mittel
    Ri1 = Ri1 - 1                                           ' ca. 1 V
    If Ri1 = 255 Then Ri1 = 0

    If Gi1 > 0 Then                                         'G > Port B.1
    Portb.1 = 1
    Else
    Portb.1 = 0
    End If
    Gi1 = Gi1 - 1
    If Gi1 = 255 Then Gi1 = 0

    If Bi1 > 0 Then
    Portb.2 = 1                                             'B > Port B.2
    Else
    Portb.2 = 0
    End If
    Bi1 = Bi1 - 1
    If Bi1 = 255 Then Bi1 = 0

    'RGB LED 2
    If Ri2 > 0 Then
    Portb.3 = 1
    Else
    Portb.3 = 0
    End If
    Ri2 = Ri2 - 1
    If Ri2 = 255 Then Ri2 = 0

    If Gi2 > 0 Then
    Portb.4 = 1
    Else
    Portb.4 = 0
    End If
    Gi2 = Gi2 - 1
    If Gi2 = 255 Then Gi2 = 0

    If Bi2 > 0 Then
    Portb.5 = 1
    Else
    Portb.5 = 0
    End If
    Bi2 = Bi2 - 1
    If Bi2 = 255 Then Bi2 = 0

    'RGB LED 3
    If Ri3 > 0 Then
    Portb.6 = 1
    Else
    Portb.6 = 0
    End If
    Ri3 = Ri3 - 1
    If Ri3 = 255 Then Ri3 = 0

    If Gi3 > 0 Then
    Portb.7 = 1
    Else
    Portb.7 = 0
    End If
    Gi3 = Gi3 - 1
    If Gi3 = 255 Then Gi3 = 0

    If Bi3 > 0 Then
    Portd.0 = 1
    Else
    Portd.0 = 0
    End If
    Bi3 = Bi3 - 1
    If Bi3 = 255 Then Bi3 = 0

    ' Hier könnten eigentlich noch weitere Kanäle eingefügt werden

    Return
    'Interupthandler ende

    Flasher:
Led1 = 1
Waitms 0.7
Led1 = 0
Led2 = 1
Waitms 1
Led1 = 1
Waitms 0.9
Led1 = 0
Led2 = 0
Waitms 1
Led1 = 1
Led2 = 1
Led3 = 1
Waitms 0.9
Led1 = 0
Led2 = 0
Led3 = 0
Waitms 0.7
Led1 = 1
Led2 = 1
Led3 = 1
Waitms 0.7
Led1 = 0
Led2 = 0
Led3 = 0
Waitms 0.9
Led1 = 1
Led2 = 1
Led3 = 1
Waitms 0.7
Led1 = 0
Led2 = 0
Led3 = 0
Waitms 0.9
Led1 = 1
Waitms 0.7
Led1 = 0
Led2 = 1
Waitms 1
Led1 = 1
Waitms 1
Led1 = 0
Led2 = 0
Waitms 0.9
Led3 = 0
Waitms 1
Led1 = 1
Waitms 0.8
Led3 = 1
Waitms 1
Led3 = 0
Waitms 0.7
Led3 = 1
Led2 = 1
Waitms 1
Led3 = 0
Waitms 0.9
Led1 = 0
Waitms 0.7
Led3 = 1
Led2 = 0
Waitms 0.8
Led3 = 0
Return

  Flasher1:
Led1 = 1
Led2 = 1
Led3 = 1
Waitms 1
Led1 = 0
Led2 = 0
Led3 = 0
Waitms 1
Led1 = 1
Led2 = 1
Led3 = 1
Waitms 1
Led1 = 0
Led2 = 0
Led3 = 0
Waitms 1
Led1 = 1
Led2 = 1
Led3 = 1
Waitms 1
Led1 = 0
Led2 = 0
Led3 = 0
Waitms 1
Led1 = 1
Led2 = 1
Led3 = 1
Waitms 1
Led1 = 0
Led2 = 0
Led3 = 0
Waitms 1
Led1 = 1
Led2 = 1
Led3 = 1
Waitms 1
Led1 = 0
Led2 = 0
Led3 = 0
Return

  Flasher2:
  Led2 = 1
  Waitms 0.6
  Led2 = 0
  Waitms 0.8
  Led2 = 1
  Waitms 0.6
  Led2 = 0
  Waitms 0.8
  Led2 = 1
  Waitms 0.6
  Led2 = 0
  Led4 = 1
  Waitms 0.8
  Led2 = 1
  Led4 = 0
  Waitms 0.6
  Led2 = 0
  Waitms 0.8
  Led2 = 1
  Led4 = 1
  Waitms 0.6
  Led2 = 0
  Led4 = 0
  Waitms 0.8
  Led2 = 1
  Led4 = 1
  Waitms 0.6
  Led2 = 0
  Led4 = 0
  Waitms 0.5
  Led4 = 1
  Waitms 0.7
  Led4 = 0
  Waitms 0.9
  Led4 = 1
  Waitms 0.6
  Led4 = 0
  Waitms 0.8
  Led4 = 1
  Waitms 0.6
  Led4 = 0
  Waitms 0.8
  Led2 = 1
  Waitms 0.6
  Led2 = 0
  Waitms 0.8
  Led2 = 1
  Waitms 0.6
  Led2 = 0
  Waitms 0.8
  Led2 = 1
  Waitms 0.6
  Led2 = 0
  Waitms 0.8
  Led2 = 1
  Waitms 0.6
  Led2 = 0
  Waitms 0.8
  Led3 = 1
  Led1 = 1
  Waitms 0.5
  Led4 = 1
  Waitms 0.6
  Led4 = 0
  Waitms 0.8
  Led4 = 1
  Waitms 0.7
  Led4 = 0
  Waitms 0.9
  Led4 = 1
  Waitms 0.8
  Led4 = 0
  Waitms 0.6
  Led3 = 0
  Led1 = 0
  Waitms 0.8
  Led3 = 1
  Led1 = 1
  Waitms 0.6
  Led3 = 0
  Led1 = 0
  Waitms 0.8
  Led3 = 1
  Led1 = 1
  Waitms 0.6
  Led3 = 0
  Led1 = 0
  Waitms 0.8
  Led3 = 1
  Led1 = 1
  Waitms 0.6
  Led3 = 0
  Led1 = 0
  Waitms 0.8
  Led3 = 1
  Led1 = 1
  Waitms 0.6
  Led3 = 0
  Led1 = 0
  Waitms 0.8
  Led3 = 1
  Led1 = 1
  Waitms 0.6
  Led3 = 0
  Led1 = 0
  Waitms 0.8
  Led3 = 1
  Led1 = 1
  Waitms 0.5
  Led4 = 1
  Waitms 0.6
  Led4 = 0
  Waitms 0.8
  Led4 = 1
  Waitms 0.7
  Led4 = 0
  Waitms 0.9
  Led4 = 1
  Waitms 0.6
  Led4 = 0
  Waitms 0.7
  Led4 = 1
  Waitms 0.9
  Led4 = 0
  Waitms 0.8
  Led4 = 1
  Waitms 0.7
  Led4 = 0
  Waitms 0.6
  Led3 = 0
  Led1 = 0
  Waitms 0.8
  Led3 = 1
  Led1 = 1
  Waitms 0.6
  Led3 = 0
  Led1 = 0
  Waitms 0.8
  Led3 = 1
  Led1 = 1
  Waitms 0.6
  Led3 = 0
  Led1 = 0
  Waitms 0.8
  Led3 = 1
  Led1 = 1
  Waitms 0.6
  Led3 = 0
  Led1 = 0
  Waitms 0.8
  Led1 = 1
  Led2 = 1
  Waitms 0.6
  Led1 = 0
  Led2 = 0
  Waitms 0.8
  Led1 = 1
  Led2 = 1
  Waitms 0.6
  Led1 = 0
  Led2 = 0
  Waitms 0.8
  Led1 = 1
  Led2 = 1
  Waitms 0.6
  Led1 = 0
  Led2 = 0
  Waitms 0.8
  Led1 = 1
  Led2 = 1
  Waitms 0.5
  Led4 = 1
  Waitms 0.6
  Led4 = 0
  Waitms 0.9
  Led4 = 1
  Waitms 0.7
  Led4 = 0
  Waitms 0.8
  Led4 = 1
  Waitms 0.6
  Led4 = 0
  Waitms 0.6
  Led1 = 0
  Led2 = 0
  Waitms 0.8
  Led1 = 1
  Led2 = 1
  Waitms 0.6
  Led1 = 0
  Led2 = 0
  Waitms 0.8
  Led1 = 1
  Led2 = 1
  Waitms 0.6
  Led1 = 0
  Led2 = 0
  Waitms 0.8
  Led2 = 1
  Led3 = 1
  Waitms 0.6
  Led2 = 0
  Led3 = 0
  Waitms 0.8
  Led2 = 1
  Led3 = 1
  Waitms 0.6
  Led2 = 0
  Led3 = 0
  Waitms 0.8
  Led2 = 1
  Led3 = 1
  Waitms 0.6
  Led2 = 0
  Led3 = 0
  Waitms 0.5
  Led4 = 1
  Waitms 0.6
  Led4 = 0
  Waitms 0.8
  Led4 = 1
  Waitms 0.7
  Led4 = 0
  Waitms 0.9
  Led4 = 1
  Waitms 0.6
  Led4 = 0
  Waitms 0.7
  Led4 = 1
  Waitms 0.7
  Led4 = 0
  Waitms 0.9
  Led4 = 1
  Waitms 0.8
  Led4 = 0
  Waitms 0.8
  Led2 = 1
  Led3 = 1
  Waitms 0.6
  Led2 = 0
  Led3 = 0
  Waitms 0.8
  Led2 = 1
  Led3 = 1
  Waitms 0.6
  Led2 = 0
  Led3 = 0
  Waitms 0.8
  Led2 = 1
  Led3 = 1
  Waitms 0.6
  Led2 = 0
  Led3 = 0
  Waitms 0.8
  Led1 = 1
  Led2 = 1
  Led3 = 1
  Waitms 0.6
  Led1 = 0
  Led2 = 0
  Led3 = 0
  Waitms 0.8
  Led1 = 1
  Led2 = 1
  Led3 = 1
  Waitms 0.6
  Led1 = 0
  Led2 = 0
  Led3 = 0
  Waitms 0.8
  Led1 = 1
  Led2 = 1
  Led3 = 1
  Waitms 0.6
  Led1 = 0
  Led2 = 0
  Led3 = 0
  Waitms 0.8
  Led1 = 1
  Led2 = 1
  Led3 = 1
  Waitms 0.6
  Led1 = 0
  Led2 = 0
  Led3 = 0
  Waitms 0.8
  Led1 = 1
  Led2 = 1
  Led3 = 1
  Waitms 0.6
  Led1 = 0
  Led2 = 0
  Led3 = 0
  Waitms 0.8
  Led1 = 1
  Led2 = 1
  Led3 = 1
  Waitms 0.6
  Led1 = 0
  Led2 = 0
  Led3 = 0
  Waitms 0.5
  Led4 = 1
  Waitms 0.8
  Led4 = 0
  Waitms 0.7
  Led4 = 1
  Waitms 0.6
  Led4 = 0
  Waitms 0.9
  Led4 = 1
  Waitms 0.7
  Led4 = 0
  Waitms 0.8
  Led3 = 1
  Waitms 0.6
  Led3 = 0
  Waitms 0.8
  Led3 = 1
  Waitms 0.6
  Led3 = 0
  Waitms 0.8
  Led3 = 1
  Waitms 0.6
  Led3 = 0
  Waitms 0.8
  Led1 = 1
  Waitms 0.6
  Led1 = 0
  Waitms 0.8
  Led1 = 1
  Waitms 0.6
  Led1 = 0
  Waitms 0.8
  Led1 = 1
  Waitms 0.6
  Led1 = 0
  Waitms 0.8
  Led2 = 1
  Waitms 0.6
  Led2 = 0
  Waitms 0.8
  Led2 = 1
  Waitms 0.6
  Led2 = 0
  Waitms 0.8
  Led2 = 1
  Waitms 0.6
  Led2 = 0
  Waitms 0.8
  Led3 = 1
  Waitms 0.6
  Led3 = 0
  Waitms 0.8
  Led3 = 1
  Waitms 0.6
  Led3 = 0
  Waitms 0.8
  Led3 = 1
  Waitms 0.6
  Led3 = 0
  Waitms 0.8
  Led1 = 1
  Waitms 0.6
  Led1 = 0
  Waitms 0.8
  Led1 = 1
  Waitms 0.6
  Led1 = 0
  Waitms 0.8
  Led1 = 1
  Waitms 0.6
  Led1 = 0
  Waitms 0.8
  Led2 = 1
  Waitms 0.6
  Led2 = 0
  Waitms 0.8
  Led2 = 1
  Waitms 0.6
  Led2 = 0
  Waitms 0.8
  Led2 = 1
  Waitms 0.6
  Led2 = 0
  Waitms 0.8
  Waitms 0.5
  Led4 = 1
  Waitms 0.6
  Led4 = 0
  Waitms 0.9
  Led4 = 1
  Waitms 0.7
  Led4 = 0
  Waitms 0.8
  Led4 = 1
  Waitms 0.5
  Led4 = 0
  Return 
Benutzeravatar
alexStyles
Auserwählter
Auserwählter
Beiträge: 2333
Registriert: So, 20.08.06, 16:51
Wohnort: Düsseldorf
Kontaktdaten:

Fr, 02.02.07, 08:17

Andy hat geschrieben:@Alex....wen meinst du nu?... :wink:
Jeder der mir diese Frage beantworten kann mit dem vielleicht ein und/oder anderen Tipp :oops: :!:

MfG Alex
Benutzeravatar
Pehu
Mega-User
Mega-User
Beiträge: 469
Registriert: Mi, 01.11.06, 19:33
Kontaktdaten:

Di, 06.02.07, 19:26

Hier der Code von meinem RGB-Fader, die einzelne Helligkeitsstufen sind deutlich weicher.

Code ist noch nicht ganz perfekt. Läuft aber. :wink:

In diesem Code werden alle Farben gleichzeitig langsam hochgedimmt. Und das warst dann auch. :wink:
Sollte als Beispielcode mit dem Befehl "Pulseout" dienen. :wink:

Jedoch wird die Led mit dem Code nicht max. belastet. Heißt auch bei max. Helligkeit des Codes, wird die Led noch mit PWM betrieben. Aber man kann einfach die Widerstände der Leds verkleinern. Jedoch vorsichtig sein, wenn man die Leds dann nicht mehr mit PWM betreibt!!! Man kann dann schnell seinen µC zerschießen.

Mit 8 Mhz:

Code: Alles auswählen

$regfile = "m8def.dat"

$crystal = 8000000

Ddrb = &B111111
Ddrd = &B000000

Config Timer0 = Timer , Prescale = 8
On Ovf0 Unserunterprogramm_isr

Enable Timer0
Enable Interrupts

Taster1 Alias Pind.2
Blau Alias Portb.2
Rot Alias Portb.3
Gruen Alias Portb.5

Dim R As Integer
Dim G As Integer
Dim B As Integer

R = 1
G = 1
B = 1

Do

R = R + 1
Waitms 20

G = G + 1
Waitms 20

B = B + 1
Waitms 20

'If Taster1 = 1 Then
'Gruen = 1
'Waitms 50
'End If

Loop


Unserunterprogramm_isr:
Pulseout Portb , 3 , R
Pulseout Portb , 5 , G
Pulseout Portb , 2 , B
Return
mars64
Mini-User
Beiträge: 2
Registriert: Mi, 11.04.07, 23:49

Do, 12.04.07, 00:05

Hallo KAI, finde Deine Projekte super.. hab mal ne Frage... könntest Du mal folgendes Programm anschauen? Ist eine PWM Steuerung für das Dimmen und Soft / an Aus von LEDs.mit nur einem Taster. Leider für den ATTINY 12 geschrieben. :(
wäre es möglich dieses Programm auf den ATTINY 13 zu portieren? oder kann jemand hier ein neues schreiben?? liefere im Gegenzug fertig bestückte Platinen mit Stromreglerbaustein TLG 4242G professionell aufgebaut. Kann Leds ansteuern bis 500ma Dauerlast. 5-40 Volt Eingangsspannung.

Wäre sehr froh über Hilfe da ich gerade erst mit Assembler anfange...versuche es jedenfalls.. :P

hier das (alte) Programm:

;Dimmer Soft ON/OFF
;(c) 2004 Markus Vohburger

;Definitionen für Tiny12 Laden
.include "tn12def.inc"



.def temp1 = r16
.def temp2 = r17
.def output = r18
.def swcount0 = r19
.def output = r20
.def pwmcount = r21
.def swcount1 = r22
.def conbuf = r23
.def direction = r25
.def control=r26
.def pwmvalue = r27
.def dirty = r28
.def onoff = r29

.EQU EE_OSCCAL = $3f;




;reset handler
.org $0000
rjmp main


;timer overflow interrut handler
.org OVF0Addr
rjmp OVF0Handler

.org $0010
main:

;stack setup



;read osccal byte

ldi temp1,EE_OSCCAL
rcall readeeprom

out osccal,temp1




;port setup

;port b input with pullups

ldi temp1,$01e
out ddrb,temp1


;port b output off, pullups on
ldi temp1,$1f
out portb,temp1

ldi temp1,$1e
out ddrb,temp1

;Einstellungen aus EEProm laden
ldi temp1,$00
rcall readsettings
mov conbuf,temp1




ldi direction,$00
ldi dirty,$00

ldi temp1,$01
rcall readeeprom
mov onoff,temp1
andi onoff,$01


;Dimmer An/Aus nach Reset umschalten, wenn Taste gedrückt
sbic pinb,0
rjmp notoggle
ldi temp1,$01
eor onoff,temp1

;ins EEProm schreiben
waittoggle:
sbic eecr,eewe
rjmp waittoggle
out eedr,onoff
sbi eecr,eemwe
sbi eecr,eewe

notoggle:

;
;Timer zurücksetzen
ldi temp1,$00
out tcnt0,temp1

;Timer interrupts an
ldi temp1,(1<<toie0)
out timsk,temp1

;Timer starten
ldi temp1,$03
out tccr0,temp1

ldi swcount0, $00
ldi swcount1,$00
ldi pwmcount,$00
ldi pwmvalue,$00

sei


;Hauptprogrammschleife, macht nur PWM
loop:

;leds aus
ldi output,$1f


cp pwmcount,pwmvalue
brsh writeoutput
;leds an
ldi output,$01

writeoutput:
out portb,output
inc pwmcount
rjmp loop


;Timer Interrupt Handler
OVF0Handler:
;Status sichern
in r1,sreg

;SoftON bzw. Off abhandeln
mov control,conbuf
cpi onoff,$01
breq nooff

ldi control,$00

nooff:
cp pwmvalue,control
breq endcontrol
brlo doinc
dec pwmvalue
rjmp endcontrol

doinc:
inc pwmvalue


;wenn taster gedrückt, dann pressedhandler
endcontrol:
sbis pinb,0
rjmp pressedhandler

;war taster zu kurz gedrückt?
cpi swcount0,$02
brlo exitreleasehandler

;helligkeit wurde geändert
cpi swcount0,$1f
brsh exitreleasehandler


;turn on / Off
;und einstellungen abspeichern
ldi temp1,$01
eor onoff,temp1
rcall writesettings
rjmp exitreleasehandler


exitreleasehandler:
ldi swcount0,$00

exit_ovf0Handler:
out sreg,r1
reti

;zähler nur bis zum maximum erhöhen
pressedhandler:
cpi swcount0,$20
brsh noinc
inc swcount0

noinc:
cpi swcount0,$20
brlo exit_ovf0handler


inc swcount1
cpi swcount1,$08
brne exit_ovf0handler
clr swcount1


rcall updown
rjmp exit_ovf0handler


;Änderungsgeschwindigkeit je nach Helligkeit anpassen
updown:
mov pwmvalue,conbuf
;merken, dass sich was geändert hat
ldi dirty,$ff

;heller oder dunkler werden ?
sbrs direction,0
rjmp uphandler

ldi temp1,$01
cpi conbuf,$f0
brsh more1
ldi temp1,$02
cpi conbuf,$e8
brsh more1
ldi temp1,$08

more1:
clc
sub conbuf,temp1
brcc exitsub
ldi conbuf,$00

cbr direction,1
rjmp exitsub


uphandler:

ldi temp1,$01
cpi conbuf,$f0
brsh more2
ldi temp1,$02
cpi conbuf,$e8
brsh more2
ldi temp1,$08


more2:
clc
add conbuf,temp1
brcc exitsub
ldi conbuf,$ff

sbr direction,1
exitsub:
ret

;die aktuelle helligkeit aus EEprom lesen
readsettings:
ldi temp1,$00
rcall readeeprom
mov conbuf,temp1
ret


writesettings:
;eeprom-Schonen!
;nur schreiben, wenn sich was geändert hat
cpi dirty,$00
breq endwrite
ldi dirty,$00

ldi temp1,$00
out eear,temp1

waitstable1:
sbic eecr,eewe
rjmp waitstable1
out eedr,conbuf
sbi eecr,eemwe
sbi eecr,eewe

endwrite:
ret


;wert aus eeprom lesen

readeeprom:

waitstableread:
sbic eecr,eewe
rjmp waitstableread
out eear,temp1
sbi eecr,eere
in temp1,eedr
ret



mit freundlichen Grüssen
Mars 64
KB
Super-User
Super-User
Beiträge: 92
Registriert: Fr, 15.09.06, 21:37
Kontaktdaten:

Fr, 13.04.07, 23:48

Hi mars64,
hab jetzt mal eine Soft on/off Routine geschrieben.
Kannst man Hier herunterladen.
Ist zwar jetzt erstmal nur für Soft ON/OFF aber kannst du dir ja mal anschauen.
Habe es erfolgreich auf einem ATTiny13 getestet weiters steht noch in der soft_on_off.asm Datei.
Bei Fragen stehe ich gerne zur Verfügung.
Und das Dimmen habe ich noch vor zu implementiern, wird aber noch etwas dauern. Naja mal schaun.

MfG Kai
[/url]
mars64
Mini-User
Beiträge: 2
Registriert: Mi, 11.04.07, 23:49

Di, 17.04.07, 08:02

Hallo Kai,
Super hast Du das hingekriegt :P :P

Werde am Wochenende mal einen Testlauf machen und einen Led Treiber TLE 4242G dranhängen.

Wenn Du das mit dem Dimmen noch hinkriegst wäre es Mega Toll. Würde im Gegenzug dafür ein paar
fertig bestückte Prints gratis liefern.

Wünsche schöne Woche und bis später,,

MFG Mars64
Benutzeravatar
tho_weiss
Mega-User
Mega-User
Beiträge: 129
Registriert: Di, 18.07.06, 17:48

Mo, 23.04.07, 08:53

Andy hat geschrieben:Meine Einstellungen sind derzeit:
$regfile = "m8def.dat"
'Quarz definieren
$crystal = 425000


'Timer konfigurieren, Vorteiler auf 1

Config Timer0 = Timer , Prescale = 1


'Definiere den Interrupthandler

On Ovf0 Tim0_isr
habe damit die besten Ergebnisse erzielt, wenn ich die Frequenz erhöhe (8 oder gar 12MHz) dann wird das "Flackern" schlimmer.

Ist schon was her, aber...

Ihr müsst natürlich auch den AVR mittels der fusebits auf eine höhere taktfrequenz einstellen, nur die angabe
$chrystal im code reicht nicht!
Das ist dafür damit Bascom intern die korrekten Timerwerte einstellt.
Wenn ihr da auf 8Mhz umstellt, aber der controller nur mit 1Mhz oder 4Mz läuft fängt es natürlich an zu ruckeln....

(nur zu info!, keine klugs*******)
luckylu1
Hyper-User
Hyper-User
Beiträge: 1405
Registriert: So, 29.04.07, 05:11
Wohnort: berlin

Fr, 04.05.07, 10:25

echt spitze,das ist eines der wenigen sachen,wo ich noch nicht so weit bin,würde später gerne ein wenig hilfe bei der programmierung in anspruch nehmen.
DaCHRlS
Mega-User
Mega-User
Beiträge: 293
Registriert: Mo, 07.05.07, 10:44
Wohnort: Herne / NRW
Kontaktdaten:

Mi, 16.05.07, 06:59

tho_weiss hat geschrieben: Ihr müsst natürlich auch den AVR mittels der fusebits auf eine höhere taktfrequenz einstellen, nur die angabe
$chrystal im code reicht nicht!
Das ist dafür damit Bascom intern die korrekten Timerwerte einstellt.
Wenn ihr da auf 8Mhz umstellt, aber der controller nur mit 1Mhz oder 4Mz läuft fängt es natürlich an zu ruckeln....

(nur zu info!, keine klugs*******)
Joa, wichtig, fuse ändern...wobei der crystal im Beispiel sogar auf ~ 0,4 MHz taktet, vermutlich ne Leiche aus irgendeinem alten Beispielcode, auf dem aufgesetzt wurde... ;-)
Antworten