- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 65

Thema: Bascom Inline-Assembler

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #11
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Definitionen sind (glaube ich) die vom ersten Post:
    Code:
    Dim Empf(5) As Word  
    Dim Channel As Byte
    Hm, das ist mir durchaus klar, aber ich kann nicht den ganzen Code nach ASM übersetzen; Trotzdem möchte ich die ISR "etwas" verschnellern. Momentan (also reines Bascom) sinds 162 Takte, das ist zulange.
    Worum gehts?
    Mit dieser ISR wird das Summensignal des Empfängers eingelesen (und näturlich mithilfe des Timer0). Es gibt 5 relevante Kanäle, die die Software benötigt. Durchschnittsberechnungen sind keine vorhanden. Hier nochmal der orignale Code:
    Code:
    Getreceiver:                                                'falling edge detection
    If Channel > 0 And Channel < 6 Then                         'fill empf(1-5)
      Empf(channel) = Timer0
    End If
    Timer0 = 6                                                  'preload for 4.096 ms
    Incr Channel                                                'if no falling edge was detected for a longer period, channel will increase above 11
    
    Return
    (wie gesagt von Willa)
    Diesen möchte ich auf ASM umschreiben. Habs auch schon mal so gemacht:
    Code:
    Isr_int0:
    
    push r16                                                    'sichere r16
    
    lds r16 , {channel}                                         'lade channel in r16
    cpi r16 , 6                                                 'vergleiche r16 mit 6
    brlo _lower                                                 'springe, wenn kleiner
    rjmp _out_of_range                                          'sonst springe nach _out_of_range
    _lower:                                                     '_lower Label
    cpi r16 , 1                                                 'vergleiche r16 mit 1
    brge _higher                                                'springe, wenn größer gleich
    rjmp _out_of_range                                          'sonst springe nach _out_of_range
    _higher:                                                    '_higher Label
    '######################################################################################################################################
    '######################################################################################################################################
    Empf(channel) = Timer0
    '######################################################################################################################################
    '######################################################################################################################################
    _out_of_range:                                              '_out_of_range Label
    ldi r16 , 6                                                 'lade 6 in r16
    !out tcnt0 , r16                                            'schreibe r16 in timer0
    lds r16 , {channel}                                         'lade Channel in r16
    inc r16                                                     'erhöhe Channel um 1
    sts {channel} , r16                                         'lade r16 in Channel
    
    pop r16                                                     'stelle r16 wieder her
    
    Return
    Das waren glaube ich 43 Takte, was auch schon deutlich besser ist. (Als Nosave INT) Aber da geht doch noch mehr, oder nicht?

    Gruß
    Chris

    EDIT:
    Bei dem letzten Code habe ich vergessen, die Register, die Bascom für die Anweisung "Empf(channel) = Timer0" braucht, zu sichern. Das sind R10, R11, R24, R26, R27.
    Das macht dann nochmal 5(Register) * 2(Push&Pop) * 2(Takte pro Befehl) = 20 Takte mehr.
    Geändert von Che Guevara (23.12.2011 um 15:04 Uhr)

Ähnliche Themen

  1. Inline Assembler
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 16
    Letzter Beitrag: 01.02.2010, 19:25
  2. AVR GCC inline Assembler
    Von chientech im Forum Assembler-Programmierung
    Antworten: 1
    Letzter Beitrag: 26.09.2009, 16:39
  3. Inline Assembler für Anfänger
    Von 1udo1 im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 25.10.2007, 19:53
  4. Inline Assembler - Register
    Von s.o. im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 02.08.2007, 20:26
  5. Parameterübergabe bei Inline-Assembler
    Von ogni42 im Forum C - Programmierung (GCC u.a.)
    Antworten: 21
    Letzter Beitrag: 30.03.2006, 13:32

Berechtigungen

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

LiFePO4 Speicher Test