- 3D-Druck Einstieg und Tipps         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 34

Thema: Eine RGB-Led und ein AtTiny13

  1. #21
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Anzeige

    E-Bike
    Zitat Zitat von Kampi Beitrag anzeigen
    Müsste man mal schauen, was Bascom aus einem INCR oder DECR Befehl macht. Gibt es irgendwo eine Auflistung der Bascom Befehle und ihrem Gegenstück in ASM?
    Hallo Kampi,
    so 'ne Auflistung kenne ich nicht. Hab das aber für was anderes mit einem Disassembler gemacht:
    https://www.roboternetz.de/community/threads/56208-Int0-gibt-2-Impulse-!?p=535821&viewfull=1#post535821

    Das ReAVR hatte ich von hier: http://www.jassenbaum.de/ja-tools/

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

  2. #22
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    So werden's 72%:
    Code:
    Dim C_r As IRam Byte At 12                                                      'Channel Rot
    Dim C_g As IRam Byte At 13                                                      'Channel Grün
    Dim C_b As IRam Byte At 14                                                      'Channel Blau
    Und das bringt's auf 66%:
    Code:
    On Timer0 Isr_timer0 Nosave
    ' ...
    'ISR TIMER0
    Isr_timer0:
            !push        r16
            !push        r17
            !push        r20
            !push        r21
            !push        r23
            !push        r24
            !push        r26
            !push        r30
            !push        r31
            !in          r24, SREG
            !push        r24
       Incr Pwm_count                                                               'PWM-Variable erhöhen
       If Div = 10000 Then                                                          'Teilervariable bei 10000 resetten
          Div = 0
          Set Flag_a
       End If
         Div = Div + 1                                                              'Teilervariable erhöhen
            !pop        r24
            !out        SREG,r24
            !pop        r31
            !pop        r30
            !pop        r26
            !pop        r24
            !pop        r23
            !pop        r21
            !pop        r20
            !pop        r17
            !pop        r16
    Return
    Außerdem kommt man dann ordentlich mit dem HWStack hin. Es hatte vorher lediglich keine Auswirkung wenn SWStack und Frame überschrieben wurden. Das Sichern der Register kostete 26 Bytes HWStack und der Aufruf von Incr Div nochmal 2 Bytes, 8 Bytes waren also viel zuwenig. Nun werden nicht mehr als 10 Byte Stack verwendet, bei Bedarf an mehr Platz für Variablen können folgende Stackangaben nochmal verkleinert werden, SWStack und Frame werden sowieso nicht benutzt.
    Code:
    $hwstack = 16
    $swstack = 16
    $framesize = 24
    Hinweis dazu: die selektive Registersicherung per Nosave/Push/Pop ist nur solange als gültig zu betrachten, solange die ISR nicht verändert wird, evtl. muss man auf die Bascom-Version achten, hier 2.0.7.4
    Interessanterweise wird mit ausgeschalteter Optimierung jeweils 1% weniger Speicher belegt.
    Benötigt die Deklaration Var = Var + 1 tatsächlich weniger Speicher als ein einfaches Incr Var?
    Nein, das ist falsch. Incr Byte_Var und Byte_Var = Byte_Var +1 erzeugen zwar identischen Code, hingegen wird Word_Var = Word_Var +1 Inline compiliert, dagegen Incr Word_Var als Funktionsaufruf. Es hängt also erst einmal von der Zielvariablen ab.
    Eine Funktion aufzurufen, d.h. Setzen der Register und ein RCALL/CALL, kostet weniger Flashspeicher als wenn der Code Inline eingebaut wird.
    Hat man viele Stellen im Code, in denen eine Word-Variable um 1 erhöht wird, so ist es also genau anders herum, man spart mit der Incr-Version Speicherplatz. Das kann sich aber mit der Bascom-Version ändern.
    In unserem Fall ist Div = Div + 1 besser, da es etwas weniger Stack braucht und schneller ist.
    Geändert von MagicWSmoke (12.03.2012 um 11:08 Uhr)

  3. #23
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Zitat Zitat von MagicWSmoke Beitrag anzeigen
    So werden's 72%:
    Code:
    Dim C_r As IRam Byte At 12                                                      'Channel Rot
    Dim C_g As IRam Byte At 13                                                      'Channel Grün
    Dim C_b As IRam Byte At 14                                                      'Channel Blau
    Und das bringt's auf 66%:
    Code:
    On Timer0 Isr_timer0 Nosave
    ' ...
    'ISR TIMER0
    Isr_timer0:
            !push        r16
            !push        r17
            !push        r20
            !push        r21
            !push        r23
            !push        r24
            !push        r26
            !push        r30
            !push        r31
            !in          r24, SREG
            !push        r24
       Incr Pwm_count                                                               'PWM-Variable erhöhen
       If Div = 10000 Then                                                          'Teilervariable bei 10000 resetten
          Div = 0
          Set Flag_a
       End If
         Div = Div + 1                                                              'Teilervariable erhöhen
            !pop        r24
            !out        SREG,r24
            !pop        r31
            !pop        r30
            !pop        r26
            !pop        r24
            !pop        r23
            !pop        r21
            !pop        r20
            !pop        r17
            !pop        r16
    Return
    Außerdem kommt man dann ordentlich mit dem HWStack hin. Es hatte vorher lediglich keine Auswirkung wenn SWStack und Frame überschrieben wurden. Das Sichern der Register kostete 26 Bytes HWStack und der Aufruf von Incr Div nochmal 2 Bytes, 8 Bytes waren also viel zuwenig. Nun werden nicht mehr als 10 Byte Stack verwendet, bei Bedarf an mehr Platz für Variablen können folgende Stackangaben nochmal verkleinert werden, SWStack und Frame werden sowieso nicht benutzt.
    Code:
    $hwstack = 16
    $swstack = 16
    $framesize = 24
    Hinweis dazu: die selektive Registersicherung per Nosave/Push/Pop ist nur solange als gültig zu betrachten, solange die ISR nicht verändert wird, evtl. muss man auf die Bascom-Version achten, hier 2.0.7.4
    Interessanterweise wird mit ausgeschalteter Optimierung jeweils 1% weniger Speicher belegt.

    Nein, das ist falsch. Incr Byte_Var und Byte_Var = Byte_Var +1 erzeugen zwar identischen Code, hingegen wird Word_Var = Word_Var +1 Inline compiliert, dagegen Incr Word_Var als Funktionsaufruf. Es hängt also erst einmal von der Zielvariablen ab.
    Eine Funktion aufzurufen, d.h. Setzen der Register und ein RCALL/CALL, kostet weniger Flashspeicher als wenn der Code Inline eingebaut wird.
    Hat man viele Stellen im Code, in denen eine Word-Variable um 1 erhöht wird, so ist es also genau anders herum, man spart mit der Incr-Version Speicherplatz. Das kann sich aber mit der Bascom-Version ändern.
    In unserem Fall ist Div = Div + 1 besser, da es etwas weniger Stack braucht und schneller ist.
    Echt stark was du da noch rausgequetscht kriegst :O
    Wenn man in der ISR jetzt nur ein Flag setzt, kann man dann trotzdem deine ISR so wie sie ist nutzen oder muss man an dem push usw. noch was ändern?
    Oder sicherst du damit nur die ganzen Register, egal wie die verwendet wurden?
    Kannst du das nochmal bischen genauer erläutern . Bin jetzt neugierig geworden
    Und das Decr und Incr besser ist wenn man ein Word hat ist ja auch interessant zu wissen.
    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

  4. #24
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Kampi Beitrag anzeigen
    Wenn man in der ISR jetzt nur ein Flag setzt, kann man dann trotzdem deine ISR so wie sie ist nutzen oder muss man an dem push usw. noch was ändern?
    Oder sicherst du damit nur die ganzen Register, egal wie die verwendet wurden?
    Nein, ich würde vor pauschaler Nutzung immer vorsichtig sein.
    Es sind insgesamt 32 Register und ich sichere nur die Verwendeten. Da ist's wichtig sich dazu das erzeugte ASM-Compilat ansehen und zu schauen was da tatsächlich hergenommen wird. Wenn Bascom-Funktionen (wie z.B. Incr) aufgerufen werden, wird's schwieriger, denn dann geht's erstmal aus der ISR per CALL/RCALL raus und mann muss alle weiteren Verzweigungen verfolgen, die der Code nehmen kann.

    Darum schrieb ich auch die Version, der Compiler wird zu einem bestimmten Versionsstand bestimmte Register nutzen, aber Garantie für andere Versionen gibt's dafür nicht.

    Wird dagegen nur ein Flag gesetzt wird, müssen weniger Register gesichert werden, das würde man besser per Assembler machen, eben weil man dann die volle Kontrolle hat. Am Schnellsten geht ein Bit im Bereich bis I/O &h1F zu setzen. Manche Prozessoren haben GPIO's in dem Bereich, z.B. ATM644:
    Code:
    On Interruptx ISR Nosave
    ' ...
    ISR:
    !SBI   GPIOR0, 0
    Return
    Meist sitzen die Ports auch in diesem Bereich. Hat man einen Pin des Ports zur freien Verfügung, so ist das die kürzest mögliche Anweisung:
    Code:
    ISR:
    !SBI   PortA, 0
    Return
    Alles andere geht langsamer. Wenn man keine Fließkomma-Variablen verwendet, dann sind meist R12-R15 frei. Leider gehen einige ASM-Befehle erst ab >= R16, darum wird ein Flag setzen in R12 zu so etwas:
    Code:
    Dim myFlag As IRam Byte At 12
    ' ...
    ISR:
    !PUSH R16
    !LDI   R16, 1
    !MOV R12, R16
    !POP  R16
    Return
    Ein Setzen einer SRam-Variablen würde so gehen:
    Code:
    Dim myFlag As Byte
    ' ...
    ISR:
    !PUSH R16
    !LDI   R16, 1
    !STS {myFlag}, R16
    !POP  R16
    Return
    Geht in der ISR gleich schnell wie mit einer IRam-Variablen, nur in der Hauptschleife ist eine Verwendung von Bascom-Befehlen in Verbindung mit IRam immer noch ein Gewinn. Ein Sichern des Statusregisters SREG ist in keinem der Beispiele notwendig, da weder LDI, MOV, PUSH, POP noch STS das SREG verändern.
    Und das Decr und Incr besser ist wenn man ein Word hat ist ja auch interessant zu wissen.
    Macht sich halt nur bei vielen Anweisungen oder kleinem Speicherplatz wirklich bemerkbar.
    Edit:
    Pwm_count kann man noch als IRam At 15 dimensionieren, dann geht's auf 65%
    Geändert von MagicWSmoke (12.03.2012 um 14:55 Uhr)

  5. #25
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Das lram sorgt wofür?
    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

  6. #26
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Kampi Beitrag anzeigen
    Das lram sorgt wofür?
    Die Hilfe unter Dim gefiel Dir nicht ?
    IRam ermöglicht es Prozessorregister unter einem Variablennamen anzusprechen. Es gibt im AVR 32 Prozessorregister, nämlich R0-R31.
    Mit:
    Code:
    Dim myFlag As IRam Byte At 12
    wird das Register R12 unter Bascomcode als myFlag ansprechbar, also:
    Code:
    If myFlag = 1 Then
    ' ...
    End If
    Prozessorregister dienen üblicherweise als Arbeitsregister und nur wenn diese von Bascom gerade selbst nicht genutzt werden, kann man das machen, was ich hier gezeigt hab'. Sobald z.B. eine Fließkommaberechnung stattfände, würden R12-R15 zerstört und damit die Sache unbrauchbar.

    Der Vorteil von IRam-Variablen liegt darin, dass Daten nicht extra aus dem SRam geholt und wieder dahin zurückgespeichert werden müssen, sondern jederzeit verfügbar in den Prozessorregistern vorliegen. Das geht schneller und spart Code.

  7. #27
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Danke für die Erklärung.
    Ich hab unter IRam gesucht und nichts gefunden
    Deswegen hab ich gefragt.
    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. #28
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Kampi Beitrag anzeigen
    Deswegen hab ich gefragt.
    Kein Problem. IRam gehört weder zu den bekanntesten noch zu den meistverwandten Dingen. Tatsächlich ist's so, dass ich für mich kein IRam verwende, ich schreib dann lieber die ganze ISR in Assembler. Hier fand ich's interessant es zu erwähnen, da man so unter (fast) ausschließlicher Verwendung von Bascom-Befehlen einen deutlichen Vorteil erzielt.

  9. #29
    Erfahrener Benutzer Roboter Experte Avatar von Thomas E.
    Registriert seit
    29.12.2011
    Beiträge
    638
    Zitat Zitat von Kampi Beitrag anzeigen
    Was für ne LED verwendest du den? Auch so eine 3W LED oder kleiner?
    Ich verwende eine kleine 5mm RGB-Led mit 4 Anschlüssen, gemeinsame Anode. Durch den geringen Vorwärtsstrom von 20mA pro Farbe konnte ich einen etwaigen Treiber einsparen. Durch großzügige Vorwiderstände (ich will es nicht so hell) wird ein Batteriebetrieb möglich. Die LED ist direkt auf die Platine aufgelötet; da die Platine - oder eher, das Platinchen - sehr klein ist, stört das nicht. Das Platinchen liegt hinter mehreren Kerzen auf der Deko-Ecke eines Kastens und beleuchtet dadurch die Raumecke. Natürlich kommt das Licht nur zur Wirkung, wenn der Raum abgedunkelt ist, aber das war ja auch der Sinn der Sache. Also sozusagen die passende lichttechnische Untermalung zum Kuscheln und Fernsehen.

    @MagicWSmoke
    Vielen Dank für die sehr interessanten Ausführen. Es ist sehr faszinierend, wieviel du aus dem Code herausholen konntest. Mit den Assembler-Instruktionen habe ich zwar noch meine Probleme, aber das liegt wohl eher daran, dass ich mich zu meiner Schande viel zu wenig damit beschäftige.
    Grüße
    Thomas

  10. #30
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Zitat Zitat von Thomas E. Beitrag anzeigen
    @MagicWSmoke
    Vielen Dank für die sehr interessanten Ausführen. Es ist sehr faszinierend, wieviel du aus dem Code herausholen konntest. Mit den Assembler-Instruktionen habe ich zwar noch meine Probleme, aber das liegt wohl eher daran, dass ich mich zu meiner Schande viel zu wenig damit beschäftige.
    Da bist du nicht alleine. Aber das ist genial....der Code wurde von 90% auf 66% runter gedrückt

    Zitat Zitat von Thomas E. Beitrag anzeigen
    Ich verwende eine kleine 5mm RGB-Led mit 4 Anschlüssen, gemeinsame Anode. Durch den geringen Vorwärtsstrom von 20mA pro Farbe konnte ich einen etwaigen Treiber einsparen. Durch großzügige Vorwiderstände (ich will es nicht so hell) wird ein Batteriebetrieb möglich. Die LED ist direkt auf die Platine aufgelötet; da die Platine - oder eher, das Platinchen - sehr klein ist, stört das nicht. Das Platinchen liegt hinter mehreren Kerzen auf der Deko-Ecke eines Kastens und beleuchtet dadurch die Raumecke. Natürlich kommt das Licht nur zur Wirkung, wenn der Raum abgedunkelt ist, aber das war ja auch der Sinn der Sache. Also sozusagen die passende lichttechnische Untermalung zum Kuscheln und Fernsehen.
    Ok sowas hatte ich auch geplant nur weil meine LED bisl größer ist muss ich noch 3 Transistoren mit auf die Platine bringen. Aber ich möchte das Ding dann auch mit einem Steckernetzteil betreiben
    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

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Ä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, 16:20
  2. ATTiny13 PWM
    Von Jacob2 im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 13.05.2009, 19:08
  3. attiny13
    Von epos im Forum AVR Hardwarethemen
    Antworten: 8
    Letzter Beitrag: 05.10.2007, 22:39
  4. Antworten: 5
    Letzter Beitrag: 02.02.2007, 11:03
  5. Antworten: 7
    Letzter Beitrag: 17.10.2006, 17:10

Berechtigungen

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

12V Akku bauen