Hallo
Möglicherweise ist die ISR zu lang und die Interrupts laufen über. Ich habe die Ausführungszeit noch nicht genau berechnet, aber so grob über den Daumen gepeilt dürfte das knapp werden. Es sind 24 Befehle in der ISR + je 9 fürs sichern und restaurieren der Register. Selbst wenn jeder Befehl nur einen Takt benötigen würde, es würde nicht reichen. Die Interrupts kommen bei prescaler=1 alle 36 Takte:
Code:
45 .global __vector_4
47 __vector_4:
48 .LFB3:
49 .LM6:
50 /* prologue: frame size=0 */
51 0014 1F92 push __zero_reg__
52 0016 0F92 push __tmp_reg__
53 0018 0FB6 in __tmp_reg__,__SREG__
54 001a 0F92 push __tmp_reg__
55 001c 1124 clr __zero_reg__
56 001e 2F93 push r18
57 0020 3F93 push r19
58 0022 8F93 push r24
59 0024 9F93 push r25
60 /* prologue end (size=9) */
61 .LM7:
62 0026 8091 0000 lds r24,servopos
63 002a 9927 clr r25
64 002c 2091 0000 lds r18,count.0
65 0030 3091 0000 lds r19,(count.0)+1
66 0034 8217 cp r24,r18
67 0036 9307 cpc r25,r19
68 0038 14F4 brge .L3
69 .LM8:
70 003a 9398 cbi 50-0x20,3
71 003c 01C0 rjmp .L4
72 .L3:
73 .LM9:
74 003e 939A sbi 50-0x20,3
75 .L4:
76 .LM10:
77 0040 8091 0000 lds r24,servopos
78 0044 9927 clr r25
79 0046 8053 subi r24,lo8(-(2000))
80 0048 984F sbci r25,hi8(-(2000))
81 004a 2817 cp r18,r24
82 004c 3907 cpc r19,r25
83 004e 3CF4 brge .L5
84 0050 2F5F subi r18,lo8(-(1))
85 0052 3F4F sbci r19,hi8(-(1))
86 0054 3093 0000 sts (count.0)+1,r19
87 0058 2093 0000 sts count.0,r18
88 005c 04C0 rjmp .L2
89 .L5:
90 .LM11:
91 005e 1092 0000 sts (count.0)+1,__zero_reg__
92 0062 1092 0000 sts count.0,__zero_reg__
93 .L2:
94 /* epilogue: frame size=0 */
95 0066 9F91 pop r25
96 0068 8F91 pop r24
97 006a 3F91 pop r19
98 006c 2F91 pop r18
99 006e 0F90 pop __tmp_reg__
100 0070 0FBE out __SREG__,__tmp_reg__
101 0072 0F90 pop __tmp_reg__
102 0074 1F90 pop __zero_reg__
103 0076 1895 reti
104 /* epilogue end (size=9) */
105 /* function __vector_4 size 50 (32) */
Mögliche Lösungen: Schnellerer Kontrollertakt, ISR in Assembler schreiben oder weniger Interrupts pro Zeit (z.B.: OCR2 = F_CPU/50000 Dann wird zwar die Auflösung geringer und die Werte für die Positionen müssen halbiert werden, aber dafür stimmen dann die Wiederholungen.
Gruß
mic
Lesezeichen