Problem mit Timer *** verzweifel

Gast #133440
Lesenswert?

hallo leute

doppelposting ich weis sorry hierfür aber auf den anderen betreff
wollte keiner antworten.
also nochmals zu meinem problem.
ich stelle meinen timer 1 auf CK/1 also laut DB TCCR1B=0x01;
dann stelle ich den überlauf ein einmal im reset und einmal im
interrupt.wie folgt

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{

TCNT1H=0xff;
TCNT1L=0xcd;

led6=!led6;

}// Timer 1


und die zeit stimmt nur manchmal kommt ganz drauf an welchen wert ich
bei tcnt1l nehme.
wenn ich zb. 0x00 nehme stimmt die zeit nehme ich 0xf5 stimmt sie
überhaupt nicht. ich habe bisher noch keine zeit unter 10µs gehabt kann
der controller evtl. nicht schneller ???

ohja zur hardware µC ist AT90S8535 und einen externen 8mhz quarz.

kann mir vileicht jemand helfen ??
Gast #133441
Lesenswert?

Hi...

Kannst du das mal in AVR-Studio durchsimulieren?

Trotzdem:
Welcher AVR?
Welcher Takt?
Kann es sein, dass du einen neuen Int aufrufen willst, bevor die
aktuelle ISR fertig ist?

Bei 0xf5 bleiben dir 11 Takte bis zum Überlauf.
Sehen wir es mal in Assembler (effektiver wird C kaum sein).
4...5 Takte zum Erkennen des Interrupts
3     Takte für RJMP ISR (am Int-Vektor)
1...5 Takte für SREG sichern (1 bei Exclusiv-Register + 2 x PUSH)
2...4 Takte für Timer-Reload (2 x OUT mit Excl. Register + 2 x LDI)
4     Takte zum LED toggeln (IN r16,ledport, LDI r17,6, EOR r16,r17,
      OUT ledport,r16
1...5 Takte für SREG wiederherstellen
4     Takte für RETI
------
19..30 Takte...

Und ich denke mal, dass ein C-Compiler noch einige andere
Vorbereitungen trifft, wenn eine ISR aufgerufen bzw. beendet wird, z.B.
einige Register PUSHer/POPen, um sich "Bewegungsfreiheit" zu
schaffen... Mit deinen 11 zur Verfügung gestellten Takten wird das also
nix, nichtmal in Assembler...

...HanneS...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren