- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 3 von 3

Thema: AVR r6 CPU-Registerbits sparen Interruptzyklen in Bascom

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

    AVR r6 CPU-Registerbits sparen Interruptzyklen in Bascom

    Anzeige

    E-Bike
    Hallo,

    benutzt man Interrupt-Service-Routinen in Bascom, werden bei Aufruf der ISR fast alle CPU-Register gesichert. Abhängig von der ISR ist das aber oft nicht notwendig und man kann die ISR schneller machen, indem man den Parameter "nosave" bei der "ON interrupt" Anweisung verwendet. Der Compiler sichert dann keine Register was PUSH/POP Befehle spart aber man muß die in der ISR verwendeten Register selbst händisch sichern.

    Um die ISR möglichst schnell ablauffähig zu bekommen verwende ich dort öfter Assembler, der innerhalb von Bascom Programmen sehr einfach zu verwenden ist. Dabei kommt es vor, daß ich in der ISR Flags abfragen oder setzen muß um zB zu entscheiden, ob der Rückwärtsfahr-Portpin oder der Vorwärtsfahr-Portpin geschaltet werden muß.

    Dabei bin ich auf Bit 4, 5, 6 und 7 von Register r6 gestoßen, die man anstelle von Flagvariablen nutzen könnte. Nur die Bits 0..3 werden in der Bascom Hilfe als vom Bascom Compiler verwendet erwähnt. r6 selbst wird bei Aufruf einer ISR weder gesichert noch wiederhergestellt. Ich gehe davon aus, das die 4 oberen Bits in r6 in einem Bascom Programm nicht verwendet/verändert werden. (r6 wird jedoch am Beginn eines Programms vom Compiler mit 0 initialisiert).

    Man spart damit Zugriffe auf Flagvariable und auch etwas RAM für die Variable. Nicht viel aber wenn man schon beim Zyklenzählen ist ...

    Nachstehend ein Programmfragment, wie so etwas aussehen könnte. Kritik und natürlich Zustimmung erwünscht , da ich mir da etwas unsicher bin. Erste einfache Versuche verliefen gut.

    Gruß
    Searcher

    Code:
    $regfile = "attiny44.dat"
    $crystal = 8000000
    $hwstack = 36
    $swstack = 32
    $framesize = 32
    
    Const Forward = 0
    Const Backward = 1
    
    Dim Direction As Byte
    
    On Compare0a Isr_pwmpulse_on Nosave                         'kein Registersichern bei ISR Aufruf
    Enable Compare0a
    On Timer0 Isr_pwmpulse_off Nosave                           'kein Registersichern bei ISR Aufruf
    Enable Timer0
    Enable Interrupts
    
    Do
      Debounce Portb.1 , 0 , Toggle_direction , Sub
    Loop
    
    'Denkbar Ist Also Zb ein Unterprogramm
    Toggle_direction:
      Disable Interrupts                                        'Inkonsistenz zwischen SET/CLT und BLD vermeiden
      If Direction = Forward Then
          !SET                                                  'T-Flag in SREG setzen
          !BLD r6 , 5                                           'T-Flag nach r6 Bit5 sichern
          Direction = Backward
        Else
          !CLT                                                  'T-Flag in SREG löschen
          !BLD r6 , 5
          Direction = Forward
      End If
      Enable Interrupts
    Return
    
    'In der ISR zB
    Isr_pwmpulse_on:                                            'PWM Portpin abhängig von Fahrtrichtung einschalten
      !SBRS r6 , 5                                              'Check Bit 5 in r6
       !sbi porta,1                                             'Setze Portpin für VorwärtsPWMpuls
      !SBRc r6 , 5                                              'Check Bit 5 in r6
       !sbi porta,2                                             'Setze Portpin für RücwärtsPWMpuls
    Return
    
    Isr_pwmpulse_off:                                           'PWM Pulse ausschalten
         !CBI porta,1
         !CBI porta,2
    return
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Hallo Searcher,

    ja, Assembler, die üblichen Hürden. Man muss eben immer alles im Blick haben. Solange ein Register nicht benutzt wird, kann man es verwenden. Oder man sichert es und stellt es am Schluss wieder her.
    Wenn Du Meinungen, in Verbindung mit AVR, suchst, habe ich etwas hier gefunden.
    Mehr kann ich dazu nicht beitragen, Assembler oder Maschinencode ist schon lang nicht mehr mein Hauptgebiet.

    MfG
    Geändert von Moppi (15.10.2020 um 07:34 Uhr) Grund: Spezifizierung

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hallo Moppi,

    danke für den Link.

    Der Hinweis zu den oberen Bits in r6 ist ziemlich sicher nur für Bascom relevant. Das sollte einen Beitrag liefern um eine ISR mit möglichst wenigen Zyklen ablauffähig zu bekommen falls nötig. Ich fand das erwähnenswert, da ich öfter Bascom und Assembler mixe. Ist in der Bascom IDE so schön einfach.

    Ich werde das r6 bei Gelegenheit so verwenden. Falls jemand weiß, ob das zu Fehlern führt; bitte melden.

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

Ähnliche Themen

  1. Geld sparen, Strom sparen?
    Von Herkules9987 im Forum Offtopic und Community Tratsch
    Antworten: 13
    Letzter Beitrag: 17.07.2019, 15:05
  2. Controller-RAM sparen
    Von cdk im Forum Arduino -Plattform
    Antworten: 5
    Letzter Beitrag: 07.07.2019, 18:48
  3. Flag - Speicherplatz sparen
    Von Ali_Baba im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 24.02.2009, 13:27
  4. Mit Dimmer Stromkosten sparen ?
    Von nase im Forum Elektronik
    Antworten: 9
    Letzter Beitrag: 11.09.2008, 21:43
  5. Interupt Port sparen
    Von im Forum Elektronik
    Antworten: 10
    Letzter Beitrag: 13.10.2004, 16:02

Berechtigungen

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

12V Akku bauen