
Zitat von
Besserwessi
Da sollte man das Hochzählen auch in ASM machen. z.B. mit
LDS R16, {Timer0_overflows}
SUBI R16, 255
STS {Timer0_overflows},R16
LDS R16, {Timer0_overflows}+1
SBCI R16, 255
STS {Timer0_overflows}+1,R16
Danke für den Code. Hab ich gleich mal ausprobiert und "Timer0_overflows = Timer0_overflows + 1" durch alle ASM Befehle ersetzt ,da bei mir eine Word Variable. Hat nochmal eine µs gebracht. Lücke jetzt noch 4µs.
PS nach weiterem Tasten und Messen 3µs Lücke
EDIT
Echt stark, was Inline ASM bringt. Habe nun die Timer0_overflows Variable auf Typ Byte geändert. Damit kann sie eine Zeit bis ca 65ms abdecken, was hier für die US Messung mehr als genug wäre.
Die ganz neue ISR sieht nun so aus:
Code:
On Timer0 Isr_count_overflows Nosave
Isr_count_overflows: 'Ansprung, wenn Timer0 überläuft
!push r16
!in r16,sreg
!Push r16
!lds R16 , {timer0_overflows}
!SUBI R16, 255
!STS {Timer0_overflows},R16
!pop r16
!out sreg,r16
!pop r16
Return
Wenn ich nun meinen eigenen Tests trauen darf, liegt die Lücke bei nur noch bei 2µs. Die Simulation ist so eingestellt, daß 10 Überläufe auftreten. Nicht angezeigte Werte sind 2568µs und 2569µs. Anmerkung: ASM Code nur durch C&P entstanden.
Gruß
Searcher
Lesezeichen