Forum: Mikrocontroller und Digitale Elektronik CTC-Timer/Interrupt zu langsam!?


von Michael N. (garril)


Lesenswert?

Hallo,

ich habe folgenden Code:
1
int main(void)
2
{
3
  TCCR0A = (1 << WGM01); //CTC-Mode
4
  TCCR0B |= (1 << CS00) | (1 << CS02); //Prescaler 1024
5
  OCR0A = 78-1; //0 bis 77 --> 78 Tiks=knapp 10ms --> 9,984ms
6
  TIMSK |= (1 << OCIE0A); //Interrupt an
7
  sei(); //Globale Interrupts an
8
  while(1) {
9
  }
10
}
11
ISR(TIMER0_COMPA_vect)
12
{
13
  if (status==1) {
14
    LEDan();
15
    status=0;
16
  }
17
  else {
18
    LEDaus();
19
    status=1;
20
  }
Allerdings sehe ich es immer noch blinken.
Ein zusätzlicher Counter um das mal mit einer Sekunde vergleichen zu 
können zeigte auch, dass es bei weitem zu langsam ist.
Die Register habe ich nun schon mehrmals im Datenblatt durchgeschaut. 
Das müsste eigentlich passen...
Ich finde den Fehler einfach nicht.
1Sekunde/8MHz=0,000000125s/Takt
0,000000125s/Takt * 1024 Prescaler=0,000128s/Countererhöhung
0,000128s/Countererhöhung * 78 Schritte bis Overflow 
(CTC)=0,009984s/Overflow
--> theoretisch ca. alle 10ms (0,01s) ein Aufruf der Interruptroutine

Praktisch läuft das ganze wesentlich langsamer ab

von Karl H. (kbuchegg)


Lesenswert?

> können zeigte auch, dass es bei weitem zu langsam ist.

Quantifiziere doch mal 'bei weitem'

> 8MHz

die hast du kontrolliert?

von Thomas E. (thomase)


Lesenswert?

Michael N. schrieb:
> Praktisch läuft das ganze wesentlich langsamer ab
Ich tippe mal 8x langsamer als erwartet.
CKDIV8-Fuse.

mfg.

von Michael N. (garril)


Lesenswert?

8x kommt schon in etwa hin (müsste es nochmal umbasteln um es ca. sagen 
zu können)
Aber wenn ich in AVR Studio auf "Read" (unter "Fuses") gehe, dann sagt 
er mir Int. RC Osc. 8MHz
Hab ihn auch auf den Attiny45 eingestellt...
Dann müsste das doch stimmen!?!

von Karl H. (kbuchegg)


Lesenswert?

Michael N. schrieb:
> 8x kommt schon in etwa hin (müsste es nochmal umbasteln um es ca. sagen
> zu können)

Warum?
Ich denke du hast eine LED im System?


1
#define F_CPU 8000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
int main()
7
{
8
  Led_port auf Ausgang;
9
10
  while( 1 ) {
11
    Led_ein();
12
    _delay_ms( 1000 );
13
    Led_aus();
14
    _delay_ms( 1000 );
15
  }
16
}

wenn die 8 Mhz stimmen, dann leuchtet deine LEd 1 Sekunde lang und ist 1 
Sekunde lang dunkel. Wenn die 8Mhz nicht stimmen und zb 1Mhz sind, dann 
leuchtet die Led 8 Sekunden und ist 8 Sekunden dunkel.
Schon weißt du es.

> Aber wenn ich in AVR Studio auf "Read" (unter "Fuses") gehe, dann sagt
> er mir Int. RC Osc. 8MHz

und was sagt sie bei CKDIV8

von Michael N. (garril)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ich denke du hast eine LED im System?

Müsste es halt nochmal umprogrammieren. Eigentlich ist das nämlich auch 
nicht nur eine LED, sondern mehrere die per Schieberegister angesteuert 
werden müssen.

Bin leider gerade nichtmehr an dem PC von dem aus ich 
programmiere...Kann aktuell nichtmehr nachschauen.

Das testen mit dem _delay_ms könnte ich auch nochmal machen. Damit hatte 
ich nämlich eigentlich erst im ersten Entwicklungsstadium meiner 
Schaltung getestet ob die Zeit stimmt. Da hat es aber noch gepasst 
(waren 8MHz).

Karl Heinz Buchegger schrieb:
> und was sagt sie bei CKDIV8

Wie gesagt bin ich gerade nichtmehr an dem PC.
Allerdings hatte ich vorhin schon nach dem Begriff Ausschau gehalten: 
Unter den Fuses war es nicht mit drin!? Wo find ich das dann? (AVR 
Studio)

von Hannes L. (hannes)


Lesenswert?

Michael N. schrieb:
> Unter den Fuses war es nicht mit drin!?

Doch, der Tiny45 hat diese CKDIV8-Fuse auch.

> Wo find ich das dann? (AVR Studio)

Im Low-Byte der Fuses, Bit 7.

Aber Du brauchst Diese Fuse nicht, denn Du kannst den 
System-Taktvorteiler CLKPR auch per Software einstellen. Dazu einfach in 
der Init den Schreibschutz von CLKPR aufheben (Bit 7, CLKPCE setzen) und 
dann zweimal hintereinander den Index des gewünschten Vorteilers in 
CLKPR scheiben, bei 1 zu 1 also 0.

Dreimal darfst Du raten, wo diese Info zu finden ist.

...

von Michael N. (garril)


Lesenswert?

Da hatte ich wohl Tomaten auf den Augen...
Ich bin schwer davon ausgegangen, dass es reicht ihn auf 8MHz zu 
stellen.
Von CKDIV8 hatte ich zwar schonmal i-wann gelesen, aber garnicht dran 
gedacht.

Vielen Dank

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.