- Labornetzteil AliExpress         
Seite 7 von 7 ErsteErste ... 567
Ergebnis 61 bis 65 von 65

Thema: Bascom Inline-Assembler

  1. #61
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Anzeige

    Praxistest und DIY Projekte
    Hallo Andreas,
    Zitat Zitat von flyer_5 Beitrag anzeigen
    Code:
    !PUSH ZL
    !PUSH ZH
    Loadadr Servo(1) , z    
    !LDS   R18,   {Kanal}
    !LDS   R19,   {Kanal+1}
    !SBIW  ZL,    1                   'Kanal fängt bei 1 an
    !ADD   ZL,    R18
    !ADC   ZH,    R19
    !LD    R16,   Z
    !STS   {Rslt},R16
    !OUT     TCNT1L,     ZL
    !OUT     TCNT1H,     ZH
    Entspricht das ungefähr dem hier? Ich weiß leider nicht so genau in welchem Register dann was und wie reingeladen wird,und wie ich es an den Timer1 übergebe...
    Code:
    Timer1 = Servo(kanal)
    nein, das stimmt so nicht. Du hast Servo() als Word deklariert, da muss der Index nach Abzug der 1 noch mit 2 multipliziert werden, Du willst auch nicht den Wert des angesprochenen Arrayelements in Rslt haben, sondern in Timer1. Im Moment schreibst Du die Adresse des ge-indexten Bytes in den Timer.

    Außerdem kannst Du Timer1 TCNT1L/H nicht mehr mit !OUT erreichen, denn das Timerregister ist beim ATM8 an &h2C/2D, das solltest Du zumindest wissen, wobei hier Bascom eine Ersetzung durch !STS durchführen wird, ohne dass Du's merkst.

    Auch ist Kanal ein Byte, als geht !LDS R19, {Kanal+1} nicht, sondern R19 wird einfach auf 0 gesetzt.

    Es muss also nach dem !SBIW , 1 mal 2 multipliziert werden, das geht per Linksschieben mit !LSL für das Lowbyte und !ROL für das Highbyte. Dann stimmt die Adresse für das ge-indexte Word schon mal, von welchem dann dann erst das Lowbyte per !LD Rx, Z+ und dann das Highbyte per !LD Ry, Z gelesen wird. Dann speicherst Du Rx/y nach TCNT1L/H, wobei Du zuerst das Highbyte des TCNT1 schreiben musst und dann das Lowbyte, siehe ATM8 Datenblatt unter Accessing 16-bit Registers.

  2. #62
    Neuer Benutzer Öfters hier
    Registriert seit
    13.02.2010
    Beiträge
    5
    Danke für die kompetente Antwort,das hat mich schon etwas weiter gebracht...Ich habe leider wenig Zeit,daher erfolgt meine Antwort erst jetzt!
    Wenn ich ehrlich bin war mir das mit dem Array zu komplitziert. Ich hab jetzt einfach meherere Word Variablen (K1 bis K7 + Pause als Word)

    Code:
    Rc:
    
    !PUSH    R16
    !in R16 , Sreg
    !push r24
    !push r25
    !PUSH    R16
    !LDS     R16,       {Kanal}
    !INC     R16                                                'Kanal um 1 erhöhen
    !STS     {Kanal}, R16
    
    cbi portd,4                                                 'Alle Ports=0
    cbi portB,6
    cbi portB,7
    cbi portD,5
    cbi portD,6
    cbi portD,7
    cbi portB,0
    
    
    
    cpi r16,1
    Brne K2                                                     ' wenn ungleich 1 -> weiterspringen
    Sbi portd,4                                                 'Ansonsten-> Port einschalten ,Timer mit Kanalwert vorladen
    LDS      R24, {k1}                                          'holen Byte 1  (bits 0-7)
    LDS      R25, {k1+1}                                        'holen Byte 2  (bits 8-15)
    !Out Tcnt1H , R25
    !Out Tcnt1l , R24
    
    K2:
    cpi r16,2
    Brne K3                                                     ' wenn ungleich 2 -> weiterspringen
    Sbi portB,6                                                 'Ansonsten-> Port einschalten ,Timer mit Kanalwert vorladen
    LDS      R24, {k2}                                          'holen Byte 1  (bits 0-7)
    LDS      R25, {k2+1}                                        'holen Byte 2  (bits 8-15)
    !Out Tcnt1H , R25
    !Out Tcnt1l , R24
    
    
    K3:
    cpi r16,3
    Brne K4
    Sbi portB,7
    LDS      R24, {k3}                                          'holen Byte 1  (bits 0-7)
    LDS      R25, {k3+1}                                        'holen Byte 2  (bits 8-15)
    !Out Tcnt1H , R25
    !Out Tcnt1l , R24
    
    K4:
    cpi r16,4
    Brne K5
    Sbi portd,5
    LDS      R24, {k4}                                          'holen Byte 1  (bits 0-7)
    LDS      R25, {k4+1}                                        'holen Byte 2  (bits 8-15)
    !Out Tcnt1H , R25
    !Out Tcnt1l , R24
    
    K5:
    cpi r16,5
    Brne K6
    Sbi portd,6
    LDS      R24, {k5}                                          'holen Byte 1  (bits 0-7)
    LDS      R25, {k5+1}                                        'holen Byte 2  (bits 8-15)
    !Out Tcnt1H , R25
    !Out Tcnt1l , R24
    
    K6:
    cpi r16,6
    Brne Pause
    Sbi portb,0
    LDS      R24, {k6}                                          'holen Byte 1  (bits 0-7)
    LDS      R25, {k6+1}                                        'holen Byte 2  (bits 8-15)
    !Out Tcnt1H , R25
    !Out Tcnt1l , R24
    
    
    Pause:
    cpi r16,7
    Brne Ende                                                   ' wenn ungleich 7 -> weiterspringen
    LDS      R24, {Pause}                                       'holen Byte 1  (bits 0-7)
    LDS      R25, {Pause+1}                                     'holen Byte 2  (bits 8-15)
    !Out Tcnt1H , R25
    !Out Tcnt1l , R24
    
    !LDI     R16,       0                                       'Kanal=0
    !STS     {Kanal}, R16
    
    Ende:
    
    pop r24
    pop r25
    pop r16
    !out sreg,r16
    pop r16
    
    Return

    Das ist nun meine neue Timer1 ISR. Die Ausgabe der Kanäle funktuioniert auch.Nur scheint es ein Problem zu geben ,welches mir nicht ersichtlich ist.... Sobald ich den Interrupt als Nosave definiere,läuft mein Hauptprogramm nicht mehr,wobei die letzten Servowerte weiterhin ausgegeben werden (Timer1 Int läuft also noch).

    Theoretisch ist das dann doch was ganz offensichtliches? Vlt. kann mir da jemand helfen,denn ich stehe quasi fast vor dem Ziel

    Nur zur Info:
    K1 - K7 werden mit 64000+-500 vorgeladen
    Pause ist im Moment ein Fixwert : 50000


    Gruß

  3. #63
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von flyer_5 Beitrag anzeigen
    Wenn ich ehrlich bin war mir das mit dem Array zu komplitziert. Ich hab jetzt einfach meherere Word Variablen (K1 bis K7 + Pause als Word)
    Auch ok.
    Code:
    Rc:
    
    !PUSH    R16
    !in R16 , Sreg
    !push r24
    !push r25
    !PUSH    R16
    ' ...
    pop r24
    pop r25
    pop r16
    !out sreg,r16
    pop r16
    Theoretisch ist das dann doch was ganz offensichtliches?
    Der Stack ist ein LiFo, last in - first out, also muss in der richtigen Reihenfolge, genau umgekehrt wie ge-PUSH-t wurde, auch wieder ge-POP-ed werden.

  4. #64
    Neuer Benutzer Öfters hier
    Registriert seit
    13.02.2010
    Beiträge
    5
    Funktioniert Hätte nicht gedacht, dass die Reihenfolge eine Rolle spielt. Aber ich bin nur ein Bascommer auf zeitkritischen Abwegen.
    @ MagicWsmoke : Nochmals Danke.Hätte den Mischer ohne deine Hilfe nicht jitterfrei bekommen...

    Der komplette Code wird folgen.Wahrscheinlich in einem neuen Thread!

  5. #65
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Ok, gern geschehen.
    Das wäre übrigens die Lösung gewesen:
    Code:
    Loadadr Servo(1) , Z
    !LDS   R18,   {Kanal}
    !LDI   R19,   0
    !DEC   R18
    !LSL   R18
    !ROL   R19
    !ADD   ZL,    R18
    !ADC   ZH,    R19
    !LD    R18,   Z+
    !LD    R19,   Z
    !OUT     TCNT1H,     R19
    !OUT     TCNT1L,     R18

Seite 7 von 7 ErsteErste ... 567

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

LiFePO4 Speicher Test