- fchao-Sinus-Wechselrichter AliExpress         
Seite 3 von 7 ErsteErste 12345 ... LetzteLetzte
Ergebnis 21 bis 30 von 65

Thema: Bascom Inline-Assembler

  1. #21
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Anzeige

    Praxistest und DIY Projekte
    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 16:44 Uhr)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  2. #22
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Che Guevara Beitrag anzeigen
    ...ob man noch was optimieren kann?
    Eher richtig machen, weniger "optimieren".
    1) Warum glaubst Du, dass XL/XH nicht durch anderen Code verändert wird ? Du lädst X nicht in der ISR, sondern addierst nur fleissig dazu, das geht so gar nicht.

    2) Anderer Code wird nicht mehr arbeiten, wenn Du XL/XH verwendest ohne den beim ISR-Eintritt zu sichern, XH kann verändert werden, wenn eine Bytegrenze überschritten wird.

    3) Du kannst Dir nur sparen das Carry per ADC auf XH aufzuaddieren, wenn Du sicher bist, dass die absolute SRam-Adresse des Arrays vom Compiler nicht an eine Bytegrenze gelegt wird. Beispiel für Word:
    Index 1: HB/LB = &h01 &hFC
    Index 2: &h01 &hFE
    Index 2: &h02 &h00

    4) SREG wird nicht gesichert.

    Abschließend vielleicht noch die Frage an Dich, warum ich Dir denn eigentlich Beispiele geschrieben habe, wenn Du die weitestgehend ignorierst ?
    Geändert von MagicWSmoke (23.12.2011 um 17:12 Uhr)

  3. #23
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    so, soweit möglich getestet:

    Besonderheiten:
    "dummy" dient nur dazu, damit Bascom bei "Loadadr" keinen Index verlangt, verbraucht aber keinen Platz (Overlay) . könnte man auch anders machen, however.
    "channel" Bascom verlangt Index 1-5. das ist aber ungünstig zu rechnen. Besser 0-4 . man braucht dadurch nur auf > 4 ( >= 5) zu prüfen


    Code:
     
    Dim Empf(5) As Word
    Dim Dummy As Byte At Empf Overlay
    Dim Channel As Byte
     
    Getreceiver:                                                'falling edge detection
       $asm
       PUSH  r24
       PUSH  r25
       PUSH  XL
       PUSH  XH
       !IN   r24, SREG
       PUSH  r24
       LDS   r24, {channel}                                     ' channel 0-4 ( Bascom 1-5)
       CPI   r24, 5                                             ' >= 5 --> skipped
       BRSH  _out_of_range
       LSL   r24                                                ' * 2 (wordlength)
       CLR   r25                                                ' clear  (r24 kann ja nicht grösser als 8 werden)
       Loadadr Dummy , X                                        ' addr Empf(0)  
       ADD   XL, r24                                            ' addr Empf + 2*channel
       ADC   XH, r25
       !IN    r24, TCNT0                                        ' timer0
       ST    X+ , r24                                           ' empf(channel) = timer0
       ST    X  , r25
    _out_of_range:
       LDS   r24, {channel}                                     ' channel 0-4 ( Bascom 1-5)
       INC   r24
       STS   {channel}, r24
       LDI   r24, 6
       !OUT  TCNT0, r24
       POP   r24
       !OUT  SREG, r24
       POP   XH
       POP   XL
       POP   r25
       POP   r24
           $end Asm
    Return
    Anders und vermutl. besser geht' sicher auch

    Ein bisschen kann man noch sparen, wenn "empf" komplett im adressbereich < 256 liegt.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #24
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Hallo,

    erstmal danke für das Beispiel!
    @MagicWSmoke:
    Ich habe deine Beispiele keinesfalls ignoriert, nur ist es für mich nicht leicht, das zu verstehen. Ich habs mir mehrfach angesehen, nur bin ich eben mit dieser ASM-Denkerei noch nicht so vertraut.
    @Picture:
    Vielen Dank! Ich werde deinen Code testen, auch auf die Taktzahl werde ich achten. Melde mich dann wieder, wenns funktioniert.

    Gruß & Vielen Dank
    Chris

    EDIT:
    Habs gerade im Simulator getestet, mit der Return-Anweisung braucht die komplette ISR (wenn Channel zw. 1 und 5) nur 48 Takte. Das ist im vergleich zu den anfänglichen ca 160 Takten nur ein Viertel. Später, oder auch morgen, werde ich das dann mal auf den Quadro flashen und mal schaun, obs funktioniert.

    EDIT2:
    Habs gerade getestet, irgendetwas funktioniert nicht. Wenn ich das Programm flashe (mit NUR veränderter ISR, Dummy-Variable und NOsave) blinken schon die LEDs anders, sie zeigen wahrscheinlich einen Fehelrcode.
    Geändert von Che Guevara (23.12.2011 um 18:20 Uhr)

  5. #25
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Che Guevara Beitrag anzeigen
    Habs gerade getestet, irgendetwas funktioniert nicht.
    Ohne dass ich jetzt Original und ASM im Detail verglichen hab', ist doch zu sehen dass Ihr das hier aus meinem früheren Post vergessen habt:
    Code:
    !DEC   R18   <--- weglassen bei Index 0-4
    Im Fall von PicNick's Code wäre das R24.

    Überleg' doch mal, was ein Schieben des Index 1 zur Folge hat und welche Adresse angesprochen wird.
    Ich habs mir mehrfach angesehen, nur bin ich eben mit dieser ASM-Denkerei noch nicht so vertraut.
    Hättest Du halt gefragt...

  6. #26
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    55
    Beiträge
    1.258
    Btw: Bascom Version ist 1.11.9.5
    mach doch erstmal ein Update.

    Gruß, Michael

  7. #27
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Hi Michael,
    Zitat Zitat von Michael Beitrag anzeigen
    mach doch erstmal ein Update.
    in diesem Fall ist's egal, da nur ASM betreffend und auch der Fehler offensichtlich ist. Unter Bascom wird im Originalcode mit Index 1..5 gearbeitet, die Adressierung in PicNicks Assemblercode benötigt aber Index 0..4.
    Wenn man sich die Basisadresse des Arrays mit LoadAdr holt, dann hat man bereits die erste Zelle im Pointer-Register und darf nicht noch den Index mit 1*2 dazurechnen. Wenn man's trotzdem macht, adressiert man den falschen Arrayinhalt und überschreibt hier sogar nachfolgende Variablen.

  8. #28
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Zur Info, wer's nicht weiss: Bascom adressiert indizierte Tabellen so: er lädt
    Tabellenanfangsadresse - elementlänge
    dadurch braucht er den index nicht um 1 zu verringern.
    das fällt im generierten Code nur auf, wenn man die Tabellen-adresse im Report (prog.RPT) vergleicht.

    Zur Vorsicht, weil wir ja nicht den ganzen Code sehen: Die ISR-Routine darf nur HINTER der "END" anweisung stehen.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #29
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Hallo,

    Die ISR-Routine steht fast ganz am Schluss des Programms, hinter dem END. Hier (http://www.villalachouette.de/willia...iquetteDLX.txt) findet man den ganzen Quellcode, meiner ist fast identisch, außer dass ich einen BMA020 ACC über I2C anspreche und ich vier Motoren habe. Ansonsten genau gleich.

    Gruß
    Chris

  10. #30
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    PicNick,
    Zitat Zitat von PicNick Beitrag anzeigen
    Zur Info, wer's nicht weiss: Bascom adressiert indizierte Tabellen so: er lädt
    Tabellenanfangsadresse - elementlänge
    dadurch braucht er den index nicht um 1 zu verringern.
    Ja, ist bekannt. Und was hat das mit Deinem Code zu tun ?
    Wenn man mal den original Bascom-Code ansieht:
    Code:
    Isr_int0:
    If Channel > 0 And Channel < 6 Then
      Empf(channel) = Timer0
    End If
    Timer0 = 6
    Incr Channel
    Return
    dann wird dort channel 1..5 verwendet, Dein ASM-Code verwendet dagegen channel 0..4. Das würde nur funktionieren, wenn channel nur eine innerhalb der ISR verwendete Variable wäre und vom restlichen Code nicht angesprochen wird. Das ist aber bereits aus dem Code hervorgehend sehr unwahrscheinlich, denn pro Aufruf der Int0-ISR wird channel um 1 hochgezählt. Was ist dann bei channel = 5 ? Hört dann alles auf, oder muss channel erst überlaufen ?

    Also wird channel sehr wahrscheinlich woanders im Code auch verwendet und wenn dem so ist, müssten alle entsprechenden Stellen auf channel 0..4 umgestellt werden.
    Das macht man doch nicht so, da ist's doch einfacher der ASM-Code bildet channel 1..5 nach, auch wenn's 'nen Takt mehr kostet.

    @Chris,

    wo kommt eigentlich das Hochzählen von channel her ? Ist im Bascom-Code nicht zu entdecken.

Seite 3 von 7 ErsteErste 12345 ... LetzteLetzte

Ähnliche Themen

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

Berechtigungen

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

12V Akku bauen