- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 65

Thema: Bascom Inline-Assembler

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    "DA" ist momentan in meinem Hirn
    Geht darum, dass die 1:1 Übertragung von Bascom ---> Assembler natürlich nicht das Gelbe vom kolumbus ist.

    Nun, wenigstens die (relevanten) Variablen definitionen würd' ma schon noch gerne sehen.
    Oder sind das genau die vom 1.Post ?

    Und worum geht's eigentlich ? Durchschnitt von 6 Messungen ?
    Geändert von PicNick (23.12.2011 um 14:07 Uhr)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  2. #2
    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)

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Soweit mal klar.
    Ich werd' Dir einen ISR-Vorschlag machen

    Btw: Du musst in der ISR auf jeden fall noch SREG pushen und poppen, sonst fängt dein Programm zu spinnen an.

    Noch eine Frage:
    Timer0 hat doch nur 8-Bit

    wieso brauchst du eine Tabelle mit WORD ?
    Geändert von PicNick (23.12.2011 um 15:44 Uhr)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Ä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
  •  

fchao-Sinus-Wechselrichter AliExpress