- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 34

Thema: Eine RGB-Led und ein AtTiny13

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte Avatar von Thomas E.
    Registriert seit
    29.12.2011
    Beiträge
    638
    Hallo!


    Ich habe nun folgende Änderungen vorgenommen:
    • If-Abfragen durch Select-Abfragen ersetzen
    • Sprung von der Timer-ISR zur Sub Fading über ein Flag in die Hauptschleife verlegt

    Durch die Änderung der If-Abfragen nach Select-Abfragen konnte ich etwa 1% Flash sparen, was anschließend durch den veränderten Sprung zur Sub Fading wieder belegt wurde. Somit stehe ich wieder bei 90% Speicherbelegung.

    Eine Veränderung des Timer-Prescalers brachte flackern mit sich, so wie ich mir das gedacht habe.
    Grüße
    Thomas

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    35
    Beiträge
    3.501
    Blog-Einträge
    9
    Im Endeffekt rufst du mit GoSub Fading ja nur das Programm auf.
    Lass das GoSub weg und pack das Unterprogramm direkt dahin wo dein GoSub stand. Und in der Timer ISR setzt du nur das Flag, welches du im Mainprogramm auswertest.
    Das sieht dann etwa so aus:
    Code:
    '#########
    '## EDT ##
    '#########
    '---------
    'TinyRGB
    'V1.0
    '04.03.2012
    '---------
    'schaltplan_tinyrgb_v1_0.dsn
    '---------
    'AtTiny13 @ 9,6 Mhz internal RC-Clock
    'Jp1 gesetzt: Modus 0 aktiv
    'Jp2 gesetzt: Modus 1 aktiv
    'Modus 0: Farbwechsel über alle drei Grundfarben (R-G-B)
    'Modus 1: Effekt-Farbwechsel
    '---------
    
    
    $regfile = "attiny13.dat"
    $crystal = 9600000                      '9,6 Mhz
    $hwstack = 8
    $swstack = 4
    $framesize = 10
    
    
    'CONFIG IN/OUT
    Config Portb.0 = Output                                     'Blau
    Config Portb.1 = Output                                     'Grün
    Config Portb.2 = Output                                     'Rot
    Config Pinb.3 = Input                                       'Jp1
    Config Pinb.4 = Input                                       'Jp2
    Portb.3 = 1                                                 'Pullup Jp1 einschalten
    Portb.4 = 1                                                 'Pullup Jp2 einschalten
    
    'ALIAS
    R Alias Portb.2
    G Alias Portb.1
    B Alias Portb.0
    Jp1 Alias Pinb.3
    Jp2 Alias Pinb.4
    
    'CONFIG TIMER
    Config Timer0 = Timer , Prescale = 1
    On Timer0 Isr_timer0
    Enable Timer0
    Start Timer0
    
    'VARIABLEN
    Dim Pwm_count As Byte                                       'PWM-Variable
    Dim C_r As Byte                                             'Channel Rot
    Dim C_g As Byte                                             'Channel Grün
    Dim C_b As Byte                                             'Channel Blau
    Dim Div As Word                                             'Teilervariable
    Dim State As Byte                                           'Status
    Dim Modus As Bit                                            'Modus
    Dim Timerflag As Bit                                        'Flag für die Timer ISR
    
    'INTERRUPTS EIN
    Enable Interrupts
    
    '### HAUPTSCHLEIFE ###
    Do
       'Vergleich Channel kleiner PWM:
       If C_r < Pwm_count Then R = 1 Else R = 0
       If C_g < Pwm_count Then G = 1 Else G = 0
       If C_b < Pwm_count Then B = 1 Else B = 0
    
       'Jumperabfrage:
       If Jp1 = 0 Then Modus = 0
       If Jp2 = 0 Then Modus = 1
    
       If Timerflag = 1 Then
          If Pwm_count = 255 Then Pwm_count = 0                    'PWM-Variable bei 255 resetten
          Incr Pwm_count                                        'PWM-Variable erhöhen
             If Div = 10000 Then                                'Teilervariable bei 10000 resetten
             Div = 0
    
                If Modus = 0 Then
                Select Case State
    
                Case 0 : Incr C_r
                         Decr C_b
                         If C_r = 255 Then State = 1
    
                Case 1 : Decr C_r
                         Incr C_g
                         If C_g = 255 Then State = 2
    
                Case 2 : Decr C_g
                         Incr C_b
                         If C_b = 255 Then State = 0
    
                End Select
                End If
    
                If Modus = 1 Then
                   Select Case State
    
                   Case 0 : If C_r < 255 Then Incr C_r
                            If C_r = 255 Then State = 1
    
                   Case 1 : If C_b < 255 Then Incr C_b
                            If C_b = 255 Then State = 2
    
                   Case 2 : If C_g < 255 Then Incr C_g
                            If C_g = 255 Then State = 3
    
                   Case 3 : If C_r > 1 Then Decr C_r
                            If C_g > 50 Then Decr C_g
                            If C_b > 1 Then Decr C_b
                            If C_r = 1 Then State = 4
    
                   Case 4 : If C_g < 255 Then Incr C_g
                            If C_b < 255 Then Incr C_b
                            If C_b = 255 Then State = 5
    
                   Case 5 : If C_g > 1 Then Decr C_g
                            If C_b > 1 Then Decr C_b
                            If C_g = 1 Then State = 0
    
                   End Select
                End If
             End If
    
          Incr Div                                              'Teilervariable erhöhen
          Timerflag = 0                                         'Flag für die Timer ISR zurücksetzen
       End If
    
    Loop
    
    
    
    
    'ISR TIMER0
    Isr_timer0:
    
       Timerflag = 1
    
    Return
    Das ist jetzt dein alter Code ohne das "Select Case" also nicht wundern
    So sparst du dir auch das Unterprogramm, weil das alles im Hauptprogramm ausgeführt wird (statt Gosub schreibst du da halt den Code hin).

    Edit: Hab einen aktuellen Code eingefügt. So in etwa meinte ich das. Musst du mal gucken ob er für dich in Ordnung ist
    Geändert von Kampi (11.03.2012 um 12:50 Uhr)
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von Thomas E.
    Registriert seit
    29.12.2011
    Beiträge
    638
    Hallo Kampi!


    Dadurch würde ich mir ja nur die Befehle Gosub und Return, sowie die Zeit zum Speichern aller wichtigen Register in den SRAM ersparen. Der benötigte Platz für die eigentlichen in "Fading" enthaltenen Befehle würde somit ja nicht kleiner werden, sondern steht nur an anderer Stelle im Flash. So zumindest meine Gedanken dazu.
    Grüße
    Thomas

  4. #4
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    35
    Beiträge
    3.501
    Blog-Einträge
    9
    Zitat Zitat von Thomas E. Beitrag anzeigen
    Hallo Kampi!


    Dadurch würde ich mir ja nur die Befehle Gosub und Return, sowie die Zeit zum Speichern aller wichtigen Register in den SRAM ersparen. Der benötigte Platz für die eigentlichen in "Fading" enthaltenen Befehle würde somit ja nicht kleiner werden, sondern steht nur an anderer Stelle im Flash. So zumindest meine Gedanken dazu.
    Stimmt! Du hast recht
    Ich weiß nicht aber ich glaube du kannst den Speicher nur optimieren, wenn du es in ASM machst. Im Moment wüsste ich nicht wo man noch was weglassen kann.
    Auf der anderen Seite....der Tiny ist ja nicht gerade ein Speicherwunder
    Da wirken selbst sehr kleine Codes mächtig
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Ein paar wenige Bytes kann man durch Weglassen von
    Code:
    If Pwm_count = 255 Then Pwm_count = 0                    'PWM-Variable bei 255 resetten
    sparen, das schon von Beginn des Threads an mitgeschleift wird.
    Eine Byte-Variable läuft von allein nach 255 auf 0 über, da muss man nix extra machen.

    Wenn man noch statt der doppelten Abfrage
    Code:
    If C_x < 255 Then Incr C_x
    If C_x = 255 Then State = 1
    jeweils
    Code:
    If C_x < 255 Then Incr C_x Else State = 1
    schreibt, kommt man auf 85%, ohne viel geändert zu haben.
    Geändert von MagicWSmoke (11.03.2012 um 17:03 Uhr)

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von Thomas E.
    Registriert seit
    29.12.2011
    Beiträge
    638
    Hallo!


    Dank den Erläuterungen von User MagicWSmoke konnten nun 6% Flash gespart werden. Hier der aktuelle Stand des Programms:
    tinyrgb_v1_2.bas

    Vielleicht fällt noch jemanden etwas ein? Es ist schon ein interessanter Ansporn, noch etwas Speicher einzusparen, zumal dann ja Platz für weitere Fading-Möglichkeiten ist. Die Schaltung beleuchtet übrigens den Deko-Bereich auf einem Wohnzimmerschrank und wird von zwei NiMH-Akkus versorgt, die tagsüber von Solarenergie geladen werden.
    Grüße
    Thomas

  7. #7
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    35
    Beiträge
    3.501
    Blog-Einträge
    9
    Hey

    kannst du den "Schaltplan" der Schaltung posten?
    Ich hab mir gestern 10 RGB LEDs bestellt und weiß nicht wofür ich sie verwenden soll (die haben 3€ das Stück gekostet....ka ob sie was taugen oder nicht aber für 3€ sag ich nicht nein)
    Und nun bin ich auf der Suche nach schönen Bastelleien mit RGB LEDs .....btw. ich hab mir eine bei RS für 25€ das Stück bestellt und für 3W ist die ja mal super hell.....und auch die "Chinesen" LEDs sind 3W....mal schauen wie die sich im Test gegen die teure LED machen.
    Wie gesagt wäre toll wenn man den Schaltplan noch sehen könnte. Weil so ein kleines Lichterspiel auf dem Schrank oder hinter dem Fernseher sicher toll aussieht.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Zitat Zitat von Thomas E. Beitrag anzeigen
    Vielleicht fällt noch jemanden etwas ein?
    Hallo Thomas,
    folgendes bringt noch hier und da etwas:
    statt:
    Dim Modus As Bit 'Modus
    Dim Flag_a As Bit 'Flag für Sub Fading

    als Byte einrichten
    Dim Modus As Byte 'Modus
    Dim Flag_a As Byte 'Flag für Sub Fading

    und alle
    Set Modus mit Modus = 1, Reset Modus mit Modus = 0 ersetzen
    Set Flag_a, Reset Flag_a gleichermaßen.

    Alle "Decr Variable" mit "Variable = Variable - 1"
    und alle "Incr Variable" mit "Variable + 1" ersetzen.

    bringt pro Decr zwei Byte


    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

Ähnliche Themen

  1. Samarai: Eine Drohne wie eine Ahornfrucht
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 15.08.2011, 15:20
  2. ATTiny13 PWM
    Von Jacob2 im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 13.05.2009, 18:08
  3. attiny13
    Von epos im Forum AVR Hardwarethemen
    Antworten: 8
    Letzter Beitrag: 05.10.2007, 21:39
  4. Antworten: 5
    Letzter Beitrag: 02.02.2007, 10:03
  5. Antworten: 7
    Letzter Beitrag: 17.10.2006, 16:10

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress