-
        

Ergebnis 1 bis 6 von 6

Thema: Timer und Nosave

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.04.2005
    Ort
    Aarau
    Alter
    34
    Beiträge
    979

    Timer und Nosave

    Anzeige

    Hallo zusammen!

    eigentlich gehört die frage auch ins assembler forum... aber die frage geht ja von Bascom aus...

    zu meinem problem:
    ich möchte die timeraufrufe mit dem nosave befehl beschleunigen... und die unnützen pop/push befehle reduzieren...

    ich habe dass compilierte .hex file mal durch einen reassembler gejagt um herauszufinden welche register in der timer isr wirklich benutzt und vorher gesichert werden müssen.

    folgendes kam dabei heraus:
    Code:
    ; reassembly of "I2C_SERVO_SLAVE.HEX"
    ; created by ReAVR V3.2.0
    ; at 2008/05/27 - 19:42:19
    ; for Atmel AVR assembler
    ;---------------------------------------
    ; AVR_TYPE=<unknown>
    ; FLASH_SIZE=8KB
    ; SRAM_START=0x60
    ;---------------------------------------
    	.cseg
    	.org	0x0000
    ;---------------------------------------
    ; byte constants:
    ;
    .equ	k00	= 0x00	;
    .equ	k01	= 0x01	;
    .equ	k02	= 0x02	;
    .equ	k04	= 0x04	;
    .equ	k07	= 0x07	;
    .equ	k08	= 0x08	;
    .equ	k18	= 0x18	;
    .equ	k1F	= 0x1F	;
    .equ	k33	= 0x33	; '3'
    .equ	k38	= 0x38	; '8'
    .equ	k40	= 0x40	; '@'
    .equ	k5F	= 0x5F	; '_'
    .equ	k60	= 0x60	; '`'
    .equ	k64	= 0x64	; 'd'
    .equ	k69	= 0x69	; 'i'
    .equ	k83	= 0x83	;
    .equ	k90	= 0x90	;
    .equ	kC2	= 0xC2	; 'Â'
    .equ	kE2	= 0xE2	; 'â'
    .equ	kF7	= 0xF7	; '÷'
    .equ	kFE	= 0xFE	; 'þ'
    .equ	kFF	= 0xFF	; 'ÿ'
    ;
    ; io register addresses:
    ;
    .equ	p09	= 0x09
    .equ	p0A	= 0x0A
    .equ	p17	= 0x17
    .equ	p18	= 0x18
    .equ	p20	= 0x20
    .equ	p21	= 0x21
    .equ	p2C	= 0x2C
    .equ	p2D	= 0x2D
    .equ	p2E	= 0x2E
    .equ	p2F	= 0x2F
    .equ	p34	= 0x34
    .equ	p39	= 0x39
    .equ	p3D	= 0x3D
    .equ	p3E	= 0x3E
    .equ	p3F	= 0x3F
    ;
    ; bit numbers:
    ;
    .equ	b0	= 0x00
    .equ	b1	= 0x01
    .equ	b2	= 0x02
    .equ	b3	= 0x03
    .equ	b4	= 0x04
    .equ	b5	= 0x05
    .equ	b6	= 0x06
    .equ	b7	= 0x07
    ;---------------------------------------
    ;
    L0000:
    	jmp	_reset	; L002A
    ;	-----------	jump on last line
    	reti
    ;----------------------*
    ; pc=0x3(0x6)
    ;
    	nop
    	reti
    ;----------------------*
    ; pc=0x5(0xA)
    ;
    	nop
    	reti
    ;----------------------*
    ; pc=0x7(0xE)
    ;
    	nop
    	reti
    ;----------------------*
    ; pc=0x9(0x12)
    ;
    	nop
    	reti
    ;----------------------*
    ; pc=0xB(0x16)
    ;
    	nop
    	reti
    ;----------------------*
    ; pc=0xD(0x1A)
    ;
    	nop
    	reti
    ;----------------------*
    ; pc=0xF(0x1E)
    ;
    	nop
    	reti
    ;----------------------*
    ; pc=0x11(0x22)
    ;
    	nop
    	jmp	L0060
    ;	-----------	jump on last line
    	reti
    ;----------------------*
    ; pc=0x15(0x2A)
    ;
    	nop
    	reti
    ;----------------------*
    ; pc=0x17(0x2E)
    ;
    	nop
    	reti
    ;----------------------*
    ; pc=0x19(0x32)
    ;
    	nop
    	reti
    ;----------------------*
    ; pc=0x1B(0x36)
    ;
    	nop
    	reti
    ;----------------------*
    ; pc=0x1D(0x3A)
    ;
    	nop
    	reti
    ;----------------------*
    ; pc=0x1F(0x3E)
    ;
    	nop
    	reti
    ;----------------------*
    ; pc=0x21(0x42)
    ;
    	nop
    	reti
    ;----------------------*
    ; pc=0x23(0x46)
    ;
    	nop
    	reti
    ;----------------------*
    ; pc=0x25(0x4A)
    ;
    	nop
    	reti
    ;----------------------*
    ; pc=0x27(0x4E)
    ;
    	nop
    	reti
    ;----------------------*
    ; pc=0x29(0x52)
    ;
    	nop
    ;
    _reset:
    ; L002A:
    	ldi	r24,k5F
    	out	p3D,r24
    	ldi	r28,k40
    	ldi	r30,k38
    	mov	r4,r30
    	ldi	r24,k08
    	out	p3E,r24
    	ldi	r29,k08
    	ldi	r31,k08
    	mov	r5,r31
    	ldi	r30,kFE
    	ldi	r31,k07
    	ldi	r26,k60
    	ldi	r27,k00
    	clr	r24
    L0039:
    	st	X+,r24
    	sbiw	r30,k01
    	 brne	L0039
    ;	-----		branch on last line
    	ldi	r24,k33
    	out	p09,r24
    	ldi	r24,k00
    	out	p20,r24
    	ldi	r24,k18
    	out	p0A,r24
    	in	r24,p34
    	mov	r0,r24
    	andi	r24,kF7
    	out	p34,r24
    	ldi	r24,k1F
    	out	p21,r24
    	ldi	r24,k07
    	out	p21,r24
    	clr	r6
    	ldi	r24,k00
    	out	p2F,r24
    	ldi	r24,k01
    	out	p2E,r24
    	in	r24,p39
    	ori	r24,k04
    	out	p39,r24
    	sbi	p17,b0
    	sbi	p17,b1
    	sbi	p17,b2
    	sbi	p17,b3
    	sbi	p17,b4
    	sbi	p17,b5
    	sei
    L0059:
    	ldi	r24,k64
    	sts	D0061,r24
    	jmp	L0059
    ;	-----------	jump on last line
    	cli
    L005F:
    	rjmp	L005F
    ;	-----------	jump on last line
    ; pc=0x60(0xC0)
    ;
    L0060:
    	push	r0
    	push	r1
    	push	r2
    	push	r3
    	push	r4
    	push	r5
    	push	r7
    	push	r10
    	push	r11
    	push	r16
    	push	r17
    	push	r18
    	push	r19
    	push	r20
    	push	r21
    	push	r22
    	push	r23
    	push	r24
    	push	r25
    	push	r26
    	push	r27
    	push	r28
    	push	r29
    	push	r30
    	push	r31
    	in	r24,p3F
    	push	r24
    	lds	r16,D0060
    	cpi	r16,k00
    	 breq	L0081
    ;	-----		branch on last line
    	jmp	L0093
    ;	-----------	jump on last line
    L0081:
    	ldi	r24,k00
    	out	p2F,r24
    	ldi	r24,k01
    	out	p2E,r24
    	ldi	r24,k90
    	ldi	r25,kE2
    	sts	(p2D+0x20),r25	; io register
    	sts	(p2C+0x20),r24	; io register
    	sbi	p18,b0
    	sbi	p18,b1
    	sbi	p18,b2
    	sbi	p18,b3
    	sbi	p18,b4
    	sbi	p18,b5
    	jmp	L00AB
    ;	-----------	jump on last line
    L0093:
    	lds	r16,D0060
    	cpi	r16,kFF
    	 breq	L0099
    ;	-----		branch on last line
    	jmp	L00A5
    ;	-----------	jump on last line
    L0099:
    	ldi	r24,k00
    	out	p2F,r24
    	ldi	r24,k02
    	out	p2E,r24
    	ldi	r24,kC2
    	ldi	r25,k69
    	sts	(p2D+0x20),r25	; io register
    	sts	(p2C+0x20),r24	; io register
    	jmp	L00AB
    ;	-----------	jump on last line
    L00A5:
    	ldi	r24,k83
    	ldi	r25,kFF
    	sts	(p2D+0x20),r25	; io register
    	sts	(p2C+0x20),r24	; io register
    L00AB:
    	lds	r16,D0060
    	cpi	r16,k00
    	 brcs	L00B2
    ;	-----		branch on last line
    	 breq	L00B2
    ;	-----		branch on last line
    	jmp	L00B4
    ;	-----------	jump on last line
    L00B2:
    	jmp	L00EA
    ;	-----------	jump on last line
    L00B4:
    	lds	r20,D0061
    	lds	r16,D0060
    	cp	r16,r20
    	 brcc	L00BC
    ;	-----		branch on last line
    	jmp	L00BD
    ;	-----------	jump on last line
    L00BC:
    	cbi	p18,b0
    L00BD:
    	lds	r20,D0062
    	lds	r16,D0060
    	cp	r16,r20
    	 brcc	L00C5
    ;	-----		branch on last line
    	jmp	L00C6
    ;	-----------	jump on last line
    L00C5:
    	cbi	p18,b1
    L00C6:
    	lds	r20,D0063
    	lds	r16,D0060
    	cp	r16,r20
    	 brcc	L00CE
    ;	-----		branch on last line
    	jmp	L00CF
    ;	-----------	jump on last line
    L00CE:
    	cbi	p18,b2
    L00CF:
    	lds	r20,D0064
    	lds	r16,D0060
    	cp	r16,r20
    	 brcc	L00D7
    ;	-----		branch on last line
    	jmp	L00D8
    ;	-----------	jump on last line
    L00D7:
    	cbi	p18,b3
    L00D8:
    	lds	r20,D0065
    	lds	r16,D0060
    	cp	r16,r20
    	 brcc	L00E0
    ;	-----		branch on last line
    	jmp	L00E1
    ;	-----------	jump on last line
    L00E0:
    	cbi	p18,b4
    L00E1:
    	lds	r20,D0066
    	lds	r16,D0060
    	cp	r16,r20
    	 brcc	L00E9
    ;	-----		branch on last line
    	jmp	L00EA
    ;	-----------	jump on last line
    L00E9:
    	cbi	p18,b5
    L00EA:
    	ldi	r26,k60
    	ldi	r27,k00
    	ld	r24,X
    	subi	r24,kFF
    	st	X,r24
    	pop	r24
    	out	p3F,r24
    	pop	r31
    	pop	r30
    	pop	r29
    	pop	r28
    	pop	r27
    	pop	r26
    	pop	r25
    	pop	r24
    	pop	r23
    	pop	r22
    	pop	r21
    	pop	r20
    	pop	r19
    	pop	r18
    	pop	r17
    	pop	r16
    	pop	r11
    	pop	r10
    	pop	r7
    	pop	r5
    	pop	r4
    	pop	r3
    	pop	r2
    	pop	r1
    	pop	r0
    	reti
    ;----------------------*
    ; pc=0x10B(0x216)
    ;
    L010B:
    	sbiw	r30,k01
    	 brne	L010B
    ;	-----		branch on last line
    	ret
    ;----------------------*
    ; pc=0x10E(0x21C)
    ;
    	set
    	bld	r6,b2
    	ret
    ;----------------------*
    ; pc=0x111(0x222)
    ;
    	clt
    	bld	r6,b2
    	ret
    ;----------------------*
    ; pc=0x114(0x228)
    ;
    ; last flash byte address = 0x0227
    ; last flash word address = 0x0113
    ;---------------------------------------
    	.dseg
    	.org	0x0060
    ;
    D0060:
    	.byte	1
    D0061:
    	.byte	1
    D0062:
    	.byte	1
    D0063:
    	.byte	1
    D0064:
    	.byte	1
    D0065:
    	.byte	1
    D0066:
    ;
    ; last lds/sts data byte at 0x0066
    ;---------------------------------------
    ;<eof>

    wenn ich es nun richtig verstanden habe müste doch eigentlich folgendes genügen:


    Code:
    Timer_ISR:
    	push	r16
    	push	r20
    	push	r24
    	push	r25
    	in	r24,p3F
    	push	r24
    
                   ------- ISR Programm -------
    
    
    	pop	r24
    	out	p3F,r24
    	pop	r25
    	pop	r24
    	pop	r20
    	pop	r16
    Return
    stimmt dies ungefähr? oder bin ich völlig falsch dran? Ich würde mich freuen wenn jemand mal drübersehen könnte...


    ach ja, hier noch das original programm:

    Code:
    $regfile = "M32def.dat"                                     ' the chip we use
    $crystal = 16000000                                         ' crystal oscillator value
    $baud = 19200                                               ' baud rate
    
    
    Config Timer1 = Timer , Prescale = 1
    On Timer1 Timer_irq
    Enable Timer1
    
    
    Config Portb.0 = Output
    Servo1 Alias Portb.0
    Config Portb.1 = Output
    Servo2 Alias Portb.1
    Config Portb.2 = Output
    Servo3 Alias Portb.2
    Config Portb.3 = Output
    Servo4 Alias Portb.3
    Config Portb.4 = Output
    Servo5 Alias Portb.4
    Config Portb.5 = Output
    Servo6 Alias Portb.5
    
    Dim Servo_incr As Byte
    Dim Servo(6) As Byte
    Dim Byte_nr As Byte
    
    Dim I As Byte
    
    Enable Interrupts
    
    
    Do
    
    Servo(1) = 100
    
    Loop
    End
    
    
    
    
    Timer_irq:
       If Servo_incr = 0 Then
          Config Timer1 = Timer , Prescale = 1                  '1ms 49536
          Timer1 = 58000
          Servo1 = 1
          Servo2 = 1
          Servo3 = 1
          Servo4 = 1
          Servo5 = 1
          Servo6 = 1
       Elseif Servo_incr = 255 Then
          Config Timer1 = Timer , Prescale = 8                  '18ms
          Timer1 = 27074
       Else
          Timer1 = 65411                                        '1ms/255  65411
       End If
    
    
       If Servo_incr > 0 Then
          If Servo_incr >= Servo(1) Then Servo1 = 0
          If Servo_incr >= Servo(2) Then Servo2 = 0
          If Servo_incr >= Servo(3) Then Servo3 = 0
          If Servo_incr >= Servo(4) Then Servo4 = 0
          If Servo_incr >= Servo(5) Then Servo5 = 0
          If Servo_incr >= Servo(6) Then Servo6 = 0
       End If
    
       Incr Servo_incr
    Return

    Gruss BlueSmash

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Ja, würde ich auch so machen.
    Ich würde noch r26, r27 mit sichern.

    Sonst müßte das ok sein.

    Gruß Dirk

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.04.2005
    Ort
    Aarau
    Alter
    34
    Beiträge
    979
    ach ja danke! die habe ich übersehen die gehören ja auch noch in die isr des timer's.....

    was ich jetzt aber noch nicht kapiere sind folgende zeilen:

    Code:
       in   r24,p3F 
       push   r24 
       .
       .
       .
       pop   r24 
       out   p3F,r24
    diese zeilen kann ich logischerweise auch nicht in Bascom einbinden da "p3F" nicht definiert ist... kann ich die weglassen oder wie kann ich diese in Bascom einbinden?

    gruss bluesmash

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hi,

    das ist das Statusregister SREG.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.04.2005
    Ort
    Aarau
    Alter
    34
    Beiträge
    979
    ah ok vielen dank! vom assembler programieren mit den pic's aus der schule würde ich sagen dass dies auf jedenfall gesichert werden muss

    gruss bluesmash

    --edit--
    wollte gerade mekern dass das register laut datenblatt SREG heisst aber da war es schon editiert

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.04.2005
    Ort
    Aarau
    Alter
    34
    Beiträge
    979
    vielen dank für eure hilfe!

    funktioniert soweit einwandfrei der Timeraufruf konnte damit um einiges beschleunigt werden... ob wirklich alle richtigen register gesichert werden wird sich erst zeigen wenn das hauptprogramm fertig ist aber ich denke das wird so schon stimmen.

    gruss bluesmash

Berechtigungen

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